Buyukweb
ModSecurity WAF Kurulumu ve OWASP Kuralları ile Web Koruması

ModSecurity WAF Kurulumu ve OWASP Kuralları ile Web Koruması

ModSecurity Web Application Firewall kurulumu ve OWASP Core Rule Set yapılandırması. Apache/Nginx entegrasyonu, özel kurallar ve false positive yönetimi.

Büyükweb Editör EkibiHosting, Sunucu ve Sistem Yönetimi Editörü12 dakika okuma

ModSecurity WAF Kurulumu ve OWASP Kuralları

ModSecurity, web uygulamalarını SQL injection, XSS, path traversal ve diğer saldırılardan koruyan açık kaynaklı bir WAF (Web Application Firewall) motorudur.

ModSecurity Nedir?

WAF, HTTP trafiğini analiz ederek kötü niyetli istekleri engeller. ModSecurity ile birlikte kullanılan OWASP Core Rule Set (CRS), binlerce saldırı imzası içerir.

Apache'ye ModSecurity Kurulumu

Ubuntu/Debian:

apt install libapache2-mod-security2
a2enmod security2
systemctl restart apache2

# Temel yapılandırma dosyası
cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf

/etc/modsecurity/modsecurity.conf:

# Önce Detection Only modunda çalıştırın
SecRuleEngine DetectionOnly

# Logları etkinleştir
SecAuditEngine On
SecAuditLog /var/log/apache2/modsecurity_audit.log
SecAuditLogParts ABIJDEFHZ

# İstek gövdesini işle
SecRequestBodyAccess On
SecRequestBodyLimit 13107200
SecRequestBodyNoFilesLimit 131072

# Yanıt gövdesini işle
SecResponseBodyAccess On
SecResponseBodyLimit 524288

OWASP Core Rule Set (CRS) Kurulumu

cd /etc/modsecurity
git clone https://github.com/coreruleset/coreruleset
cp coreruleset/crs-setup.conf.example coreruleset/crs-setup.conf

# Apache yapılandırmasına dahil et
# /etc/apache2/mods-enabled/security2.conf
<IfModule security2_module>
    SecDataDir /var/cache/modsecurity
    IncludeOptional /etc/modsecurity/*.conf
    IncludeOptional /etc/modsecurity/coreruleset/crs-setup.conf
    IncludeOptional /etc/modsecurity/coreruleset/rules/*.conf
</IfModule>
systemctl restart apache2

Nginx ile ModSecurity

# ModSecurity-nginx connector kurulumu
apt install libnginx-mod-security

# /etc/nginx/nginx.conf
http {
    modsecurity on;
    modsecurity_rules_file /etc/modsecurity/modsecurity.conf;
}

Detection Only → Enforcement Mode

Test aşamasında DetectionOnly kullanın, sorun yoksa aktif edin:

# /etc/modsecurity/modsecurity.conf
SecRuleEngine On   # DetectionOnly yerine

Log İzleme

# Gerçek zamanlı log takibi
tail -f /var/log/apache2/modsecurity_audit.log

# Engellenen istekleri filtrele
grep "Access denied" /var/log/apache2/modsecurity_audit.log

# Hangi kurallar tetiklenmiş
grep "id:" /var/log/apache2/modsecurity_audit.log | sort | uniq -c | sort -rn | head -20

False Positive Yönetimi

Meşru istekler engelleniyorsa kural devre dışı bırakın:

# Belirli kural devre dışı
SecRuleRemoveById 942100

# Belirli alan için devre dışı
<Location "/wp-admin">
    SecRuleRemoveById 942100 941100
</Location>

# Belirli IP için devre dışı
SecRule REMOTE_ADDR "@ipMatch 192.168.1.100"     "id:1000,phase:1,pass,nolog,ctl:ruleEngine=Off"

Özel Kural Yazma

# /etc/modsecurity/custom-rules.conf

# Belirli User-Agent'ı engelle
SecRule REQUEST_HEADERS:User-Agent "sqlmap"     "id:9001,phase:1,deny,status:403,msg:'SQLMap Detected'"

# Belirli parametre uzunluğunu sınırla
SecRule ARGS_NAMES "@gt 100"     "id:9002,phase:2,deny,status:400,msg:'Too many parameters'"

# Admin sayfasına IP kısıtlaması
SecRule REQUEST_URI "@beginsWith /wp-admin"     "id:9003,phase:1,chain,deny,status:403"
SecRule REMOTE_ADDR "!@ipMatch 192.168.1.0/24"

Performans Optimizasyonu

# Statik dosyalar için WAF'ı devre dışı bırak
<FilesMatch ".(jpg|jpeg|png|gif|ico|css|js|woff|woff2)$">
    SecRuleEngine Off
</FilesMatch>

# CRS paranoia seviyesini düşür (varsayılan 1, max 4)
# crs-setup.conf
SecAction "id:900000,phase:1,nolog,pass,t:none,setvar:tx.paranoia_level=1"

[Büyükweb cPanel hosting](MASK40) paketlerinde ModSecurity varsayılan olarak etkin gelir. VDS sunucularda özelleştirilmiş WAF kuralları oluşturabilirsiniz.

OWASP Kural Seti Ince Ayar ve False Positive Yönetimi

ModSecurity OWASP Core Rule Set (CRS) kurulduktan sonra false positive uyarilarini yönetmek önemli bir adimdir. Başlangıçta kurallari DetectionOnly modda çalıştirarak uyarilari izleyin ve mesru trafigi engelleyen kurallari tespit edin. Belirli kurallar icin ozel istisnalar tanımlayarak uygulamanizin normal isleyisini bozmadan güvenlik sağlayin. SecRuleRemoveById direktifi ile belirli kurallari devre disi birakabilirsiniz.

Paranoia seviyesini uygulamanizin gereksinimlerine gore ayarlayin. Seviye 1 temel koruma sağlarken, seviye 4 en katı kurallari uygular. Çoğu web uygulamasi icin seviye 2 dengeli bir seçimdir. IP beyaz liste yapılandırmasi ile guvenilir kaynaklardan gelen trafigi muaf tutabilirsiniz. ModSecurity audit loglarini duzenli olarak inceleyerek saldiri ornuntularini analiz edin. Sanal yamalama (virtual patching) ile bilinen güvenlik açıklarini uygulama kodu değiştirmeden engelleyebilirsiniz. Buyukweb.com hosting paketlerinde ModSecurity varsayilan olarak etkindir ve profesyonel güvenlik korumaniz sağlanir.

Sonuc

Güvenlik sürekli bir süreçtir. Katmanli yaklasim ile sitenizi koruyun. Büyükweb paketlerinde Imunify360 ve ücretsiz SSL dahildir.

SSL Sertifika Turleri

Tur Dogrulama Kullanım Fiyat
DV (Domain) Domain sahipligi Kişisel site, blog Ücretsiz-düşük
OV (Organization) Şirket dogrulama Kurumsal site Orta
EV (Extended) Detaylı dogrulama Banka, e-ticaret Yüksek
Wildcard Tüm subdomainler Çoklu subdomain Orta-yüksek

Let's Encrypt Otomatik Yenileme

Certbot ile sertifikalari otomatik yenileyin. Cron veya systemd timer ile 60 günde bir yenileme zamanlayIn.

Güvenlik Denetim Kontrol Listesi

  • SSL/TLS versiyonlari güncel mi?
  • Güvenlik basliklari dogru yapılandırildi mi?
  • WAF kurallari aktif mi?
  • fail2ban çalışiyor mu?
  • Gereksiz portlar kapali mi?
  • Root girisi devre disi mi?
  • 2FA aktif mi?
  • Yedekler duzenli aliniyor mu?
  • Dosya izinleri dogru mu?
  • Kullanılmayan servisler kapatildi mi?

Bu listeyi ayda bir kontrol ederek sunucunuzun güvenligini ust seviyede tutun.

ModSecurity 2.x vs 3.x (libmodsecurity)

ModSecurity'nin iki farklı major sürümü var; doğru sürümü seçmek deploy başarısının yarısı:

Özellik ModSecurity 2.x ModSecurity 3.x (libmodsecurity)
Apache desteği ✓ native (mod_security2) ✓ connector (libmodsecurity3)
Nginx desteği sınırlı, eski ✓ native (modsecurity-nginx)
IIS desteği
OpenResty/HAProxy kısmi (libmodsecurity API)
Performans tek thread multi-thread, %30+ hızlı
Aktif geliştirme sürdürülüyor (yamalar) birincil sürüm
CRS uyumluluk tam tam

Yeni kurulum 2026'da: mutlaka ModSecurity 3.x + libmodsecurity seçin. Apache mevcut sistemlerde 2.x kalabilir ama yeni Nginx kurulumlarında v3 standardı.

Coraza — Go Alternatifi

[Coraza](MASK41) — ModSecurity'nin Go ile yeniden yazılmış open-source alternatifi (OWASP projesi). 2024'ten bu yana production-ready:

  • Caddy, Traefik, Envoy ile native entegrasyon
  • HAProxy SPOE üzerinden bağlantı
  • ModSecurity SecLang dilini birebir destekler — mevcut CRS kurallarınız çalışır
  • Bellek izi ModSecurity'nin yarısı, yatay ölçek dostu

Ne zaman tercih edin? Kubernetes/microservices ortamı, Caddy/Traefik kullananlar, statik binary deploy isteyen ekipler.

Paranoia Level — Detaylı Karar Matrisi

OWASP CRS'in paranoia level (PL) ayarı saldırı tespiti ile false positive arasındaki dengeyi belirler:

PL Hedef False Positive Riski Önerilen Senaryo
PL1 Açık saldırı (sqlmap, kötü payload) düşük Genel WordPress/Joomla site, ilk kurulum
PL2 Şüpheli pattern + pl1 orta E-ticaret, kurumsal site
PL3 Anomaly detection sıkı yüksek Bankacılık, ödeme API
PL4 Aşırı sıkı, neredeyse paranoid çok yüksek Sadece önemli login API endpoint

Pratik strateji: PL1 ile başla → 2 hafta DetectionOnly çalıştır → false positive listesi → exception ekle → PL2'ye yükselt.

# crs-setup.conf
SecAction "id:900000,phase:1,pass,nolog,t:none,\
  setvar:tx.blocking_paranoia_level=1,\
  setvar:tx.detection_paranoia_level=2,\
  setvar:tx.enforce_bodyproc_urlencoded=1"

detection_paranoia_level > blocking_paranoia_level ayarı iki seviye birden çalıştırma trick'i — yüksek seviyeyi log-only test eder, düşük seviyeyi block eder.

Anomaly Scoring System (CRS 3.x)

CRS 3+ artık her isteği bir anomali skoru ile değerlendirir; tek bir kuralın "deny" demesi yerine kümülatif skor üstüne eylem:

# crs-setup.conf
# Skor eşikleri
SecAction "id:900110,phase:1,pass,nolog,\
  setvar:tx.inbound_anomaly_score_threshold=5,\
  setvar:tx.outbound_anomaly_score_threshold=4"

# Severity ağırlıkları
SecAction "id:900100,phase:1,pass,nolog,\
  setvar:tx.critical_anomaly_score=5,\
  setvar:tx.error_anomaly_score=4,\
  setvar:tx.warning_anomaly_score=3,\
  setvar:tx.notice_anomaly_score=2"

Default'ta bir CRITICAL kural tetiklendiğinde skor 5 ekler ve eşik 5 olduğundan engellenir. Eşiği yükseltmek (örn. 10) birden fazla şüpheli pattern gerektirir — paranoia level düşürmenin alternatifi.

JSON / REST API Koruması

Modern API'ler JSON body kullanır; ModSecurity 3.x JSON parser'ı default açıktır:

# /etc/modsecurity/modsecurity.conf
SecRequestBodyAccess On
SecRequestBodyJsonDepthLimit 512
SecRequestBodyLimit 13107200

# Content-Type bazlı parser yönlendirme
SecRule REQUEST_HEADERS:Content-Type "application/json" \
  "id:200001,phase:1,pass,nolog,ctl:requestBodyProcessor=JSON"

# XML için
SecRule REQUEST_HEADERS:Content-Type "application/(xml|soap)" \
  "id:200002,phase:1,pass,nolog,ctl:requestBodyProcessor=XML"

JSON gövdesindeki anahtar/değerler ARGS koleksiyonunda görünür — SQL injection / XSS kuralları otomatik çalışır.

API tipik false positive'leri:

  • JWT token base64 string → 942100 (SQL meta-char) yanılması
  • GraphQL query → 933 (PHP injection) yanılması
  • Webhook payload → bot detection

Çözüm: ilgili endpoint için exception:

SecRule REQUEST_URI "^/api/v1/webhook" \
  "id:1000,phase:1,pass,nolog,ctl:ruleRemoveById=942100;942101"

WordPress False Positive Kütüphanesi

WordPress core ve popüler plugin'ler ModSecurity ile sık çakışır. Pratik exception listesi:

# /etc/modsecurity/wordpress-exceptions.conf

# wp-admin için detection sıkılığını düşür
<LocationMatch "/wp-admin/(post|admin-ajax|customize)\.php">
  SecRuleRemoveById 942100 942130 942150 942260 942410
  SecRuleRemoveById 941160 941170
  SecRuleRemoveById 932100 932105 932150
</LocationMatch>

# Visual Composer / Elementor — base64 inline content
<LocationMatch "/wp-admin/admin-ajax\.php">
  SecRuleRemoveById 920273 920274
  SecRuleUpdateActionById 949110 "pass,nolog"
</LocationMatch>

# WooCommerce REST API
<LocationMatch "/wp-json/wc/">
  SecRuleRemoveById 920420
</LocationMatch>

# WordPress core file edits (admin-only zaten yetkili)
<LocationMatch "/wp-admin/(theme|plugin)-editor\.php">
  SecRuleEngine DetectionOnly
</LocationMatch>

cPanel & Plesk'te ModSecurity Yönetimi

cPanel WHM:

  • WHM > Security Center > ModSecurity Tools — kurallari aç/kapat
  • WHM > Security Center > ModSecurity Vendors — OWASP CRS, Comodo CWAF, Atomicorp seçilebilir
  • Kullanıcı bazlı disable: User > Web Application Firewall > kural aç/kapat

Plesk:

  • Tools & Settings > Web Application Firewall (ModSecurity) — modu aç (Detection/On/Off)
  • Per-domain: Domains > example.com > Web Application Firewall → "Specify the WAF" ile kural seti seç
  • Plesk Atomic Basic ModSecurity ücretsiz, Atomic Advanced premium tier

Imunify360, ModSecurity'yi otomatik yöneten ticari katman — false positive ML otomasyonu, captcha challenge, blacklist sync sunar; cPanel/Plesk üzerinde tek tıkla kurulum.

Performance Optimizasyonu

ModSecurity ham CPU'yu %5-15 ek kullanır; yüksek trafikte tuning şart:

# Statik dosyalar için tamamen pas geç (en büyük kazanç)
<FilesMatch "\.(jpg|jpeg|png|gif|ico|css|js|woff2?|svg|map|webp)$">
  SecRuleEngine Off
</FilesMatch>

# Audit log seçici (tüm istekleri loglamak disk yer)
SecAuditEngine RelevantOnly
SecAuditLogRelevantStatus "^(?:5|4(?!04))"

# Audit log compression
SecAuditLogType Concurrent
SecAuditLogStorageDir /var/log/modsec_audit/

# Body limit konservatif
SecRequestBodyLimit 1048576           # 1 MB
SecRequestBodyNoFilesLimit 65536      # 64 KB

# PCRE limit (regex performance protection)
SecPcreMatchLimit 100000
SecPcreMatchLimitRecursion 100000

Hyperscan engine (Intel SIMD-optimized regex) — ModSecurity 3.0.6+ SecRuleEngine On --enable-hyperscan ile multi-Gbps tarama. Yüksek RPS API'ler için %50+ hız.

Audit Log Analizi — Pratik Komutlar

# En çok tetiklenen kurallar (top 20)
grep -h '\[id "' /var/log/modsec_audit/*.log | \
  grep -oP 'id "\d+"' | sort | uniq -c | sort -rn | head -20

# Belirli kuralı tetikleyen IP'ler
grep -B2 'id "942100"' /var/log/modsec_audit/2026*.log | \
  grep "REMOTE_ADDR" | awk '{print $NF}' | sort -u

# Engellenen istek özet (status 403)
awk '/Section H/{flag=1} flag && /Status: 403/' /var/log/modsec_audit/*.log | \
  head -50

# İstatistik dashboard — modsec-tail
modsec-tail -f /var/log/modsec_audit/  # community tool

Ücretsiz GUI: Wazuh + ModSecurity entegrasyonu — Kibana'da real-time WAF dashboard. Production'da SIEM'e bağlamak için altın standart.

Test Araçları ve Doğrulama

Kurulumun çalıştığını doğrulamak için kontrollü saldırı testi:

# 1. SQL injection test (engellenmesi beklenir)
curl "https://example.com/?id=1' OR '1'='1"

# 2. XSS test
curl "https://example.com/?q=<script>alert(1)</script>"

# 3. Path traversal
curl "https://example.com/?file=../../../../etc/passwd"

# 4. PHP code injection
curl "https://example.com/?cmd=phpinfo()"

# 5. Beklenen yanıt: 403 Forbidden
# Eğer 200 dönüyorsa kural tetiklenmedi → CRS aktif değil

Otomatik tester: go-ftw — OWASP CRS resmi test framework'ü; YAML payload kütüphanesi ile yüzlerce saldırı senaryosu çalıştırır:

go install github.com/coreruleset/go-ftw@latest
go-ftw run -d /etc/modsecurity/coreruleset/tests/regression

ModSecurity benchmarks: modsec-tester ile RPS dağılımı + latency p99 ölçümü.

CRS Güncelleme Stratejisi

OWASP CRS 6 ayda bir major güncelleme yayınlar (4.0, 4.1, ...). Production'da güvenli güncelleme:

  1. Staging'de test — CRS yeni sürüm + go-ftw ile regresyon
  2. DetectionOnly mode — production'da 1 hafta logla, false positive avla
  3. Exception sync — özel kuralları yeni sürüme aktar
  4. Aşamalı rollout — %10 trafik → %50 → %100
  5. Rollback hazır — git ile sürüm yönetimi:
cd /etc/modsecurity/coreruleset
git tag v3.3.5-prod-2026-05-07          # mevcut hâli yedekle
git fetch && git checkout v4.5.0
# Test, test, test...
# Sorun varsa: git checkout v3.3.5-prod-2026-05-07

ML / Behavior-Based Eklentiler

Klasik signature-based WAF, zero-day saldırılara kör. Modern eklentiler:

  • Imunify360 Proactive Defense — runtime PHP davranış analizi
  • Cloudflare WAF + Magic Firewall — ML-driven anomaly detection
  • Yurt dışı bulut WAF + Bot Control servisleri — managed kural seti + davranış tabanlı tespit
  • Datadog ASM — RASP (Runtime Application Self-Protection) — uygulama içinden istek doğrulama

ModSecurity'yi edge olarak, RASP'i uygulama içinde kullanmak iki katmanlı koruma sağlar.

Sık Sorulan Sorular

CRS sürümü 3 vs 4 hangisi?

CRS 4.x (2024+ sürümleri) — yeni anomaly engine, JSON/HTTP/2 desteği iyileştirildi, eski kuralların kalanı temizlendi. Production için CRS 4 önerilir; ModSecurity 2.9+ ile uyumlu.

Detection-only modda yıllarca tutmak güvenli mi?

Hayır — log-only zamanla rule fatigue yaratır, kimse incelemez. 4-6 hafta DetectionOnly → false positive temizliği → SecRuleEngine On. Aksi halde WAF yok hükmünde.

ModSecurity yüksek trafikte yavaş mı?

Doğru tuning ile %5-15 CPU artışı. Statik dosya bypass, audit log RelevantOnly, Hyperscan engine, body limit konservatif → 1000+ rps endpoint'lerde sorunsuz. Test: wrk -t8 -c200 -d60s öncesi/sonrası karşılaştırma.

CRS PL1 ile başlasam yeterli mi?

WordPress/Joomla/Drupal gibi CMS'ler için PL1 + Imunify360 yeterli. Custom uygulama, finans/sağlık API, kullanıcı verisi yoğun ise PL2'ye çık. PL3-4 sadece yüksek-risk endpoint için.

"Mod Security: Access denied with code 403" hatası alıyorum, debug nasıl?

tail -f /var/log/modsec_audit.log | grep -A 20 "engine_state\|Pattern match\|Match"

Section H'deki [id "..."] numarasını bulup ya SecRuleRemoveById ile bypass et ya da kuralı incele.

Imunify360 ile ModSecurity birlikte mi kullanılır?

Imunify360 zaten ModSecurity'yi yönetir — ek kural seti (CRS + Comodo + custom) bundle eder. Manuel ModSecurity yapılandırması Imunify ile çakışır; her ikisini birden kurmayın.

Reverse proxy arkasında gerçek IP nasıl loglanır?

SecRule REMOTE_ADDR "@ipMatch 10.0.0.0/8" \
  "id:1100,phase:1,pass,nolog,setvar:tx.real_ip=%{REQUEST_HEADERS.X-Forwarded-For}"

veya Apache'da mod_remoteip aktif et — ModSecurity REMOTE_ADDR'ı düzgün okur.

Türkiye'de KVKK için WAF logları kişisel veri mi?

IP adresi + URI + user-agent kişisel veri kapsamında değerlendirilebilir. Audit log saklama süresi: max 6-12 ay, kişisel verilerin gerekmediği durumda anonimleştirme. Şirket içi politika dokümanına dahil edin.

ModSecurity ücretsiz mi, ticari versiyonu var mı?

Açık kaynak (Apache 2.0 lisansı) — ücretsiz. Ticari destek için Trustwave SpiderLabs (orijinal yazar) veya Atomicorp (yönetilen kural setleri + 7/24 destek) kontratları mevcut.

Büyükweb'de ModSecurity

Büyükweb cPanel hosting tüm paketlerde ModSecurity + OWASP CRS default aktiftir. Genel paket bazlı durum:

  • Web hosting — ModSecurity PL1, Imunify360 ile yönetimli, varsayılan açık
  • VDS sunucu — kullanıcı yönetiminde, root erişimi ile özel kural yazabilirsiniz
  • WordPress hosting — wp-admin için pre-configured exception listesi
  • Reseller hosting — son müşteriler kendi domain'leri için kapatabilir

WAF yapılandırmada destek için 7/24 hattımız: 0850 302 60 70.

İlgili Rehberler

İlgili Büyükweb Hizmetleri

Sunucu ve site güvenliğini ciddiye alanlar için Türkiye Tier 3 veri merkezimizdeki paketler:

Sorularınız için 0850 302 60 70 numaralı destek hattımıza veya iletişim sayfamıza yazabilirsiniz.

Güvenlik & SSL İlgili Hizmetlerimiz

Bu yazıda anlatılan teknik konuyu profesyonel altyapıyla deneyimleyin

Etiketler:

#modsecurity#waf#owasp#kurulum rehberi#güvenlik#ssl

Bu yazıyı paylaş