Güvenlik
CPalius güvenliği eklentilere bırakmaz; çekirdeğin parçası olarak gelir. Bu sayfa her katmanı, ilgili ayar anahtarını ve varsayılan değerini verir. Ayarların tamamı AACP → Güvenlik ekranından yönetilir.
Yeni bir kurulum bilerek gözlem modunda başlar: WAF detect, CSP report. İkisi de olayları kaydeder ama engellemez. Böylece yeni kurulan sitenin meşru trafiği yanlış pozitiflerle kesilmez. Canlıya çıkarken kayıtları inceleyip modları block / enforce seviyesine almak operatörün kararıdır. cp:security:audit iki durumu da bulgu olarak raporlar.
Katmanlar
istek → IP yasağı / izinli liste → WAF (imza taraması) → hız sınırı → kimlik doğrulama
→ yetki (capability) → denetleyici → çıktı kaçışlama → güvenlik başlıkları (CSP, HSTS…)
WAF
RequestGuardSubscriber her isteği ThreatAnalyzer ile tarar. Tarama; adres, sorgu parametreleri, başlıklar ve gövde üzerinde dört imza ailesi arar:
- SQL enjeksiyonu imzaları
- XSS imzaları
- Yol gezintisi / LFI imzaları (
../,/etc/passwdgibi) - Bilinen saldırı araçları (tarayıcı kullanıcı ajanları)
Her eşleşme bir skor üretir.
| Ayar | Varsayılan | Anlamı |
|---|---|---|
security.waf_mode |
detect |
off kapalı, detect yalnız kaydeder, block skor eşiğinde isteği reddeder |
security.waf_block_score |
80 | Bu skor ve üstü reddedilir (block modunda) |
security.waf_autoban_score |
95 | Bu skor ve üstü IP'yi yasaklar |
security.waf_autoban_minutes |
1440 | Yasak süresi (dakika) |
security.ip_allowlist |
boş | Her yasaktan önce gelir: buradaki IP'ler engellenmez |
security.trusted_hosts |
boş | İzin verilen Host başlıkları |
WAF /aacp yolunu da kapsar; yönetim paneli erişilebilir bırakılırsa yasaklı bir adres giriş formunu dövmeye devam edebilirdi. Yalnızca veritabanından bağımsız kurtarma konsolu muaftır, çünkü kendi kendini yasaklayan operatörün geri dönüş yolu odur.
Yazı alanları ve yanlış pozitifler
Blog, forum, belge gibi insan yazısı alanları meşru olarak ../, .env, wp-login.php gibi ifadeler içerebilir (ör. bir teknik makale). Bunun için dar bir muafiyet vardır:
- Yalnızca POST isteklerinde,
- yalnızca bilinen yazma yollarında (Studio/AACP yolları ve forum yazma yolları),
- yalnızca
body,content,excerpt,faq,descriptiongibi yazı alanlarında gövde taranmaz.
Başlık, slug, URL ve diğer tüm alanlar ile diğer tüm yollar eskisi gibi taranır. Güvenlik burada çıktıda kaçışlama, parametreli SQL ve kayıt anı HTML temizliğiyle sağlanır; WAF kapatılmaz.
Yazı alanınız WAF'a takılıyorsa WAF'ı gevşetmeyin; yolunuzu ve alan adınızı ThreatAnalyzer içindeki muafiyet listesine ekletin (ayrı, dar bir kural olarak) ve çıktıda kaçışlamayı doğrulayın.
Giriş savunması
Giriş denemeleri FloodService (kayan pencereli sınırlayıcı) ile sayılır. Tanımlayıcılar hash'lenir; e-posta adresi önbellek anahtarlarında görünmez. Engelleme, parola hash'i hesaplanmadan önce yapılır, yani kilitli bir hesap saldırgana bizim CPU'muza maliyet yazdıramaz. Savunma kimlik doğrulayıcı olaylarına bağlı olduğundan bugünkü ve yarınki tüm kimlik doğrulayıcılar kapsanır.
| Ayar | Varsayılan |
|---|---|
security.login_ip_limit |
20 deneme / pencere (IP başına) |
security.login_user_limit |
5 deneme / pencere (hesap başına) |
security.login_window_minutes |
15 |
security.lockout_minutes |
15 |
security.autoban_after_lockouts |
3 kilitlenmeden sonra IP yasağı |
security.register_limit_hourly |
5 kayıt / saat |
security.reset_limit_hourly |
5 parola sıfırlama / saat |
CAPTCHA
Sağlayıcılar: reCAPTCHA (v2 / v3, skor eşiği 0.5), Cloudflare Turnstile, hCaptcha. Varsayılan sağlayıcı none; kayıtta açık, girişte kapalı gelir (security.captcha_on_register / security.captcha_on_login).
Parola politikası
Tek bir yerde karar verilir (PasswordPolicy); kayıt, hesap içi değişiklik ve yönetici sıfırlaması aynı kuralı kullanır.
| Ayar | Varsayılan |
|---|---|
security.password_min_length |
10 |
security.password_required_classes |
3 (büyük, küçük, rakam, sembol sınıflarından) |
security.password_breach_check |
açık |
security.password_breach_fail_closed |
kapalı |
security.password_history_depth |
son 5 parola tekrar kullanılamaz |
security.password_max_age_days |
0 (süresiz) |
security.password_denylist |
boş (kendi yasaklı kelimeleriniz) |
Sızıntı kontrolü Pwned Passwords veri kümesine k-anonimlik ile bakar: yalnızca parolanın SHA-1 özetinin ilk beş karakteri sunucudan çıkar; uzak servis parolayı tanıyabilecek kadar bilgi görmez. Servis erişilemezse varsayılan davranış parolayı kabul etmektir; fail_closed açılırsa erişilemeyen servis parolayı reddeder.
İki adımlı doğrulama
| Ayar | Varsayılan |
|---|---|
security.twofactor_enabled |
açık |
security.twofactor_methods |
both (zaman tabanlı kod ve e-posta kodu) |
security.twofactor_enforce_privileged |
kapalı (açılırsa yetkili hesaplar için zorunlu) |
security.twofactor_drift |
1 (zaman kayması toleransı, adım sayısı) |
security.twofactor_email_ttl_minutes |
10 |
security.twofactor_email_resend_seconds |
60 |
Oturum
| Ayar | Varsayılan |
|---|---|
security.session_idle_minutes |
60 |
security.session_admin_idle_minutes |
20 (panel oturumu daha kısa) |
security.session_absolute_hours |
0 (mutlak süre yok) |
security.session_bind_user_agent |
açık |
security.session_bind_ip |
kapalı |
security.session_purge_days |
30 |
Anonim ziyaretçilere oturum açılmaz; bu hem gizlilik hem de önbellek açısından bilinçli bir karardır.
AACP kapısı
İsteğe bağlı (security.aacp_gate_enabled, varsayılan kapalı) paylaşılan sırlı bir sorudur ve oturum başına bir kez sorulur. İkinci faktör değildir; herkesin aynı cevabı verdiği bir soru ikinci faktör olamaz. Sağladığı şey: çalınmış bir oturum çerezi ya da açık unutulmuş bir tarayıcı, saldırgana siteyi verir ama yönetim konsolunu vermez. Etkin ama yapılandırılmamış bir kapı etkisizdir, yani kutuyu işaretleyip cevabı unutan operatör kendini dışarıda bırakmaz. Kurtarma konsolu bu kapıdan da muaftır.
CSP ve güvenlik başlıkları
| Ayar | Varsayılan |
|---|---|
security.headers_enabled |
açık |
security.csp_mode |
report (enforce seçilince engeller) |
security.csp_script_src, csp_style_src, csp_img_src, csp_connect_src |
boş (ek izinli kaynaklar) |
security.csp_frame_src |
YouTube (nocookie) ve Vimeo oynatıcıları |
security.csp_frame_ancestors |
'self' |
security.hsts_max_age |
0 (kapalı) |
security.referrer_policy |
strict-origin-when-cross-origin |
security.permissions_policy |
kamera vb. kapalı |
Satır içi betik ve stiller nonce taşır; şablonlarda csp_nonce_attr() kullanılır. Dış alan adından betik/stil çağırmayın; kütüphaneleri modülün Resources/assets/vendor klasörüne yerel alın. Rapor modunda ihlaller CspReportController ile toplanır, böylece enforce öncesinde hangi kaynakların bloklanacağı görülür.
Yetki sistemi
Her işlem bir yetenek (capability) ile korunur ve tanımsız yetenek reddedilir. Rol adına değil yetenek adına bakılır. Ayrıntı: Yetki sistemi.
Yüklemeler ve içerik
- Dosya türü uzantıya değil MIME içeriğine göre doğrulanır; izinli tür listesi vardır.
- Yüklenen dosyalar karma (hash) adıyla, çalıştırılamaz bir klasöre yazılır;
public/uploads/.htaccessPHP çalıştırmayı kapatır. - Zengin metin, kayıt anında HTML temizleyiciden geçer; Twig çıktısında ham basım yalnızca açıkça temizlenmiş içerik için yapılır.
Zararlı yazılım tarayıcı
Varsayılan kapalıdır. AACP → Araçlar → Yazılım tarayıcı ekranından açılır. Kurallar yüksek / orta / düşük ciddiyetle sınıflanır; bulgular karantinaya alınabilir, hash'e bağlı beyaz liste vardır. Yüklemeler ile modül/tema paketleri taranır; çekirdek kodunda zayıf (düşük) ipuçları atlanır.
Denetim kaydı ve telemetri
- Denetim kaydı: önemli yönetim eylemleri kim/ne zaman/ne ile saklanır.
audit.enabledaçık,audit.retention_days365. - Güvenlik telemetrisi: WAF ve giriş olayları ciddiyet düzeyleriyle kaydedilir (
telemetry.security_enabled, varsayılan kapalı). Saklama: bilgi 3, uyarı 7, kritik 30, tehdit 90 gün.
Webhook ve dış istekler
Giden webhook'lar HMAC ile imzalanır ve SSRF koruması (SsrfGuard) arkasından çıkar: iç ağ adreslerine istek reddedilir. Ayrıntı: API ve webhook.
Güvenlik denetimi: cp:security:audit
php cp-core/bin/console cp:security:audit
php cp-core/bin/console cp:security:audit --json # makine okunur
php cp-core/bin/console cp:security:audit --fail-on=high # CI için
Denetçi yalnızca kayıtlı ayarlara değil, isteklerin gerçekte nasıl işlendiğine bakar ve birbirini sıfırlayan ayar kombinasyonlarını işaretler. Varsayılan kurulum bilerek 100/100 almaz: denetim bir sertifika değil, operatör için kontrol listesidir.
Güvenlik açığı bildirimi
Güvenlik açıklarını herkese açık bir yere yazmayın. Depodaki SECURITY.md dosyası bildirim kanallarını ve hedef sürelerini verir: bildirimin alındığı 72 saat içinde onaylanır, ilk değerlendirme 7 gün, kritik açıklar için çözüm veya hafifletme 30 gün hedeflenir. Ücretli bir hata ödül programı şu an yoktur; bildirenler, istemezlerse dışında, sürüm notlarında anılır.
Modül yazarı için kurallar
- Denetleyicide
#[IsGranted('modul.eylem')]ya da menüdecapability:kullanın; rol adı kontrol etmeyin. - Kullanıcı girdisini Twig'de kaçışlı basın;
|rawyalnızca temizlenmiş içerik için. - Sorgu parametreleri her zaman bağlanmış (parametreli) olsun.
- Anonim isteklerde oturum başlatmayın.
- Satır içi betikte nonce kullanın; dış CDN çağırmayın.
- Yazı alanı WAF'a takılıyorsa muafiyeti dar ve ayrı bir kural olarak ekletin.