İnternete açık bir sunucunun SSH portunu birkaç saat dinlerseniz, bilmediğiniz IP adreslerinden saniye başına gelen parola denemelerini görmeniz an meselesidir. Bu otomatik denemeler, zayıf bir parola bulana kadar yorulmadan devam eder. Fail2ban, tam olarak bu tabloya karşı çalışan, log dosyalarını izleyip belirli eşik aşıldığında saldırgan IP'yi güvenlik duvarı kuralıyla dışarıda tutan hafif bir koruma katmanıdır.

Fail2ban Tam Olarak Ne Yapar?

Çalışma mantığı sade ama etkili: servis loglarını sürekli takip eder, içine tanımladığınız desenlere (regex) uyan başarısız oturum denemelerini sayar ve eşik aşıldığında ilgili IP'yi geçici olarak engeller. Engelleme işlemini doğrudan kendisi yapmaz; arka planda nftables ya da iptables üzerinden bir kural ekler. Süre dolunca kuralı kaldırır. Yani parolayı güçlendirmenin yerine geçmez, ancak saldırı yüzeyini ciddi biçimde daraltır.

  • jail: Hangi servisin korunacağını, hangi log dosyasının izleneceğini ve eşikleri tanımlayan yapı.
  • filter: Log satırlarındaki başarısız denemeyi yakalayan regex tanımları.
  • action: Eşik aşıldığında çalıştırılan işlem; çoğunlukla güvenlik duvarına ban kuralı eklemek.

Kurulum

Paket, hemen her dağıtımın deposunda yer alır. Debian veya Ubuntu tarafında kurulum tek komutla halledilir:

apt update
apt install fail2ban
systemctl enable --now fail2ban

RHEL, AlmaLinux veya Rocky Linux kullanıyorsanız önce EPEL deposunu etkinleştirmeniz gerekir:

dnf install epel-release
dnf install fail2ban fail2ban-firewalld
systemctl enable --now fail2ban

Servisin ayakta olup olmadığını systemctl status fail2ban ile kontrol edebilirsiniz.

Doğru Yapılandırma: jail.local

En sık yapılan hata, ayarları doğrudan /etc/fail2ban/jail.conf dosyasında değiştirmektir. Bu dosya paket güncellemelerinde üzerine yazılır. Bunun yerine değişiklikleri /etc/fail2ban/jail.local içinde tutun; Fail2ban önce .conf dosyasını, ardından .local dosyasını okur ve sonrakini geçerli sayar.

[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 ::1 203.0.113.10
backend  = systemd

[sshd]
enabled = true
port    = ssh
maxretry = 3

Buradaki üç parametre işin kalbidir. findtime penceresi içinde maxretry kadar başarısız deneme olursa IP, bantime süresince banlanır. ignoreip satırına kendi sabit IP'nizi eklemeyi unutmayın; aksi halde bir gün kendinizi kapı dışında bulabilirsiniz.

Tekrarlayan Saldırganlara Karşı Artan Ceza

Sabit bir ban süresi, ısrarcı botlara karşı bir noktadan sonra yetersiz kalır. Fail2ban'in bantime.increment özelliği, aynı IP tekrar yakalandığında ceza süresini katlayarak uzatır:

[DEFAULT]
bantime.increment = true
bantime.factor    = 2
bantime.maxtime   = 1w

Böylece ilk yakalanışta 1 saat ban yiyen bir IP, ısrar ettikçe günler süren bir engelle karşılaşır; üst sınır da bir hafta ile sabitlenir.

Yalnızca SSH Değil

Fail2ban kutudan çıkan haliyle pek çok servis için hazır filtre sunar. Genellikle web ve mail sunucularında da ciddi fayda sağlar:

  • nginx-http-auth / apache-auth: Web panellerine yönelik parola denemeleri.
  • postfix & dovecot: SMTP ve IMAP üzerinden gelen kaba kuvvet girişimleri.
  • wordpress / wp-login: WordPress yönetim girişine yönelik bot trafiği.

Yoğun trafik alan veya birden çok servisi tek makinede barındıran kurulumlarda bu jail'lerin etkinleştirilmesi, log kirliliğini de gözle görülür biçimde azaltır. Kaynaklarınızı esnek biçimde ölçeklemek istiyorsanız bir sanal sunucu çözümü üzerinde Fail2ban'i test ortamı olarak ayağa kaldırıp eşikleri kendi trafiğinize göre kalibre edebilirsiniz.

İzleme ve Yönetim Komutları

Sistemi devreye aldıktan sonra durumu fail2ban-client ile yönetirsiniz. Anlık banlanan IP'leri ve sayaçları görmek için:

fail2ban-client status sshd
fail2ban-client status
fail2ban-client set sshd unbanip 198.51.100.42

Yanlışlıkla banlanan bir kullanıcıyı son komutla anında serbest bırakabilirsiniz. Filtrelerinizin gerçekten doğru satırları yakalayıp yakalamadığını test etmek içinse fail2ban-regex aracı paha biçilmezdir:

fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

Parametre Seçiminde Denge

Eşikleri çok agresif tutarsanız meşru kullanıcıları rahatsız edersiniz; çok gevşek tutarsanız koruma anlamını yitirir. Aşağıdaki tablo, tipik senaryolar için makul başlangıç değerleri sunar.

Senaryomaxretryfindtimebantime
Yönetim SSH (az kullanıcı)310m1h
Web auth / panel girişi510m2h
Mail (SMTP/IMAP)515m4h
Ağır bot baskısı altında25m1w (artan)

Bu değerleri taş yazı olarak görmeyin; kendi log geçmişinizi inceleyip yaklaşık birkaç günlük gözlemle ince ayar yapmak en sağlıklı yöntemdir.

Bogahost Önerisi: Fail2ban'i kritik üretim sunucularında devreye almadan önce, mutlaka kendi statik IP bloğunuzu ignoreip listesine ekleyin ve değişiklikleri uzaktan bağlantınız açıkken yeni bir oturumda test edin. Yönetim panelini ayrı bir IP'den eriştiğiniz bir kuruluma kaydırmak isterseniz, izole kaynaklara sahip bir fiziksel sunucu üzerinde güvenlik katmanlarını daha rahat konumlandırabilirsiniz.

Kalıcılık ve Yeniden Başlatma

Sunucu yeniden başladığında ya da Fail2ban servisi durup kalktığında aktif banların korunup korunmadığı sık sorulan bir konudur. Modern sürümlerde durum bilgisi bir SQLite veritabanında tutulur ve varsayılan olarak /var/lib/fail2ban/fail2ban.sqlite3 altında saklanır. Bu sayede servis tekrar ayağa kalktığında, dbpurgeage süresi dolmamış banlar yeniden uygulanır. Bu davranışı doğrudan ayar dosyasından yönetebilirsiniz:

[DEFAULT]
dbfile     = /var/lib/fail2ban/fail2ban.sqlite3
dbpurgeage = 1d

Güvenlik duvarı tarafında nftables ya da firewalld kullanmak, ham iptables kurallarına göre genellikle daha temiz bir tablo verir; çünkü Fail2ban ban kümelerini ayrı bir set içinde tutar ve diğer kurallarınızla çakışma olasılığı azalır.

Bildirim ve Loglama

Bir IP banlandığında haberdar olmak isterseniz, action satırını e-posta gönderecek şekilde değiştirebilirsiniz. action_mwl seçeneği, ban bilgisinin yanı sıra ilgili WHOIS kaydını ve tetikleyen log satırlarını da iletir:

[DEFAULT]
destemail = [email protected]
sender    = [email protected]
action    = %(action_mwl)s

Çok sayıda jail'in aynı anda çalıştığı yoğun sistemlerde her ban için e-posta almak gürültülü olabilir; böyle durumlarda bildirimi yalnızca SSH gibi kritik jail'lerle sınırlamak daha pratiktir.

Sık Karşılaşılan Tuzaklar

Pratikte en çok şu noktalarda takılınır:

  • Yanlış backend: systemd journal kullanan modern dağıtımlarda backend = systemd ayarlanmazsa Fail2ban hiçbir satır göremeyebilir ve sessizce hiçbir ban uygulamaz.
  • Reverse proxy arkası: Web jail'lerinde gerçek istemci IP'si yerine proxy IP'si banlanabilir; log formatında X-Forwarded-For ya da gerçek IP'nin yer aldığından emin olun.
  • IPv6 ihmali: Yalnızca IPv4 düşünüp IPv6 üzerinden gelen denemeleri gözden kaçırmak yaygın bir açıktır.
  • Log rotasyonu çakışması: Log dosyası döndürülürken takip kesilebilir; systemd backend bu sorunu büyük ölçüde ortadan kaldırır.

Bu kalemlerin her biri, koruma açık gibi görünürken aslında çalışmadığı bir sessiz başarısızlığa yol açabilir. Devreye aldıktan sonra fail2ban-client status sshd çıktısında sayaçların gerçekten arttığını teyit etmek, en hızlı doğrulama yöntemidir.

Özetle

Fail2ban, birkaç dakikalık yapılandırmayla sunucunuzun günlük gürültüsünü ve gerçek tehdit yüzeyini birlikte küçülten, düşük maliyetli ama yüksek getirili bir araçtır. Güçlü parola politikası, anahtar tabanlı SSH girişi ve güncel bir güvenlik duvarıyla birlikte kullanıldığında, kaba kuvvet saldırılarını çoğu durumda daha ilk denemelerde etkisiz bırakır.

Reklam Alanı

İçerik Altı (728x90)

Yorumlar (0)

Henüz yorum yapılmamış. İlk yorumu siz yapın!

Yorum Yap

Maksimum 2000 karakter