fail2ban Kurulum ve Temel Yapılandırma

Sunucunuzu internete açtığınız andan itibaren brute force saldırıları, otomatik tarayıcılar ve kötü niyetli botlar kapınızı çalmaya başlar. SSH loglarınıza bir bakın, büyük ihtimalle yüzlerce başarısız giriş denemesi göreceksiniz. İşte tam bu noktada fail2ban devreye girer ve bu saldırıları otomatik olarak tespit edip ilgili IP adreslerini engeller.

fail2ban Nedir ve Nasıl Çalışır?

fail2ban, log dosyalarını izleyen ve belirli kurallara uyan şüpheli aktiviteleri tespit ettiğinde otomatik olarak firewall kuralı ekleyen bir araçtır. Python ile yazılmıştır ve temel mantığı oldukça basittir: belirlediğiniz süre içinde belirlediğiniz sayıda başarısız deneme gelirse, o IP’yi belirli bir süre için yasakla.

Çalışma prensibi şu şekilde işler:

  • Filter: Log dosyasındaki başarısız denemeleri tespit eden regex kuralları
  • Jail: Hangi servis için, hangi log dosyasına bakılacağını ve ne kadar ban uygulanacağını belirleyen yapılandırma
  • Action: Ban uygulandığında ne yapılacağını belirleyen aksiyonlar (iptables kuralı ekle, e-posta gönder vb.)

Bir örnek üzerinden düşünelim: Biri SSH’a brute force yapıyor. fail2ban /var/log/auth.log dosyasını izliyor, 10 dakika içinde 5 başarısız deneme görünce o IP’yi iptables’a ekleyerek 1 saat engelliyor. Bu kadar.

Kurulum

Kurulum oldukça basittir, hemen hemen tüm Linux dağıtımlarının paket depolarında bulunur.

Debian/Ubuntu için:

sudo apt update
sudo apt install fail2ban -y

CentOS/RHEL/Rocky Linux için:

sudo dnf install epel-release -y
sudo dnf install fail2ban -y

Arch Linux için:

sudo pacman -S fail2ban

Kurulumun ardından servisi etkinleştirip başlatıyoruz:

sudo systemctl enable fail2ban
sudo systemctl start fail2ban
sudo systemctl status fail2ban

Servis düzgün çalışıyorsa active (running) çıktısını görmeniz gerekir.

Temel Yapılandırma Mantığı

fail2ban yapılandırması /etc/fail2ban/ dizini altında bulunur. Burada dikkat etmeniz gereken önemli bir nokta var: asla jail.conf dosyasını doğrudan düzenlemeyin. Paket güncellemelerinde bu dosya üzerine yazılır ve değişiklikleriniz kaybolur.

Bunun yerine jail.local dosyasını oluşturun. fail2ban önce .conf dosyalarını okur, ardından .local dosyalarıyla üzerine yazar. Bu yüzden sadece değiştirmek istediğiniz parametreleri .local dosyasına yazmak yeterlidir.

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Ya da sıfırdan bir jail.local oluşturabilirsiniz. Ben genellikle ikinci yöntemi tercih ederim, daha temiz kalıyor.

jail.local Temel Yapılandırması

Şimdi /etc/fail2ban/jail.local dosyasını açalım ve temel ayarları yapalım:

sudo nano /etc/fail2ban/jail.local

Aşağıdaki yapılandırma iyi bir başlangıç noktasıdır:

[DEFAULT]
# Kendi IP adresinizi ve yerel ağınızı beyaz listeye alın
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24

# Ban süresi: 1 saat (saniye cinsinden ya da h/m/d kullanılabilir)
bantime = 1h

# Bu süre içindeki denemeler sayılır (10 dakika)
findtime = 10m

# Kaç başarısız denemeden sonra ban uygulanır
maxretry = 5

# Backend: systemd kullanan sistemlerde systemd, diğerlerinde auto
backend = systemd

# Ban aksiyonu
banaction = iptables-multiport

# E-posta bildirimi için (opsiyonel)
# destemail = [email protected]
# sendername = Fail2Ban
# mta = sendmail

[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
maxretry = 3
bantime = 24h

Değişiklikleri kaydettikten sonra fail2ban’ı yeniden başlatın:

sudo systemctl restart fail2ban

Önemli Parametreler

  • ignoreip: Bu IP adresleri hiçbir zaman ban yemez. Kendi IP’nizi mutlaka buraya ekleyin, yoksa kendinizi kilitleyebilirsiniz.
  • bantime: Bir IP’nin ne kadar süre yasaklı kalacağı. -1 yazarsanız kalıcı ban uygular.
  • findtime: Başarısız denemelerin sayılacağı zaman penceresi.
  • maxretry: findtime süresi içinde kaç başarısız deneme ban’ı tetikler.
  • backend: Log okuma backend’i. Systemd kullanan modern sistemlerde systemd kullanın.

Jail Durumunu Kontrol Etmek

fail2ban’ın düzgün çalışıp çalışmadığını ve aktif jail’leri görmek için fail2ban-client komutunu kullanıyoruz:

# Genel durum
sudo fail2ban-client status

# Belirli bir jail'in detayları
sudo fail2ban-client status sshd

sshd jail’inin çıktısı şuna benzer:

Status for the jail: sshd
|- Filter
|  |- Currently failed: 2
|  |- Total failed: 47
|  `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 3
   |- Total banned: 12
   `- Banned IP list: 45.33.32.156 198.20.70.114 80.82.77.139

Bu çıktıda kaç IP’nin şu anda ban’lı olduğunu, toplam kaç ban uygulandığını ve ban’lı IP listesini görebilirsiniz.

Manuel Ban ve Ban Kaldırma

Bazen bir IP’yi manuel olarak ban’lamak ya da yanlışlıkla ban’lanan bir IP’yi kurtarmak gerekebilir:

# Manuel ban uygula
sudo fail2ban-client set sshd banip 1.2.3.4

# Ban kaldır (unban)
sudo fail2ban-client set sshd unbanip 1.2.3.4

# Tüm ban'ları listele
sudo fail2ban-client banned

Kendinizi kilitlemişseniz ve sunucuya console/VNC üzerinden erişebildiğinizde bu komutlar hayat kurtarır.

Nginx ve Apache için fail2ban Yapılandırması

SSH dışında web sunucularınızı da korumak isteyebilirsiniz. Özellikle login sayfalarına yapılan brute force saldırıları, 404 taramaları ve DDoS denemeleri için fail2ban oldukça işe yarar.

/etc/fail2ban/jail.local dosyanıza şu jail’leri ekleyin:

[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 5
bantime = 1h

[nginx-noscript]
enabled = true
port = http,https
filter = nginx-noscript
logpath = /var/log/nginx/access.log
maxretry = 6
bantime = 1h

[nginx-badbots]
enabled = true
port = http,https
filter = nginx-badbots
logpath = /var/log/nginx/access.log
maxretry = 2
bantime = 24h

[apache-auth]
enabled = true
port = http,https
logpath = /var/log/apache2/error.log
maxretry = 5
bantime = 1h

Nginx için bazı filtreler sisteminizde hazır gelmeyebilir. Bu durumda özel filter oluşturmanız gerekir.

Özel Filter Oluşturma

Örneğin WordPress login sayfasını korumak için özel bir filter yazalım. /etc/fail2ban/filter.d/wordpress.conf dosyası oluşturun:

sudo nano /etc/fail2ban/filter.d/wordpress.conf
[Definition]
failregex = ^<HOST> .* "POST /wp-login.php
            ^<HOST> .* "POST /xmlrpc.php
ignoreregex =

Ardından bu filtreyi kullanacak jail’i jail.local‘a ekleyin:

[wordpress]
enabled = true
port = http,https
filter = wordpress
logpath = /var/log/nginx/access.log
maxretry = 3
bantime = 48h
findtime = 1h

Filter regex’inizi test etmek için fail2ban-regex aracını kullanabilirsiniz:

sudo fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/wordpress.conf

Bu komut, kaç satırın eşleştiğini ve hangi IP’lerin tespit edildiğini gösterir. Filter yazarken bu aracı sürekli kullanın, çok zaman kazandırır.

Recidive Jail: Tekrarlayan Saldırganlar İçin

Bazı saldırganlar ban süresi dolunca hemen tekrar saldırmaya devam eder. Bu tip “ısrarcı” saldırganlar için recidive jail’i kullanabilirsiniz. Bu jail, fail2ban’ın kendi log dosyasını izler ve defalarca ban yiyen IP’lere çok daha uzun süreli ban uygular:

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

Bu yapılandırmayla, 1 gün içinde 5 kez ban yiyen bir IP bir hafta boyunca tüm portlardan engellenir. Gerçekten saldırgan birini durdurmak için etkili bir yöntem.

E-posta Bildirimleri

Önemli ban olaylarından haberdar olmak istiyorsanız e-posta bildirimlerini etkinleştirebilirsiniz. Bunun için sunucunuzda bir MTA kurulu olması gerekir (postfix, sendmail vb.):

sudo apt install postfix mailutils -y

Ardından jail.local dosyasındaki [DEFAULT] bölümüne ekleyin:

[DEFAULT]
destemail = [email protected]
sendername = Fail2Ban Alert
mta = mail
action = %(action_mwl)s
  • %(action_)s: Sadece ban uygular
  • %(action_mw)s: Ban uygular + whois bilgisiyle e-posta gönderir
  • %(action_mwl)s: Ban uygular + whois bilgisi + ilgili log satırlarıyla e-posta gönderir

Ben production ortamlarında %(action_mwl)s kullanıyorum. Sabah kalktığımda kim ne yapmaya çalışmış, hangi IP’ler ban’lanmış, hepsini bir e-postada görmek çok rahatlatıcı.

fail2ban Log Takibi

fail2ban’ın ne yaptığını takip etmek için loglarına bakabilirsiniz:

# Canlı log takibi
sudo tail -f /var/log/fail2ban.log

# Sadece ban/unban olayları
sudo grep -E "Ban|Unban" /var/log/fail2ban.log

# Bugünkü ban'lar
sudo grep "Ban" /var/log/fail2ban.log | grep "$(date +%Y-%m-%d)"

# En çok ban yiyen IP'ler
sudo grep "Ban" /var/log/fail2ban.log | awk '{print $NF}' | sort | uniq -c | sort -rn | head -20

Son komut özellikle ilginç istatistikler verir. Hangi IP’lerin en çok ban yediğini görünce, internet üzerindeki otomatik tarayıcıların ne kadar yoğun olduğunu daha iyi anlarsınız.

Gerçek Dünya Senaryosu: VPS Saldırı Altında

Geçen ay bir müşterimin VPS’i sürekli yavaşlıyordu. htop‘a baktım, CPU normal. Sonra logları kontrol ettim:

sudo grep "Failed password" /var/log/auth.log | wc -l

Çıktı: 47.832. Bir günde neredeyse 50.000 başarısız SSH denemesi. Brute force saldırısı tam gaz devam ediyordu ve fail2ban kurulu değildi.

Hızlıca fail2ban kurduk ve agresif bir yapılandırma yaptık:

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1

[sshd]
enabled = true
maxretry = 3
findtime = 5m
bantime = 7d
port = ssh

[recidive]
enabled = true
logpath = /var/log/fail2ban.log
banaction = iptables-allports
bantime = 4w
findtime = 1d
maxretry = 3

Kurulumdan 30 dakika sonra CPU yükü normale döndü, log yazma yavaşladı. İlk saatte 340 farklı IP ban’landı. Saldırıların büyük çoğunluğu Rusya, Çin ve Romanya kaynaklıydı (whois çıktılarına göre). fail2ban olmadan bu sunucu sonunda ele geçirilecekti ya da en azından servis dışı kalacaktı.

Sık Yapılan Hatalar

1. Kendi IP’yi ignoreip’e eklememek: En klasik hata. Yapılandırmayı test ederken kendi IP’nizi ban’layabilirsiniz. Dinamik IP’niz varsa ve evden bağlanıyorsanız bu özellikle tehlikelidir. Her zaman ofis ve ev IP’lerinizi ekleyin.

2. jail.conf’u doğrudan düzenlemek: Güncelleme geldiğinde değişiklikleriniz silinir. Her zaman jail.local kullanın.

3. Çok düşük maxretry değeri: maxretry = 1 koymak cazip görünebilir ama meşru kullanıcılar da yanlışlıkla ban yiyebilir. Genellikle 3-5 arası makul bir değerdir.

4. Backend’i yanlış ayarlamak: Systemd kullanan bir sistemde backend = auto ile loglar düzgün okunamayabilir. Systemd için backend = systemd kullanın.

5. firewalld ile iptables çakışması: CentOS/Rocky sistemlerde hem firewalld hem iptables aktifse çakışmalar olabilir. Bu durumda banaction = firewallcmd-ipset kullanın.

fail2ban ile Birlikte Kullanılabilecek Ek Güvenlik Önlemleri

fail2ban tek başına yeterli değil, kapsamlı bir güvenlik stratejisinin parçası olmalı:

  • SSH key authentication: Parola girişini tamamen kapatın, sadece key ile bağlanmaya izin verin
  • SSH portunu değiştirin: 22’den farklı bir port seçmek otomatik tarayıcıların büyük çoğunluğunu engeller
  • UFW veya firewalld: fail2ban’ın yanında genel firewall kuralları mutlaka olmalı
  • CrowdSec: fail2ban’a modern bir alternatif, topluluk tabanlı tehdit istihbaratıyla çalışır
  • Logwatch veya Lynis: Düzenli güvenlik raporları ve sistem denetimi

Yapılandırmayı Test Etmek

Yeni bir yapılandırma yaptıktan sonra her zaman test edin. fail2ban’ın yapılandırma dosyalarını doğrulamak için:

# Yapılandırma dosyalarını test et
sudo fail2ban-client -t

# Debug modunda başlat (detaylı çıktı)
sudo fail2ban-client -vvv start

# Belirli bir filtreyi test et
sudo fail2ban-regex /var/log/auth.log sshd

fail2ban-client -t komutu syntax hatalarını yakalar ve servisi yeniden başlatmadan önce mutlaka çalıştırılmalıdır. Yanlış bir regex yazdığınızda tüm jail devre dışı kalabilir, bu yüzden test adımını atlamayın.

Sonuç

fail2ban, her Linux sunucusunda bulunması gereken temel güvenlik araçlarından biridir. Kurulumu basit, yapılandırması esnek ve etkisi anında görülür. Özellikle internete açık SSH, web sunucusu veya herhangi bir servis çalıştırıyorsanız fail2ban olmadan sunucunuz sürekli saldırı altında demektir.

Başlangıç için SSH korumasıyla işe başlayın, sonra web sunucularınızı ve diğer servisleri ekleyin. recidive jail’ini mutlaka etkinleştirin, tekrarlayan saldırganları uzun süreliğine engellemek gerçekten işe yarıyor. E-posta bildirimlerini kurun, böylece sisteminizdeki anormal aktiviteleri erken fark edersiniz.

Son bir not: fail2ban reaktif bir araçtır, yani saldırı gerçekleştikten sonra devreye girer. Bu yüzden SSH key authentication, güçlü firewall kuralları ve düzenli güvenlik güncellemeleriyle birlikte kullanın. Güvenlik katmanlı bir yaklaşım gerektirir ve fail2ban bu katmanların önemli bir parçasıdır.

Yorum yapın