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.