Rehber

Fail2ban kurulumu: SSH'i parola kaba kuvvetinden koruma

Güncellendi: · Skillaria.Top

Fail2ban, servislerin günlüklerini okur, tekrarlanan başarısız giriş denemelerini bulur ve saldırganın IP adresini güvenlik duvarı üzerinden geçici olarak engeller. SSH'i korumak için paketi kurup /etc/fail2ban/jail.local dosyasına [sshd] bölümünü (enabled = true, maxretry, findtime, bantime) yazmak ve servisi yeniden başlatmak yeterlidir; durum fail2ban-client status sshd ile kontrol edilir.

Fail2ban, servislerin günlüklerini izleyen, tekrarlanan başarısız giriş denemelerini fark eden ve bunların geldiği IP adresini kısa süreliğine engelleyen bir servistir. SSH için bu, parola kaba kuvvetine karşı en basit korumadır: botlar birkaç hatadan sonra sunucuyu zorlamayı bırakır. Aşağıda fail2ban kurulumu, kurulumdan ban kontrolüne ve engeli kaldırmaya kadar anlatılıyor; tipik hatalar da var.

SSH anahtarı varken fail2ban neden gerekli

22. portu açık olan her sunucu, açıldıktan birkaç dakika sonra giriş denemeleri almaya başlar. Kendiniz bakabilirsiniz:

$ sudo journalctl -u ssh --since "1 hour ago" | grep -c "Failed password"
412

Parolayla giriş kapalıysa ve yalnızca anahtarlar kullanılıyorsa, erişimi tahmin etmek neredeyse imkânsızdır. Yine de fail2ban faydalıdır: günlükteki gürültüyü azaltır, binlerce bağlantının yükünü hafifletir ve parola girişinin yanlışlıkla yeniden açılması gibi yapılandırma hatalarına karşı korur. Bu anahtarların yerini almaz, ikinci bir katmandır.

Fail2ban nasıl çalışır

Mantık üç parçadan oluşur:

  • Filtre (filter) — başarısız denemeyi gösteren günlük satırlarını bulan ve içinden IP'yi çıkaran düzenli ifadeler. Filtreler /etc/fail2ban/filter.d/ dizinindedir.
  • Eylem (action) — ihlal edene ne yapılacağı: iptables, nftables, ufw veya firewalld'ye kural eklemek. Eylemler /etc/fail2ban/action.d/ dizinindedir.
  • Hapishane (jail) — filtrenin, eylemin, günlük kaynağının ve eşiklerin birleşimi. Örneğin sshd jail'i SSH günlüğünü izler.

findtime süresi içinde bir IP'den maxretry kadar eşleşme gelirse, adres bantime süresince engellenir. Süre dolunca engel kendiliğinden kalkar.

Fail2ban kurulumu

Debian ve Ubuntu'da:

sudo apt update
sudo apt install fail2ban

RHEL, Rocky, AlmaLinux'ta paket EPEL deposundadır:

sudo dnf install epel-release
sudo dnf install fail2ban

Açılışta otomatik başlatmayı açın ve servisin durumunu kontrol edin:

sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban

Debian ve Ubuntu'da SSH jail'i /etc/fail2ban/jail.d/defaults-debian.conf üzerinden varsayılan olarak açıktır. RHEL ailesinde kurulumdan sonra hiçbir jail açık değildir; onları elle etkinleştirmeniz gerekir.

Ayarlar nerede: jail.conf ve jail.local

Ana dosya /etc/fail2ban/jail.conf'tur, ama bunu düzenlemeyin: paket güncellendiğinde üzerine yazılır. Kendi ayarlarınızı /etc/fail2ban/jail.local veya /etc/fail2ban/jail.d/*.local dosyalarına yazın. Fail2ban dosyaları şu sırayla okur ve her sonraki, önceki değeri geçersiz kılar:

  1. jail.conf
  2. jail.d/*.conf
  3. jail.local
  4. jail.d/*.local

jail.conf'un tamamını jail.local'a kopyalamayın — eski varsayılan değerleri dondurmuş olursunuz. jail.local dosyasına yalnızca değiştirdiklerinizi yazın.

SSH için fail2ban kurulumu: minimal jail.local

Dosyayı oluşturun:

sudo nano /etc/fail2ban/jail.local

İçine şunu ekleyin:

[DEFAULT]
# Hiçbir zaman engellenmeyecek adresler
ignoreip = 127.0.0.1/8 ::1 203.0.113.10
bantime  = 1h
findtime = 10m
maxretry = 5
# Günlük kaynağı: systemd journal veya dosyalar
backend  = systemd

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

Servisi yeniden başlatın ve jail'in ayağa kalktığını kontrol edin:

$ sudo systemctl restart fail2ban
$ sudo fail2ban-client status
Status
|- Number of jail:      1
`- Jail list:   sshd

Parametrelerin anlamı

ParametreAnlamıÖrnek
enabledjail etkin mitrue
portihlal edene engellenecek port(lar)ssh, 2222, ssh,2222
maxretryengellemeden önce izin verilen hata sayısı3
findtimehataların sayıldığı zaman penceresi10m
bantimeengelleme süresi; -1 — kalıcı1h, 1d
ignoreipengellenmeyecek adresler ve alt ağlar10.0.0.0/8
backendgünlük kaynağısystemd, auto
logpathdosya tabanlı backend için günlük dosyasının yolu/var/log/auth.log
banactionengellemek için hangi güvenlik duvarı kullanılırnftables-multiport, ufw

Süreler s, m, h, d, w ekleriyle yazılabilir. Ek olmayan sayılar saniye kabul edilir.

backend: systemd mi yoksa dosya mı

Debian 12 ve Ubuntu 24.04'te rsyslog kurulu değilse /var/log/auth.log dosyası olmayabilir: SSH günlükleri yalnızca systemd journal'da tutulur. Bu durumda backend = systemd gerekir; aksi halde fail2ban, günlük dosyası bulunamadığı hatasıyla başlamaz. rsyslog kuruluysa dosya tabanlı seçenek de kullanılabilir:

[sshd]
enabled  = true
backend  = auto
logpath  = /var/log/auth.log

RHEL sistemlerinde karşılık gelen dosya /var/log/secure'dur.

Standart olmayan portta SSH

sshd, örneğin 2222 portunu dinliyorsa, bunu jail'de belirtin; aksi halde fail2ban 22. portu engeller, saldırı ise 2222'de sürer:

[sshd]
enabled = true
port    = 2222

İhlal edenin tüm portlarını birden engellemek için banaction parametresiyle iptables-allports veya nftables-allports eylemi kullanılabilir.

Güvenlik duvarı seçimi: iptables, nftables, ufw, firewalld

Debian'da varsayılan banaction = nftables'tır (eski sürümlerde iptables), RHEL'de firewalld. Sunucuda ufw yapılandırılmışsa, engellerin ufw'de görünmesi daha kullanışlıdır:

[DEFAULT]
banaction = ufw

firewalld için:

[DEFAULT]
banaction = firewallcmd-rich-rules

Kuralların gerçekten eklendiğini sudo nft list ruleset | grep f2b veya sudo iptables -L -n | grep f2b ile görebilirsiniz: fail2ban, f2b- önekli zincirler oluşturur.

Çalışmayı kontrol etme: fail2ban-client status

Ana yönetim aracı fail2ban-client'tır. Belirli bir jail'in durumu:

$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 2
|  |- Total failed:     147
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 4
   |- Total banned:     38
   `- Banned IP list:   45.148.10.12 92.118.39.7 185.224.128.40 218.92.0.112

Buradan şu anda pencerede kaç hata olduğunu, kaç IP'nin engellendiğini ve bunların hangileri olduğunu görürsünüz. Korumayı canlı test etmek için başka bir makineden (ignoreip içinde olmayan) birkaç kez yanlış parolayla giriş deneyin — üçüncü denemeden sonra bağlantı kurulamaz.

Fail2ban'ın kendi günlüğü /var/log/fail2ban.log dosyasındadır:

$ sudo tail -n 3 /var/log/fail2ban.log
2026-10-14 09:12:41,118 fail2ban.filter  [812]: INFO    [sshd] Found 218.92.0.112
2026-10-14 09:12:44,302 fail2ban.filter  [812]: INFO    [sshd] Found 218.92.0.112
2026-10-14 09:12:47,551 fail2ban.actions [812]: NOTICE  [sshd] Ban 218.92.0.112

fail2ban'da IP engeli nasıl kaldırılır

Kendinizi veya bir meslektaşınızı yanlışlıkla engellediyseniz, engeli sunucunun konsolundan (sağlayıcı paneli veya başka bir IP üzerinden) kaldırın:

sudo fail2ban-client set sshd unbanip 203.0.113.25

Tüm jail'lerdeki tüm engelleri kaldırmak için:

sudo fail2ban-client unban --all

Filtrenin tetiklenmesini beklemeden bir adresi elle engellemek için:

sudo fail2ban-client set sshd banip 198.51.100.7

Aynı sorunun tekrarlanmaması için kendi sabit adreslerinizi veya ofis alt ağınızı ignoreip'e ekleyin.

Tekrarlayan ihlalciler için artan engelleme süresi

Birçok bot, engel kalkar kalkmaz geri döner. Sürüm 0.11'den itibaren fail2ban, tekrarlayan ihlalciler için engelleme süresinin artmasını destekler:

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

Aynı IP'nin her yeni engeli bir öncekinden daha uzun olur, ama dört haftayı geçmez. Eski sürümler için alternatif, kendi günlüğünü okuyan ve birden fazla kez yakalanan adresleri uzun süre engelleyen recidive jail'idir:

[recidive]
enabled  = true
logpath  = /var/log/fail2ban.log
bantime  = 1w
findtime = 1d
maxretry = 5

Filtreyi test etme: fail2ban-regex

Jail çalışıyor ama kimseyi engellemiyorsa, filtrenin günlükte gerçekten satır bulup bulmadığını kontrol edin. Dosya günlüğü için:

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

systemd journal için:

sudo fail2ban-regex systemd-journal sshd

Çıktıda Lines: ... matched satırına bakın. Sıfır eşleşme, filtrenin günlük biçimine uymadığı veya yanlış kaynağın seçildiği anlamına gelir. Yeniden başlatmadan önce tüm yapılandırmanın sözdizimini de kontrol etmek iyidir:

sudo fail2ban-client -t

Tipik hatalar

  • Servis başlamıyor: «Have not found any log file for sshd jail». /var/log/auth.log yok. backend = systemd ayarlayın veya rsyslog kurun.
  • Durumda engeller var ama saldırı sürüyor. Yanlış port belirtilmiş (SSH taşınmış) veya güvenlik duvarı kuralları daha önceki bir izin kuralıyla çakışıyor. port değerini ve nft list ruleset çıktısını kontrol edin.
  • Değişiklikler uygulanmadı. jail.conf düzenlenmiş, ama jail.local veya jail.d/*.local içinde başka bir değer var. Etkin değeri görün: sudo fail2ban-client get sshd maxretry.
  • Kendinizi engellediniz. Konsoldan engeli kaldırın ve IP'nizi ignoreip'e ekleyin.
  • Docker'daki fail2ban saldırıları görmüyor. Konteyner portları INPUT'u atlayan DOCKER zinciri üzerinden yayımlanır. Bu tür servisler için eylemde chain = DOCKER-USER kullanın.

SSH'i korumak için başka neler yapılabilir

Fail2ban, /etc/ssh/sshd_config içindeki temel önlemlerle birlikte iyi çalışır:

PasswordAuthentication no
PermitRootLogin no
MaxAuthTries 3

Değişiklikten sonra sudo sshd -t ile yapılandırmayı kontrol edin ve servisi yeniden başlatın. Yeni oturumda anahtarla girişin çalıştığını doğrulayana kadar mevcut oturumunuzu kapatmayın. Ayrıca güvenlik duvarında SSH erişimini yalnızca gerekli adreslerle sınırlayabilirsiniz.

Sonuç

Fail2ban kurulumu birkaç adımdır: paketi kurun, [sshd] bölümü olan bir jail.local oluşturun, doğru backend'i ve portu seçin, maxretry, findtime ve bantime değerlerini belirleyin, kendi adreslerinizi ignoreip'e ekleyin ve fail2ban-client status sshd ile çalışmayı doğrulayın. Yalnızca anahtarla girişle birlikte bu, SSH'i parola kaba kuvvetinden güvenilir biçimde korur. Sunucu koruması ve fail2ban kurstaki Linux uygulamalarında ele alınır.

Sık sorulan sorular

Parolalı giriş kapalıysa fail2ban'a ihtiyaç var mı?

Zorunlu değil, ama faydalı: binlerce anlamsız denemeyi günlüklerden temizler, yükü azaltır ve parola girişi yanlışlıkla yeniden açılırsa ek koruma sağlar.

Tüm jail'lerdeki engellenmiş IP'leri nasıl görürüm?

sudo fail2ban-client banned komutunu çalıştırın; her jail için engellenen adreslerin listesini verir. Tek bir jail için fail2ban-client status sshd kullanın.

Sunucu yeniden başlatıldıktan sonra engeller korunur mu?

Evet. fail2ban engelleri kendi SQLite veritabanında (/var/lib/fail2ban/fail2ban.sqlite3) tutar ve dbpurgeage bunları daha önce silmediyse açılışta geri yükler.

Fail2ban yalnızca SSH'i mi koruyabilir?

Hayır, paketle birlikte nginx, Apache, Postfix, Dovecot ve diğer servisler için filtreler gelir. Gerekli jail'i jail.local içinde etkinleştirmek yeterlidir, örneğin enabled = true ile [nginx-http-auth].

Fail2ban ile güvenlik duvarındaki kısıtlama arasındaki fark nedir?

Güvenlik duvarı adresleri sabit olarak izinli veya yasaklı yapar, fail2ban ise günlüklerde kötü davranış gösterenleri dinamik olarak engeller. Çoğunlukla birlikte kullanılırlar: güvenlik duvarında beyaz liste, geri kalanı için fail2ban.

Bu konuyu videoyla öğrenin

Bu konu “Linux: с нуля до уверенного администрирования” kursunda uygulamalı olarak ayrıntılı işleniyor.

Kursa git