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ı inceley...
 
        Linux sunucu güvenliği konusunda 15+ yıllık deneyimim boyunca öğrendiğim en önemli şey şu: Varsayılan konfigürasyonlar hiçbir zaman yeterli değildir. Her yeni Linux sunucu kurduğumda, sistemi üretime almadan önce mutlaka uyguladığım 7 temel CIS (Center for Internet Security) güvenlik pratiği var. Bu yazıda, bu uygulamaları neden kritik bulduğumu ve nasıl hayata geçirdiğimi anlatacağım.
CIS Benchmarks, dünyanın dört bir yanından siber güvenlik uzmanlarının consensus esaslı katkılarıyla geliştirilmiş, kapsamlı güvenlik konfigürasyon rehberleridir. CIS standardlarının bilinen güvenlik açıklarının %80-95'ini eliminate ettiği kanıtlanmıştır. CIS Benchmarks'in Temel Prensipleri:
SSH, Linux sunuculara erişimin temel yöntemi olduğu için sertleştirme sürecimin en kritik parçasıdır.
# SSH konfigürasyon dosyasını düzenle sudo nano /etc/ssh/sshd_config # Kritik ayarlar: Protocol 2 # Sadece SSH v2 kullan PermitRootLogin no # Root kullanıcısının SSH erişimini engelle PasswordAuthentication no # Parola tabanlı girişi devre dışı bırak PubkeyAuthentication yes # Public key authentication aktif et Port 2222 # Varsayılan port değiştir MaxAuthTries 3 # Maksimum deneme sayısını sınırla MaxSessions 4 # Eşzamanlı oturum sayısını sınırla LoginGraceTime 30 # Giriş süresi sınırı AllowUsers your_username # Sadece belirli kullanıcılara izin ver ClientAliveInterval 300 # İnaktif bağlantıları sonlandır ClientAliveCountMax 2 # Maksimum hayatta kalma kontrolü HostBasedAuthentication no # Host tabanlı kimlik doğrulamayı devre dışı bırak IgnoreRhosts yes # .rhosts dosyalarını yoksay # RSA 4096 bit key oluştur ssh-keygen -t rsa -b 4096 -C "your_email@example.com" # ED25519 (önerilen - daha güvenli ve hızlı) ssh-keygen -t ed25519 -C "your_email@example.com" # SSH directory güvenliğini sağla chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys chmod 600 ~/.ssh/id_rsa chmod 644 ~/.ssh/id_rsa.pub # Fail2Ban kurulumu sudo apt install fail2ban -y # SSH için jail konfigürasyonu sudo nano /etc/fail2ban/jail.local enabled = true port = 2222 filter = sshd logpath = /var/log/auth.log maxretry = 3 bantime = 3600 findtime = 600 sudo systemctl enable fail2ban sudo systemctl start fail2ban CIS Controls, host-based firewall ile varsayılan-reddet kuralının uygulanmasını önermektedir.
# UFW'yi aktif et sudo ufw enable # Varsayılan politikaları ayarla sudo ufw default deny incoming sudo ufw default allow outgoing # Gerekli portları aç sudo ufw allow 2222/tcp # SSH (özel port) sudo ufw allow 80/tcp # HTTP sudo ufw allow 443/tcp # HTTPS # Belirli IP'den SSH erişimi (opsiyonel) sudo ufw allow from 192.168.1.100 to any port 2222 # Rate limiting ile SSH brute force koruması sudo ufw limit 2222/tcp # UFW durumunu kontrol et sudo ufw status verbose # Temel iptables konfigürasyonu #!/bin/bash # Mevcut kuralları temizle iptables -F iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X # Varsayılan politikalar iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # Loopback trafiğine izin ver iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # Established ve related bağlantılara izin ver iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # SSH erişimi (rate limiting ile) iptables -A INPUT -p tcp --dport 2222 -m state --state NEW -m recent --set iptables -A INPUT -p tcp --dport 2222 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP iptables -A INPUT -p tcp --dport 2222 -j ACCEPT # Web servisleri iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT # ICMP (ping) sınırlı izin iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT # Kuralları kaydet iptables-save > /etc/iptables/rules.v4 # PAM konfigürasyonu ile parola karmaşıklığı sudo nano /etc/pam.d/common-password # Şu satırı ekle: password requisite pam_pwquality.so retry=3 minlen=12 dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1 # Parola geçmişi kontrolü sudo nano /etc/pam.d/common-password # Şu satırı ekle: password required pam_pwhistory.so remember=5 # Hesap kilitleme politikası sudo nano /etc/pam.d/common-auth # Şu satırı ekle: auth required pam_tally2.so deny=3 unlock_time=600 onerr=fail audit even_deny_root # Sudo konfigürasyonunu düzenle sudo visudo # Kullanıcı için sudo izinleri your_username ALL=(ALL:ALL) ALL # Parola timeout ayarı Defaults passwd_timeout=5 # Sudo session timeout Defaults timestamp_timeout=15 # Sudo kullanımını logla Defaults logfile="/var/log/sudo.log" Defaults log_input,log_output # Sistem kullanıcılarını kontrol et cat /etc/passwd | grep -v "/usr/sbin/nologin\|/bin/false" | cut -d: -f1 # Gereksiz hesapları devre dışı bırak sudo usermod -L username # Hesabı kilitle sudo usermod -s /bin/false username # Shell erişimini engelle # Son giriş tarihlerini kontrol et sudo lastlog | grep -v "Never" # Pasif hesapları tespit et sudo last | head -20 # Unattended upgrades kurulumu sudo apt install unattended-upgrades apt-listchanges -y # Konfigürasyon sudo dpkg-reconfigure -plow unattended-upgrades # Manuel konfigürasyon sudo nano /etc/apt/apt.conf.d/50unattended-upgrades # İçerik: Unattended-Upgrade::Allowed-Origins { "${distro_id}:${distro_codename}-security"; "${distro_id}ESMApps:${distro_codename}-apps-security"; "${distro_id}ESM:${distro_codename}-infra-security"; }; Unattended-Upgrade::AutoFixInterruptedDpkg "true"; Unattended-Upgrade::MinimalSteps "true"; Unattended-Upgrade::Remove-Unused-Dependencies "true"; Unattended-Upgrade::Automatic-Reboot "false"; # E-posta bildirimlerini aktif et Unattended-Upgrade::Mail "admin@yourdomain.com"; #!/bin/bash # update_system.sh echo "Sistem güncelleme başlıyor..." # Paket listesini güncelle apt update # Güncellenebilir paketleri listele apt list --upgradable # Güvenlik güncellemelerini uygula apt upgrade -y # Sistem temizleme apt autoremove -y apt autoclean # Kernel güncellemesi kontrolü if ; then echo "Sistem yeniden başlatma gerekiyor!" echo "Yeniden başlatma için: sudo reboot" fi echo "Güncelleme tamamlandı: $(date)" # Rsyslog konfigürasyonu sudo nano /etc/rsyslog.conf # Uzak log gönderimi için (opsiyonel) *.* @@logserver.yourdomain.com:514 # Lokal log rotasyonu sudo nano /etc/logrotate.d/rsyslog /var/log/syslog { daily missingok rotate 52 compress delaycompress notifempty create 0640 syslog adm postrotate /usr/lib/rsyslog/rsyslog-rotate endscript } # Auditd kurulumu sudo apt install auditd audispd-plugins -y # Auditd kuralları sudo nano /etc/audit/rules.d/audit.rules # Kritik dosya değişikliklerini izle -w /etc/passwd -p wa -k passwd_changes -w /etc/shadow -p wa -k shadow_changes -w /etc/group -p wa -k group_changes -w /etc/sudoers -p wa -k sudoers_changes -w /etc/ssh/sshd_config -p wa -k ssh_config_changes # Sistem çağrılarını izle -a always,exit -F arch=b64 -S adjtimex -S settimeofday -k time_change -a always,exit -F arch=b32 -S adjtimex -S settimeofday -S stime -k time_change # Network konfigürasyon değişikliklerini izle -w /etc/issue -p wa -k system_locale -w /etc/issue.net -p wa -k system_locale -w /etc/hosts -p wa -k system_locale -w /etc/network/ -p wa -k system_locale # Auditd'yi yeniden başlat sudo systemctl restart auditd sudo systemctl enable auditd # Logwatch kurulumu sudo apt install logwatch -y # Günlük rapor konfigürasyonu sudo nano /etc/logwatch/conf/logwatch.conf Detail = High MailTo = admin@yourdomain.com MailFrom = logwatch@yourdomain.com Format = html Range = today # Manuel logwatch raporu sudo logwatch --detail high --mailto admin@yourdomain.com --format html --range today # Çalışan servisleri listele systemctl list-units --type=service --state=running # Açık portları kontrol et sudo netstat -tulpn sudo ss -tulpn # Gereksiz servisleri devre dışı bırak sudo systemctl disable telnet sudo systemctl disable ftp sudo systemctl disable rsh sudo systemctl disable rlogin sudo systemctl disable tftp sudo systemctl disable xinetd sudo systemctl disable sendmail # Eğer mail server değilse # Servis durumlarını kontrol et sudo systemctl is-enabled service_name sudo systemctl is-active service_name # Apache güvenlik modülü sudo a2enmod security2 sudo a2enmod headers sudo a2enmod ssl # Güvenlik konfigürasyonu sudo nano /etc/apache2/conf-available/security.conf # İçerik: ServerTokens Prod ServerSignature Off TraceEnable Off # Güvenlik başlıkları Header always set X-Content-Type-Options nosniff Header always set X-Frame-Options DENY Header always set X-XSS-Protection "1; mode=block" Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" Header always set Content-Security-Policy "default-src 'self'" # Konfigürasyonu aktif et sudo a2enconf security sudo systemctl restart apache2 # Nginx güvenlik konfigürasyonu sudo nano /etc/nginx/nginx.conf # İçerik: server_tokens off; # SSL konfigürasyonu ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; # Rate limiting limit_req_zone $binary_remote_addr zone=login:10m rate=10r/m; # Güvenlik başlıkları add_header X-Frame-Options "SAMEORIGIN" always; add_header X-XSS-Protection "1; mode=block" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "no-referrer-when-downgrade" always; add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always; # Sistem dosya izinlerini kontrol et ve düzelt sudo chmod 644 /etc/passwd sudo chmod 600 /etc/shadow sudo chmod 644 /etc/group sudo chmod 600 /etc/gshadow sudo chmod 600 /etc/ssh/sshd_config sudo chmod 755 /etc/ssh # World-writable dosyaları bul ve düzelt find / -type f -perm -002 -exec ls -la {} \; 2>/dev/null find / -type d -perm -002 -exec ls -ld {} \; 2>/dev/null # SUID/SGID dosyalarını kontrol et find / -type f \( -perm -4000 -o -perm -2000 \) -exec ls -la {} \; 2>/dev/null # Sahibi olmayan dosyaları bul find / -nouser -o -nogroup 2>/dev/null # Fstab güvenlik ayarları sudo nano /etc/fstab # Örnek güvenli mount opsisonları: /dev/sda1 /tmp ext4 defaults,nodev,nosuid,noexec 0 2 tmpfs /dev/shm tmpfs defaults,nodev,nosuid,noexec 0 0 # Dosya sistemi bütünlük kontrolü (AIDE) sudo apt install aide -y # AIDE veritabanını başlat sudo aide --init sudo mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db # Günlük bütünlük kontrolü için cron job echo "0 5 * * * root /usr/bin/aide --check | mail -s 'AIDE Integrity Check' admin@yourdomain.com" >> /etc/crontab #!/bin/bash # cis_assessment.sh # CIS-CAT Lite indir (ücretsiz versiyon) wget https://learn.cisecurity.org/cis-cat-lite # Unzip ve çalıştır unzip cis-cat-lite.zip cd CIS-CAT-Lite/ # Ubuntu 20.04 için assessment çalıştır ./CIS-CAT.sh -i -a -x -r /opt/cis-reports/ # Raporu analiz et echo "CIS Assessment tamamlandı. Rapor: /opt/cis-reports/" # Lynis kurulumu sudo apt install lynis -y # Tam güvenlik denetimi sudo lynis audit system # Raporu incele sudo lynis show report # Öneriler için: sudo lynis show suggestions #!/bin/bash # weekly_security_check.sh echo "=== Haftalık Güvenlik Kontrolü ===" echo "Tarih: $(date)" # 1. Sistem güncellemelerini kontrol et echo "--- Mevcut Güncellemeler ---" apt list --upgradable # 2. Son giriş yapan kullanıcıları kontrol et echo "--- Son Kullanıcı Girişleri ---" last | head -10 # 3. Başarısız SSH girişlerini kontrol et echo "--- Başarısız SSH Girişleri ---" grep "Failed password" /var/log/auth.log | tail -10 # 4. Açık portları kontrol et echo "--- Açık Portlar ---" ss -tulpn # 5. Disk kullanımını kontrol et echo "--- Disk Kullanımı ---" df -h # 6. Yüksek CPU/Memory kullanımını kontrol et echo "--- Sistem Kaynakları ---" top -bn1 | head -20 # 7. Fail2Ban durumunu kontrol et echo "--- Fail2Ban Durumu ---" fail2ban-client status echo "=== Kontrol Tamamlandı ===" Bu 7 CIS güvenlik pratiği, Linux sunucularınızın güvenlik seviyesini önemli ölçüde artıracaktır. Ancak güvenlik bir hedef değil, sürekli bir süreçtir.
Linux güvenliği karmaşık görünse de, bu temel CIS pratiklerini sistematik olarak uygulayarak sunucularınızı siber tehditlere karşı önemli ölçüde koruyabilirsiniz. Güvenlik katmanları prensibi gereği, hiçbir tek önlem %100 koruma sağlamaz, ancak bu 7 uygulamanın kombinasyonu saldırganlar için yeterince yüksek bir engel oluşturacaktır. Her sunucu kurulumunda bu listeyi kontrol ederek, güvenli bir temel üzerine inşa etmeye devam edin. Unutmayın: En iyi savunma, proaktif önlemlerdir.