SSH Brute-Force Saldırılarını Ubuntu ve Red Hat'te Otomatik Olarak Nasıl Engelleriz

SSH Brute-Force Saldırılarını Ubuntu ve Red Hat'te Otomatik Olarak Nasıl Engelleriz
SSH servislerin çalıştığı herhangi bir sunucunun log dosyalarını inceleyecek olursanız, sistematik giriş denemelerini, bot'ların ve saldırganların sürekli parola deneme girişimlerini göreceksiniz. Bu brute-force saldırıları, Linux sunucularının güvenliğini tehlikeye atmanın en yaygın yöntemlerinden biridir. Bu yazıda, Ubuntu ve Red Hat tabanlı sistemlerde SSH brute-force saldırılarını otomatik olarak engellemek için kullanabileceğiniz pratik çözümleri detaylı olarak anlatacağım.

SSH Brute-Force Saldırıları Nedir?

Brute-force saldırıları, saldırganların sistematik olarak farklı kullanıcı adı ve parola kombinasyonlarını deneyerek sisteme yetkisiz erişim sağlamaya çalıştığı otomatik saldırılardır. Bu saldırılar:
  • Yüksek Frekanslı: Saniyede yüzlerce deneme yapabilir
  • Sürekli: 7/24 devam edebilir
  • Otomatik: Bot'lar ve script'ler tarafından gerçekleştirilir
  • Hedef Odaklı: SSH (port 22) en popüler hedeftir
Gerçek Dünya Örneği:
# Tipik brute-force saldırı log'u Jun 10 15:32:15 server sshd: Failed password for admin from 192.168.1.100 port 45678 ssh2 Jun 10 15:32:17 server sshd: Failed password for root from 192.168.1.100 port 45679 ssh2 Jun 10 15:32:19 server sshd: Failed password for user from 192.168.1.100 port 45680 ssh2 

Çözüm 1: Fail2Ban - Dinamik IP Banlama

Fail2ban, log dosyalarını sürekli izleyerek şüpheli aktiviteleri tespit eden ve otomatik olarak firewall kuralları oluşturan bir intrusion prevention sistemidir.

Ubuntu'da Fail2Ban Kurulumu

# Paket listesini güncelle sudo apt update # Fail2ban kurulumu sudo apt install fail2ban -y # Servisi etkinleştir ve başlat sudo systemctl enable fail2ban sudo systemctl start fail2ban # Durumu kontrol et sudo systemctl status fail2ban 

Red Hat/CentOS'ta Fail2Ban Kurulumu

# EPEL repository'yi etkinleştir (gerekiyorsa) sudo yum install epel-release -y # RHEL 8/9 için sudo dnf install fail2ban -y # RHEL 7/CentOS 7 için sudo yum install fail2ban -y # Servisi başlat sudo systemctl enable fail2ban sudo systemctl start fail2ban 

Fail2Ban SSH Jail Konfigürasyonu

# Ana konfigürasyon dosyasını kopyala sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # SSH jail'i için özel konfigürasyon sudo nano /etc/fail2ban/jail.d/sshd.local 
SSH Jail Konfigürasyonu (/etc/fail2ban/jail.d/sshd.local):
 enabled = true port = ssh filter = sshd logpath = /var/log/auth.log # Ubuntu #logpath = /var/log/secure # Red Hat/CentOS maxretry = 3 # 3 başarısız denemeden sonra banla bantime = 3600 # 1 saat ban süresi (3600 saniye) findtime = 600 # 10 dakika içinde 3 deneme ignoreip = 127.0.0.1/8 # Yerel IP'leri hariç tut backend = systemd # Modern sistemler için # E-posta bildirimleri için (opsiyonel) action = %(action_mwl)s 
İleri Seviye SSH Jail Konfigürasyonu:
 enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 2 # Daha agresif: 2 deneme bantime = 86400 # 24 saat ban findtime = 300 # 5 dakika pencere backend = systemd # Recidive (tekrar eden) saldırganlar için enabled = true filter = recidive logpath = /var/log/fail2ban.log maxretry = 3 bantime = 604800 # 1 hafta ban findtime = 86400 # 24 saat içinde 

Fail2Ban Servisini Yeniden Başlatma ve Test

# Konfigürasyonu test et sudo fail2ban-client -t # Servisi yeniden başlat sudo systemctl restart fail2ban # SSH jail durumunu kontrol et sudo fail2ban-client status sshd # Fail2ban genel durumu sudo fail2ban-client status 

Fail2Ban Yönetimi ve İzleme

# Banlı IP'leri listele sudo fail2ban-client status sshd # Specific IP'yi manuel banla sudo fail2ban-client set sshd banip 192.168.1.100 # IP ban'ını kaldır sudo fail2ban-client set sshd unbanip 192.168.1.100 # Tüm ban'ları temizle sudo fail2ban-client unban --all # Fail2ban log'larını izle sudo tail -f /var/log/fail2ban.log 

Çözüm 2: PAM Faillock - Sistem Seviyesi Hesap Kilitleme

PAM (Pluggable Authentication Modules) faillock, başarısız giriş denemelerinden sonra kullanıcı hesaplarını sistem seviyesinde kilitleyen bir modüldür.

Ubuntu'da PAM_tally2 Kullanımı

Ubuntu sistemlerinde genellikle pam_tally2 modülü kullanılır:
# PAM konfigürasyon dosyalarını düzenle sudo nano /etc/pam.d/common-auth # Şu satırları ekle: auth required pam_tally2.so deny=3 unlock_time=1800 onerr=fail audit even_deny_root # Account konfigürasyonu sudo nano /etc/pam.d/common-account # Şu satırı ekle: account required pam_tally2.so 
PAM_tally2 Parametreleri:
  • deny=3: 3 başarısız denemeden sonra kilitle
  • unlock_time=1800: 30 dakika sonra otomatik kilidi aç
  • onerr=fail: Hata durumunda başarısız say
  • audit: Girişimleri logla
  • even_deny_root: Root kullanıcısını da kilitle

Red Hat/CentOS'ta PAM_faillock Kullanımı

Modern Red Hat sistemlerinde pam_faillock tercih edilir:
# Sistem auth konfigürasyonu sudo nano /etc/pam.d/system-auth # Auth bölümüne ekle: auth required pam_faillock.so preauth silent audit deny=3 unlock_time=1800 auth required pam_faillock.so authfail audit deny=3 unlock_time=1800 # Account bölümüne ekle: account required pam_faillock.so # Password auth konfigürasyonu sudo nano /etc/pam.d/password-auth # Aynı satırları buraya da ekle 
Modern PAM_faillock Konfigürasyonu (/etc/security/faillock.conf):
# Faillock konfigürasyonu deny = 3 # Maksimum başarısız deneme unlock_time = 1800 # Kilit süresi (saniye) fail_interval = 900 # Başarısız deneme penceresi dir = /var/run/faillock # Faillock dosya dizini audit # Audit logları aktif silent # Sessiz mod even_deny_root # Root'u da kilitle 

PAM Faillock Yönetimi

# Kullanıcının başarısız deneme sayısını kontrol et sudo faillock --user username # Kullanıcının kilitini aç sudo faillock --user username --reset # Tüm kullanıcıların durumunu göster sudo faillock # Örnek output: # user1: # When Type Source Valid # 2025-06-12 14:30:15 RHOST 192.168.1.100 V # 2025-06-12 14:30:18 RHOST 192.168.1.100 V # 2025-06-12 14:30:21 RHOST 192.168.1.100 V 

Çözüm 3: iptables ile Rate Limiting

Iptables kullanarak connection rate limiting uygulayabilirsiniz:
# SSH connection rate limiting sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP # Alternatif olarak hashlimit modülü sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m hashlimit --hashlimit-above 3/min --hashlimit-burst 3 --hashlimit-mode srcip --hashlimit-name ssh --hashlimit-htable-expire 60000 -j DROP # Kuralları kaydet # Ubuntu için: sudo iptables-save > /etc/iptables/rules.v4 # Red Hat için: sudo service iptables save 

Çözüm 4: SSH Konfigürasyon Sertleştirme

SSH daemon konfigürasyonunu sertleştirerek saldırı yüzeyini azaltın:
# SSH konfigürasyonu sudo nano /etc/ssh/sshd_config # Güvenlik ayarları: MaxAuthTries 3 # Maksimum deneme sayısı MaxSessions 4 # Maksimum eşzamanlı oturum LoginGraceTime 30 # Giriş süresi limiti ClientAliveInterval 300 # Keep-alive süresi ClientAliveCountMax 2 # Maksimum keep-alive sayısı # Bağlantı sınırlamaları MaxStartups 3 # Bekleyen bağlantı sayısı # Kullanıcı kısıtlamaları AllowUsers admin user1 # Sadece belirli kullanıcılar DenyUsers root guest # Yasaklı kullanıcılar # Root girişini engelle PermitRootLogin no # Parola tabanlı girişi devre dışı bırak PasswordAuthentication no PubkeyAuthentication yes # SSH restart sudo systemctl restart sshd 

Kombine Çözüm: Çok Katmanlı Güvenlik

En etkili yaklaşım, birden fazla yöntemi birleştirmektir:

1. SSH Sertleştirme + Fail2Ban Kombinasyonu

# 1. SSH'ı sertleştir sudo nano /etc/ssh/sshd_config # MaxAuthTries 2 # LoginGraceTime 20 # 2. Agresif Fail2Ban konfigürasyonu sudo nano /etc/fail2ban/jail.d/ssh-hardened.local 
 enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 2 bantime = 7200 # 2 saat findtime = 300 # 5 dakika backend = systemd enabled = true filter = sshd-ddos port = ssh logpath = /var/log/auth.log maxretry = 6 bantime = 3600 findtime = 60 

2. PAM Faillock + Fail2Ban Hybrid

# PAM ile yerel hesap koruması # Fail2Ban ile ağ seviyesi koruması # /etc/security/faillock.conf deny = 2 unlock_time = 900 # /etc/fail2ban/jail.d/hybrid.local enabled = true port = ssh filter = sshd maxretry = 3 bantime = 1800 findtime = 600 

İzleme ve Alerting

1. Fail2Ban E-posta Bildirimleri

# Postfix kurulumu (Ubuntu) sudo apt install postfix mailutils -y # Fail2Ban action konfigürasyonu sudo nano /etc/fail2ban/action.d/sendmail-common.local 
 actionstart = echo "Fail2ban %(name)s started on %(hostname)s" | mail -s "Fail2ban Alert" admin@yourdomain.com actionstop = echo "Fail2ban %(name)s stopped on %(hostname)s" | mail -s "Fail2ban Alert" admin@yourdomain.com actionban = echo "IP %(ip)s banned on %(hostname)s" | mail -s "Fail2ban Ban Alert" admin@yourdomain.com actionunban = echo "IP %(ip)s unbanned on %(hostname)s" | mail -s "Fail2ban Unban Alert" admin@yourdomain.com 

2. Log İzleme Script'i

#!/bin/bash # ssh_monitor.sh # SSH saldırı analizi echo "=== SSH Brute Force Analizi ===" echo "Son 24 saatteki başarısız SSH girişleri:" # Ubuntu için if ; then grep "Failed password" /var/log/auth.log | grep "$(date +'%b %d')" | \ awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -10 fi # Red Hat için if ; then grep "Failed password" /var/log/secure | grep "$(date +'%b %d')" | \ awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -10 fi echo "" echo "=== Fail2Ban Durumu ===" fail2ban-client status sshd echo "" echo "=== PAM Faillock Durumu ===" faillock 2>/dev/null || pam_tally2 2>/dev/null || echo "PAM faillock/tally2 bulunamadı" 

3. Gerçek Zamanlı İzleme

# Fail2ban log'larını canlı izleme sudo tail -f /var/log/fail2ban.log | grep -E "(Ban|Unban|NOTICE)" # SSH girişlerini canlı izleme sudo tail -f /var/log/auth.log | grep sshd # Ubuntu sudo tail -f /var/log/secure | grep sshd # Red Hat # Banlı IP'leri periyodik kontrol watch -n 5 'fail2ban-client status sshd' 

Troubleshooting ve Yaygın Sorunlar

1. Kendimizi Banladık

# Fiziksel erişim varsa: sudo fail2ban-client set sshd unbanip YOUR_IP # Alternatif olarak fail2ban'ı durdur sudo systemctl stop fail2ban # IP'yi manuel olarak iptables'dan kaldır sudo iptables -D fail2ban-sshd -s YOUR_IP -j REJECT 

2. PAM Faillock Çalışmıyor

# SSH konfigürasyonunu kontrol et sudo nano /etc/ssh/sshd_config # Bu ayarlar olmalı: UsePAM yes ChallengeResponseAuthentication yes PasswordAuthentication no # PAM conversation'ı zorlamak için sudo systemctl restart sshd 

3. Fail2Ban Filter Problemleri

# Filter'ı test et sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf # Custom filter oluştur sudo nano /etc/fail2ban/filter.d/sshd-custom.conf 
 failregex = ^%(__prefix_line)s(?:error: PAM: )?uthentication (?:failure|error|failed) for .* from <HOST>( via \S+)?\s*$ ^%(__prefix_line)s(?:error: )?Received disconnect from <HOST>: 3: .*: Auth fail$ ^%(__prefix_line)sFailed \S+ for (?P<preuser>\S+|\) from <HOST>(?: port \d+)?(?: ssh\d*)?(?:: message repeated \d+ times)?$ 

Best Practices ve Öneriler

1. Katmanlı Güvenlik Stratejisi

# 1. SSH Key-based Authentication ssh-keygen -t ed25519 -C "your_email@example.com" # 2. SSH Port Değiştirme sudo nano /etc/ssh/sshd_config # Port 2222 # 3. Fail2Ban + PAM Faillock # Her ikisini de kullanın # 4. VPN kullanımı (üretim ortamları için) # SSH'ı sadece VPN üzerinden erişilebilir yapın 

2. Monitoring ve Alerting

# Nagios/Zabbix entegrasyonu # SIEM sistemi entegrasyonu # Log aggregation (ELK Stack, Splunk) 

3. Düzenli Güvenlik Denetimleri

#!/bin/bash # security_audit.sh echo "=== SSH Güvenlik Denetimi ===" # SSH konfigürasyon kontrolü sshd -T | grep -E "(MaxAuthTries|LoginGraceTime|PermitRootLogin)" # Fail2Ban durumu fail2ban-client status # Açık portlar ss -tlnp | grep :22 # Son saldırılar grep "Failed password" /var/log/auth.log | tail -20 

Sonuç

SSH brute-force saldırılarından korunmak için:
  1. Fail2Ban: Ağ seviyesi koruma, dinamik IP banlama
  2. PAM Faillock: Sistem seviyesi hesap kilitleme
  3. SSH Sertleştirme: Saldırı yüzeyini azaltma
  4. İzleme: Sürekli güvenlik durumu takibi
En İyi Yaklaşım: Bu yöntemleri kombine ederek çok katmanlı bir güvenlik stratejisi oluşturun. Fail2Ban ile ağ seviyesinde koruma sağlarken, PAM ile sistem seviyesinde hesap güvenliğini artırın. Unutmayın: Güvenlik bir hedef değil, sürekli bir süreçtir. Düzenli olarak log'larınızı inceleyin, saldırı trendlerini takip edin ve güvenlik stratejinizi güncel tutun. Bu yaklaşımlarla SSH sunucunuzu brute-force saldırılarına karşı etkili şekilde koruyabilir ve sistem güvenliğinizi önemli ölçüde artırabilirsiniz.