ModSecurity, web sunucusunun içinde çalışan açık kaynak bir web uygulama güvenlik duvarı (WAF) motorudur. HTTP isteklerini ve yanıtlarını SecRules (SecLang) dilinde yazılmış kurallara göre inceler; eşleşme olduğunda isteği loglayabilir veya engelleyebilir. Coraza ise aynı kural dilini destekleyen, Go ile yazılmış açık kaynak bir WAF motorudur. İkisi de kendi başına saldırı bilgisi taşımaz; korumayı çoğunlukla OWASP CRS (Core Rule Set) adlı genel amaçlı kural seti sağlar.

Bu yazıda ModSecurity v3'ü (libmodsecurity) Nginx ile kullanmanın mantığını, Coraza'nın nerede durduğunu, CRS paranoia seviyelerini, DetectionOnly ile On modları arasındaki farkı ve yanlış pozitif (false positive) ayarlamasını resmi belgelerden alınmış kısa örneklerle anlatıyoruz. Firewall kavramlarına yabancıysanız önce güvenlik duvarı (firewall) nedir yazısını okuyun.

Bileşenler: motor, bağlayıcı ve kural seti

Bileşenler: motor, bağlayıcı ve kural seti: libmodsecurity (ModSecurity v3), ModSecurity-nginx, OWASP CRS, Coraza
BileşenNe işe yararProje sayfasında belirtilen lisans
libmodsecurity (ModSecurity v3)SecRules kurallarını yükleyip bağlayıcının verdiği HTTP içeriğine uygulayan kütüphaneApache-2.0
ModSecurity-nginxlibmodsecurity ile Nginx arasındaki bağlayıcı (connector) modülApache-2.0
OWASP CRSModSecurity veya uyumlu WAF motorları için genel saldırı tespit kurallarıOkunan sayfalarda belirtilmiyor
CorazaGo ile yazılmış, SecLang kurallarını destekleyen WAF motoruApache-2.0

ModSecurity v3 ve proje durumu

ModSecurity deposu bugün GitHub'da owasp-modsecurity organizasyonu altında yer alıyor ve güvenlik bildirimleri için OWASP'a ait bir e-posta adresi veriliyor. README'de geliştirmenin Trustwave sponsorluğunda yapıldığı ve bu sponsorluğun 1 Temmuz 2024'te sona ereceği yazıyor. Projenin lisansı depoda Apache-2.0 olarak gösteriliyor.

README'ye göre libmodsecurity, ModSecurity v3 projesinin bir bileşenidir ve ModSecurity platformunun Apache bağımlılığı olmayan, baştan yazılmış (C++17) halidir. Kütüphane, SecRules biçimindeki kuralları yükler ve bağlayıcıların (connector) sağladığı HTTP içeriğine uygular. Apache modülü olan eski v2.x dalı ise ayrı bir dalda bakımda ve erişilebilir durumda.

ModSecurity-nginx bağlayıcısı

Nginx bağlayıcısı ayrı bir GitHub projesi olarak tutuluyor. Önce libmodsecurity kurulmalı, ardından Nginx kaynak dizininde modül derlenmelidir. README'deki iki seçenek:

bash
# statik modül
./configure --add-module=/path/to/ModSecurity-nginx

# dinamik modül
./configure --add-dynamic-module=/path/to/ModSecurity-nginx --with-compat

Dinamik modülde README, derlediğiniz Nginx kaynak sürümünün çalıştırdığınız Nginx sürümüyle aynı olması gerektiğini belirtiyor. Dinamik modül nginx.conf'un en üstünde şöyle yüklenir (CRS belgesindeki satır):

nginx
load_module modules/ngx_http_modsecurity_module.so;

Modülün dört direktifi vardır ve hepsi http, server ve location bağlamlarında kullanılabilir:

DirektifGörevi
modsecurity on | offModülü açar veya kapatır (varsayılan off)
modsecurity_rules_fileBir kural/yapılandırma dosyasını yükler
modsecurity_rulesKuralları doğrudan Nginx yapılandırmasına gömer
modsecurity_transaction_idİşlem kimliğini Nginx tarafında belirler (ör. log eşleştirme için)

README'deki örneğin sadeleştirilmiş hali:

nginx
server {
    modsecurity on;
    location / {
        root /var/www/html;
        modsecurity_rules_file /etc/my_modsecurity_rules.conf;
    }
}

Nginx server block yapısına yabancıysanız Nginx yapılandırma rehberi yazısına bakabilirsiniz.

DetectionOnly mi, On mu?

DetectionOnly mi, On mu? Kuralları işler, Kuralları işlemez, DetectionOnly

ModSecurity'nin davranışını SecRuleEngine direktifi belirler. v3 başvuru kılavuzuna göre sözdizimi SecRuleEngine On|Off|DetectionOnly, varsayılan değer ise Off'tur:

DeğerDavranış (Reference Manual v3.x)
OnKuralları işler
OffKuralları işlemez
DetectionOnlyKuralları işler ama block, deny, drop, allow, proxy ve redirect gibi kesintiye yol açan (disruptive) eylemleri hiçbir zaman uygulamaz

Projenin önerilen yapılandırma dosyası modsecurity.conf-recommended da bu yüzden DetectionOnly ile başlar ve açıklamasında, kurulum sonrası kesinti riskini en aza indirmek için başlangıçta yalnızca tespit modunun kullanılmasını önerir:

apache
SecRuleEngine DetectionOnly
SecRequestBodyAccess On
SecAuditEngine RelevantOnly

Aynı dosyadaki açıklamaya göre SecRequestBodyAccess kapalı olursa ModSecurity POST parametrelerini göremez. SecAuditEngine RelevantOnly ise bir kuralın işaretlediği işlemleri ve sunucu hatası üreten istekleri audit log'a yazar.

OWASP CRS: kural seti

CRS sitesi projeyi "ModSecurity veya uyumlu WAF'larla kullanılmak üzere genel saldırı tespit kuralları" olarak tanımlıyor; hedefi OWASP Top Ten dahil saldırılara karşı en az yanlış alarmla koruma sağlamak. 3 Kasım 2026 itibarıyla resmi sitede en güncel sürüm 4.30.0, uzun süreli destek (LTS) sürümü 4.25.2 olarak gösteriliyor; 3.3.x serisinin ise ömrünü tamamladığı (end of life) belirtiliyor.

CRS belgesine göre Nginx için yükleme sırası şöyledir (dizin yolunu kendi kurulumunuza göre değiştirin):

apache
Include modsecurity.d/modsecurity.conf
Include /etc/nginx/coreruleset/crs-setup.conf
Include /etc/nginx/coreruleset/plugins/*-config.conf
Include /etc/nginx/coreruleset/plugins/*-before.conf
Include /etc/nginx/coreruleset/rules/*.conf
Include /etc/nginx/coreruleset/plugins/*-after.conf

Bu satırları bir dosyada toplayıp Nginx'te modsecurity_rules_file ile o dosyayı göstermek yaygın bir düzendir. Kullanmak istediğiniz CRS eklentilerini (plugin) de ayrıca dahil etmeniz gerektiğini CRS belgesi hatırlatıyor.

Paranoia seviyeleri

CRS kurallarını dört paranoia seviyesine (PL) ayırır. Seviye yükseldikçe daha fazla kural devreye girer ve yanlış pozitif ihtimali artar:

SeviyeCRS belgesindeki tanım
PL 1İnternetteki her HTTP sunucusu için temel koruma; yanlış alarm nadirdir. Varsayılan seviye.
PL 2Gerçek kullanıcı verisi işleyen siteler (ör. online mağaza) için ek kurallar; ayarlama gerektiren bazı yanlış pozitifler beklenir.
PL 3Online bankacılık gibi yüksek güvenlik gerektiren servisler; yanlış pozitifler kabul edilir ve beklenir.
PL 4En sıkı seviye; neredeyse her saldırıyı yakalar ama çok fazla meşru trafiği de işaretler, risk size aittir.

Seviye crs-setup.conf içindeki 900000 numaralı kuralla ayarlanır. Örnek dosyadaki yorum satırı halindeki kuralın açılmış hali (ver etiketi kullandığınız sürüme göre farklıdır):

apache
SecAction \
    "id:900000,\
    phase:1,\
    pass,\
    t:none,\
    nolog,\
    tag:'OWASP_CRS',\
    setvar:tx.blocking_paranoia_level=1"

Örnek dosyaya göre tx.detection_paranoia_level değerine kadar olan kurallar çalışır, ancak yalnızca tx.blocking_paranoia_level değerine kadar olanlar anomali puanını etkiler. Varsayılan olarak detection seviyesi blocking seviyesine eşittir ve ondan düşük olamaz. Bu sayede bir üst seviyeyi engelleme yapmadan, sadece gözlem için çalıştırabilirsiniz. Anomali puanı eşikleri de aynı dosyada 900110 numaralı kuralla (tx.inbound_anomaly_score_threshold ve tx.outbound_anomaly_score_threshold) ayarlanır.

Yanlış pozitif (false positive) ayarlama

Yanlış pozitif (false positive) ayarlama: Configure-time, Runtime

Yanlış pozitif, meşru bir isteğin genel bir CRS kuralı tarafından saldırı sanılmasıdır. CRS belgesi çözüm olarak CRS dosyalarını düzenlemeyi değil, kural istisnası (rule exclusion) yazmayı öneriyor; çünkü CRS dosyalarındaki değişiklikler her güncellemede ezilir. İstisnalar iki türdür:

TürNe zaman uygulanırNereye yazılır
Configure-timeSunucu yapılandırmayı yüklerken bir kezCRS include satırından sonra (kuralın önce var olması gerekir)
RuntimeHer işlemde (transaction) ayrı ayrıCRS include satırından önce (kural çalışmadan değiştirilmeli)

Configure-time örneği: uygulamanız PHP kullanmıyorsa CRS belgesindeki gibi 933151 numaralı kuralı tamamen kaldırabilirsiniz:

apache
SecRuleRemoveById 933151

Runtime örneği: belgedeki örnekte yalnızca /dynamic/new_post adresine gelen isteklerde text_input parametresi 941150 numaralı XSS kuralının dışında bırakılıyor:

apache
# CRS Rule Exclusion: 941150 - XSS Filter - Category 5: Disallowed HTML Attributes
SecRule REQUEST_URI "@beginsWith /dynamic/new_post" \
    "id:1020,\
    phase:1,\
    pass,\
    t:none,\
    nolog,\
    ctl:ruleRemoveTargetById=941150;ARGS:text_input"

CRS belgesi ayrıca bazı popüler web uygulamaları için hazır istisna paketleri bulunduğunu belirtiyor. Mümkün olduğunda bütün kuralı kapatmak yerine yalnızca ilgili parametreyi ve adresi hedefleyen dar istisnalar yazın.

Coraza: Go ile yazılmış alternatif

OWASP Coraza, coraza.io'da "API'ler ve web uygulamaları için açık kaynak web uygulama güvenlik duvarı" olarak tanımlanıyor ve OWASP Production Project olarak listeleniyor. GitHub deposunda lisans Apache-2.0 olarak gösteriliyor; proje ModSecurity SecLang kural setlerini desteklediğini ve OWASP Core Rule Set v4 ile "%100 uyumlu" olduğunu belirtiyor.

Coraza'nın GitHub sayfasında listelenen entegrasyonlar ve durumları:

EntegrasyonDurum (GitHub README)
Caddy eklentisiKararlı, bakımcı aranıyor
Proxy-WASM (Envoy vb.)Kararlı, geliştirme sürüyor
Traefik WASMDeneysel
HAProxy SPOEDeneysel
libcoraza (Nginx ve diğerleri için C kütüphanesi)Deneysel

Sınırlar ve ne zaman başka çözüm gerekir?

  • ModSecurity veya Coraza uygulama katmanında çalışır; ağ katmanındaki hacimsel DDoS saldırılarını durduramaz. Bunun için DDoS koruma rehberi yazısına bakın.
  • Kural motoru ek işlemci yükü getirir; paranoia seviyesini artırmadan önce sunucu kaynaklarını izleyin.
  • Bot yönetimi, hesap ele geçirme koruması ve yönetilen kural güncellemesi gibi özellikler ticari ürünlerde hazır gelir. Örnekler: Cloudflare WAF, FortiWeb, F5 BIG-IP Advanced WAF, Imperva WAF, Barracuda WAF.
  • WAF tek başına yeterli değildir; sunucu tarafında SSH sertleştirme ve güncelleme disiplini için VPS güvenlik sertleştirme yazısına bakın.

Sık Sorulan Sorular

ModSecurity ücretsiz mi?

Evet, açık kaynaktır. GitHub deposunda lisans Apache-2.0 olarak gösteriliyor. Nginx bağlayıcısı ve Coraza da Apache-2.0 lisanslı olarak listeleniyor.

ModSecurity projesi hâlâ geliştiriliyor mu?

Depo GitHub'da owasp-modsecurity organizasyonu altında duruyor ve güvenlik bildirimleri OWASP adresine yönlendiriliyor. README, Trustwave sponsorluğunun 1 Temmuz 2024'te sona erdiğini belirtiyor. Güncel sürüm ve değişiklikler için deponun release sayfasını takip edin.

DetectionOnly modunda saldırılar engellenir mi?

Hayır. DetectionOnly kuralları işler ve eşleşmeleri loglar, ancak block, deny, drop gibi kesintiye yol açan eylemleri uygulamaz. Engelleme için SecRuleEngine On gerekir.

Hangi paranoia seviyesini seçmeliyim?

CRS'de varsayılan PL 1'dir ve CRS belgesi bunu internetteki her HTTP sunucusu için temel koruma olarak tanımlıyor. Kullanıcı verisi işleyen siteler için PL 2 öneriliyor, ancak ek ayarlama gerektirir.

Coraza ModSecurity yerine kullanılabilir mi?

Coraza kendini ModSecurity yerine kullanılabilecek (drop-in replacement) bir motor olarak tanımlıyor ve SecLang ile CRS v4'ü destekliyor. Ancak Nginx bağlayıcısı deneysel olduğundan Nginx'te kullanmadan önce durumunu kontrol edin.

Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.

İlgili içerikler: Güvenlik duvarı nedir · Cloudflare WAF kuralları · FortiWeb nedir · F5 BIG-IP Advanced WAF nedir · Imperva WAF nedir · Barracuda WAF nedir · Nginx yapılandırma rehberi · IDS/IPS nedir