İçeriğe geç

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.

Varsayılan sıkılık

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/passwd gibi)
  • 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, description gibi 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.

Yeni modül yazıyorsanız

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/.htaccess PHP ç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.enabled açık, audit.retention_days 365.
  • 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

  1. Denetleyicide #[IsGranted('modul.eylem')] ya da menüde capability: kullanın; rol adı kontrol etmeyin.
  2. Kullanıcı girdisini Twig'de kaçışlı basın; |raw yalnızca temizlenmiş içerik için.
  3. Sorgu parametreleri her zaman bağlanmış (parametreli) olsun.
  4. Anonim isteklerde oturum başlatmayın.
  5. Satır içi betikte nonce kullanın; dış CDN çağırmayın.
  6. Yazı alanı WAF'a takılıyorsa muafiyeti dar ve ayrı bir kural olarak ekletin.
Son güncelleme: 13.10.2026