fail2ban ile FTP Sunucusu Koruması: vsftpd ve ProFTPD Saldırı Tespiti

FTP sunucuları, ağ altyapısının belki de en çok hedef alınan bileşenlerinden biri. Brute force saldırıları, anonim erişim denemeleri, credential stuffing… Bunlar her gün binlerce FTP sunucusuna karşı gerçekleştirilen saldırı türleri. Bu yazıda vsftpd ve ProFTPD sunucularını fail2ban ile nasıl koruyacağınızı, saldırıları nasıl tespit edeceğinizi ve gerçek dünya senaryolarında nasıl müdahale edeceğinizi ele alacağız.

fail2ban Neden FTP için Kritik?

Şunu düşünün: Bir FTP sunucusu işletiyorsunuz ve gece 3’te birisi Rusya’dan 50 farklı şifre kombinasyonu deniyor. Eğer fail2ban yoksa, bu saldırgan sabaha kadar milyonlarca deneme yapabilir. fail2ban tam burada devreye giriyor: belirli sayıda başarısız girişimden sonra saldırganın IP adresini otomatik olarak engelliyor.

FTP protokolünün doğasında bazı güvenlik sorunları var. Kimlik bilgileri açık metin olarak iletiliyor (FTPS kullanmıyorsanız), port 21 herkese açık ve tahmin edilmesi kolay, ayrıca çoğu sistem yöneticisi varsayılan ayarları değiştirmeden kullanıyor. Bu kombinasyon, FTP sunucularını kolay hedef haline getiriyor.

Ön Hazırlık ve Kurulum

Önce sisteminizde fail2ban’ın kurulu olduğundan emin olalım.

# Debian/Ubuntu için
sudo apt update && sudo apt install fail2ban -y

# RHEL/CentOS/AlmaLinux için
sudo dnf install epel-release -y
sudo dnf install fail2ban -y

# Servis durumunu kontrol et
sudo systemctl status fail2ban
sudo systemctl enable fail2ban

fail2ban’ı yapılandırmadan önce önemli bir kural: asla /etc/fail2ban/jail.conf dosyasını doğrudan düzenleme. Bu dosya güncellemelerle üzerine yazılabilir. Bunun yerine /etc/fail2ban/jail.local dosyasını kullanın.

# Mevcut yapılandırmayı temel olarak kopyala
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# Düzenlemeye başla
sudo nano /etc/fail2ban/jail.local

vsftpd Yapılandırması

vsftpd (Very Secure FTP Daemon), Debian ve Ubuntu tabanlı sistemlerde yaygın olarak kullanılan bir FTP sunucusu. Önce vsftpd’nin log yapılandırmasını doğru ayarlayalım çünkü fail2ban log dosyalarını parse ederek çalışıyor.

# /etc/vsftpd.conf dosyasını kontrol et
sudo nano /etc/vsftpd.conf

Aşağıdaki ayarların aktif olduğundan emin olun:

# Log ayarları - fail2ban bunlara ihtiyaç duyuyor
xferlog_enable=YES
xferlog_std_format=NO
log_ftp_protocol=YES
vsftpd_log_file=/var/log/vsftpd.log

# Güvenlik için ek ayarlar
anonymous_enable=NO
local_enable=YES
chroot_local_user=YES
ssl_enable=YES

Şimdi fail2ban’da vsftpd jail’ini yapılandıralım. /etc/fail2ban/jail.local dosyasına şunları ekleyin:

[vsftpd]
enabled  = true
port     = ftp,ftp-data,ftps,ftps-data
filter   = vsftpd
logpath  = /var/log/vsftpd.log
maxretry = 5
bantime  = 3600
findtime = 600
action   = iptables-multiport[name=vsftpd, port="20,21,990,989", protocol=tcp]
           sendmail-whois[name=vsftpd, [email protected], [email protected]]

Buradaki parametreleri açıklayalım:

  • enabled: Bu jail’i aktif hale getirir
  • port: Hangi portların izleneceği, FTP için 20/21, FTPS için 989/990
  • filter: Hangi filter dosyasının kullanılacağı
  • logpath: İzlenecek log dosyasının yolu
  • maxretry: Ban uygulanmadan önce izin verilen maksimum başarısız deneme sayısı
  • bantime: Ban süresinin saniye cinsinden değeri (3600 = 1 saat)
  • findtime: Bu süre içinde maxretry kadar deneme olursa ban uygulanır

vsftpd için Özel Filter Oluşturma

fail2ban’ın varsayılan vsftpd filtresi genellikle yeterli olsa da, özelleştirmek daha iyi sonuçlar verir. /etc/fail2ban/filter.d/vsftpd.conf dosyasını kontrol edelim:

sudo cat /etc/fail2ban/filter.d/vsftpd.conf

Eğer bu dosya yoksa veya yetersizse, özel bir filter oluşturalım:

sudo nano /etc/fail2ban/filter.d/vsftpd-custom.conf
[Definition]
# vsftpd başarısız giriş denemelerini yakala
failregex = ^%(__prefix_line)sFAILED LOGIN.*from <HOST>$
            ^%(__prefix_line)smaximum login attempts.*from <HOST>$
            ^%(__prefix_line)sCONNECT.*from <HOST>.*refused$
            ^.*vsftpd.*FAIL.*LOGIN.*[<HOST>].*$
            ^.*[pid d+] [.+] FAIL LOGIN: Client "<HOST>"$

ignoreregex =

# Log zaman damgası formatı
datepattern = {^LN-BEG}%%Y%%m%%d %%H:%%M:%%S
              {^LN-BEG}%%a %%b %e %%H:%%M:%%S %%Y

ProFTPD Yapılandırması

ProFTPD, kurumsal ortamlarda daha fazla tercih edilen, modüler yapısıyla esnek bir FTP sunucusu. ProFTPD için log yapılandırması biraz farklı.

# ProFTPD log ayarları için
sudo nano /etc/proftpd/proftpd.conf

ProFTPD’nin syslog veya dosyaya yazdığından emin olun:

# Log formatını ayarla
LogFormat default "%h %l %u %t "%r" %s %b"
LogFormat auth "%v [%P] %h %t "%r" %s"

# SystemLog /var/log/proftpd/proftpd.log
TransferLog /var/log/proftpd/xferlog
SystemLog /var/log/proftpd/proftpd.log

# Başarısız giriş denemelerini logla
ExtendedLog /var/log/proftpd/auth.log AUTH auth

Şimdi fail2ban jail’ini ProFTPD için yapılandıralım:

[proftpd]
enabled  = true
port     = ftp,ftp-data,ftps,ftps-data
filter   = proftpd
logpath  = /var/log/proftpd/proftpd.log
maxretry = 6
bantime  = 86400
findtime = 3600
action   = iptables-multiport[name=proftpd, port="20,21,989,990", protocol=tcp]

ProFTPD için Özel Filter

ProFTPD’nin log formatı vsftpd’den farklı, bu yüzden özel filter gerekiyor:

sudo nano /etc/fail2ban/filter.d/proftpd-custom.conf
[Definition]
failregex = proftpd: (.+) [ERROR] USER .+: no such user found from <HOST> [.*] to .*$
            proftpd: (.+) [WARNING] .+ [<HOST>]: incorrect password.$
            proftpd[d+]: .+(<HOST>[.*]): USER .+: no such user found from <HOST>.*$
            proftpd[d+]: .+(<HOST>[.*]): USER .+: Login failed.$
            proftpd: pam_unix(proftpd:auth): authentication failure.*rhost=<HOST>

ignoreregex =

Gerçek Dünya Senaryosu: Brute Force Saldırısı Tespiti

Diyelim ki bir e-ticaret firmasının sistem yöneticisisiniz. Sabah işe geldiniz ve bir şeyler yanlış gidiyor. FTP sunucunuz aşırı yük altında. Önce durumu analiz edelim:

# Aktif bağlantıları kontrol et
sudo netstat -tn | grep ':21' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -20

# Son 1 saatin log kayıtlarına bak
sudo tail -n 1000 /var/log/vsftpd.log | grep "FAILED" | awk '{print $NF}' | sort | uniq -c | sort -rn

# fail2ban'ın şu an ban uyguladığı IP'leri listele
sudo fail2ban-client status vsftpd

Bu komutların çıktısında belirli IP adreslerinin onlarca, yüzlerce deneme yaptığını görebilirsiniz. fail2ban bu IP’leri otomatik olarak engellemiş olmalı, ama manuel kontrol her zaman iyi bir pratik.

# Belirli bir IP'nin ban durumunu sorgula
sudo fail2ban-client get vsftpd banip 192.168.1.100

# Manuel olarak IP ban ekle
sudo fail2ban-client set vsftpd banip 45.33.32.156

# Ban listesine toplu IP ekle (saldırı anında)
for ip in $(cat suspicious_ips.txt); do
    sudo fail2ban-client set vsftpd banip $ip
done

Gelişmiş Yapılandırma: Coğrafi Engelleme ile Entegrasyon

Eğer FTP sunucunuza sadece belirli ülkelerden erişim olması gerekiyorsa, fail2ban’ı GeoIP ile entegre edebilirsiniz. Bu özellikle kurumsal ortamlarda çok işe yarıyor.

# MaxMind GeoIP veritabanını kur
sudo apt install geoip-database geoip-bin -y   # Ubuntu/Debian
sudo dnf install GeoIP GeoIP-data -y           # RHEL/CentOS

# Belirli bir IP'nin ülkesini kontrol et
geoiplookup 45.33.32.156

Fail2ban ile birlikte çalışacak özel bir action oluşturalım:

sudo nano /etc/fail2ban/action.d/iptables-geoip.conf
[Definition]
actionstart = 
actionstop = 
actioncheck = 
actionban = country=$(geoiplookup <ip> | awk -F': ' '{print $2}' | awk '{print $1}')
            if [ "$country" != "TR" ] && [ "$country" != "DE" ]; then
                iptables -I INPUT -s <ip> -p tcp --dport 21 -j DROP
            fi
actionunban = iptables -D INPUT -s <ip> -p tcp --dport 21 -j DROP

Log Analizi ve Saldırı Pattern’lerini Anlama

Sisteminizi iyi korumak için saldırıların nasıl gerçekleştiğini anlamanız gerekiyor. Bazı analiz komutları:

#!/bin/bash
# ftp_analysis.sh - FTP saldırı analiz scripti

LOG_FILE="/var/log/vsftpd.log"
REPORT_FILE="/tmp/ftp_security_report_$(date +%Y%m%d).txt"

echo "=== FTP Guvenlik Raporu ===" > $REPORT_FILE
echo "Tarih: $(date)" >> $REPORT_FILE
echo "" >> $REPORT_FILE

# En çok başarısız giriş yapan IP'ler
echo "--- En Fazla Basarisiz Giris Yapan IP Adresleri ---" >> $REPORT_FILE
grep "FAILED LOGIN" $LOG_FILE | grep -oE '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' | 
    sort | uniq -c | sort -rn | head -10 >> $REPORT_FILE

echo "" >> $REPORT_FILE

# En çok denenen kullanıcı adları
echo "--- En Cok Denenen Kullanici Adlari ---" >> $REPORT_FILE
grep "FAILED LOGIN" $LOG_FILE | grep -oP 'USER KS+' | 
    sort | uniq -c | sort -rn | head -10 >> $REPORT_FILE

echo "" >> $REPORT_FILE

# Saatlik saldırı dağılımı
echo "--- Saatlik Saldiri Dagilimi ---" >> $REPORT_FILE
grep "FAILED LOGIN" $LOG_FILE | awk '{print $3}' | cut -d: -f1 | 
    sort | uniq -c | sort -rn >> $REPORT_FILE

cat $REPORT_FILE

Bu scripti cron job olarak her sabah çalıştırabilirsiniz:

# Crontab'a ekle
echo "0 8 * * * /usr/local/bin/ftp_analysis.sh | mail -s 'FTP Guvenlik Raporu' [email protected]" | crontab -

fail2ban Regex Testi

Yeni bir filter yazdığınızda, gerçek log satırları üzerinde test etmek önemli. fail2ban-regex aracı bunun için birebir:

# Mevcut filter'ı test et
sudo fail2ban-regex /var/log/vsftpd.log /etc/fail2ban/filter.d/vsftpd.conf

# Özel filter'ı test et
sudo fail2ban-regex /var/log/vsftpd.log /etc/fail2ban/filter.d/vsftpd-custom.conf

# Tek bir log satırını test et
sudo fail2ban-regex "Mon Nov 13 10:23:45 2023 [pid 12345] [testuser] FAILED LOGIN: Client '45.33.32.156'" /etc/fail2ban/filter.d/vsftpd-custom.conf

Çıktıda kaç satırın eşleştiğini, kaç satırın görmezden gelindiğini göreceksiniz. Yüksek eşleşme oranı, filtrenizin düzgün çalıştığının göstergesi.

Whitelist Yönetimi ve İzin Verilen IP’ler

Bazı durumlarda belirli IP adreslerini veya aralıkları ban listesinden muaf tutmanız gerekebilir. Örneğin, kendi ofis IP’nizi veya güvenilir iş ortaklarının IP’lerini.

sudo nano /etc/fail2ban/jail.local
[DEFAULT]
# Bunlar hicbir zaman ban'lanmaz
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 10.0.0.0/8 203.0.113.50

[vsftpd]
enabled  = true
port     = ftp,ftp-data,ftps,ftps-data
filter   = vsftpd
logpath  = /var/log/vsftpd.log
maxretry = 5
bantime  = 3600
findtime = 600
# Bu jail için ekstra whitelist
ignoreip = %(ignoreip)s 172.16.0.0/12

Dinamik whitelist yönetimi için bir script yazalım:

#!/bin/bash
# whitelist_manager.sh

FAIL2BAN_JAIL="vsftpd"
ACTION=$1
IP=$2

case $ACTION in
    add)
        sudo fail2ban-client set $FAIL2BAN_JAIL addignoreip $IP
        echo "$IP whitelist'e eklendi"
        ;;
    remove)
        sudo fail2ban-client set $FAIL2BAN_JAIL delignoreip $IP
        echo "$IP whitelist'ten cikarildi"
        ;;
    list)
        sudo fail2ban-client get $FAIL2BAN_JAIL ignoreip
        ;;
    *)
        echo "Kullanim: $0 {add|remove|list} [IP]"
        ;;
esac

Notification ve Alerting

Saldırı tespit edildiğinde haberdar olmak istiyorsanız, birkaç farklı yöntem var. En yaygını e-posta bildirimi:

sudo nano /etc/fail2ban/jail.local
[DEFAULT]
destemail = [email protected]
sender = [email protected]
mta = sendmail
action = %(action_mwl)s

Slack bildirimi için özel action oluşturalım:

sudo nano /etc/fail2ban/action.d/slack-notify.conf
[Definition]
actionban = curl -X POST -H 'Content-type: application/json' 
    --data '{"text":"*UYARI: FTP Brute Force*nIP: <ip>nSunucu: $(hostname)nTarih: $(date)nJail: <name>"}' 
    https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK

actionunban = curl -X POST -H 'Content-type: application/json' 
    --data '{"text":"*BILGI: IP Ban Kaldirildi*nIP: <ip>nJail: <name>"}' 
    https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK

Performans Optimizasyonu

Yüksek trafikli sunucularda fail2ban’ın performansını optimize etmek önemli. Birkaç öneri:

  • backend = systemd: Systemd journal kullanıyorsanız, dosya yerine journal okumak daha hızlı
  • dbpurgeage: Veritabanından eski kayıtları temizleme süresi
  • maxlines: Her bir log kontrolünde okunacak maksimum satır sayısı
[DEFAULT]
# Performans ayarlari
backend = auto
dbfile = /var/lib/fail2ban/fail2ban.sqlite3
dbpurgeage = 86400
logtarget = /var/log/fail2ban.log

# Birden fazla log dosyasini izle
[vsftpd-aggressive]
enabled = true
filter  = vsftpd-custom
port    = ftp,ftp-data,ftps,ftps-data
logpath = /var/log/vsftpd.log
          /var/log/syslog
maxretry = 3
bantime  = 86400
findtime = 3600

Düzenli Bakım ve İzleme

fail2ban’ın sağlıklı çalışıp çalışmadığını düzenli kontrol etmek gerekiyor:

# Genel durum raporu
sudo fail2ban-client status

# Belirli jail'in durumu
sudo fail2ban-client status vsftpd

# fail2ban'ı yeniden başlat (yapılandırma değişikliklerinden sonra)
sudo systemctl restart fail2ban

# Log dosyasını izle
sudo tail -f /var/log/fail2ban.log | grep -E "(Ban|Unban|Found)"

# Aktif ban'ları listele ve IP bilgilerini göster
sudo fail2ban-client status vsftpd | grep "Banned IP" | 
    tr ' ' 'n' | grep -E '^[0-9]' | 
    while read ip; do echo "$ip: $(geoiplookup $ip 2>/dev/null | head -1)"; done

Haftalık otomatik rapor için:

sudo nano /usr/local/bin/fail2ban_weekly_report.sh
#!/bin/bash
# Haftalik fail2ban ozet raporu

echo "=== Haftalik fail2ban Ozet Raporu ==="
echo "Rapor Tarihi: $(date)"
echo ""
echo "--- Aktif Jail Durumu ---"
sudo fail2ban-client status

echo ""
echo "--- Son 7 Gunun Ban Istatistikleri ---"
grep "Ban " /var/log/fail2ban.log | 
    awk -v d="$(date -d '7 days ago' '+%Y-%m-%d')" '$1 >= d' | 
    awk '{print $8}' | sort | uniq -c | sort -rn | head -20

echo ""
echo "--- En Cok Ban Yiyen IP Adresleri ---"
grep "Ban " /var/log/fail2ban.log | 
    awk -v d="$(date -d '7 days ago' '+%Y-%m-%d')" '$1 >= d' | 
    grep -oE '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' | 
    sort | uniq -c | sort -rn | head -10

Sonuç

fail2ban ile FTP sunucusu koruma konusu, tek seferlik kurulum yapıp unutacağınız bir şey değil. Özellikle vsftpd ve ProFTPD’nin log formatları arasındaki farklılıklar, doğru filter yazmayı kritik kılıyor. Yanlış veya eksik filter, saldırıların tespit edilememesine yol açar.

Pratik açıdan şunu söyleyebilirim: Çoğu ortamda maxretry değerini 5’in altına indirmeyin. Meşru kullanıcılar bazen yanlış şifre girebilir ve kendinizi veya müşterinizi yanlışlıkla ban’lamak can sıkıcı bir durum. Aynı zamanda bantime değerini en az 1 saat (3600 saniye) olarak ayarlamak, basit brute force saldırılarının büyük çoğunluğunu etkisiz hale getirir.

Son olarak, fail2ban’ı tek başına bir güvenlik çözümü olarak görmeyin. FTPS veya SFTP’ye geçiş, güçlü şifre politikaları, düzenli log analizi ve güvenlik güncellemeleri ile birlikte kullanıldığında gerçek anlamda sağlam bir savunma hattı oluşturabilirsiniz. fail2ban bu zincirin güçlü ama tek bir halkasıdır.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir