UFW ile Fail2Ban Entegrasyonu: Otomatik IP Engelleme Sistemi Kurma

Sunucunuza her gün binlerce brute-force denemesi geldiğini fark ettiğinizde, “bunu manuel takip edemem” diye düşünürsünüz. İşte tam bu noktada UFW ile Fail2Ban kombinasyonu devreye girer. Bu ikili, saldırı girişimlerini otomatik olarak tespit edip engelleyen, neredeyse kendi kendine çalışan bir güvenlik katmanı oluşturur. Bugün bu sistemi sıfırdan nasıl kuracağımızı, nasıl yapılandıracağımızı ve gerçek dünyada nasıl çalıştığını adım adım göreceğiz.

Temel Kavramlar: UFW ve Fail2Ban Ne İş Yapar?

UFW (Uncomplicated Firewall), iptables’ın üzerine oturmuş, kullanımı kolay bir güvenlik duvarı aracıdır. Ubuntu ve Debian tabanlı sistemlerde varsayılan olarak gelir. Karmaşık iptables kuralları yazmak yerine basit komutlarla port yönetimi yapmanızı sağlar.

Fail2Ban ise log dosyalarını sürekli izleyen, belirli bir sürede çok fazla başarısız giriş denemesi yapan IP adreslerini tespit eden ve bu IP’leri otomatik olarak engelleyen bir araçtır. Python ile yazılmıştır ve son derece esnek bir yapıya sahiptir.

İkisini birlikte kullandığınızda şu senaryo gerçekleşir: Birisi SSH’a 5 kez yanlış şifre girerse, Fail2Ban bunu fark eder ve UFW aracılığıyla o IP’yi otomatik olarak banlar. Siz hiçbir şey yapmadan sistem kendini korur.

Kurulum

Sistem Güncellemesi ve Paket Kurulumu

Her şeyden önce sisteminizi güncel tutun. Sonra gerekli paketleri yükleyin:

sudo apt update && sudo apt upgrade -y
sudo apt install ufw fail2ban -y

Kurulum tamamlandıktan sonra her iki servisin durumunu kontrol edin:

sudo systemctl status ufw
sudo systemctl status fail2ban

UFW’yi Aktif Etmeden Önce SSH’ı Unutmayın

Bu adım kritik. UFW’yi etkinleştirmeden önce SSH portuna izin vermezseniz sunucunuza erişiminizi kaybedersiniz. Özellikle uzak sunucularda çalışıyorsanız bu adımı atlamamalısınız:

# Varsayılan SSH portu için
sudo ufw allow 22/tcp

# Eğer SSH portunu değiştirdiyseniz (örneğin 2222)
sudo ufw allow 2222/tcp

# Gerekli diğer portları da ekleyin
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

Artık UFW’yi güvenle aktif edebilirsiniz:

sudo ufw enable
sudo ufw status verbose

Fail2Ban Yapılandırması

Temel Yapılandırma Mantığı

Fail2Ban’ın iki önemli kavramı vardır: jail (hapishane) ve filter (filtre). Jail, hangi servisin izleneceğini ve ne olduğunda ne yapılacağını tanımlar. Filter ise log dosyalarında hangi pattern’ları arayacağını belirtir.

Fail2Ban’ın kendi yapılandırma dosyasını doğrudan düzenlememelisiniz. Bunun yerine .local uzantılı dosyalar oluşturmalısınız. Bu sayede Fail2Ban güncellendiğinde yapılandırmanız bozulmaz.

# Örnek yapılandırmayı kopyalayın
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Şimdi jail.local dosyasını düzenleyelim:

sudo nano /etc/fail2ban/jail.local

Temel jail.local Yapılandırması

Dosyanın [DEFAULT] bölümüne aşağıdaki ayarları ekleyin veya güncelleyin:

[DEFAULT]
# Kendi IP adresinizi asla banlamamak için
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24

# Bir IP'nin kaç saniye banlanacağı (86400 = 1 gün)
bantime = 86400

# Kaç saniye içindeki denemeler sayılacak
findtime = 600

# Kaç başarısız deneme ban için tetikleyici olacak
maxretry = 5

# Backend ayarı - systemd kullanan sistemler için
backend = systemd

# UFW'yi ban için kullan
banaction = ufw
banaction_allports = ufw

Bu ayarları biraz açıklayalım:

  • ignoreip: Bu IP’ler asla banlanmaz. Kendi IP adresinizi veya güvendiğiniz ağları buraya ekleyin
  • bantime: Negatif değer verirseniz (-1) kalıcı ban uygular
  • findtime: 10 dakikalık pencerede maxretry kadar hata olursa ban devreye girer
  • maxretry: 5 başarısız deneme eşiği, web uygulamaları için bunu düşürebilirsiniz

SSH Jail Yapılandırması

Şimdi SSH için özel bir jail tanımlayalım. jail.local dosyasına şunları ekleyin:

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 172800
findtime = 300

SSH için daha sıkı kurallar koyduk: 5 dakika içinde 3 yanlış deneme 2 günlük ban anlamına geliyor. SSH brute-force oldukça yaygın olduğu için agresif olmakta fayda var.

UFW Action Dosyası Oluşturma

Fail2Ban’ın UFW ile düzgün konuşabilmesi için özel bir action dosyası oluşturmanız gerekiyor:

sudo nano /etc/fail2ban/action.d/ufw.conf

Dosyaya şu içeriği ekleyin:

[Definition]
actionstart =
actionstop =
actioncheck =

actionban = ufw insert 1 deny from <ip> to any comment "Fail2Ban: <name>"

actionunban = ufw delete deny from <ip> to any

Bu yapılandırma sayesinde Fail2Ban bir IP’yi banlayacağı zaman otomatik olarak ufw insert 1 deny from IP to any komutunu çalıştırır. insert 1 komutu bu kuralı listenin en başına ekler, yani öncelikli olarak işlenir.

Web Sunucusu Güvenliği: Nginx ve Apache

Nginx İçin Jail

Web sunucunuza gelen saldırılar genellikle brute-force değil, bot taramaları şeklinde gelir. Nginx için özel bir jail oluşturalım:

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

[nginx-limit-req]
enabled = true
port = http,https
filter = nginx-limit-req
logpath = /var/log/nginx/error.log
maxretry = 10
bantime = 7200
findtime = 600

[nginx-botsearch]
enabled = true
port = http,https
filter = nginx-botsearch
logpath = /var/log/nginx/access.log
maxretry = 2
bantime = 86400
findtime = 3600

Apache İçin Jail

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

[apache-badbots]
enabled = true
port = http,https
filter = apache-badbots
logpath = /var/log/apache2/access.log
maxretry = 2
bantime = 172800
findtime = 3600

Özel Filtre Oluşturma

Bazen varsayılan filtreler yetersiz kalır. Özelleştirilmiş bir uygulama çalıştırıyorsanız kendi filtrenizi yazabilirsiniz. Örneğin, özel bir web uygulamasının login hataları için:

sudo nano /etc/fail2ban/filter.d/myapp-auth.conf
[Definition]
failregex = ^<HOST> .* "POST /login HTTP/.*" 401
            ^<HOST> .* "POST /api/auth HTTP/.*" 403

ignoreregex =

datepattern = {^LN-BEG}%%Y-%%m-%%d %%H:%%M:%%S

Bu filtreyi aktive etmek için jail.local‘e ekleyin:

[myapp-auth]
enabled = true
port = http,https
filter = myapp-auth
logpath = /var/log/nginx/access.log
maxretry = 5
bantime = 7200
findtime = 300

Servis Yönetimi ve Test

Yapılandırma değişikliklerinden sonra Fail2Ban’ı yeniden başlatın:

sudo systemctl restart fail2ban
sudo systemctl enable fail2ban

Yapılandırmanın Doğrulanması

Fail2Ban’ın jail’leri düzgün okuduğunu kontrol edin:

sudo fail2ban-client status

Belirli bir jail’in durumuna bakmak için:

sudo fail2ban-client status sshd

Bu komut size şunu gösterir: kaç IP banlandı, hangi IP’ler şu an banlı, toplam kaç başarısız deneme tespit edildi.

Banlı IP’leri Görüntüleme

UFW kurallarına bakarak hangi IP’lerin banlandığını görebilirsiniz:

sudo ufw status numbered | grep "Fail2Ban"

Veya doğrudan Fail2Ban üzerinden:

sudo fail2ban-client status sshd | grep "Banned IP"

Manuel Ban ve Unban

Test veya acil durum için bir IP’yi manuel olarak banlayabilirsiniz:

# Manuel ban
sudo fail2ban-client set sshd banip 192.168.1.100

# Manuel unban
sudo fail2ban-client set sshd unbanip 192.168.1.100

# UFW üzerinden kontrol
sudo ufw status | grep 192.168.1.100

Gerçek Dünya Senaryosu: WordPress Koruması

WordPress siteleri sürekli brute-force saldırısına uğrar. wp-login.php sayfasına saniyede onlarca istek gelebilir. Şöyle bir senaryo düşünün: Sabah sunucuya baktığınızda wp-login.php’ye günde 50.000 istek geldiğini görüyorsunuz. Sunucu yük altında. İşte bu durumda şu yapılandırma hayat kurtarır.

Önce özel filtre oluşturun:

sudo nano /etc/fail2ban/filter.d/wordpress.conf
[Definition]
failregex = ^<HOST> .* "POST .*wp-login.php HTTP/.*" 200
            ^<HOST> .* "POST .*xmlrpc.php HTTP/.*" 200
            ^<HOST> .* "GET .*wp-login.php?action=register HTTP/.*" 200

ignoreregex =

Sonra jail ekleyin:

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

Burada bantime 604800 saniye yani 7 gün. WordPress saldırılarında bu agresiflik gereklidir.

E-posta Bildirimleri

Bir IP banlandığında e-posta almak isteyebilirsiniz. jail.local‘e şunu ekleyin:

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

Burada %(action_mwl)s ban işleminde e-posta gönderir ve log satırlarını da ekler. Eğer sadece basit e-posta istiyorsanız %(action_mw)s kullanın.

İzleme ve Log Analizi

Fail2Ban’ın ne yaptığını düzenli olarak takip etmek önemlidir. Log dosyasına bakın:

sudo tail -f /var/log/fail2ban.log

Ban işlemlerini filtreleyin:

sudo grep "Ban " /var/log/fail2ban.log | tail -20

Bugün kaç IP banlandığına bakın:

sudo grep "Ban " /var/log/fail2ban.log | grep "$(date +%Y-%m-%d)" | wc -l

En çok banlanan IP’leri bulmak için:

sudo grep "Ban " /var/log/fail2ban.log | awk '{print $NF}' | sort | uniq -c | sort -rn | head -10

Recidive Jail: Tekrar Eden Saldırıları Kalıcı Banlama

Normal saldırganlar 24 saat sonra unban olduğunda tekrar saldırıya geçer. Bunun için “recidive” jail kullanabilirsiniz. Bu jail, Fail2Ban’ın kendi log dosyasını izler ve daha önce banlanan IP’ler tekrar banlanırsa çok uzun süreli ya da kalıcı olarak engeller:

[recidive]
enabled = true
filter = recidive
logpath = /var/log/fail2ban.log
action = ufw
bantime = 2592000
findtime = 86400
maxretry = 3

Bu yapılandırmayla: bir IP 24 saat içinde 3 kez banlanırsa 30 gün boyunca engellenir. Gerçekten ısrarcı saldırganları temizlemek için mükemmeldir.

Yaygın Sorunlar ve Çözümleri

Fail2Ban başlamıyor: Genellikle yapılandırma dosyasında syntax hatası vardır. Kontrol edin:

sudo fail2ban-client -t

Kendi IP’nizi banladınız: Panik yapmayın. Sunucuya fiziksel erişim veya konsol ile girin:

sudo fail2ban-client set sshd unbanip SIZIN_IP_ADRESINIZ
sudo ufw delete deny from SIZIN_IP_ADRESINIZ to any

UFW kuralları birikti: Uzun süre çalışan sistemlerde UFW’de binlerce kural birikebilir. Temizlemek için:

sudo fail2ban-client stop
sudo ufw reset
sudo ufw enable
sudo fail2ban-client start

Log dosyası yolu yanlış: Fail2Ban jail’i çalışıyor ama hiçbir şey banlenmiyorsa logpath’i kontrol edin:

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

Bu komut, filtrenizin log dosyasında kaç eşleşme bulduğunu gösterir.

Performans Optimizasyonu

Çok sayıda jail aktifse ve sunucu yoğun trafik alıyorsa Fail2Ban biraz CPU yiyebilir. Birkaç optimizasyon:

  • dbpurgeage ayarını düşürün: Veritabanında tutulan eski kayıtları daha erken temizler
  • Gereksiz jail’leri kapatın: Kullanmadığınız servislerin jail’lerini enabled = false yapın
  • backend = systemd kullanın: journald ile doğrudan konuşmak polling’den daha verimlidir
[DEFAULT]
dbpurgeage = 86400
backend = systemd

Sonuç

UFW ile Fail2Ban entegrasyonu, kurulumu 30 dakika süren ama yıllarca güvenlik sağlayan bir sistem oluşturur. SSH brute-force saldırıları, WordPress bot taramaları, API kötüye kullanımı gibi yaygın tehditlere karşı otomatik ve etkili bir savunma hattı elde edersiniz.

Kurulumu tamamladıktan sonra şunları yapmayı unutmayın:

  • Kendi IP adresinizi ignoreip listesine ekleyin
  • fail2ban-regex ile filtrelerinizi test edin
  • Düzenli olarak fail2ban-client status ile sistemi izleyin
  • Bantime değerlerini trafik yapınıza göre ayarlayın
  • Recidive jail’ini mutlaka aktif edin

Bu sistem tek başına yeterli değildir elbette. SSH için key-based authentication, düzenli sistem güncellemeleri ve uygulama seviyesinde güvenlik önlemleri de şart. Ama Fail2Ban ile UFW kombinasyonu, bu güvenlik zincirinin en güçlü halkalarından birini oluşturur. Bir kez kurduğunuzda, log dosyalarına her baktığınızda otomatik olarak engellenen düzinelerce IP görecek ve sisteminizin arka planda ne kadar çok iş yaptığına şaşıracaksınız.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir