Güvenlik

Fail2ban ile Saldırganı Otomatik Engelleme Kurulumu

SSH veya WordPress logların başarısız deneme kayıtlarıyla doluysa, bu rehber varsayılan jail'i, özel filtre yazmayı ve kendini bloklamaktan korunmayı adım adım gösterir.

Güvenlik

journalctl -u ssh komutunu açtığında son bir saat içinde 4000 satır Failed password for root kaydı görüyorsan, artık sorun "muhtemelen" değildir. Sunucun internete açık ve biri sözlük saldırısıyla şifreleri deniyor. Çoğu yöneticinin yaptığı ilk şey SSH portunu değiştirmektir; bu yalnızca tembel tarayıcıların gürültüsünü azaltır ve gerçek tarayıcıyı durdurmaz. Gerçekten etkili olan şey, birkaç başarısız denemeden sonra saldırganın adresini kapatmaktır. Fail2ban'ın yaptığı tam olarak budur.

Fail2ban tam olarak neyi kapatır ve neyi kapatmaz

Fail2ban, bir log dosyasını tail eden, yeni satırlara regex kalıpları uygulayan ve bir zaman aralığında eşleşme sayısı bir eşiği aştığında sistem güvenlik duvarına bir kural yazan Python daemon'udur. Debian ve Ubuntu'da bu kural iptables veya nftables üzerinden uygulanır; firewalld kullanan sistemlerde firewall-cmd üzerinden.

Baştan üç şeyi bilmelisin. Birincisi, Fail2ban hacimsel DDoS saldırısını engellemez; trafik ağ katmanındaysa, sunucu düzeyinde IP kapatmak işe yaramaz ve DDoS koruması aramalısın. İkincisi, bu araç çalınmış özel anahtarla girişi engellemez, çünkü o giriş başarılıdır ve loga hata olarak kaydedilmez. Üçüncüsü, bir CDN veya ters proxy arkasındaysan, kullanıcının gerçek adresini görmezsin ve CDN'in kendi IP'sini bloklayabilirsin.

Kurulum ve SSH üzerinde ilk jail

Ubuntu 22.04 veya 24.04'te kurulum tek satırdır:

apt install fail2ban -y
systemctl enable --now fail2ban

Asla doğrudan /etc/fail2ban/jail.conf içinde düzenleme yapma. O dosya her paket güncellemesinde yeniden yazılır ve ayarların sessizce kaybolur. Ayrı bir dosya oluştur:

cat > /etc/fail2ban/jail.local <<'EOF'
[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 185.51.200.14

[sshd]
enabled = true
port    = ssh
logpath = %(sshd_log)s
backend = systemd
EOF

maxretry = 5 değeri, findtime aralığında beş başarısız deneme anlamına gelir. Paketin varsayılan değeri 5'tir ve çoğu sunucu için mantıklıdır. Bunu 2 yaparsan, şifreyi iki kez yanlış yazan bir kullanıcı dışarıda kalır ve destek talebi alırsın. 20 yaparsan, pratikte kimseyi yakalamamış olursun.

ignoreip satırını ciddiye al. Ofisinin veya VPN'inin IP adresini baştan oraya yaz, yoksa ilk bloklanan kişi sen olursun. Erişimin çalışanların güvenli erişimi için kurumsal VPN üzerindense, o VPN'in adres aralığını da ekle.

Kaydettikten sonra doğrula ve yeniden başlat:

fail2ban-client -t
systemctl restart fail2ban
fail2ban-client status sshd

Çıktı şuna benzer olmalıdır: Currently banned: 3 ve Total banned: 47. Eğer Currently banned sıfır kalırsa ve journalctl -u fail2ban içinde Failed to access socket path satırını görürsen, servis ayağa kalkmamıştır ve logu baştan okumalısın.

Logunu kimsenin okumadığı bir uygulama için filtre yazmak

Varsayılan jail yalnızca SSH'ı kapsar. WordPress'in varsa, başarısız giriş logu /var/log/auth.log içinde değildir; veritabanında veya güvenlik eklentisinin logundadır. Bu durum için özel bir filtre yazmalısın.

Diyelim ki /var/log/myapp/access.log içine şöyle bir satır yazan bir uygulaman var:

2025-02-11 09:14:22 WARN login_failed ip=91.240.118.7 user=admin

/etc/fail2ban/filter.d/myapp.conf içindeki filtre:

[Definition]
failregex = ^.*login_failed ip=<HOST>.*$
ignoreregex =

Ve jail.local içindeki ilgili jail:

[myapp]
enabled  = true
filter   = myapp
logpath  = /var/log/myapp/access.log
maxretry = 8
bantime  = 24h

Yeniden başlatmadan önce regex'i ayrıca test et. Bu adımı insanların %90'ı atlar ve sonra "Fail2ban çalışmıyor" der:

fail2ban-regex /var/log/myapp/access.log /etc/fail2ban/filter.d/myapp.conf

Çıktı sıfırdan büyük bir Lines matched sayısı vermelidir. Sıfır verdiyse, regex yanlıştır, sunucu değil. Çoğu kişiyi yere seren nokta: <HOST> yalnızca IPv4 ve IPv6'yı yakalar ve adres portla birlikte geliyorsa <HOST>:<PORT> yazmalısın.

Burada hata yapıyorlar

Destek taleplerinde en sık gördüğüm hata şudur: biri bantime = -1 yaparak "sonsuza kadar" bloklar, sonra üç hafta sonra gerçek kullanıcılarının ortak bir NAT arkasında olduğunu ve hepsinin aynı dış IP ile siteye geldiğini fark eder. Bir kişi şifreyi yanlış girer, tüm şirket dışarıda kalır. Belirtisi de şudur: site trafiği yarıya iner ama CPU ve bant genişliği hiç değişmemiştir.

İkinci hata: arama motoru veya ödeme servisi webhook'unun IP aralığını bloklamak. ignoreip içine ödeme sunucusunun adresini koymazsan ve o sunucu korumalı bir endpoint'e birkaç başarısız istek yaparsa, Fail2ban onu kapatır ve işlemler sessizce başarısız olur. Uygulama logunu el değmemiş tut ki bunu sonradan yeniden oluşturabilesin; bunu Denetim logu nedir ve onu el değmemiş nasıl tutarız? yazısında anlattım.

Engelleme seçeneklerinin karşılaştırması

YöntemNerede etkilidirGerçek maliyeti
Fail2banSunucu katmanı, log tabanlı servislerdeHer uygulama için regex yazma ve test etme gereği
SSH portunu değiştirmeYalnızca tembel tarayıcılarGerçek koruma yok; sadece daha az gürültü
Genel anahtar + şifreyi devre dışı bırakmaSaldırının kökünü kapatırHer kullanıcı için anahtar yönetimi
Bulut güvenlik duvarıTrafik sunucuya ulaşmadan önceAylık maliyet ve panele bağımlılık

Yalnızca bir şey yapabiliyorsan, SSH ile şifre girişini tamamen devre dışı bırak ve genel anahtar kullan. Bu, brute-force denemelerinin %95'ini kökünden etkisiz kılar ve Fail2ban ikinci katman olur. Doğru sıra budur, tersi değil. Ayrıntıları SSH güvenliği; port değiştirmekten fail2ban ve genel anahtara yazısında yer alıyor.

Kendini blokladığında

Bu herkesin başına gelir. SSH erişimin kesildiyse ve kendi IP'nin bloklandığından eminsen, sunucunun acil konsolundan (KVM veya panel VNC) gir ve şunu çalıştır:

fail2ban-client set sshd unbanip 185.51.200.14

Tam listeyi görmek için:

fail2ban-client banned

Pratik bir nokta: jail.local içinde her değişiklikten önce bir SSH oturumu açık tut ve değişikliği ikinci oturumda uygula. Ayarlar yanlışsa, ilk oturum canlı kalır ve geri dönebilirsin. Bu alışkanlığı güvenlik duvarındaki her değişiklik için de edin.

Sunucu bir CDN arkasındaysa, filtrede X-Forwarded-For okumalısın, yoksa CDN kenarının IP'sini bloklarsın ve site herkes için erişilemez hale gelir. Kullanıcının gerçek adresinin ne olduğunu kontrol etmek için DNS ve ağ sorgulama araçlarını kullan ve başlıkları proxy öncesi ve sonrası karşılaştır.

Sonuç olarak, Fail2ban tepkisel bir araçtır. Sunucunun şu anda ne durumda olduğunu bilmek istiyorsan, herhangi bir değişiklikten önce servisin durumunu kontrol et ve sonra işe koyul. Bu katmanın yönetilen altyapı üzerinde çalışmasını tercih ediyorsan, ServerNet sunucu güvenlik hizmetleri bunu kapsıyor.

Sık sorulan sorular

Fail2ban DDoS saldırısını engeller mi?

Hayır. Fail2ban paket sunucuya ulaştıktan ve loga kaydedildikten sonra tepki verir, bu nedenle bant genişliğini tüketen hacimsel saldırı için çok geçtir. O katman için ağ kenarı filtresi veya DDoS koruma servisi kullanmalısın.

Fail2ban neden hiçbir IP'yi bloklamıyor?

Çoğu durumda filtrenin regex'i gerçek log formatıyla eşleşmiyordur veya logpath yolu yanlıştır. Aynı log dosyası üzerinde fail2ban-regex ile test et; eşleşme sayısı sıfırsa sorun serviste değil filtrededir.

Kendim bloklandıktan sonra nasıl geri dönerim?

Sunucunun acil konsolundan gir ve fail2ban-client set sshd unbanip <IP> komutunu çalıştır. Tekrarını önlemek için sabit IP adresini jail.local dosyasındaki ignoreip içine ekle.

SSH portunu da değiştirmeli miyim?

Portu değiştirmek tek başına ek güvenlik sağlamaz ve yalnızca basit tarayıcıların log hacmini azaltır. Brute-force'u gerçekten durdurmak istiyorsan, şifre girişini devre dışı bırak ve genel anahtar kimlik doğrulamasını zorunlu kıl.

ServerNet Destek

ServerNet mühendislik ve yayın ekibi — altyapı, ağ ve web barındırma uzmanları.

Güvenlik Hizmetleri
Paylaş:

Yorumlar 0

Henüz yorum yok — ilk siz olun!

Yorum bırakın

İlgili hizmet

Güvenlik Hizmetleri

OSCP sertifikalı uzmanlarla sızma testi, altyapı sıkılaştırma ve 7/24 güvenlik izleme.