Apache’de Rate Limiting ve DDoS Girişimlerini Log Analizi ile Tespit Etme
Bir sabah uyandığınızda sunucunuzun yanıt vermediğini görüyorsunuz. Apache log dosyalarına bakıyorsunuz ve binlerce farklı IP’den saniyeler içinde yüzlerce istek geldiğini fark ediyorsunuz. İşte bu, her sistem yöneticisinin kabul etmek istemediği ama mutlaka hazırlıklı olması gereken bir DDoS senaryosu. Bu yazıda Apache üzerinde rate limiting nasıl kurulur, log analizi ile saldırı tespiti nasıl yapılır, bunları adım adım ele alacağız.
Apache Log Formatını Anlamak
Önce temelden başlayalım. Apache’nin varsayılan log formatını bilmeden analiz yapmak, haritasız ormanда yürümek gibidir. Apache’nin iki temel log dosyası vardır:
- /var/log/apache2/access.log: Tüm HTTP isteklerini kaydeder
- /var/log/apache2/error.log: Hata mesajlarını ve uyarıları kaydeder
Varsayılan “combined” log formatı şu şekilde görünür:
# /etc/apache2/apache2.conf içindeki log format tanımı
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
Bir log satırı şöyle görünür:
192.168.1.100 - - [15/Jan/2024:10:23:45 +0300] "GET /wp-login.php HTTP/1.1" 200 1234 "-" "Mozilla/5.0"
Bu satırı parçalara ayıralım:
- %h: İstemci IP adresi (192.168.1.100)
- %l: Identd kimliği (genellikle -)
- %u: Kimlik doğrulama kullanıcı adı
- %t: İstek zaman damgası
- %r: İstek satırı (method, URL, protokol)
- %>s: HTTP durum kodu
- %b: Yanıt boyutu (byte)
DDoS analizi için özellikle IP adresi, zaman damgası ve durum kodu kritik öneme sahiptir.
Log Analizi ile Saldırı Tespiti
Temel Log Analiz Komutları
Önce basit ama etkili komutlarla başlayalım. Bir saldırı anında en çok ihtiyaç duyacağınız şey hızlı sonuç veren komutlardır.
# En çok istek yapan IP'leri bul (ilk 20)
awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -20
# Son 1 saatteki istekleri analiz et
awk -v d1="$(date -d '1 hour ago' '+%d/%b/%Y:%H:%M:%S')"
'$4 > "["d1' /var/log/apache2/access.log |
awk '{print $1}' | sort | uniq -c | sort -rn | head -20
# Belirli bir URL'ye yapılan istekleri say
grep "POST /wp-login.php" /var/log/apache2/access.log |
awk '{print $1}' | sort | uniq -c | sort -rn
# HTTP 4xx hatalarını yapan IP'ler
awk '$9 ~ /^4[0-9][0-9]$/ {print $1}' /var/log/apache2/access.log |
sort | uniq -c | sort -rn | head -20
Gerçek Zamanlı İzleme Scripti
Saldırı anında gerçek zamanlı izleme için şu scripti kullanabilirsiniz:
#!/bin/bash
# realtime_monitor.sh
# Gerçek zamanlı Apache log izleme
THRESHOLD=100 # Dakikada bu kadar istek şüpheli
LOG_FILE="/var/log/apache2/access.log"
ALERT_FILE="/var/log/ddos_alerts.log"
echo "Apache DDoS Monitor başlatıldı... (Ctrl+C ile durdur)"
tail -f $LOG_FILE | while read line; do
IP=$(echo $line | awk '{print $1}')
# Son 60 saniyedeki istek sayısını hesapla
COUNT=$(grep "$IP" $LOG_FILE |
awk -v t="$(date -d '1 minute ago' '+%d/%b/%Y:%H:%M:%S')"
'$4 > "["t' | wc -l)
if [ $COUNT -gt $THRESHOLD ]; then
ALERT_MSG="$(date): UYARI - IP $IP dakikada $COUNT istek yapıyor!"
echo $ALERT_MSG
echo $ALERT_MSG >> $ALERT_FILE
# Otomatik engelleme (isteğe bağlı)
# iptables -A INPUT -s $IP -j DROP
fi
done
GoAccess ile Görsel Analiz
GoAccess, Apache loglarını gerçek zamanlı olarak analiz eden mükemmel bir araçtır. Özellikle DDoS tespitinde dashboard görünümü çok işe yarar.
# GoAccess kurulumu
apt-get install goaccess # Debian/Ubuntu
yum install goaccess # CentOS/RHEL
# Terminal'de gerçek zamanlı analiz
goaccess /var/log/apache2/access.log -c
# HTML rapor oluşturma
goaccess /var/log/apache2/access.log
--log-format=COMBINED
-o /var/www/html/rapor.html
--real-time-html
# Sıkıştırılmış logları dahil etme
zcat /var/log/apache2/access.log.*.gz |
goaccess /var/log/apache2/access.log
--log-format=COMBINED -o /tmp/rapor.html -
Apache mod_ratelimit ile Rate Limiting
Apache’nin yerleşik mod_ratelimit modülü bant genişliği sınırlaması için kullanılır. Ancak istek sayısı sınırlaması için mod_evasive veya mod_qos daha etkilidir.
mod_evasive Kurulumu ve Yapılandırması
# mod_evasive kurulumu
apt-get install libapache2-mod-evasive # Debian/Ubuntu
# Modülü etkinleştir
a2enmod evasive
# Yapılandırma dosyası oluştur
nano /etc/apache2/mods-enabled/evasive.conf
<IfModule mod_evasive20.c>
# Aynı sayfaya saniyede bu kadar istek gelirse engelle
DOSPageCount 5
# Aynı siteye saniyede bu kadar istek gelirse engelle
DOSSiteCount 50
# Sayfa engel süresi (saniye)
DOSPageInterval 1
# Site engel süresi (saniye)
DOSSiteInterval 1
# IP'nin kara listede kalma süresi (saniye)
DOSBlockingPeriod 10
# E-posta bildirimi (isteğe bağlı)
# DOSEmailNotify [email protected]
# Log dosyası
DOSLogDir /var/log/apache2/
# Güvenilir IP'ler (virgülle ayır)
DOSWhitelist 127.0.0.1
DOSWhitelist 10.0.0.0/8
</IfModule>
mod_qos ile Gelişmiş Rate Limiting
mod_qos, kurumsal ortamlar için çok daha güçlü seçenekler sunar:
# mod_qos kurulumu
apt-get install libapache2-mod-qos
# Etkinleştir
a2enmod qos
# /etc/apache2/conf-available/qos.conf
<IfModule mod_qos.c>
# Maksimum eşzamanlı bağlantı sayısı
QS_SrvMaxConn 300
# Tek IP'den maksimum eşzamanlı bağlantı
QS_SrvMaxConnPerIP 10
# Bağlantı başına maksimum istek oranı (dakikada)
QS_SrvRequestRate 150
# Yavaş bağlantıları (Slowloris) engelle
QS_SrvMinDataRate 150 1200
# Belirli lokasyon için rate limiting
<Location /api/>
# Dakikada maksimum 30 istek
QS_LocRequestLimitMatch ^/api/.* 30
</Location>
# Login sayfası için özel limit
<Location /wp-login.php>
QS_LocRequestLimitMatch ^/wp-login.php 5
</Location>
</IfModule>
.htaccess ile Temel Koruma
Her zaman bir modül yükleyemeyebilirsiniz. Bu durumda .htaccess ile de bazı koruma önlemleri alınabilir:
# .htaccess - Temel DDoS koruması
# User-Agent bazlı engelleme
RewriteEngine On
# Boş User-Agent'ları engelle
RewriteCond %{HTTP_USER_AGENT} ^-?$
RewriteRule .* - [F,L]
# Bilinen botları engelle
RewriteCond %{HTTP_USER_AGENT} (harvest|attack|extract|scrape) [NC]
RewriteRule .* - [F,L]
# Referrer spam engelleme
RewriteCond %{HTTP_REFERER} (semalt|buttons-for-website|blackhatworth) [NC]
RewriteRule .* - [F,L]
# Belirli IP aralığını engelle
# Deny from 192.168.1.0/24
# Rate limiting için çerez tabanlı kontrol
# (mod_rewrite ile basit implementasyon)
RewriteCond %{HTTP_COOKIE} !session_token
RewriteCond %{REQUEST_URI} ^/api/
RewriteRule .* - [F,L]
Fail2ban ile Otomatik IP Engelleme
Log analizi sonucunda tespit ettiğiniz kötü niyetli IP’leri manuel olarak engellemek yerine Fail2ban bunu otomatik yapar:
# Fail2ban kurulumu
apt-get install fail2ban
# Apache için jail yapılandırması
nano /etc/fail2ban/jail.local
[apache-ddos]
enabled = true
port = http,https
filter = apache-ddos
logpath = /var/log/apache2/access.log
maxretry = 200
findtime = 60
bantime = 3600
[apache-auth]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache2/error.log
maxretry = 5
findtime = 300
bantime = 86400
[apache-badbots]
enabled = true
port = http,https
filter = apache-badbots
logpath = /var/log/apache2/access.log
maxretry = 2
findtime = 3600
bantime = 604800
# Özel DDoS filtresi oluştur
nano /etc/fail2ban/filter.d/apache-ddos.conf
[Definition]
# Saniyede 10'dan fazla istek yapan IP'leri yakala
failregex = ^<HOST> -.*"(GET|POST|HEAD).*HTTP.*" [0-9]* [0-9]*
ignoreregex =
# Gelişmiş regex - sadece belirli URL'ler için
# failregex = ^<HOST> -.*"POST /wp-login.php HTTP.*" [0-9]* [0-9]*
# Fail2ban'ı yeniden başlat ve durumu kontrol et
systemctl restart fail2ban
fail2ban-client status apache-ddos
# Manuel IP engelleme ve çözme
fail2ban-client set apache-ddos banip 192.168.1.100
fail2ban-client set apache-ddos unbanip 192.168.1.100
Kapsamlı Log Analiz Scripti
Günlük olarak çalıştırabileceğiniz ve e-posta raporu gönderen kapsamlı bir script:
#!/bin/bash
# apache_security_report.sh
# Günlük güvenlik raporu oluşturur
LOG_FILE="/var/log/apache2/access.log"
REPORT_FILE="/tmp/security_report_$(date +%Y%m%d).txt"
THRESHOLD_IP=500 # IP başına günlük maksimum istek
THRESHOLD_404=50 # IP başına maksimum 404 hatası
echo "=== Apache Güvenlik Raporu - $(date) ===" > $REPORT_FILE
echo "" >> $REPORT_FILE
# En aktif IP'ler
echo "--- En Çok İstek Yapan IP'ler (Top 10) ---" >> $REPORT_FILE
awk '{print $1}' $LOG_FILE | sort | uniq -c | sort -rn | head -10 >> $REPORT_FILE
echo "" >> $REPORT_FILE
# Şüpheli IP'ler (eşik değerini aşanlar)
echo "--- Şüpheli IP'ler (Günde $THRESHOLD_IP'den fazla istek) ---" >> $REPORT_FILE
awk '{print $1}' $LOG_FILE | sort | uniq -c | sort -rn |
awk -v t=$THRESHOLD_IP '$1 > t {print $0}' >> $REPORT_FILE
echo "" >> $REPORT_FILE
# 404 hatası yapan IP'ler (dizin tarama girişimi)
echo "--- Olası Dizin Tarama Girişimleri ---" >> $REPORT_FILE
awk '$9 == "404" {print $1}' $LOG_FILE | sort | uniq -c | sort -rn |
awk -v t=$THRESHOLD_404 '$1 > t {print $0}' >> $REPORT_FILE
echo "" >> $REPORT_FILE
# En çok istek yapılan URL'ler
echo "--- En Çok İstek Yapılan URL'ler ---" >> $REPORT_FILE
awk '{print $7}' $LOG_FILE | sort | uniq -c | sort -rn | head -20 >> $REPORT_FILE
echo "" >> $REPORT_FILE
# HTTP metod dağılımı
echo "--- HTTP Metod Dağılımı ---" >> $REPORT_FILE
awk '{print $6}' $LOG_FILE | tr -d '"' | sort | uniq -c | sort -rn >> $REPORT_FILE
echo "" >> $REPORT_FILE
# Durum kodu özeti
echo "--- HTTP Durum Kodu Özeti ---" >> $REPORT_FILE
awk '{print $9}' $LOG_FILE | sort | uniq -c | sort -rn >> $REPORT_FILE
# Raporu görüntüle
cat $REPORT_FILE
# E-posta gönder (isteğe bağlı)
# mail -s "Günlük Apache Güvenlik Raporu" [email protected] < $REPORT_FILE
echo ""
echo "Rapor kaydedildi: $REPORT_FILE"
Gerçek Dünya Senaryosu: WordPress Saldırısı
Bir WordPress sitesinde wp-login.php’ye brute force saldırısı tespit ettiğinizi varsayalım. İşte adım adım müdahale süreci:
# 1. Saldırının boyutunu tespit et
grep "POST /wp-login.php" /var/log/apache2/access.log |
awk '{print $1}' | sort | uniq -c | sort -rn | head -20
# 2. Saldırının zaman dağılımını analiz et
grep "POST /wp-login.php" /var/log/apache2/access.log |
awk '{print $4}' | cut -d: -f2 | sort | uniq -c
# 3. Saldırgan IP'leri hızlıca engelle
grep "POST /wp-login.php" /var/log/apache2/access.log |
awk '{print $1}' | sort | uniq -c | sort -rn |
awk '$1 > 50 {print $2}' | while read ip; do
echo "Engelleniyor: $ip"
iptables -A INPUT -s $ip -j DROP
done
# 4. wp-login.php için Apache'de özel limit ekle
cat >> /etc/apache2/conf-available/wordpress-protection.conf << 'EOF'
<Location /wp-login.php>
Order Deny,Allow
Deny from all
Allow from 10.0.0.0/8
Allow from 192.168.0.0/16
# Kendi IP'nizi buraya ekleyin
Allow from YOUR.IP.HERE
</Location>
EOF
a2enconf wordpress-protection
systemctl reload apache2
Apache Reverse Proxy Arkasındaki Gerçek IP’yi Loglama
Eğer sunucunuzun önünde bir yük dengeleyici veya CDN varsa, log’larda sahte IP görebilirsiniz. Bunu düzeltmek önemlidir:
# /etc/apache2/apache2.conf veya virtual host içinde
# mod_remoteip modülünü etkinleştir
# a2enmod remoteip
<IfModule remoteip_module>
RemoteIPHeader X-Forwarded-For
RemoteIPHeader X-Real-IP
# Güvenilir proxy IP'leri
RemoteIPTrustedProxy 10.0.0.0/8
RemoteIPTrustedProxy 172.16.0.0/12
RemoteIPTrustedProxy 192.168.0.0/16
# Cloudflare IP aralıkları
RemoteIPTrustedProxy 103.21.244.0/22
RemoteIPTrustedProxy 103.22.200.0/22
</IfModule>
# Log formatına gerçek IP'yi ekle
LogFormat "%a %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined_with_real_ip
Performans İpuçları ve Öneriler
Rate limiting ve log analizi yaparken dikkat etmeniz gereken bazı kritik noktalar var:
- Log rotasyonu: Loglar büyüdükçe analiz yavaşlar.
logrotateile günlük rotasyon yapılandırın ve eski logları sıkıştırın. - Disk alanı izleme: Saldırı anında loglar çok hızlı büyüyebilir. /var/log için ayrı bir partition kullanmayı düşünün.
- mod_status: Apache’nin
/server-statussayfasını iç ağdan erişime açık tutun, gerçek zamanlı bağlantı durumunu görmenizi sağlar. - Whitelist oluşturun: Monitoring sistemleri, CDN IP’leri ve iç ağ adreslerini her zaman beyaz listeye alın. Kendi kendinizi engellemenin verdiği paniği yaşamak istemezsiniz.
- Uyarı eşiklerini ayarlayın: Sitenizin normal trafik profilini bilin. Bir e-ticaret sitesi için 1000 istek/dakika normalken, küçük bir blog için bu DDoS işareti olabilir.
- Logları merkezi sisteme gönderin: ELK Stack (Elasticsearch, Logstash, Kibana) veya Graylog kullanarak tüm sunucularınızın loglarını merkezi yerde toplayın.
Sonuç
Apache’de rate limiting ve DDoS tespiti tek başına yeterli değildir. Bu önlemler katmanlı bir güvenlik stratejisinin bir parçası olmalıdır. mod_evasive ile istek limitini belirleyin, Fail2ban ile otomatik engelleme yapın, günlük log analiz scriptleriyle trendleri takip edin ve şüpheli aktiviteleri erkenden tespit edin.
Unutmayın, en iyi savunma proaktif izlemedir. Saldırı gerçekleştiğinde değil, gerçekleşmeden önce hazırlıklı olmak gerekir. Bu yazıda paylaştığım scriptleri kendi ortamınıza uyarlayın, eşik değerlerini sitenizin normal trafik profiline göre ayarlayın ve düzenli testlerle sistemin doğru çalıştığını doğrulayın. Bir saldırı anında paniğe kapılmak yerine hazır playbook’larınızın olması, hem sunucunuzu hem de sinirlerinizi korur.
