ModSecurity WAF ile Apache ve Nginx Altyapılarında Gelişmiş Güvenlik Katmanı Oluşturma

 · 

ModSecurity WAF ile Apache ve Nginx Altyapılarında Gelişmiş Güvenlik Katmanı Oluşturma

ModSecurity WAF ile Apache ve Nginx Altyapılarında Gelişmiş Güvenlik Katmanı Oluşturma

Web uygulamalarının karmaşıklığı, sürekli değişen tehdit ortamıyla birleştiğinde, geleneksel ağ güvenlik çözümleri yetersiz kalabilmektedir. Özellikle Apache ve Nginx gibi yaygın web sunucuları üzerinde barındırılan uygulamaların, uygulama katmanı saldırılarına karşı korunması, kritik bir gerekliliktir. Bu noktada ModSecurity, açık kaynaklı bir Web Uygulama Güvenlik Duvarı (WAF) olarak, HTTP/S trafiğini derinlemesine analiz ederek ve önceden tanımlanmış kurallara göre kötü niyetli istekleri engelleyerek önemli bir savunma mekanizması sunar.

ModSecurity'nin Temel İşleyiş Prensibi

ModSecurity, web sunucusu ile uygulama arasına bir güvenlik katmanı ekleyerek çalışır. Gelen her HTTP isteğini ve giden her yanıtı gerçek zamanlı olarak inceler. Bu inceleme sırasında, OWASP Core Rule Set (CRS) gibi önceden tanımlanmış kural setlerini veya özel olarak yazılmış kuralları kullanarak bilinen saldırı vektörlerini (SQL Enjeksiyonu, Cross-Site Scripting (XSS), uzaktan kod çalıştırma, dosya dahil etme vb.) tespit eder ve durdurur. İstekler, Header, URL, Query String, POST gövdesi gibi çeşitli parametreler üzerinden değerlendirilir.

Apache ile ModSecurity Entegrasyonu

Apache HTTP Sunucusu ile ModSecurity entegrasyonu, genellikle bir Apache modülü (

mod_security2
) aracılığıyla gerçekleşir. Bu entegrasyon, sunucu konfigürasyonuna doğrudan müdahale etme ve esnek kural yönetimi imkanı sunar.

Kurulum ve Temel Konfigürasyon

Çoğu Linux dağıtımında, ModSecurity modülü paket yöneticisi aracılığıyla kolayca kurulabilir:

sudo apt-get update && sudo apt-get install libapache2-mod-security2 # Debian/Ubuntu
sudo yum install mod_security # RHEL/CentOS

Kurulumun ardından, modülün etkinleştirilmesi ve temel yapılandırma dosyalarının ayarlanması gerekir. Genellikle

/etc/modsecurity/
dizini altında bulunan
modsecurity.conf
ve
crs-setup.conf
gibi dosyalar temel ayarları içerir. CRS kurallarını etkinleştirmek için, Apache ana konfigürasyon dosyasında (örn.
apache2.conf
veya
httpd.conf
) veya site bazında sanal host konfigürasyonunda aşağıdaki gibi include direktifleri kullanılır:

<IfModule security2_module>
  SecRuleEngine On
  IncludeOptional /etc/modsecurity/*.conf
  IncludeOptional /usr/share/modsecurity-crs/*.conf
  IncludeOptional /usr/share/modsecurity-crs/rules/*.conf
</IfModule>

Burada

SecRuleEngine On
direktifi, ModSecurity motorunu etkinleştirir.
IncludeOptional
direktifleri ise ana ModSecurity yapılandırma dosyasını ve OWASP CRS kurallarını yükler.

Nginx ile ModSecurity Entegrasyonu

Nginx, ModSecurity'yi doğrudan bir modül olarak desteklemez. Nginx ile ModSecurity kullanmak için, Nginx'in ModSecurity konnektörü ile kaynak koddan derlenmesi veya Dynamic Module Loading (DSO) kullanılması gerekir. Bu, Nginx'in yüksek performanslı yapısını korurken WAF yeteneklerini de bünyesine katmasını sağlar.

Kurulum ve Temel Konfigürasyon

Nginx'i ModSecurity desteğiyle derlemek için aşağıdaki adımlar izlenir:

# ModSecurity kaynak kodunu indirin ve derleyin (libmodsecurity3)
git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity
cd ModSecurity
git submodule init
git submodule update
./build.sh
./configure
make -j $(nproc)
sudo make install

# Nginx ModSecurity konnektörünü indirin
git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git

# Nginx kaynak kodunu indirin ve ModSecurity modülüyle derleyin
cd nginx-<version>
./configure --with-compat --add-dynamic-module=/path/to/ModSecurity-nginx # --with-compat DSO için
make modules
sudo make install # veya modülleri manuel kopyalayın

Nginx konfigürasyonuna (örn.

nginx.conf
içinde
http
bloğuna veya
server
bloğuna) ModSecurity modülünü yüklemek ve etkinleştirmek için aşağıdaki direktifler eklenir:

load_module modules/ngx_http_modsecurity_module.so;

http {
    # ... diğer http direktifleri ...
    modsecurity on;
    modsecurity_rules_file /etc/nginx/modsec/main.conf;
    # ...
}

/etc/nginx/modsec/main.conf
dosyası, tıpkı Apache'deki gibi ana ModSecurity yapılandırmasını ve CRS kurallarını içermelidir.

OWASP Core Rule Set (CRS) ve Kural Yönetimi

ModSecurity'nin gücünün büyük bir kısmı OWASP CRS'den gelir. Bu kural seti, dünya genelinde bilinen birçok web saldırısı vektörüne karşı genel koruma sağlar. CRS'nin doğru bir şekilde yapılandırılması, optimum güvenlik seviyesi için kritik öneme sahiptir.

CRS kuralları genellikle

SecRuleEngine DetectionOnly
modunda başlatılır ve false positive'ler analiz edildikten sonra
On
moduna alınır. Kural setleri içinde seviyeler (paranoia levels) bulunur ve daha yüksek seviyeler daha fazla kuralı etkinleştirerek daha agresif koruma sağlar ancak false positive riskini artırır.

Örnek ModSecurity Kuralı

ModSecurity kuralları,

SecRule
direktifi ile tanımlanır. Aşağıdaki örnek, belirli bir URL'ye yapılan isteklerde 'admin' kelimesinin 'UNION SELECT' ile birlikte kullanılmasını engelleyen basit bir SQL enjeksiyon kuralıdır:

SecRule REQUEST_URI "@contains /admin/login" \
         "id:1001,phase:2,deny,status:403,log,auditlog,msg:'Potansiyel SQL Enjeksiyonu Tespit Edildi', \
         chain"
SecRule ARGS "@rx (?i:union\s+select)" "msg:'SQLi Keyword Detected'"

Bu kural,

/admin/login
içeren bir URI'ye yapılan istekte,
ARGS
(istek parametreleri) içinde 'union select' ifadesini arar. Eğer eşleşme olursa, isteği 403 HTTP hatası ile reddeder ve olayı loglar.

Gerçek Üretim Senaryoları ve Çözümleri

Senaryo 1: Dinamik İçerik Yönetim Sistemleri (CMS) için SQL Enjeksiyon Koruması

Büyük bir e-ticaret platformu, Apache üzerinde WordPress ile çalışıyor ve ürün arama formları üzerinden potansiyel SQL enjeksiyonu tehditleri alıyor. Standart CRS kuralları çoğu saldırıyı engellese de, bazen özel olarak hazırlanmış ve maskelenmiş enjeksiyon denemeleri mevcut kuralları aşabilir. Bu durumda, ModSecurity'ye özel, daha agresif SQL enjeksiyon kuralları eklemek gerekir.

Çözüm:

Belirli arama parametrelerinde (örn.

search_query
) yoğunlaşan ve şüpheli SQL anahtar kelimelerini (
OR 1=1
,
--
,
'
) içeren istekleri hedefleyen özel bir kural yazılabilir. OWASP CRS'in
942100
serisi gibi SQL enjeksiyon kurallarını daha yüksek hassasiyetle yapılandırmak veya belirli URL'ler için özel eklemeler yapmak faydalıdır.

SecRule ARGS:search_query "@detectSQLi" \
         "id:200001,phase:2,deny,status:403,log,auditlog,msg:'E-ticaret SQLi Tespit Edildi: Arama Formu'"

Bu kural, doğrudan

search_query
argümanını
@detectSQLi
operatörü ile analiz ederek bilinen SQL enjeksiyon paternlerini yakalar.

Senaryo 2: API Gateway Önünde Nginx ile Brute-Force ve DDoS Koruması

Bir Nginx sunucusu, birçok mikroservisin önünde bir API Gateway olarak görev yapıyor. Belirli bir login API endpoint'ine (örn.

/api/v1/auth/login
) yönelik yoğun ve başarısız deneme istekleri (brute-force) veya kaynak tüketimine yönelik basit DDoS atakları alınıyor.

Çözüm:

ModSecurity'nin persistent koleksiyonları ve dönüşüm fonksiyonları kullanılarak IP tabanlı rate limiting (oran sınırlama) uygulanabilir. Belirli bir zaman diliminde başarısız login denemesi sayısı belirli bir eşiği aşan IP adresleri geçici olarak engellenir.

SecRule REQUEST_URI "@streq /api/v1/auth/login" \
         "id:200002,phase:1,setvar:ip.login_attempts=+1,expirevar:ip.login_attempts=60, \
         pass,nolog,noauditlog"
SecRule IP:login_attempts "@gt 5" \
         "id:200003,phase:1,deny,status:429,log,auditlog,msg:'Brute-Force Tespit Edildi: IP Kaynağından Çok Sayıda Başarısız Login'"

Bu kurallar dizisi,

/api/v1/auth/login
adresine yapılan her isteği sayar ve her istekte
ip.login_attempts
değişkenini artırır. Eğer 60 saniye içinde aynı IP'den gelen istek sayısı 5'i aşarsa, istek 429 (Too Many Requests) hatası ile engellenir.

Senaryo 3: False Positive Yönetimi ve İstisna Kuralları

Uygulamada yasal bir işlem, ModSecurity tarafından yanlışlıkla kötü niyetli olarak algılanıyor ve engelleniyor. Örneğin, bir metin editörü aracılığıyla HTML içeriği kaydedilirken, ModSecurity'nin XSS kuralları tetiklenebiliyor.

Çözüm:

ModSecurity'nin audit logları incelenerek hangi kuralın tetiklendiği tespit edilir (

id
numarası). Ardından, belirli bir URL veya parametre için o kuralın devre dışı bırakılması sağlanır. Bu işlem, genellikle
SecRuleRemoveById
veya
SecRuleUpdateTargetById
direktifleri ile yapılır.

# /admin/posts/edit URL'si için 941100 (XSS) kuralını devre dışı bırak
SecRule REQUEST_URI "@streq /admin/posts/edit" \
         "id:200004,phase:1,pass,nolog,noauditlog,ctl:ruleEngine=Off, \
         chain"
SecRule REQUEST_METHOD "@streq POST" \
         "ctl:ruleRemoveById=941100"

Bu örnek,

/admin/posts/edit
URL'sine yapılan POST isteklerinde (CMS'de bir gönderiyi düzenleme işlemi gibi) 941100 numaralı XSS kuralını kaldırır. Bu, spesifik bir senaryoda uygulamanın doğru çalışmasını sağlarken, diğer tüm senaryolarda XSS korumasını aktif tutar.

Performans Etkisi ve Optimizasyon

ModSecurity, her isteği incelediği için bir performans yükü getirebilir. Bu yükü minimize etmek için bazı stratejiler uygulanabilir:

  • Kural Seti Optimizasyonu: Sadece gerçekten ihtiyaç duyulan CRS seviyelerini ve özel kuralları etkinleştirin. Gereksiz veya çakışan kuralları kaldırın.
  • İstisna Yönetimi: Güvenli olduğu bilinen iç IP'ler veya belirli uygulama yolları için ModSecurity'yi devre dışı bırakın (
    SecRuleEngine Off
    ).
  • Verimli Kural Yazımı: RegEx ifadeleri yerine daha hızlı çalışan string eşleştirme operatörlerini (@streq, @contains) tercih edin.
  • Audit Log Seviyesi: Audit log seviyesini dikkatli seçin. Her isteğin tüm detaylarıyla loglanması, disk I/O'sunu artırarak performansı düşürebilir.

Sonuç

ModSecurity WAF, Apache ve Nginx tabanlı web altyapıları için vazgeçilmez bir güvenlik katmanıdır. Doğru bir kurulum ve sürekli optimizasyon ile, web uygulamalarınızı OWASP Top 10 ve diğer gelişen tehditlere karşı güçlü bir şekilde koruyabilir. Üretim ortamlarında karşılaşılacak senaryoları öngörerek proaktif kural yönetimi ve false positive'lerin dikkatli analizi, WAF'ın etkinliğini ve güvenilirliğini maksimize etmenin anahtarıdır. Bu sayede, modern siber saldırıların karşısında dirençli ve kesintisiz hizmet veren web servisleri inşa etmek mümkün hale gelir.

← Blog Listesine Dön