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:
- Fail2Ban: Ağ seviyesi koruma, dinamik IP banlama
- PAM Faillock: Sistem seviyesi hesap kilitleme
- SSH Sertleştirme: Saldırı yüzeyini azaltma
- İ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.