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[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 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
[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:

  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.

Yorum Yazın