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[1234]: Failed password for admin from 192.168.1.100 port 45678 ssh2
Jun 10 15:32:17 server sshd[1235]: Failed password for root from 192.168.1.100 port 45679 ssh2
Jun 10 15:32:19 server sshd[1236]: 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
):
[sshd]
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:
[sshd-aggressive]
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
[recidive]
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 kilitleunlock_time=1800
: 30 dakika sonra otomatik kilidi açonerr=fail
: Hata durumunda başarısız sayaudit
: Girişimleri loglaeven_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
[ssh-hardened]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 2
bantime = 7200 # 2 saat
findtime = 300 # 5 dakika
backend = systemd
[ssh-dos]
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
[sshd-pam]
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
[Definition]
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 [ -f "/var/log/auth.log" ]; 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 [ -f "/var/log/secure" ]; 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
[Definition]
failregex = ^%(__prefix_line)s(?:error: PAM: )?[aA]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+|\[preauth\]) 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.