Dovecot ile Rate Limiting ve Brute Force Saldırılarına Karşı Koruma
Mail sunucusu yönetiminin en can sıkıcı ama bir o kadar da kritik konularından biri brute force saldırılarıdır. Sabahın 3’ünde log dosyalarını incelerken yüzlerce başarısız login denemesi görüyorsanız, bu yazı tam size göre. Dovecot’u doğru yapılandırarak hem rate limiting uygulayabilir hem de bu tür saldırıları otomatik olarak engelleyebilirsiniz.
Neden Dovecot’ta Rate Limiting Şart?
IMAP ve POP3 protokolleri, doğası gereği kimlik doğrulama tabanlı servislerdir. Bu durum onları brute force saldırıları için birincil hedef haline getirir. Saldırganlar genellikle botnet’ler aracılığıyla binlerce farklı IP’den saniyede onlarca deneme yaparak şifreleri kırmaya çalışır.
Dovecot’un varsayılan kurulumu bu tür saldırılara karşı oldukça açıktır. Hiçbir rate limiting yapılandırması olmadan bıraktığınızda şunlarla karşılaşabilirsiniz:
- Sunucu kaynaklarının tükenmesi (CPU, RAM, network)
- Geçerli kullanıcıların servise erişememesi
- Başarılı şifre kırma girişimleri sonrası hesap ele geçirme
- Ele geçirilen hesaplar üzerinden spam gönderimi
- Blacklist’e girme ve e-posta tesliminin bozulması
Gerçek hayattan bir örnek vermek gerekirse, bir müşterinin sunucusunda 24 saatte 450.000 başarısız IMAP login denemesi tespit ettik. Bu durum sunucunun neredeyse kullanılamaz hale gelmesine yol açmıştı. Doğru yapılandırma ile bu sorunu 15 dakika içinde çözdük.
Dovecot’un Dahili Koruma Mekanizmaları
Dovecot, versiyon 2.x ile birlikte bazı dahili koruma mekanizmalarını beraberinde getirmiştir. Bunların başında auth_policy ve login işlemlerindeki gecikme mekanizması gelir.
auth-policy Yapılandırması
Dovecot’un auth-policy özelliği, harici bir policy servisiyle entegre çalışarak her login denemesini değerlendirebilir. Ancak temel koruma için Dovecot’un kendi mekanizmalarını önce anlamak gerekir.
İlk olarak mevcut durumu kontrol edelim:
# Dovecot versiyonunu kontrol et
dovecot --version
# Mevcut yapılandırmayı görüntüle
doveconf -n | grep -i "auth|login|limit"
# Aktif bağlantıları ve başarısız denemeleri izle
tail -f /var/log/dovecot.log | grep "auth failed|Login failed"
Login Gecikme Mekanizması
Dovecot, başarısız her giriş denemesinden sonra otomatik olarak 2 saniye gecikme uygular. Bu basit ama etkili bir mekanizmadır. Ancak bu tek başına yeterli değildir çünkü çok sayıda bağlantı aynı anda geldiğinde gecikme mekanizması bypass edilebilir.
/etc/dovecot/conf.d/10-auth.conf dosyasında temel ayarları yapılandıralım:
# /etc/dovecot/conf.d/10-auth.conf
# Başarısız denemeden sonra gecikme süresi (saniye)
auth_failure_delay = 2secs
# Maksimum eşzamanlı auth işlemi
auth_worker_max_count = 30
# Şifre doğrulama önbelleği - aynı kullanıcının tekrar denemesini yavaşlatır
auth_cache_size = 10M
auth_cache_ttl = 1 hour
auth_cache_negative_ttl = 1 hour
Rate Limiting için Login Throttle Yapılandırması
Dovecot 2.2+ sürümünden itibaren login_client_limit ve login_max_connections direktifleri ile bağlantı limitlemesi yapabilirsiniz.
# /etc/dovecot/conf.d/10-master.conf
service imap-login {
inet_listener imap {
port = 143
}
inet_listener imaps {
port = 993
ssl = yes
}
# Aynı anda işlenebilecek maksimum login isteği
service_count = 1
# Her kaynak IP'den maksimum bağlantı sayısı
login_max_connections = 250
# Process başına maksimum client sayısı
client_limit = 1
# Servis için ayrılan process sayısı
process_min_avail = 0
process_limit = 128
}
service pop3-login {
inet_listener pop3 {
port = 110
}
inet_listener pop3s {
port = 995
ssl = yes
}
service_count = 1
login_max_connections = 250
client_limit = 1
process_limit = 128
}
IP Bazlı Bağlantı Limitleri
Aynı IP’den gelen bağlantıları kısıtlamak için login_access_sockets ve Dovecot’un dahili login limitleri kullanılabilir:
# /etc/dovecot/conf.d/10-mail.conf
# Her IP için maksimum eşzamanlı bağlantı
mail_max_userip_connections = 10
Bu ayar, aynı kullanıcının aynı IP’den açabileceği maksimum bağlantı sayısını sınırlar. Kurumsal ortamlarda bu değeri biraz yüksek tutabilirsiniz çünkü bazı e-posta istemcileri birden fazla IMAP bağlantısı açar.
Fail2ban ile Entegrasyon
Dovecot’un dahili mekanizmaları iyi bir başlangıç noktasıdır, ancak gerçek koruma için Fail2ban ile entegrasyon şarttır. Fail2ban, log dosyalarını izleyerek belirli bir eşiği aşan IP’leri iptables veya firewalld aracılığıyla otomatik olarak engeller.
Fail2ban Kurulumu
# Debian/Ubuntu
apt-get install fail2ban
# RHEL/CentOS/Rocky Linux
dnf install fail2ban
# Servis durumunu kontrol et
systemctl status fail2ban
Dovecot için Fail2ban Filtresi
/etc/fail2ban/filter.d/dovecot.conf dosyasını oluşturun veya mevcut olanı düzenleyin:
# /etc/fail2ban/filter.d/dovecot.conf
[INCLUDES]
before = common.conf
[Definition]
_daemon = (auth|imap(?:-login)?|pop3(?:-login)?|managesieve(?:-login)?|submission(?:-login)?|lmtp)
failregex = ^%(__prefix_line)s(pam_unix(dovecot:auth):s+authentication failure; logname=S* uid=S* euid=S* tty=dovecot ruser=S* rhost=<HOST>(s+user=S*)?s*$|
^%(__prefix_line)s(?:authentication failure|Aborted login (auth failed|Aborted login (tried to use disallowed|Disconnected (auth failed|Aborted login (no auth attempts in).*rip=<HOST>
^%(__prefix_line)sDisconnected: Inactivity.*rip=<HOST>
ignoreregex =
journalmatch = _SYSTEMD_UNIT=dovecot.service
Fail2ban Jail Yapılandırması
# /etc/fail2ban/jail.d/dovecot.conf
[dovecot]
enabled = true
port = pop3,pop3s,imap,imaps,submission,465,sieve
filter = dovecot
logpath = /var/log/dovecot.log
/var/log/mail.log
maxretry = 5
findtime = 300
bantime = 3600
action = iptables-multiport[name=dovecot, port="pop3,pop3s,imap,imaps", protocol=tcp]
[dovecot-aggressive]
enabled = true
port = pop3,pop3s,imap,imaps
filter = dovecot
logpath = /var/log/dovecot.log
maxretry = 3
findtime = 60
bantime = 86400
action = iptables-multiport[name=dovecot-aggressive, port="pop3,pop3s,imap,imaps", protocol=tcp]
Bu yapılandırmada iki farklı jail tanımladık:
- [dovecot]: 5 dakika içinde 5 başarısız deneme yapan IP’yi 1 saat engeller
- [dovecot-aggressive]: 1 dakika içinde 3 başarısız deneme yapan IP’yi 24 saat engeller
Fail2ban’ı yeniden başlatın ve durumu kontrol edin:
systemctl restart fail2ban
systemctl enable fail2ban
# Aktif jail'leri görüntüle
fail2ban-client status
# Dovecot jail durumunu görüntüle
fail2ban-client status dovecot
# Yasaklı IP'leri görüntüle
fail2ban-client status dovecot-aggressive
Dovecot Log Yapılandırması
Fail2ban’ın doğru çalışabilmesi için Dovecot’un yeterli log üretmesi gerekir. Varsayılan log seviyesi yeterli olmayabilir.
# /etc/dovecot/conf.d/10-logging.conf
# Log dosyası konumu
log_path = /var/log/dovecot.log
info_log_path = /var/log/dovecot-info.log
# Log seviyesi
log_timestamp = "%Y-%m-%d %H:%M:%S "
# Auth işlemlerini logla
auth_verbose = yes
auth_verbose_passwords = no
auth_debug = no
# Login işlemlerini logla
login_log_format_elements = user=<%u> method=%m rip=%r lip=%l mpid=%e %c %k
login_log_format = %$: %s
# Başarısız login'leri detaylı logla
mail_log_prefix = "%s(%u)<%{pid}><%{session}>: "
Log dosyasının doğru formatta yazıldığını test edin:
# Canlı log takibi
tail -f /var/log/dovecot.log
# Başarısız girişleri filtrele
grep "auth failed|Authentication failure|Aborted login" /var/log/dovecot.log | tail -50
# IP bazlı başarısız giriş sayısını hesapla
grep "auth failed" /var/log/dovecot.log | grep -oP 'rip=K[0-9.]+' | sort | uniq -c | sort -rn | head -20
Gelişmiş Koruma: Dovecot Auth Policy
Dovecot 2.2.25+ sürümünde gelen auth_policy özelliği, harici bir servisle (örneğin SOGo’nun krb veya özel bir policy daemon) entegrasyon sağlar. Ancak daha pratik bir çözüm için Dovecot’un kendi mekanizmalarını maksimum düzeyde kullanabiliriz.
PassDB ile Ek Güvenlik Katmanı
# /etc/dovecot/conf.d/10-auth.conf
# Brute force koruması için ekstra ayarlar
auth_policy_server_url = http://localhost:12345/
# Şüpheli IP'leri geçici olarak yavaşlat
auth_policy_reject_on_fail = no
auth_policy_hash_mech = sha256
auth_policy_server_api_header = X-Secret: mysecretkey
auth_policy_hash_nonce = somerandomstring123
# Policy sunucusu yanıt vermezse ne yapılacak
auth_policy_request_attributes = login=%{requested_username} pwhash=%{hashed_password} remote=%{rip} device_id=%{client_id} protocol=%s
auth_policy_check_before_auth = yes
auth_policy_check_after_auth = yes
auth_policy_report_after_auth = yes
Firewall Düzeyinde Rate Limiting
Dovecot seviyesinde yapılan konfigürasyona ek olarak, iptables veya nftables ile de rate limiting uygulayabilirsiniz. Bu, saldırıları daha düşük seviyede, Dovecot’a ulaşmadan engellemek açısından çok daha etkilidir.
# iptables ile IMAP port'una rate limiting
# Önce mevcut kuralları yedekle
iptables-save > /root/iptables-backup.txt
# IMAP için rate limiting kuralı ekle
iptables -I INPUT -p tcp --dport 143 -m state --state NEW -m recent --set --name IMAP
iptables -I INPUT -p tcp --dport 143 -m state --state NEW -m recent --update --seconds 60 --hitcount 10 --name IMAP -j DROP
# IMAPS için aynı kural
iptables -I INPUT -p tcp --dport 993 -m state --state NEW -m recent --set --name IMAPS
iptables -I INPUT -p tcp --dport 993 -m state --state NEW -m recent --update --seconds 60 --hitcount 10 --name IMAPS -j DROP
# Kuralları kalıcı hale getir
iptables-save > /etc/iptables/rules.v4
nftables kullanıyorsanız daha temiz bir yapılandırma yapabilirsiniz:
# /etc/nftables.conf içine eklenecek kural bloğu
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
# IMAP ve IMAPS için rate limiting
tcp dport { 143, 993 } ct state new limit rate 10/minute burst 20 packets accept
tcp dport { 143, 993 } ct state new drop
# POP3 ve POP3S için rate limiting
tcp dport { 110, 995 } ct state new limit rate 5/minute burst 10 packets accept
tcp dport { 110, 995 } ct state new drop
}
}
Whitelist ve Trusted Network Yönetimi
Tüm bu koruma mekanizmaları hayata geçirildiğinde, meşru kullanıcıların ve sistemlerin engellenmemesi için whitelist yönetimi kritik önem taşır.
# /etc/fail2ban/jail.d/dovecot.conf içine whitelist ekle
[dovecot]
enabled = true
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 10.0.0.0/8
# Ofis IP'si ve VPN aralığı gibi güvenilir ağları buraya ekleyin
Dovecot tarafında da güvenilir ağlardan gelen bağlantıları farklı şekilde işleyebilirsiniz:
# /etc/dovecot/conf.d/10-auth.conf
# Belirli IP aralıklarından gelen bağlantılar için auth cache'i uzat
# Bu güvenilir ağların daha hızlı authenticate olmasını sağlar
passdb {
driver = pam
args = dovecot
}
# Local network için ayrı passdb tanımla (opsiyonel)
passdb {
driver = passwd
args =
override_fields = allow_nets=127.0.0.0/8,192.168.0.0/16
}
İzleme ve Alarm Sistemi
Gerçek zamanlı izleme olmadan tüm bu yapılandırmaların değeri azalır. Basit bir monitoring scripti hazırlayalım:
#!/bin/bash
# /usr/local/bin/dovecot-monitor.sh
LOG_FILE="/var/log/dovecot.log"
ALERT_EMAIL="[email protected]"
THRESHOLD=100
TIMEFRAME=300 # 5 dakika
# Son 5 dakikadaki başarısız giriş sayısını hesapla
FAILED_COUNT=$(awk -v d="$(date -d '5 minutes ago' '+%Y-%m-%d %H:%M')" '$0 >= d' "$LOG_FILE" |
grep -c "auth failed|Authentication failure")
if [ "$FAILED_COUNT" -gt "$THRESHOLD" ]; then
echo "UYARI: Son 5 dakikada $FAILED_COUNT başarısız Dovecot login denemesi tespit edildi!" |
mail -s "Dovecot Brute Force Alarmı - $(hostname)" "$ALERT_EMAIL"
# En çok deneme yapan IP'leri logla
TOP_IPS=$(grep "auth failed" "$LOG_FILE" | grep -oP 'rip=K[0-9.]+' |
sort | uniq -c | sort -rn | head -5)
echo "En aktif saldırgan IP'ler: $TOP_IPS" >> /var/log/dovecot-alerts.log
fi
# Script'i crontab'a ekle
# */5 * * * * /usr/local/bin/dovecot-monitor.sh
Bu scripti crontab’a ekleyerek düzenli aralıklarla çalıştırabilirsiniz. Ayrıca Fail2ban’ın ban istatistiklerini düzenli olarak kontrol etmek de iyi bir alışkanlıktır:
# Günlük Fail2ban raporu almak için
fail2ban-client status dovecot | grep "Total banned|Currently banned"
# Tüm ban'lı IP'leri listele
fail2ban-client banned
# Yanlışlıkla ban'lanan bir IP'yi serbest bırak
fail2ban-client set dovecot unbanip 1.2.3.4
Gerçek Dünya Senaryosu: Toplu Saldırı Tespiti ve Müdahale
Bir gece alarm sisteminiz çalmaya başladı. Dovecot loglarında 50 farklı IP’den koordineli bir saldırı görüyorsunuz. İşte adım adım müdahale planı:
# 1. Mevcut durumu değerlendir
tail -n 1000 /var/log/dovecot.log | grep "auth failed" | wc -l
# 2. Saldırgan IP bloğunu tespit et
grep "auth failed" /var/log/dovecot.log | grep -oP 'rip=K[0-9.]+' |
awk -F. '{print $1"."$2"."$3".0/24"}' | sort | uniq -c | sort -rn | head -10
# 3. Tüm subnet'i geçici olarak engelle
iptables -I INPUT -s 185.220.0.0/16 -j DROP
# 4. Fail2ban ban süresini artır (aktif oturum için)
fail2ban-client set dovecot bantime 604800 # 1 hafta
# 5. Hedef alınan kullanıcıları tespit et
grep "auth failed" /var/log/dovecot.log | grep -oP 'user=<K[^>]+' |
sort | uniq -c | sort -rn | head -10
# 6. Saldırı altındaki kullanıcıların şifrelerini geçici olarak kilitle
# (LDAP veya veritabanı backend'e göre değişir)
Yapılandırma Testleri
Tüm değişiklikleri yaptıktan sonra doğrulamak için testler yapın:
# Dovecot yapılandırmasını test et (hata varsa gösterir)
dovecot -n
doveconf -n | grep -v "^#"
# Mail loglarında hata olup olmadığını kontrol et
journalctl -u dovecot --since "10 minutes ago" -p err
# Test kullanıcısıyla bağlantı dene
openssl s_client -connect mail.example.com:993
# Bağlandıktan sonra:
# a login [email protected] wrongpassword
# a login [email protected] wrongpassword
# Bu adımı 3-4 kez tekrarlayın ve Fail2ban'ın IP'nizi ban'layıp banlamadığını test edin
# Ban'landıktan sonra kendinizi serbest bırakın
fail2ban-client set dovecot unbanip YOUR_IP
Sonuç
Dovecot’u brute force saldırılarına karşı korumak tek bir çözümden değil, katmanlı bir güvenlik yaklaşımından oluşur. Özetlemek gerekirse:
- Dovecot dahili mekanizmaları:
auth_failure_delay,mail_max_userip_connectionsve login süreç limitleri ile temel korumayı sağlayın - Fail2ban entegrasyonu: Otomatik IP engelleme için en kritik araçtır, mutlaka yapılandırın
- Firewall düzeyinde rate limiting: iptables veya nftables ile Dovecot’a ulaşmadan saldırıları durdurun
- Kapsamlı loglama: İyi yapılandırılmış loglar olmadan ne Fail2ban ne de manuel müdahale işe yarar
- Whitelist yönetimi: Güvenilir ağları mutlaka koruma kapsamı dışında tutun
- İzleme ve alarm: Saldırıdan haberdar olmak için proaktif izleme sistemleri kurun
Bu yapılandırmalar hayata geçirildiğinde saldırıların büyük çoğunluğu otomatik olarak engellenir. Sunucunuzun log dosyalarını düzenli olarak inceleyin ve Fail2ban istatistiklerini takip edin. Saldırı pattern’leri değiştiğinde yapılandırmanızı güncellemeyi de unutmayın. Mail sunucusu güvenliği durağan değil, sürekli güncellenen bir süreçtir.
