OpenLiteSpeed mod_security ile WAF Entegrasyonu

Web sunucunuza gelen trafiğin ne kadarının gerçek kullanıcılardan, ne kadarının saldırı girişimlerinden oluştuğunu hiç merak ettiniz mi? Gerçek dünyada çalışan bir web sunucusunda bu oran sizi şaşırtabilir. OpenLiteSpeed kullanıyorsanız ve henüz WAF entegrasyonu yapmadıysanız, sunucunuz adeta kapısı açık bir ev gibi duruyor demektir. Bu yazıda OpenLiteSpeed üzerinde mod_security ile WAF kurulumunu, konfigürasyonunu ve gerçek dünya senaryolarında nasıl kullanacağınızı adım adım anlatacağım.

OpenLiteSpeed ve mod_security: Neden Bu İkili?

OpenLiteSpeed, LiteSpeed Technologies’in açık kaynak web sunucusudur ve özellikle WordPress ile PHP tabanlı uygulamalarda Apache’den çok daha iyi performans sunar. Ancak performans tek başına yeterli değil. Güvenlik katmanı olmadan hızlı bir sunucu, hızlı ele geçirilen bir sunucu anlamına gelir.

mod_security ise sektörün en yaygın kullanılan açık kaynak WAF (Web Application Firewall) motorudur. OWASP Core Rule Set (CRS) ile birlikte kullanıldığında SQL injection, XSS, RFI, LFI ve daha onlarca saldırı tipine karşı koruma sağlar. OpenLiteSpeed, mod_security’yi native olarak destekler ve bu entegrasyon Apache’deki kadar sancılı değildir, neyse ki.

Neler öğreneceğiz:

  • mod_security kurulumu ve OpenLiteSpeed entegrasyonu
  • OWASP CRS konfigürasyonu
  • Detection-only moddan prevention moduna geçiş
  • Yanlış pozitif (false positive) yönetimi
  • Gerçek saldırı senaryolarında log analizi
  • Performans optimizasyonu

Ön Gereksinimler

Yazı boyunca Ubuntu 22.04 ve OpenLiteSpeed 1.7.x üzerinde çalışacağız. Farklı bir dağıtım kullanıyorsanız paket manager komutlarını uyarlayın, geri kalan her şey aynı kalacak.

Başlamadan önce sisteminizde şunların kurulu olduğundan emin olun:

# OpenLiteSpeed versiyon kontrolü
/usr/local/lsws/bin/lshttpd -v

# Sistem güncellemesi
apt update && apt upgrade -y

# Gerekli araçlar
apt install -y git wget curl build-essential

mod_security Kurulumu

OpenLiteSpeed için mod_security’yi iki farklı şekilde kurabilirsiniz: paket yöneticisi üzerinden veya kaynak koddan derleyerek. Paket yöneticisi yolunu tercih ediyorum çünkü güncellemeleri takip etmek çok daha kolay.

# mod_security kurulumu
apt install -y libmodsecurity3 libmodsecurity-dev

# mod_security versiyon kontrolü
dpkg -l | grep modsecurity

# OpenLiteSpeed mod_security modülünü kur
apt install -y ols-modsecurity

# Alternatif olarak LiteSpeed reposundan
wget -O - https://repo.litespeed.sh | bash
apt install -y ols-modsecurity

Kurulum sonrasında modülün doğru yüklendiğini kontrol edin:

# Modülün varlığını kontrol et
ls -la /usr/local/lsws/modules/ | grep modsecurity

# Beklenen çıktı
# mod_security.so veya modsec.so dosyasını görmeli
ls /usr/local/lsws/modules/mod_security.so

OWASP Core Rule Set Kurulumu

mod_security’nin kendisi sadece bir motor. Asıl kurallar OWASP CRS ile geliyor. Bu kurallar düzenli olarak güncelleniyor ve bilinen saldırı vektörlerinin büyük çoğunluğunu kapsıyor.

# OWASP CRS'i indir
cd /usr/local/lsws/

mkdir -p modsec
cd modsec

# En güncel CRS versiyonunu GitHub'dan çek
git clone https://github.com/coreruleset/coreruleset.git owasp-crs

# Temel konfigürasyon dosyasını oluştur
cp owasp-crs/crs-setup.conf.example owasp-crs/crs-setup.conf

# mod_security ana konfigürasyon dosyası
cat > /usr/local/lsws/modsec/modsecurity.conf << 'EOF'
# mod_security temel konfigürasyonu
SecRuleEngine DetectionOnly

# Request body işleme
SecRequestBodyAccess On
SecRequestBodyLimit 13107200
SecRequestBodyNoFilesLimit 131072

# Response body işleme
SecResponseBodyAccess On
SecResponseBodyMimeType text/plain text/html text/xml
SecResponseBodyLimit 524288

# Log ayarları
SecAuditEngine RelevantOnly
SecAuditLogRelevantStatus "^(?:5|4(?!04))"
SecAuditLog /usr/local/lsws/logs/modsec_audit.log
SecAuditLogParts ABIJDEFHZ
SecAuditLogType Serial

# Debug log (production'da kapatın)
SecDebugLog /usr/local/lsws/logs/modsec_debug.log
SecDebugLogLevel 0

# Geçici dosya yolları
SecTmpDir /tmp/
SecDataDir /tmp/

# PCRE limitleri
SecPcreMatchLimit 1000
SecPcreMatchLimitRecursion 1000
EOF

OpenLiteSpeed’de mod_security Aktivasyonu

Şimdi OpenLiteSpeed’e mod_security’yi tanıtalım. Bu işlemi hem web admin panelinden hem de konfigürasyon dosyaları üzerinden yapabilirsiniz. Dosya yolunu tercih ediyorum çünkü versiyon kontrolü altında tutmak çok daha kolay.

# OpenLiteSpeed konfigürasyon dizini
ls /usr/local/lsws/conf/

# httpd_config.conf dosyasını düzenle
nano /usr/local/lsws/conf/httpd_config.conf

httpd_config.conf dosyasına şu bloğu ekleyin:

# httpd_config.conf içine eklenecek mod_security bloğu
module mod_security {
  modsecurity  on
  modsecurity_rules_file  /usr/local/lsws/modsec/modsecurity.conf
}

# Virtual host konfigürasyonuna da eklenmesi gerekiyor
# /usr/local/lsws/conf/vhosts/SITEADI/vhconf.conf

Virtual host konfigürasyonunu düzenleyelim:

# Örnek virtual host konfigürasyonu
cat >> /usr/local/lsws/conf/vhosts/example.com/vhconf.conf << 'EOF'

module mod_security {
  modsecurity  on
  modsecurity_rules_file  /usr/local/lsws/modsec/modsecurity.conf
  modsecurity_rules_file  /usr/local/lsws/modsec/owasp-crs/crs-setup.conf
  modsecurity_rules_dir   /usr/local/lsws/modsec/owasp-crs/rules/
}
EOF

# Konfigürasyonu test et
/usr/local/lsws/bin/lshttpd -t

# Servisi yeniden başlat
systemctl restart lsws
# veya
/usr/local/lsws/bin/lswsctrl restart

Detection Mode’dan Prevention Mode’a Geçiş

Yeni kurulum yapıyorsanız kesinlikle önce DetectionOnly modda çalışın. Bu mod trafiği engellemez, sadece loglar. En az 1-2 hafta bu modda çalıştırın ve false positive oranını analiz edin.

# Log analizini başlat
tail -f /usr/local/lsws/logs/modsec_audit.log

# Son 100 uyarıyı listele
grep -i "warning|error" /usr/local/lsws/logs/modsec_audit.log | tail -100

# En çok tetiklenen kuralları bul
grep "id:" /usr/local/lsws/logs/modsec_audit.log | 
  grep -oP 'id "K[^"]+' | 
  sort | uniq -c | sort -rn | head -20

Analiz sonucunda güvenli olduğuna emin olduktan sonra prevention moduna geçin:

# modsecurity.conf dosyasını düzenle
sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' 
  /usr/local/lsws/modsec/modsecurity.conf

# Servisi yeniden başlat
systemctl restart lsws

Gerçek Dünya Senaryosu: WordPress Sitesi Koruması

Diyelim ki müşterinizin WordPress sitesine sürekli brute force ve SQL injection denemeleri geliyor. Bu gerçekten çok yaygın bir senaryo. İşte bu duruma özel konfigürasyon:

# WordPress için özel kural dosyası oluştur
cat > /usr/local/lsws/modsec/custom-wordpress.conf << 'EOF'
# WordPress login brute force koruması
SecRule REQUEST_URI "@contains /wp-login.php" 
    "id:10001, 
    phase:1, 
    pass, 
    nolog, 
    initcol:ip=%{REMOTE_ADDR}, 
    setvar:ip.login_count=+1, 
    expirevar:ip.login_count=60"

# Dakikada 10'dan fazla login denemesi engelle
SecRule IP:LOGIN_COUNT "@gt 10" 
    "id:10002, 
    phase:1, 
    deny, 
    status:429, 
    log, 
    msg:'WordPress brute force detected', 
    logdata:'IP: %{REMOTE_ADDR}, Count: %{ip.login_count}'"

# xmlrpc.php saldırı koruması (kullanmıyorsanız tamamen engelle)
SecRule REQUEST_URI "@streq /xmlrpc.php" 
    "id:10003, 
    phase:1, 
    deny, 
    status:403, 
    log, 
    msg:'xmlrpc.php access blocked'"

# wp-config.php doğrudan erişim engeli
SecRule REQUEST_URI "@contains wp-config.php" 
    "id:10004, 
    phase:1, 
    deny, 
    status:403, 
    log, 
    msg:'wp-config.php direct access blocked'"
EOF

Bu dosyayı virtual host konfigürasyonuna ekleyin:

# Virtual host konfigürasyonuna özel kuralları dahil et
echo 'modsecurity_rules_file /usr/local/lsws/modsec/custom-wordpress.conf' 
  >> /usr/local/lsws/conf/vhosts/example.com/vhconf.conf

False Positive Yönetimi

Bu konu başlı başına bir saç yoldurucu olabilir. OWASP CRS bazen meşru trafiği de engelleyebiliyor. Özellikle e-ticaret siteleri, forum uygulamaları ve içerik yönetim sistemleri ile çalışırken bu sorunla sık karşılaşırsınız.

False positive tespiti için şu komutu kullanın:

# False positive analiz scripti
cat > /usr/local/bin/modsec-analyze.sh << 'EOF'
#!/bin/bash
LOG="/usr/local/lsws/logs/modsec_audit.log"

echo "=== En Çok Tetiklenen Kurallar ==="
grep -oP 'id "K[^"]+' $LOG | sort | uniq -c | sort -rn | head -20

echo ""
echo "=== En Çok Engellenen IP'ler ==="
grep "REMOTE_ADDR" $LOG | grep -oP 'd+.d+.d+.d+' | 
  sort | uniq -c | sort -rn | head -10

echo ""
echo "=== Son 1 Saatteki Engellenen İstekler ==="
find $LOG -newer /tmp/1hour_ago -exec grep -c "action.*deny" {} ;
EOF

chmod +x /usr/local/bin/modsec-analyze.sh

Belirli bir kuralı devre dışı bırakmak için:

# Kural istisnaları için ayrı dosya oluştur
cat > /usr/local/lsws/modsec/exclusions.conf << 'EOF'
# Belirli bir kuralı tamamen devre dışı bırak
# SecRuleRemoveById 920350

# Belirli bir URL için kuralı devre dışı bırak
SecRule REQUEST_URI "@beginsWith /admin/wysiwyg" 
    "id:20001, 
    phase:1, 
    pass, 
    nolog, 
    ctl:ruleRemoveById=941100-941999"

# Belirli bir IP için kuralları devre dışı bırak (ofis IP'si)
SecRule REMOTE_ADDR "@ipMatch 203.0.113.50" 
    "id:20002, 
    phase:1, 
    pass, 
    nolog, 
    ctl:ruleEngine=Off"

# Content-Type bazlı istisna (API endpoint)
SecRule REQUEST_URI "@beginsWith /api/v1/" 
    "id:20003, 
    phase:1, 
    pass, 
    nolog, 
    ctl:ruleRemoveById=200000-299999"
EOF

Log Analizi ve Monitoring

Gerçek zamanlı monitoring olmadan WAF yarım kalır. Şu araçları mutlaka kurun:

# fail2ban ile mod_security entegrasyonu
apt install -y fail2ban

# fail2ban filter oluştur
cat > /etc/fail2ban/filter.d/modsecurity.conf << 'EOF'
[Definition]
failregex = [client <HOST>] ModSecurity: Access denied
            Message: Access denied.*[client <HOST>]
ignoreregex =
EOF

# fail2ban jail konfigürasyonu
cat >> /etc/fail2ban/jail.local << 'EOF'
[modsecurity]
enabled  = true
port     = http,https
filter   = modsecurity
logpath  = /usr/local/lsws/logs/modsec_audit.log
maxretry = 5
findtime = 600
bantime  = 3600
EOF

# fail2ban servisini yeniden başlat
systemctl restart fail2ban
systemctl enable fail2ban

# Aktif ban listesini kontrol et
fail2ban-client status modsecurity

Günlük rapor için basit bir script:

cat > /usr/local/bin/modsec-daily-report.sh << 'EOF'
#!/bin/bash
DATE=$(date +%Y-%m-%d)
LOG="/usr/local/lsws/logs/modsec_audit.log"
REPORT="/var/log/modsec-reports/report-${DATE}.txt"

mkdir -p /var/log/modsec-reports

echo "ModSecurity Günlük Raporu - ${DATE}" > $REPORT
echo "========================================" >> $REPORT
echo "" >> $REPORT
echo "Toplam Uyarı Sayısı:" >> $REPORT
grep -c "ModSecurity" $LOG >> $REPORT

echo "" >> $REPORT
echo "Engellenen İstekler:" >> $REPORT
grep -c "Access denied" $LOG >> $REPORT

echo "" >> $REPORT
echo "Top 5 Saldıran IP:" >> $REPORT
grep "REMOTE_ADDR" $LOG | grep -oP 'd+.d+.d+.d+' | 
  sort | uniq -c | sort -rn | head -5 >> $REPORT

# Raporu mail ile gönder (mail kuruluysa)
# mail -s "ModSecurity Raporu ${DATE}" [email protected] < $REPORT

cat $REPORT
EOF

chmod +x /usr/local/bin/modsec-daily-report.sh

# Cron'a ekle (her gece 23:00'de çalışsın)
echo "0 23 * * * root /usr/local/bin/modsec-daily-report.sh" 
  >> /etc/cron.d/modsecurity

Performans Optimizasyonu

WAF eklemek doğal olarak bir miktar overhead yaratır. Bu overhead’i minimize etmek için şu ayarları yapın:

SecRequestBodyInMemoryLimit: Request body’yi memory’de tutar, disk I/O azalır.

SecAuditEngine RelevantOnly: Tüm trafiği değil, sadece şüpheli trafiği loglar.

SecRuleEngine konfigürasyonunda gereksiz kuralları kapatın:

# CRS konfigürasyonunda performans optimizasyonu
cat >> /usr/local/lsws/modsec/owasp-crs/crs-setup.conf << 'EOF'

# Paranoya seviyesini ayarla (1-4 arası, 1 en az agresif)
SecAction 
  "id:900000, 
  phase:1, 
  pass, 
  t:none, 
  nolog, 
  tag:'OWASP_CRS', 
  ver:'OWASP_CRS/3.3.0', 
  setvar:tx.paranoia_level=2"

# Sampling mode - trafiğin yüzde kaçını kontrol et
# Yüksek trafikli sitelerde önce düşük tutun
SecAction 
  "id:900400, 
  phase:1, 
  pass, 
  nolog, 
  setvar:tx.sampling_percentage=100"

# Request body memory limiti
SecRequestBodyInMemoryLimit 131072
EOF

Kural dosyalarını optimize etmek için kullanılmayan kategorileri devre dışı bırakabilirsiniz:

# Kullanmadığınız kural gruplarını devre dışı bırakın
# Örnek: PHP kullanmıyorsanız PHP kurallarına gerek yok
# (ama çoğu durumda PHP kullanıyorsunuzdur :))

# Aktif kural dosyalarını listele
ls /usr/local/lsws/modsec/owasp-crs/rules/*.conf | head -20

# REQUEST-903 dosyaları uygulama spesifik kurallar
# Kullanmadıklarınızı kural yükleme listesinden çıkarın

Gerçek Saldırı Tespiti: Örnek Log Analizi

Gerçek bir saldırıyı nasıl tespit ettiğinizi bilmek önemli. İşte tipik bir SQL injection denemesinin audit log çıktısı ve bunu nasıl okuyacağınız:

# SQL injection logunu simüle et ve analiz et
# Test için (sadece Detection modda yapın!)
curl -v "http://siteniz.com/page?id=1+UNION+SELECT+1,2,3--"

# Log çıktısını incele
grep -A 20 "UNION SELECT" /usr/local/lsws/logs/modsec_audit.log

# XSS denemesi
curl -v "http://siteniz.com/search?q=<script>alert(1)</script>"

# Log'daki XSS tespitini gör
grep -A 10 "XSS|script" /usr/local/lsws/logs/modsec_audit.log | 
  grep -v "^--" | head -30

Audit log format açıklaması:

  • Bölüm A: Timestamp, unique ID, kaynak/hedef IP
  • Bölüm B: Request başlıkları
  • Bölüm C: Request body
  • Bölüm F: Response başlıkları
  • Bölüm H: Audit log footer, tetiklenen kurallar
  • Bölüm Z: Kayıt sonu işaretçisi

Admin Paneli Üzerinden Konfigürasyon

Web admin panelini tercih ediyorsanız (https://sunucu-ip:7080) şu adımları izleyin:

  • Server Configuration bölümüne gidin
  • Modules sekmesini açın
  • mod_security modülünü bulun ve aktifleştirin
  • Module Parameters bölümüne konfigürasyon dosya yollarını girin
  • Virtual Host ayarlarından da mod_security’yi aktifleştirin
  • Graceful Restart yapın

Web admin paneli değişikliklerinin otomatik olarak conf dosyalarına yansıdığını unutmayın. Bu nedenle hem panelden hem de dosyadan aynı anda değişiklik yapmaktan kaçının.

Güncelleme Stratejisi

OWASP CRS sürekli güncelleniyor. Otomatik güncelleme scripti hazırlayın:

cat > /usr/local/bin/update-owasp-crs.sh << 'EOF'
#!/bin/bash
CRS_DIR="/usr/local/lsws/modsec/owasp-crs"
BACKUP_DIR="/usr/local/lsws/modsec/owasp-crs-backup-$(date +%Y%m%d)"

echo "OWASP CRS güncelleniyor..."

# Mevcut versiyonu yedekle
cp -r $CRS_DIR $BACKUP_DIR

# Güncellemeleri çek
cd $CRS_DIR
git pull origin main

# Değişiklikleri kontrol et
if [ $? -eq 0 ]; then
    echo "Güncelleme başarılı"
    # Konfigürasyonu test et
    /usr/local/lsws/bin/lshttpd -t
    if [ $? -eq 0 ]; then
        systemctl reload lsws
        echo "Servis yeniden yüklendi"
    else
        echo "Konfigürasyon hatası! Yedekten geri dönülüyor..."
        rm -rf $CRS_DIR
        mv $BACKUP_DIR $CRS_DIR
        systemctl reload lsws
    fi
else
    echo "Git pull başarısız!"
    exit 1
fi
EOF

chmod +x /usr/local/bin/update-owasp-crs.sh

# Haftalık otomatik güncelleme
echo "0 2 * * 0 root /usr/local/bin/update-owasp-crs.sh >> /var/log/crs-update.log 2>&1" 
  >> /etc/cron.d/owasp-crs-update

Sonuç

OpenLiteSpeed ve mod_security entegrasyonu, başlangıçta karmaşık görünse de adım adım uygulandığında son derece yönetilebilir bir yapı ortaya çıkarıyor. Özetlemek gerekirse:

  • Önce DetectionOnly modda başlayın, 1-2 hafta logları izleyin
  • False positive oranını analiz edip gerekli istisnaları tanımlayın
  • Ardından Prevention moduna geçin
  • fail2ban entegrasyonu ile ban yönetimini otomatize edin
  • Düzenli log analizi ve CRS güncellemelerini ihmal etmeyin
  • Paranoya seviyesini 1’den başlatıp kademeli olarak artırın

WAF hiçbir zaman tek başına yeterli bir güvenlik önlemi değildir. Doğru kullanıcı izinleri, güncel yazılımlar, düzenli backup ve network düzeyindeki güvenlik önlemleriyle birleştiğinde gerçek bir güvenlik katmanı oluşturur. Ama başlangıç için bile sadece WAF’ın devreye alınması, sıradan bot saldırılarının ve otomatik exploit araçlarının büyük çoğunluğunu durdurmaya yeter.

Sorularınız olursa yorumlarda buluşalım. Bir sonraki yazıda OpenLiteSpeed ile Redis önbellekleme entegrasyonunu ele alacağım.

Yorum yapın