fail2ban ile Postfix Mail Sunucusu Koruması

Mail sunucusu yönetmek, sistem yöneticiliğinin en zorlu alanlarından biri. Postfix kuruyorsunuz, her şey güzel çalışıyor, sonra log dosyalarına bakıyorsunuz ve binlerce başarısız giriş denemesi, spam relay girişimi, brute force saldırısı görüyorsunuz. İşte tam bu noktada fail2ban devreye giriyor ve hayat kurtarıcı oluyor.

Bu yazıda Postfix mail sunucunuzu fail2ban ile nasıl koruyacağınızı, gerçek dünya senaryolarında hangi jail konfigürasyonlarının işe yaradığını ve log analizi yaparak sistemi nasıl fine-tune edeceğinizi anlatacağım.

Neden Postfix Özellikle Hedef Alınır?

Postfix 25, 465, 587 portlarında dinliyor ve internet üzerinden erişilebilir durumda. Bu durum onu otomatik botlar için çekici bir hedef haline getiriyor. Tipik saldırı senaryoları şunlar:

  • SMTP Auth Brute Force: Kullanıcı adı/şifre kombinasyonlarını deneyerek hesap ele geçirme
  • Open Relay Testi: Sunucunuzu spam göndermek için kullanmaya çalışma
  • Dictionary Attack: Yaygın kullanıcı adlarını sistematik olarak deneme
  • Bounce Attack: Sahte gönderen adresleriyle backscatter üretme

Bunların hepsi hem güvenlik riski hem de performans sorunu. Binlerce bağlantı isteği sunucunuzu yoruyor, log dosyalarınız şişiyor, gerçek trafiği görmek zorlaşıyor.

fail2ban Kurulumu

Debian/Ubuntu sistemlerde kurulum oldukça basit:

# Ubuntu/Debian
apt update && apt install fail2ban -y

# CentOS/RHEL/Rocky Linux
dnf install epel-release -y
dnf install fail2ban -y

# Servisi başlat ve otomatik başlatmayı aktif et
systemctl enable fail2ban
systemctl start fail2ban
systemctl status fail2ban

Kurulumdan sonra yapmanız gereken ilk şey konfigürasyon dosyalarını doğru yönetmek. fail2ban’ın ana konfigürasyonu /etc/fail2ban/jail.conf dosyasında ama bu dosyayı doğrudan düzenlemeyin. Güncellemeler bu dosyanın üzerine yazabilir.

Bunun yerine jail.local dosyası oluşturun:

# jail.conf'u kopyala ama düzenleme için jail.local kullan
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# Ya da sıfırdan oluştur (tavsiye edilen yöntem)
touch /etc/fail2ban/jail.local

Temel jail.local Yapılandırması

Postfix korumaya geçmeden önce genel ayarları doğru yapmak gerekiyor:

[DEFAULT]
# Ban süresi (saniye cinsinden, -1 = kalıcı)
bantime = 3600

# Bu süre içindeki denemeler sayılır (saniye)
findtime = 600

# Bu kadar başarısız denemeden sonra ban
maxretry = 5

# Backend seçimi - systemd kullanan sistemler için
backend = systemd

# Mail bildirimi için (opsiyonel)
destemail = [email protected]
sender = [email protected]
mta = sendmail

# Varsayılan action
action = %(action_mwl)s

# Whitelist - kendi IP'lerini asla banlama
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24

bantime değeri için dikkatli olun. Çok kısa koyarsanız botlar birkaç saat bekleyip tekrar deniyor. Ben production sunucularda genellikle 86400 (1 gün) hatta 604800 (1 hafta) kullanıyorum. Tekrarlayan saldırganlar için bantime.multiplier özelliğini de aktif edebilirsiniz, bu her tekrarda ceza süresini katlar.

Postfix için Filter Dosyaları

fail2ban, log dosyalarındaki belirli pattern’ları regex ile yakalıyor. Postfix için bazı filter’lar kurulumla birlikte geliyor ama bunları kontrol etmek ve geliştirmek gerekiyor.

Mevcut Postfix filter’larını inceleyelim:

ls -la /etc/fail2ban/filter.d/ | grep postfix
# postfix.conf
# postfix-sasl.conf dosyalarını görmelisiniz

/etc/fail2ban/filter.d/postfix.conf dosyasına bakalım ve kendi özel filter’ımızı oluşturalım:

cat /etc/fail2ban/filter.d/postfix.conf

Gerçek dünyada bu default filter’lar yeterli gelmiyor. Kendi özel filter’ınızı oluşturun:

cat > /etc/fail2ban/filter.d/postfix-custom.conf << 'EOF'
[INCLUDES]
before = common.conf

[Definition]
_daemon = postfix/smtpd

failregex = ^%(__prefix_line)sNOQUEUE: reject: RCPT from S+[<HOST>]: 554 .*$
            ^%(__prefix_line)sNOQUEUE: reject: RCPT from S+[<HOST>]: 550 .*$
            ^%(__prefix_line)sNOQUEUE: reject: RCPT from S+[<HOST>]: 450 .*$
            ^%(__prefix_line)sNOQUEUE: reject: RCPT from S+[<HOST>]: 421 .*$
            ^%(__prefix_line)swarning: S+[<HOST>]: SASL .* authentication failed.*$
            ^%(__prefix_line)slost connection after AUTH from S+[<HOST>]$
            ^%(__prefix_line)stoo many errors after AUTH from S+[<HOST>]$

ignoreregex =
EOF

SASL authentication için ayrı bir filter oluşturmak iyi pratik:

cat > /etc/fail2ban/filter.d/postfix-sasl-custom.conf << 'EOF'
[INCLUDES]
before = common.conf

[Definition]
_daemon = postfix/smtpd

failregex = ^%(__prefix_line)swarning: S+[<HOST>]: SASL LOGIN authentication failed: .*$
            ^%(__prefix_line)swarning: S+[<HOST>]: SASL PLAIN authentication failed: .*$
            ^%(__prefix_line)swarning: S+[<HOST>]: SASL DIGEST-MD5 authentication failed: .*$

ignoreregex =
EOF

jail.local’a Postfix Jail’lerini Ekleme

Artık jail konfigürasyonlarını ekleyebiliriz. jail.local dosyasına şunları ekleyin:

# Postfix SMTP genel koruma
[postfix]
enabled = true
port = smtp,465,submission
filter = postfix-custom
logpath = /var/log/mail.log
maxretry = 5
findtime = 300
bantime = 3600
action = %(action_mwl)s

# Postfix SASL auth brute force koruması
[postfix-sasl]
enabled = true
port = smtp,465,submission,imap,imaps,pop3,pop3s
filter = postfix-sasl-custom
logpath = /var/log/mail.log
maxretry = 3
findtime = 300
bantime = 86400
action = %(action_mwl)s

# Postfix-Dovecot kombinasyonu için
[dovecot]
enabled = true
port = pop3,pop3s,imap,imaps,submission,465,sieve
filter = dovecot
logpath = /var/log/mail.log
maxretry = 5
bantime = 3600

Dikkat edin, SASL için maxretry = 3 kullandım. Kimse normal şartlarda 3 kez üst üste yanlış şifre girmez. Bu agresif ayar bazen yöneticilerin kendilerini ban’lamasına neden olabilir, bu yüzden ignoreip listesini doğru tutun.

Log Dosyası Konumu Kontrolü

Farklı Linux dağıtımlarında mail log konumları değişiyor:

# Ubuntu/Debian sistemlerde
tail -f /var/log/mail.log

# CentOS/RHEL sistemlerde
tail -f /var/log/maillog

# Systemd journal kullanan sistemlerde
journalctl -u postfix -f

# Log dosyasının yerini bulmak için
postconf -d | grep syslog_name
find /var/log -name "mail*" 2>/dev/null

Eğer systemd journal kullanıyorsanız jail.local‘da backend = systemd ve logpath = /var/log/journal şeklinde ayarlayın ya da rsyslog’un mail loglarını dosyaya yazmasını sağlayın.

Filter Test Etme

Yeni bir filter yazdınızda mutlaka test edin. fail2ban-regex aracı bunun için mükemmel:

# Gerçek log satırlarına karşı filter'ı test et
fail2ban-regex /var/log/mail.log /etc/fail2ban/filter.d/postfix-custom.conf

# Belirli bir log satırını test et
fail2ban-regex "May 15 10:23:45 mail postfix/smtpd[12345]: warning: unknown[185.220.101.1]: SASL LOGIN authentication failed: UGFzc3dvcmQ6" /etc/fail2ban/filter.d/postfix-sasl-custom.conf

# Daha detaylı çıktı için
fail2ban-regex --print-all-matched /var/log/mail.log /etc/fail2ban/filter.d/postfix-custom.conf

Çıktıda “Lines: X matched, Y missed, Z ignored” görüyorsunuz. Matched sayısı beklentinizle örtüşüyorsa filter çalışıyor demektir. Eğer sıfır matched görüyorsanız regex’inizde veya log format ayarında sorun var.

fail2ban’ı Yeniden Başlatma ve Test

Konfigürasyon değişikliklerinden sonra:

# Konfigürasyonu doğrula (syntax hatası kontrolü)
fail2ban-client -t

# Servisi yeniden başlat
systemctl restart fail2ban

# Jail'lerin aktif olduğunu kontrol et
fail2ban-client status

# Belirli bir jail'in durumunu gör
fail2ban-client status postfix
fail2ban-client status postfix-sasl

# Ban'lı IP'leri listele
fail2ban-client status postfix | grep "Banned IP"

fail2ban-client status postfix çıktısında şunları görmelisiniz:

  • Currently failed: Şu an takip edilen başarısız deneme sayısı
  • Total failed: Toplam başarısız deneme
  • Currently banned: Şu an ban’lı IP sayısı
  • Total banned: Toplam ban’lanan IP
  • Banned IP list: Ban’lı IP adresleri

Manuel Ban ve Unban İşlemleri

Bazen manuel müdahale gerekiyor:

# IP adresini manuel ban'la
fail2ban-client set postfix banip 185.220.101.1

# IP adresinin ban'ını kaldır
fail2ban-client set postfix unbanip 185.220.101.1

# Belirli bir IP'nin ban'lı olup olmadığını kontrol et
fail2ban-client get postfix banip | grep 185.220.101.1

# Tüm jail'lerde IP ara
for jail in $(fail2ban-client status | grep "Jail list" | sed 's/.*://;s/,//g'); do
    echo "=== $jail ===" 
    fail2ban-client status $jail | grep "Banned IP"
done

iptables ile Entegrasyon Kontrolü

fail2ban varsayılan olarak iptables kullanarak ban uyguluyor. Ban’ların gerçekten uygulandığını doğrulayın:

# fail2ban tarafından oluşturulan iptables kurallarını gör
iptables -L f2b-postfix -n --line-numbers
iptables -L f2b-postfix-sasl -n --line-numbers

# Kural sayısını hızlıca kontrol et
iptables -L | grep -c DROP

# nftables kullanan modern sistemlerde
nft list ruleset | grep fail2ban

Eğer f2b-postfix chain’ini göremiyorsanız fail2ban düzgün çalışmıyor olabilir. systemctl status fail2ban ile hata mesajlarını kontrol edin.

Gelişmiş Senaryo: Tekrarlayan Saldırganlar için Kalıcı Ban

Bazı IP adresleri defalarca ban’lanıp süre dolunca tekrar geliyor. Bunlar için kalıcı ban mantıklı:

[postfix-sasl]
enabled = true
port = smtp,465,submission
filter = postfix-sasl-custom
logpath = /var/log/mail.log
maxretry = 3
findtime = 300

# Bantime artırma özelliği
bantime = 3600
bantime.increment = true
bantime.multiplier = 2
bantime.maxtime = 604800
bantime.overalljails = true

Bu konfigürasyonla:

  • İlk ban: 1 saat
  • İkinci ban: 2 saat
  • Üçüncü ban: 4 saat
  • Maksimum: 1 hafta

bantime.overalljails = true ayarı önemli, bu sayede bir IP postfix jail’inden ban yedikten sonra dovecot üzerinden gelirse o ban süresi de hesaba katılıyor.

Bildirim ve Raporlama

Önemli ban olaylarından haberdar olmak için mail bildirimi ayarlayın:

# /etc/fail2ban/jail.local içinde DEFAULT bölümüne ekle
[DEFAULT]
destemail = [email protected]
sendername = Fail2Ban Alert
mta = sendmail
action = %(action_mwl)s

action_mwl şu anlama geliyor:

  • m: Mail gönder
  • w: whois bilgisi ekle
  • l: log satırlarını ekle

Sunucunuzda sendmail/postfix çalışıyorsa bu bildirimler otomatik geliyor. Test etmek için:

# Test mail gönder
fail2ban-client set postfix banip 1.2.3.4
# Mail geldi mi kontrol et

Log Analizi ve İzleme

Günlük rutin olarak şu komutları çalıştırmayı alışkanlık haline getirin:

# Son 24 saatteki ban istatistikleri
grep "Ban " /var/log/fail2ban.log | grep "$(date +%Y-%m-%d)" | wc -l

# En çok ban yiyen IP'ler
grep "Ban " /var/log/fail2ban.log | awk '{print $NF}' | sort | uniq -c | sort -rn | head -20

# Hangi jail'ler aktif ban'lıyor
grep "Ban " /var/log/fail2ban.log | awk '{print $6}' | sort | uniq -c | sort -rn

# Gerçek zamanlı fail2ban logunu izle
tail -f /var/log/fail2ban.log | grep -E "(Ban|Unban|Found)"

Bu komutları bir bash script’e koyup cron ile her sabah mail olarak alabilirsiniz. Sabah kahvenizle birlikte gece boyunca ne olduğunu görmek hem bilgi verici hem de tatmin edici.

Postfix Tarafında Ek Güvenlik Önlemleri

fail2ban tek başına yeterli değil, Postfix konfigürasyonuyla birlikte çalışmalı. /etc/postfix/main.cf dosyasında şu ayarları kontrol edin:

# Aynı IP'den çok fazla bağlantıyı sınırla
postconf -e 'smtpd_client_connection_count_limit = 10'
postconf -e 'smtpd_client_connection_rate_limit = 30'
postconf -e 'smtpd_client_message_rate_limit = 20'

# Auth hata limitini düşür
postconf -e 'smtpd_hard_error_limit = 3'
postconf -e 'smtpd_soft_error_limit = 1'

# SASL güvenlik
postconf -e 'smtpd_sasl_security_options = noanonymous'
postconf -e 'broken_sasl_auth_clients = yes'

# Değişiklikleri uygula
postfix reload

Bu Postfix ayarları fail2ban’ın devreye girmesinden önce bir ön filtre görevi görüyor. Aynı IP 10’dan fazla bağlantı açmaya çalışırsa Postfix direkt reddediyor, fail2ban da bu redleri log’a yazıyor ve ban uyguluyor.

Yaygın Sorunlar ve Çözümleri

Problem: Kendi IP’mi ban’ladım

# Hemen unban et
fail2ban-client set postfix-sasl unbanip KENDI_IP_ADRESINIZ

# jail.local'a ignoreip ekle
# [DEFAULT]
# ignoreip = 127.0.0.1/8 ::1 KENDI_IP_ADRESINIZ

Problem: fail2ban başlamıyor

# Detaylı hata mesajı için
journalctl -u fail2ban -n 50
fail2ban-client -vvv start

# Log dosyası yolu doğru mu?
ls -la /var/log/mail.log

# Filter dosyasında syntax hatası var mı?
fail2ban-client -t

Problem: Ban uygulanıyor ama IP erişmeye devam ediyor

# iptables kuralları gerçekten var mı?
iptables -L f2b-postfix -n

# IPv6 için ayrı kontrol
ip6tables -L f2b-postfix -n

# fail2ban action'ı kontrol et
fail2ban-client get postfix actions

Problem: Çok fazla false positive

# maxretry değerini artır
# findtime değerini düşür
# Filter regex'ini daha spesifik yap

# Hangi satırlar match oluyor görmek için
fail2ban-regex --print-all-matched /var/log/mail.log /etc/fail2ban/filter.d/postfix-custom.conf 2>&1 | head -50

Periyodik Bakım Scriptleri

Sistem yöneticisi olarak birkaç işi otomatize etmek güzel. Haftalık temizlik için:

cat > /usr/local/bin/fail2ban-report.sh << 'EOF'
#!/bin/bash

echo "=== Fail2Ban Haftalık Raporu ==="
echo "Tarih: $(date)"
echo ""
echo "--- Jail Durumları ---"
for jail in $(fail2ban-client status | grep "Jail list" | sed 's/.*://;s/,/ /g'); do
    echo ""
    echo "[$jail]"
    fail2ban-client status $jail | grep -E "(Currently|Total)"
done

echo ""
echo "--- Son 7 Günün En Aktif Saldırganları ---"
grep "Ban " /var/log/fail2ban.log | 
    awk -v d="$(date -d '7 days ago' '+%Y-%m-%d')" '$0 >= d' | 
    awk '{print $NF}' | sort | uniq -c | sort -rn | head -10

echo ""
echo "--- Toplam Ban Sayısı (7 gün) ---"
grep "Ban " /var/log/fail2ban.log | 
    awk -v d="$(date -d '7 days ago' '+%Y-%m-%d')" '$0 >= d' | wc -l
EOF

chmod +x /usr/local/bin/fail2ban-report.sh

# Cron'a ekle - her Pazartesi sabah 08:00'de rapor gönder
echo "0 8 * * 1 root /usr/local/bin/fail2ban-report.sh | mail -s 'Fail2Ban Haftalık Raporu' [email protected]" >> /etc/cron.d/fail2ban-report

Sonuç

fail2ban ve Postfix kombinasyonu, mail sunucusu güvenliğinin temel taşı. Bu yazıda anlattıklarımı özetleyecek olursam:

  • Temel kurulumu doğru yapın, jail.local kullanın, jail.conf‘u dokunmayın
  • Postfix için özel filter’lar yazın, default filter’lar yeterli gelmiyor
  • SASL brute force en yaygın saldırı vektörü, buna özel jail şart
  • bantime.increment ile tekrarlayan saldırganları kalıcı olarak caydırın
  • fail2ban-regex ile filter’larınızı test etmeden production’a almayın
  • ignoreip listesini güncel tutun, kendinizi ban’lamak can sıkıcı
  • Postfix rate limiting ile fail2ban’ı destekleyin, katmanlı savunma önemli
  • Periyodik raporlama ile sisteminizi izleyin

Gerçek dünyada bu konfigürasyonları devreye aldıktan sonra mail sunucunuzun log’larının belirgin şekilde temizlendiğini göreceksiniz. Auth failure sayıları düşecek, sunucu yükü azalacak ve gerçek anlamda ne olduğunu görmek kolaylaşacak. Birkaç günlük data topladıktan sonra hangi IP bloklarının en çok saldırdığını görebilir, hatta büyük botnet bloklarını manuel olarak null route edebilirsiniz.

Mail sunucusu güvenliği asla “kur ve unut” olmaz ama fail2ban ile işin büyük kısmını otomatize etmek mümkün.

Yorum yapın