fail2ban Kurulumu ve Yapılandırması: SSH'ı Kaba Kuvvet Saldırılarına Kapatın
İnternete açık bir sunucunun SSH loglarına bakan herkes aynı manzarayı görür: dakikada onlarca başarısız giriş denemesi, dünyanın dört bir yanından IP'ler, root, admin, test gibi kullanıcı adlarıyla sonu gelmeyen parola denemeleri. fail2ban, bu denemeleri log dosyalarından tespit edip saldırgan IP'leri güvenlik duvarı seviyesinde otomatik yasaklayan araçtır. Kurulumu dakikalar sürer; doğru yapılandırıldığında kaba kuvvet saldırılarını pratikte anlamsız hâle getirir.
Bu yazıda Ubuntu/Debian üzerinde fail2ban kurulumunu, jail.local yapılandırma mantığını, SSH jail'inin ayarlarını ve sahada en sık karşılaştığımız hataları anlatıyoruz. fail2ban tek başına bir güvenlik çözümü değildir; sunucunun bütününü kapsayan sıkılaştırma adımları için Ubuntu VPS güvenliği rehberimize bakabilirsiniz.
fail2ban Nasıl Çalışır?
Çalışma mantığı üç bileşene dayanır:
- Filter (filtre): Log satırlarında başarısız girişleri yakalayan regex desenleri. Örneğin sshd filtresi, auth logundaki "Failed password" satırlarını tanır.
- Jail (hapishane): Bir filtreyi bir log dosyasına ve bir yasaklama aksiyonuna bağlayan kural seti. "sshd jail" = SSH loglarını izle, eşik aşılırsa yasakla.
- Action (aksiyon): Yasaklamanın nasıl uygulanacağı; varsayılan olarak nftables/iptables kuralı eklenir.
Özetle: log izlenir, desen eşleşir, sayaç artar, eşik aşılınca IP belirlenen süre boyunca firewall'da engellenir.
Kurulum
sudo apt update
sudo apt install fail2ban -y
İlk komut paket listesini günceller, ikincisi fail2ban'ı ve bağımlılıklarını kurar. Servisi etkinleştirip başlatın:
sudo systemctl enable --now fail2ban
Bu komut servisi hem hemen başlatır hem de sunucu yeniden başladığında otomatik açılmasını sağlar. Çalıştığını doğrulamak için:
sudo systemctl status fail2ban
Çıktıda active (running) görüyorsanız kurulum tamamdır. Ubuntu'da sshd jail'i çoğu sürümde kutudan çıkar çıkmaz etkindir; yine de ayarları kendimiz belirleyeceğiz.
jail.local Mantığı: Neden jail.conf'u Düzenlememelisiniz?
fail2ban'ın ana yapılandırması /etc/fail2ban/jail.conf dosyasındadır. Bu dosyayı doğrudan düzenlemeyin: paket güncellemelerinde dosya yenilenir ve değişiklikleriniz kaybolur. Doğru yöntem, aynı dizinde jail.local dosyası oluşturmaktır; fail2ban önce jail.confu okur, sonra jail.local ile üzerine yazar. Böylece yalnızca değiştirmek istediğiniz ayarları tutan küçük ve güncellemeye dayanıklı bir dosyanız olur.
sudo nano /etc/fail2ban/jail.local
Önerdiğimiz başlangıç yapılandırması:
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 ::1
[sshd]
enabled = true
port = ssh
maxretry = 3
bantime = 24h
[DEFAULT] bölümü tüm jail'ler için geçerli varsayılanları belirler; [sshd] bölümü ise SSH jail'ini etkinleştirir ve varsayılanları kendi değerleriyle ezer. Burada SSH için daha sert davranıyoruz: 3 hatalı denemede 24 saat yasak. Değişiklikten sonra servisi yeniden yükleyin:
sudo systemctl restart fail2ban
SSH portunuzu değiştirdiyseniz (örneğin 10022), port = ssh satırını port = 10022 yapmayı unutmayın; aksi hâlde yasak kuralı yanlış porta yazılır ve koruma fiilen çalışmaz.
Parametreler: bantime, findtime, maxretry
Üç parametrenin birlikte nasıl çalıştığını anlamak, fail2ban'ı doğru ayarlamanın anahtarıdır:
| Parametre | Anlamı | Önerimiz (SSH) |
|---|---|---|
maxretry |
Yasak için gereken başarısız deneme sayısı | 3 |
findtime |
Denemelerin sayılacağı zaman penceresi | 10m |
bantime |
Yasağın süresi | 24h |
Okunuşu şöyle: "Bir IP, 10 dakika içinde 3 başarısız deneme yaparsa 24 saat yasaklanır." Süreleri 10m, 1h, 24h, 1w gibi birimlerle yazabilirsiniz; birimsiz değerler saniye kabul edilir.
İşe yarayan iki ek ayar:
[DEFAULT]
bantime.increment = true
bantime.maxtime = 4w
bantime.increment, aynı IP tekrar yasaklandıkça yasak süresini katlanarak artırır; bantime.maxtime bu artışın üst sınırını belirler. Israrcı botlar için özellikle etkilidir.
Dikkat edilmesi gereken denge: bantime'ı kalıcı (-1) yapmak cazip görünse de, dinamik IP'ler ve NAT arkasındaki ağlar yüzünden masum kullanıcıları da kalıcı kilitleyebilir. Uzun ama sonlu yasak + artımlı süre, sahada en sağlıklı bulduğumuz kombinasyondur. Kendi sabit IP'nizi ignoreip satırına eklemek, yanlışlıkla kendinizi yasaklamanızı önler.
Durum Komutları: Ne Olup Bittiğini Görmek
fail2ban'ın günlük yönetimi fail2ban-client üzerinden yapılır. En sık kullanacağınız komutlar:
sudo fail2ban-client status
Aktif jail'lerin listesini gösterir; sshd burada görünmüyorsa jail etkin değildir.
sudo fail2ban-client status sshd
sshd jail'inin detayını döker: toplam/güncel başarısız deneme sayısı ve yasaklı IP listesi. Sunucunun ne kadar saldırı aldığını görmenin en hızlı yolu budur.
sudo fail2ban-client set sshd unbanip 203.0.113.42
Belirtilen IP'nin yasağını kaldırır; ofis IP'niz yanlışlıkla yasaklandığında kullanacağınız komut budur.
sudo fail2ban-client set sshd banip 198.51.100.7
Bir IP'yi elle yasaklar; loglarda gördüğünüz şüpheli bir kaynağı beklemeden engellemek için kullanışlıdır.
sudo tail -f /var/log/fail2ban.log
fail2ban'ın kendi logunu canlı izler; Ban ve Unban satırlarından sistemin çalıştığını doğrulayabilirsiniz.
Filtrenizi Test Edin: fail2ban-regex
Bir jail'in gerçekten çalışıp çalışmadığından emin olmanın en sağlam yolu, filtresini gerçek log verisi üzerinde test etmektir:
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
Komut, sshd filtresinin regex desenlerini auth.log'a uygular ve kaç satırın eşleştiğini raporlar. Sunucunuz saldırı alıyorsa çıktıdaki Matched sayısının sıfırdan büyük olması gerekir; sıfırsa filtre ile log formatı arasında bir uyumsuzluk var demektir ve jail görünürde çalışsa bile kimseyi yasaklamıyordur. Journal tabanlı sistemlerde aynı testi journalctl -u ssh --no-pager | sudo fail2ban-regex - /etc/fail2ban/filter.d/sshd.conf biçiminde borulayarak yapabilirsiniz.
Kendinizi güvenli biçimde test etmek isterseniz, farklı bir ağdan (örneğin telefon hotspot'u) sunucuya bilerek yanlış parolayla birkaç kez bağlanmayı deneyin; ardından fail2ban-client status sshd çıktısında o IP'nin yasaklandığını görmelisiniz. Bu uçtan uca test, yapılandırmanın kâğıt üzerinde değil sahada çalıştığını kanıtlar.
Sık Yapılan Hatalar
Müdahale ettiğimiz vakalarda fail2ban "kurulu ama işlevsiz" durumda sık karşımıza çıkıyor. En yaygın nedenler:
1. Jail etkin sanılıyor ama değil. jail.local dosyasına enabled = true yazılmamış ya da bölüm adı yanlış yazılmış ([ssh] yerine [sshd] olmalı). Kontrol: sudo fail2ban-client status çıktısında jail'i görüyor musunuz?
2. Değiştirilen SSH portu jail'e bildirilmemiş. SSH 10022'ye taşınmış, jail hâlâ port = ssh (22) ile çalışıyor. Deneme sayacı işler ama engelleme kuralı 22'ye yazıldığı için saldırgan denemeye devam eder.
3. jail.conf doğrudan düzenlenmiş. Paket güncellemesi dosyayı sıfırlar, koruma sessizce eski hâline döner. Tüm özelleştirmeler jail.local'da (veya jail.d/ altındaki dosyalarda) durmalıdır.
4. Log kaynağı uyumsuzluğu. Yeni Ubuntu/Debian sürümlerinde sshd logları dosya yerine systemd journal'a gider. Güncel fail2ban sürümleri bunu backend = systemd ile otomatik yönetir; ancak eski yapılandırmalardan kalan logpath tanımları filtrenin hiçbir satır görmemesine yol açabilir. fail2ban.log içinde jail başlarken hata olup olmadığını kontrol edin.
5. fail2ban'a tek başına güvenmek. fail2ban parola denemelerini yavaşlatır; parolayı ortadan kaldırmaz. Asıl çözüm SSH'ta parola girişini tamamen kapatıp anahtara geçmektir. fail2ban bunun üzerine ek bir katmandır, yerine geçen bir önlem değildir.
6. Kendini yasaklamak. Yanlış parolayı birkaç kez üst üste deneyip sunucuya erişimi kaybetmek klasik senaryodur. Sabit IP'nizi ignoreip'e ekleyin; yasaklandıysanız sunucuya sağlayıcı konsolundan girip unbanip komutunu kullanın.
fail2ban'ı Bütünün İçine Yerleştirin
Doğru yapılandırılmış bir fail2ban, SSH ve diğer servislere yönelik kaba kuvvet saldırılarını etkisiz hâle getirir; ama sunucu güvenliği tek katmandan ibaret değildir. Kapalı root girişi, anahtar tabanlı SSH, sıkı bir UFW politikası ve internete açılmayan uygulama portlarıyla birlikte anlam kazanır. Sunucunuzun bu katmanların kaçına sahip olduğunu görmek isterseniz ücretsiz sunucu güvenlik kontrolü yaptırabilir, kurumsal düzeyde bir yapılandırma için Linux sunucu sıkılaştırma hizmetimizi inceleyebilirsiniz. Loglarınızda başarısız denemelerin ötesinde başarılı şüpheli girişler görüyorsanız durum farklıdır; bu ihtimalde sitem hacklendi, ne yapmalıyım yazımızdaki adımları izleyin veya doğrudan acil müdahale hattımıza ulaşın.
Sık Sorulan Sorular
fail2ban kurduktan sonra SSH parola girişini kapatmama gerek kalır mı?
Kalır. fail2ban denemeleri yavaşlatır ama zayıf bir parola yine de birkaç deneme içinde bulunabilir; ayrıca saldırgan farklı IP'lerden denemeye devam edebilir. Parola girişini tamamen kapatıp SSH anahtarına geçmek asıl önlemdir; fail2ban bunun tamamlayıcısıdır.
fail2ban SSH dışındaki servisleri de koruyabilir mi?
Evet. Paketle birlikte Nginx/Apache auth, Postfix, Dovecot, vsftpd gibi birçok servis için hazır filtre gelir; WordPress giriş denemeleri gibi özel senaryolar için kendi filtrenizi de yazabilirsiniz. Her biri kendi jail bölümüyle etkinleştirilir ve aynı bantime/findtime/maxretry mantığıyla çalışır.
Yasaklı IP listesi sunucu yeniden başlayınca silinir mi?
Güncel sürümlerde fail2ban yasakları bir SQLite veritabanında (/var/lib/fail2ban/fail2ban.sqlite3) tutar ve servis yeniden başladığında süresi dolmamış yasakları geri yükler. Yani planlı bir reboot, aktif yasakları sıfırlamaz.
bantime değerini çok yüksek yaparsam ne olur?
Bot IP'leri uzun süre engelli kalır, bu iyidir; ancak dinamik IP kullanan gerçek kullanıcılar veya NAT arkasındaki ofis ağları da uzun süre kilitlenebilir. Bu yüzden sonsuz yasak yerine bantime.increment ile artımlı süreyi öneriyoruz: ilk hata kısa, tekrarlayan saldırı giderek uzun yasak alır.
fail2ban'ı kurdunuz ama loglarda gördükleriniz içinize sinmiyorsa, sunucunuza ücretsiz güvenlik kontrolü yapalım; giriş denemelerini, açık portları ve yapılandırma hatalarını raporlayalım. WhatsApp üzerinden 7/24 ulaşabilirsiniz; kapsamlı koruma için VPS güvenliği hizmetimize göz atın.