Fail2Ban ile SSH ve Web Brute-Force Saldırılarına Karşı Etkin Savunma
Sunucularınızın güvenliği, sürekli evrilen tehdit ortamında kritik bir öneme sahiptir. Özellikle SSH ve web servisleri gibi dış dünyaya açık servisler, kaba kuvvet (brute-force) saldırılarının hedefi olmaktadır. Fail2Ban, bu tür saldırıları tespit edip engelleyerek sistemlerinizin direncini artırmanıza olanak tanıyan güçlü bir araçtır. Bu rehberde, Fail2Ban'ın teknik detaylarına inecek, gerçek dünya senaryolarıyla zenginleştirecek ve yapılandırmasını derinlemesine inceleyeceğiz.
Fail2Ban'ın Çalışma Prensibi ve Mimarisi
Fail2Ban, sunucunuzdaki log dosyalarını (örneğin, SSH oturum kayıtları, web sunucusu erişim logları) sürekli izler. Belirlenen eşik değerlerini aşan başarısız giriş denemeleri veya şüpheli aktiviteler tespit edildiğinde, ilgili IP adresini otomatik olarak firewall (genellikle iptables) kurallarıyla bloke eder. Bu bloklama, belirli bir süre boyunca kalıcı olabilir veya manuel olarak kaldırılana kadar devam edebilir.
Temel Bileşenler:
- Log Parsers: Çeşitli servislerin log formatlarını anlayarak saldırı girişimlerini ayırt eden regex tabanlı kurallardır.
- Filters: Parsers'dan gelen bilgileri kullanarak şüpheli aktiviteleri tanımlayan yapılandırmalardır. Hangi logların taranacağını ve hangi kalıpların aranacağını belirler.
- Actions: Bir saldırı tespit edildiğinde tetiklenen komutlardır. En yaygın aksiyon, IP adresini firewall'a ekleyerek engellemektir.
- Jail: Fail2Ban'ın temel yapılandırma birimidir. Bir jail, belirli bir servis (örneğin SSH), log dosyasının konumu, filter ve action'ları bir araya getirir.
SSH Brute-Force Saldırılarına Karşı Fail2Ban Yapılandırması
SSH, sızma girişimlerinin en yaygın rotalarından biridir. Fail2Ban, bu saldırılara karşı ilk savunma hattınızı oluşturur. Varsayılan olarak çoğu Fail2Ban kurulumunda SSH için bir 'jail' aktif gelir ancak özelleştirmeler performans ve güvenlik açısından önemlidir.
`jail.local` Yapılandırması:
Yapılandırma dosyası genellikle /etc/fail2ban/jail.local konumundadır. Eğer yoksa jail.conf dosyasını kopyalayarak oluşturabilirsiniz. Bu, güncellemeler sırasında orijinal yapılandırmanın üzerine yazılmasını önler.
# /etc/fail2ban/jail.local
[DEFAULT]
# Engelleme süresi (saniye)
findtime = 10m
# Engelleme sonrası tekrar deneme sayısı
maxretry = 5
# Engelleme süresi (saniye)
bantime = 1h
# Banlanacak IP adreslerinin hangi ağdan olduğunu belirler
ignoreip = 127.0.0.1/8
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
backend = auto
- findtime: Belirtilen süre içinde
maxretrykadar başarısız deneme olursa IP engellenir. - maxretry: Bir IP adresinin engellenmesi için gereken maksimum başarısız deneme sayısı.
- bantime: Engellenen IP adresinin ne kadar süreyle (saniye, dakika, saat, gün cinsinden) engelleneceği.
- ignoreip: Güvenilir IP adreslerini ekleyerek yanlış pozitifleri önler.
- logpath: Fail2Ban'ın izleyeceği SSH log dosyasının yolu. Bu, sisteminize göre değişebilir (örn.
/var/log/secure).
Özel SSH Kuralı Oluşturma (Örnek: Farklı Port Kullanımı):
Eğer SSH servisinizi varsayılan 22 numaralı port yerine farklı bir portta (örn. 2222) çalıştırıyorsanız, SSH jail'ini buna göre düzenlemelisiniz.
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
backend = auto
Web Servisleri (Apache, Nginx) İçin Fail2Ban Yapılandırması
Web sunucuları da parola denemeleri (örn. WordPress admin paneli), SQL injection girişimleri veya bot taramaları gibi çeşitli saldırılara maruz kalabilir. Fail2Ban, bu logları da izleyerek koruma sağlayabilir.
Apache İçin Örnek Jail:
Özellikle 401 (Unauthorized) ve 403 (Forbidden) gibi durum kodlarını üreten istekleri izleyerek saldırganları engelleyebilirsiniz.
[apache-auth]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache2/access.log
maxretry = 3
findtime = 5m
bantime = 1h
Bu yapılandırma, Apache'nin erişim logunu izler ve kısa sürede çok sayıda başarısız kimlik doğrulama denemesi yapan IP'leri engeller.
Nginx İçin Örnek Jail:
Nginx için de benzer şekilde yapılandırma yapabilirsiniz. Özellikle 403 Forbidden hataları veya bot taramaları için özel filtreler oluşturmak faydalıdır.
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/access.log
maxretry = 3
findtime = 5m
bantime = 1h
[nginx-badbot]
enabled = true
port = http,https
filter = nginx-badbot
logpath = /var/log/nginx/access.log
maxretry = 100
findtime = 1h
bantime = 1d
nginx-badbot filtresi, genellikle user-agent başlığında zararlı botları tanımlamak için kullanılır.
Gerçek Production Senaryoları ve İpuçları
Senaryo 1: Yoğun SSH Denemesi ve Otomatik Engelleme
Bir sunucuya gerçekleştirilen otomatikleştirilmiş SSH kaba kuvvet saldırısı sırasında, Fail2Ban'ın /var/log/auth.log dosyasını izlediğini varsayalım. sshd jail'i, 5 dakika içinde 5 başarısız parola denemesini tespit ettiğinde, ilgili IP adresini 1 saat süreyle engeller. Bu, sunucunun CPU ve ağ kaynaklarının gereksiz yere tüketilmesini önler ve gerçek kullanıcıların erişimini korur.
Senaryo 2: WordPress Admin Paneli Saldırıları ve Web Sunucusu Koruması
Bir WordPress sitesinde, yönetici paneline (/wp-admin/) yönelik binlerce başarısız giriş denemesi yapıldığı tespit edildiğinde, özel bir Fail2Ban kuralı (örn. wp-login filtresi ile) bu IP'leri engeller. Bu, hem web sunucusunun (Nginx/Apache) loglarını kirletir hem de veritabanı üzerinde gereksiz yük oluşturur. Fail2Ban, bu saldırıları daha kullanıcı arayüzüne ulaşmadan durdurur.
İpuçları:
- Aşırı Engellemeyi Önleme:
ignoreiplistesini dikkatlice yapılandırın. VPN veya dinamik IP kullanan kullanıcılar için daha uzunbantimesüreleri veya manuel unban işlemleri gerekebilir. - Performans: Çok sayıda jail ve yoğun log trafiği sunucu kaynaklarını etkileyebilir. Gerekli olmayan servisler için jail'leri devre dışı bırakın ve loglama seviyelerini optimize edin.
- Fail2Ban'ı Güncel Tutun: Güvenlik açıklarına karşı korunmak için Fail2Ban'ı düzenli olarak güncelleyin.
- Özel Filtreler: Kendi özel saldırı kalıplarınızı tespit etmek için kendi filtrelerinizi yazmaktan çekinmeyin.
- Email Bildirimleri: Pentest veya önemli saldırılar sırasında bilgilendirilmek için Fail2Ban'ı email bildirimleri gönderecek şekilde yapılandırabilirsiniz. Bunu
jail.localdosyasındadestemailveaction = %(action_mw)sgibi ayarlar yaparak gerçekleştirebilirsiniz.
Fail2Ban Yönetimi ve Komut Satırı Araçları
Fail2Ban'ı yönetmek için çeşitli komut satırı araçları mevcuttur:
- Fail2Ban Servisini Başlatma/Durdurma/Yeniden Başlatma:
sudo systemctl start fail2ban sudo systemctl stop fail2ban sudo systemctl restart fail2ban - Durumu Kontrol Etme:
sudo systemctl status fail2ban - Jail'leri Listeleme: Hangi jail'lerin aktif olduğunu gösterir.
sudo fail2ban-client status - Belirli Bir Jail'in Durumunu Kontrol Etme: Örneğin, SSH jail'inin durumunu görmek için.
sudo fail2ban-client status sshd - IP Adresini Manuel Olarak Engelleme:
sudo fail2ban-client set sshd banip 192.168.1.100 - IP Adresini Manuel Olarak Engellemeden Çıkarma (Unban):
sudo fail2ban-client set sshd unbanip 192.168.1.100 - Tüm Engelleri Gösterme:
Bu komutun çıktısında 'Currently banned' bölümünde engellenen IP'ler listelenir.sudo fail2ban-client status sshd
Sonuç
Fail2Ban, sunucu güvenliğinizi sağlamak için güçlü ve esnek bir çözümdür. SSH ve web servislerine yönelik kaba kuvvet saldırılarını otomatik olarak engelleyerek sistemlerinizi korur. Doğru yapılandırma, düzenli bakım ve gerçek dünya senaryolarına uygun ayarlamalar ile Fail2Ban, altyapınızın direncini önemli ölçüde artıracaktır.