Fail2ban ile SSH ve web saldırılarını otomatik engellemek
İnternete açık her sunucu, birkaç dakika içinde SSH ve giriş sayfalarına yönelik otomatik şifre denemeleri almaya başlar. Fail2ban, günlükleri izleyip belirli bir sürede çok fazla başarısız deneme yapan IP adreslerini güvenlik duvarında geçici olarak engeller.
Kurulum
# Debian / Ubuntu
sudo apt install fail2ban
# RHEL / Rocky / Alma (EPEL deposu gerekir)
sudo dnf install epel-release && sudo dnf install fail2ban
Ayar dosyası: jail.local
Ana ayar dosyası jail.conf'u düzenleme; paket güncellemesinde üzerine yazılabilir. Bunun yerine /etc/fail2ban/jail.local oluştur:
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 ::1 203.0.113.25
backend = systemd
[sshd]
enabled = true
- findtime + maxretry: 10 dakika içinde 5 başarısız deneme yapan IP engellenir.
- bantime: Engelin süresi.
-1kalıcı engel demektir ama yanlışlıkla kendini engellersen sorun olur. - ignoreip: Kendi sabit IP adresini mutlaka ekle. Yoksa birkaç yanlış şifre denemesinde kendi sunucundan kilitlenirsin.
- backend = systemd: Günlükleri journald'dan okur. SSH günlükleri dosyaya yazılmayan sistemlerde gereklidir. Dağıtımına göre varsayılan farklı olabilir.
Başlat:
sudo systemctl enable --now fail2ban
sudo fail2ban-client status
sudo fail2ban-client status sshd
Tekrar eden saldırganlara daha uzun ceza
Engeli bitip tekrar deneyen IP'ler için engel süresini katlanarak artırabilirsin:
[DEFAULT]
bantime.increment = true
bantime.maxtime = 1w
Web uygulamaları için
Fail2ban, hazır filtrelerle birçok servisi korur. Filtreler /etc/fail2ban/filter.d/ içindedir. Nginx için birkaç örnek:
[nginx-http-auth]
enabled = true
[nginx-botsearch]
enabled = true
logpath = /var/log/nginx/access.log
Kendi uygulamanın giriş sayfası için özel filtre de yazabilirsin. Örneğin uygulaman başarısız girişleri Login failed for 198.51.100.7 biçiminde bir dosyaya yazıyorsa /etc/fail2ban/filter.d/uygulamam.conf:
[Definition]
failregex = Login failed for <HOST>
Ve jail.local içine:
[uygulamam]
enabled = true
filter = uygulamam
logpath = /var/log/uygulamam/auth.log
maxretry = 10
Filtrenin doğru eşleştiğini test et:
sudo fail2ban-regex /var/log/uygulamam/auth.log /etc/fail2ban/filter.d/uygulamam.conf
Uygulaman Cloudflare gibi bir vekilin arkasındaysa günlüklerde ziyaretçinin değil vekilin IP'si görünür. Bu durumda fail2ban vekilin IP'sini engeller ve siten herkese kapanabilir. Önce web sunucusunun gerçek ziyaretçi IP'sini günlüğe yazdığından emin ol.
Engeli kaldırmak
sudo fail2ban-client set sshd unbanip 198.51.100.7
sudo fail2ban-client banned # engellenen bütün IP'ler (yeni sürümlerde)
Fail2ban yeterli mi?
Hayır, bir ek katmandır. Asıl koruma:
- SSH'de şifreyle girişi kapatıp sadece anahtarla giriş (
PasswordAuthentication no), - root ile doğrudan girişi kapatmak,
- mümkünse SSH'yi sadece belirli IP'lere açmak.
Şifreyle giriş kapalıysa kaba kuvvet denemeleri zaten başarılı olamaz; fail2ban bu durumda günlükleri temiz tutar ve gereksiz yükü azaltır. Web giriş sayfalarında ise uygulama içi deneme sınırlarıyla birlikte kullanıldığında gerçekten fark yaratır.