Sunucu Sertleştirme: Ubuntu’da SSH Güvenliğini Artırmanın Yolları

Yeni bir Ubuntu sunucu kurduğunuzda ilk yapmanız gereken şey SSH güvenliğini sağlamlaştırmaktır. İnternete açık bir sunucuda SSH portu varsayılan ayarlarla bırakıldığında, dakikalar içinde brute-force saldırıları başlar. Bu yazıda, gerçek dünya senaryolarına dayalı olarak Ubuntu sunucularında SSH güvenliğini adım adım nasıl sağlamlaştıracağınızı anlatacağım.

Neden SSH Güvenliği Bu Kadar Önemli?

Geçen ay bir müşterimin sunucusuna baktım. Sunucu sadece 3 gün önce kurulmuştu ve /var/log/auth.log dosyasına baktığımda binlerce başarısız giriş denemesi görmek beni şaşırtmadı. Çin, Rusya, Brezilya kaynaklı IP adreslerinden gelen otomatik botlar, root, admin, ubuntu, test gibi kullanıcı adlarıyla sistematik olarak deneme yapıyordu.

grep "Failed password" /var/log/auth.log | wc -l

Bu komutun çıktısı 47.832 idi. Üç günde 47 bin başarısız giriş denemesi. Eğer sunucunuzda zayıf bir şifre varsa, bu botlar eninde sonunda onu bulur.

İşte bu yüzden SSH sertleştirmesi, sunucu kurulumunun ayrılmaz bir parçası olmalı.

Mevcut Durumu Analiz Etme

Değişiklik yapmadan önce mevcut SSH yapılandırmanızı gözden geçirin:

# SSH servisi durumunu kontrol et
sudo systemctl status ssh

# Mevcut SSH versiyonunu öğren
ssh -V

# Aktif SSH bağlantılarını listele
who
w

# Son başarılı ve başarısız girişleri gör
last -n 20
lastb -n 20

Ana yapılandırma dosyası /etc/ssh/sshd_config dosyasıdır. Değişiklik yapmadan önce mutlaka yedek alın:

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
sudo ls -la /etc/ssh/sshd_config.backup

Bu yedek dosyasını sakın silmeyin. Bir hata yaparsanız ve SSH bağlantınız kesilirse, sunucuya konsol erişimiyle bu yedeği geri yükleyebilirsiniz.

SSH Anahtar Tabanlı Kimlik Doğrulama

SSH güvenliğinin temel taşı, şifre yerine anahtar çifti kullanmaktır. Şifre tabanlı kimlik doğrulama, brute-force saldırılarına karşı savunmasızdır. Anahtar tabanlı kimlik doğrulama ise matematiksel olarak çok daha güçlüdür.

Anahtar Çifti Oluşturma

Yerel makinenizde (sunucuda değil, kendi bilgisayarınızda) anahtar çifti oluşturun:

# Modern ve güvenli Ed25519 algoritmasıyla anahtar oluştur
ssh-keygen -t ed25519 -C "sunucu-adi-$(date +%Y%m%d)" -f ~/.ssh/id_ed25519_sunucu

# Alternatif olarak RSA 4096-bit (eski sistemlerle uyumluluk için)
ssh-keygen -t rsa -b 4096 -C "sunucu-adi-$(date +%Y%m%d)" -f ~/.ssh/id_rsa_sunucu

Anahtar oluştururken mutlaka bir passphrase (anahtar parolası) girin. Boş bırakmayın. Özel anahtarınız çalınsa bile passphrase olmadan kullanılamaz.

Genel Anahtarı Sunucuya Kopyalama

# ssh-copy-id ile otomatik kopyalama (en kolay yol)
ssh-copy-id -i ~/.ssh/id_ed25519_sunucu.pub kullanici@sunucu-ip

# Manuel kopyalama (ssh-copy-id yoksa)
cat ~/.ssh/id_ed25519_sunucu.pub | ssh kullanici@sunucu-ip "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

Anahtarı kopyaladıktan sonra bağlantıyı test edin. Mevcut terminal oturumunu kapatmayın! Yeni bir terminal açın ve test edin:

ssh -i ~/.ssh/id_ed25519_sunucu kullanici@sunucu-ip

Bağlantı başarılıysa bir sonraki adıma geçebilirsiniz. Eğer bağlanamıyorsanız, eski terminalden sorunu çözün.

SSHD_CONFIG Sertleştirmesi

Şimdi asıl sertleştirme adımlarına geçelim. sshd_config dosyasını düzenleyeceğiz:

sudo nano /etc/ssh/sshd_config

Aşağıdaki parametreleri bulun ve güncelleyin (yoksa ekleyin):

Port: Varsayılan 22 yerine farklı bir port kullanın. Bu “security through obscurity” yani gizlilikle güvenlik yaklaşımıdır ve tek başına yeterli değildir ama bot trafiğini önemli ölçüde azaltır. 1024 ile 65535 arasında bir port seçin.

PermitRootLogin: no yapın. Root ile doğrudan SSH girişine asla izin vermeyin. Normal kullanıcıyla girin, sonra sudo kullanın.

PasswordAuthentication: Anahtarları ayarladıktan sonra bunu no yapın.

PermitEmptyPasswords: Kesinlikle no olmalı.

MaxAuthTries: Bir bağlantıda kaç başarısız denemeye izin verileceğini sınırlar. 3 iyi bir değerdir.

MaxSessions: Tek bağlantıda açılabilecek maksimum oturum sayısı.

LoginGraceTime: Kullanıcının giriş yapması için verilen süre.

X11Forwarding: Sunucuda grafik arayüz kullanmıyorsanız no yapın.

AllowTcpForwarding: İhtiyacınız yoksa no yapın.

ClientAliveInterval ve ClientAliveCountMax: Boşta kalan bağlantıları otomatik kapatır.

# Tüm bu ayarları içeren örnek yapılandırma
sudo tee /etc/ssh/sshd_config.d/hardening.conf << 'EOF'
# Port değişikliği - bot trafiğini azaltır
Port 2222

# Root girişini engelle
PermitRootLogin no

# Şifre ile girişi kapat (anahtarları kurduktan sonra!)
PasswordAuthentication no
PermitEmptyPasswords no

# Kimlik doğrulama ayarları
MaxAuthTries 3
MaxSessions 5
LoginGraceTime 30

# Gereksiz özellikleri kapat
X11Forwarding no
AllowTcpForwarding no
GatewayPorts no
PermitTunnel no

# Boşta kalan bağlantıları kapat
ClientAliveInterval 300
ClientAliveCountMax 2

# Sadece belirli kullanıcılara izin ver
AllowUsers ahmet deploy backup

# Güvenli kriptografi algoritmaları
Protocol 2
KexAlgorithms curve25519-sha256,[email protected]
Ciphers [email protected],[email protected],[email protected]
MACs [email protected],[email protected]

# Banner ekle (isteğe bağlı, caydırıcı etki)
Banner /etc/ssh/banner.txt
EOF

Ubuntu 22.04 ve üzeri sürümlerde /etc/ssh/sshd_config.d/ dizinindeki .conf dosyaları otomatik olarak yüklenir. Bu yaklaşım, ana yapılandırma dosyasına dokunmadan ayarlarınızı yönetmenizi sağlar.

Yapılandırmayı Test Etme ve Uygulama

# Yapılandırma dosyasında sözdizimi hatası var mı kontrol et
sudo sshd -t

# Hata yoksa servisi yeniden başlat
sudo systemctl restart ssh

# Servisin çalıştığını doğrula
sudo systemctl status ssh

sshd -t komutu çok kritik. Bir yazım hatası yapıp SSH servisi başlamazsa sunucunuza bağlanamazsınız. Bu kontrolü atlamamanızı şiddetle öneririm.

Fail2ban ile Brute-Force Koruması

Anahtar tabanlı kimlik doğrulama açık olsa bile, başarısız giriş denemeleri log dosyalarınızı doldurmaya ve sunucu kaynaklarınızı tüketmeye devam eder. Fail2ban, belirli sayıda başarısız denemeden sonra IP adreslerini otomatik olarak engeller.

# Fail2ban kur
sudo apt update
sudo apt install fail2ban -y

# Yerel yapılandırma dosyası oluştur
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Yerel yapılandırma dosyasını düzenleyin:

sudo tee /etc/fail2ban/jail.d/sshd.conf << 'EOF'
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24
EOF

Parametre açıklamaları:

  • maxretry: Kaç başarısız denemeden sonra engelleme yapılacak (3)
  • bantime: Engelleme süresi saniye cinsinden (3600 = 1 saat)
  • findtime: Bu süre içindeki başarısız denemeler sayılır (600 = 10 dakika)
  • ignoreip: Asla engellenmeyecek IP adresleri (kendi ağınızı ekleyin!)
# Fail2ban'ı başlat ve otomatik başlatmayı aktif et
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

# Durumu kontrol et
sudo fail2ban-client status
sudo fail2ban-client status sshd

# Engellenen IP'leri listele
sudo fail2ban-client status sshd | grep "Banned IP"

Fail2ban ile bir müşteri senaryosu: Sunucuya brute-force saldırısı başladığında bantime‘ı kalıcı hale getirebilirsiniz. bantime = -1 ayarı, engellenmiş IP’lerin hiç açılmamasını sağlar. Ancak bu agresif bir yaklaşımdır, dikkatli kullanın.

UFW ile Güvenlik Duvarı Yapılandırması

SSH güvenliğini güvenlik duvarıyla desteklemek gerekir. Ubuntu’da UFW (Uncomplicated Firewall) kullanımı oldukça kolaydır:

# UFW durumunu kontrol et
sudo ufw status verbose

# Önce tüm girişleri engelle
sudo ufw default deny incoming
sudo ufw default allow outgoing

# Yeni SSH portunuza izin ver
sudo ufw allow 2222/tcp comment 'SSH'

# Diğer servisler için
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'

# UFW'yi aktif et
sudo ufw enable

# Durumu doğrula
sudo ufw status numbered

Önemli uyarı: UFW’yi aktif etmeden önce yeni SSH portunuza izin verdiğinizden emin olun. Aksi takdirde kendinizi sunucunun dışında bırakabilirsiniz.

Belirli IP aralıklarından SSH erişimine izin vermek için:

# Sadece ofis IP'sinden SSH erişimi
sudo ufw allow from 85.92.x.x to any port 2222 proto tcp comment 'Ofis SSH'

# VPN alt ağından SSH erişimi
sudo ufw allow from 10.8.0.0/24 to any port 2222 proto tcp comment 'VPN SSH'

SSH Banner ve Honeypot Teknikleri

Bazı sysadmin’ler SSH banner’ı görmezden gelir, oysa bu küçük ama etkili bir caydırıcıdır. Hukuki açıdan da önemlidir: “Bu sisteme yetkisiz erişim yasaktır” gibi bir banner, olası bir ihlal durumunda hukuki korumanızı güçlendirir.

sudo tee /etc/ssh/banner.txt << 'EOF'
*******************************************************************
                    UYARI / WARNING
*******************************************************************
Bu sisteme yetkisiz erisim yasaktir ve yasal islem baslatilabilir.
Unauthorized access to this system is prohibited and may result
in criminal prosecution.

Tum aktiviteler kayit altina alinmaktadir.
All activities are being monitored and logged.
*******************************************************************
EOF

İki Faktörlü Kimlik Doğrulama (2FA)

Anahtar tabanlı kimlik doğrulamaya ek olarak, özellikle hassas sunucular için 2FA ekleyebilirsiniz. Google Authenticator PAM modülü bunu mümkün kılar:

# Google Authenticator PAM modülünü kur
sudo apt install libpam-google-authenticator -y

# Kullanıcı için 2FA ayarla (her kullanıcı kendi hesabıyla çalıştırmalı)
google-authenticator

Kurulum sırasında gelen sorulara şu şekilde yanıt verin:

  • Time-based tokens: y (evet, zaman tabanlı token)
  • QR kodu: Authenticator uygulamanızla tarayın
  • ~/.google_authenticator dosyasını güncelle: y
  • Çoklu kullanım: n (hayır, güvenlik için)
  • 30 saniyelik pencere: n (hayır)
  • Rate limiting: y (evet)

PAM yapılandırmasını güncelleyin:

sudo nano /etc/pam.d/sshd

Dosyanın en üstüne ekleyin:

auth required pam_google_authenticator.so

sshd_config‘de şunu etkinleştirin:

# sshd_config.d/hardening.conf dosyasına ekle
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive

Bu yapılandırmayla hem SSH anahtarı hem de TOTP kodu gerekecek. Son derece güvenli ama aynı zamanda kullanımı biraz zahmetli. Dengeli bir yaklaşım için sadece belirli kullanıcılara 2FA zorunlu kılabilirsiniz.

Log İzleme ve Alarm Sistemi

Güvenlik sertleştirmesi, izleme olmadan yarım kalır. SSH loglarını düzenli izlemek şart:

# Gerçek zamanlı log izleme
sudo tail -f /var/log/auth.log | grep --line-buffered "sshd"

# Bugünkü başarısız giriş denemelerini say
grep "$(date '+%b %e')" /var/log/auth.log | grep "Failed password" | wc -l

# En çok deneme yapan IP'leri listele
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn | head -20

# Başarılı girişleri listele
grep "Accepted" /var/log/auth.log | tail -20

Basit bir günlük SSH raporu için cron job oluşturun:

sudo tee /usr/local/bin/ssh-daily-report.sh << 'EOF'
#!/bin/bash
TARIH=$(date '+%Y-%m-%d')
LOG="/var/log/auth.log"
EMAIL="[email protected]"

BASARISIZ=$(grep "$TARIH" "$LOG" | grep -c "Failed password")
BASARILI=$(grep "$TARIH" "$LOG" | grep -c "Accepted")
ENGELLENEN=$(fail2ban-client status sshd | grep "Banned IP list" | wc -w)

echo "SSH Gunluk Rapor - $TARIH
Basarisiz giris: $BASARISIZ
Basarili giris: $BASARILI
Engellenen IP: $ENGELLENEN

En cok deneme yapan IP'ler:
$(grep "Failed password" "$LOG" | awk '{print $11}' | sort | uniq -c | sort -rn | head -10)" | 
mail -s "SSH Guvenlik Raporu - $TARIH" "$EMAIL"
EOF

sudo chmod +x /usr/local/bin/ssh-daily-report.sh

# Cron'a ekle (her gün sabah 7'de)
echo "0 7 * * * root /usr/local/bin/ssh-daily-report.sh" | sudo tee /etc/cron.d/ssh-report

Güvenlik Denetimi ve Doğrulama

Yaptığınız değişikliklerin etkili olduğunu doğrulamak için aşağıdaki araçları kullanın:

# SSH yapılandırmanızı dışarıdan test edin
# (Başka bir sunucudan veya yerel makineden)
nmap -sV -p 2222 sunucu-ip

# SSH audit aracıyla güvenlik değerlendirmesi
# ssh-audit aracını kur
pip3 install ssh-audit
ssh-audit sunucu-ip -p 2222

ssh-audit aracı, kullandığınız şifreleme algoritmalarını, key exchange yöntemlerini ve MAC algoritmalarını değerlendirerek zayıf olanları işaretler. Çıktıda “warn” veya “fail” gördüğünüz satırları düzeltmelisiniz.

# Sistemdeki tüm authorized_keys dosyalarını bul
sudo find /home -name "authorized_keys" -exec ls -la {} ;
sudo find /root -name "authorized_keys" -exec ls -la {} ;

# Yetkisiz public key var mı kontrol et
sudo cat /root/.ssh/authorized_keys 2>/dev/null

Bu son kontrol kritik. Bazen saldırganlar sisteme girdikten sonra kendi public anahtarlarını authorized_keys dosyasına eklerler. Düzenli aralıklarla bu dosyaları kontrol etmeniz gerekir.

Gerçek Dünya Senaryo: Miras Sunucu Sertleştirmesi

Bir süre önce devraldığım bir sunucuda çok yaygın bir tablo gördüm: Eski sysadmin her şeyi root ile yapıyordu, SSH portu 22’ydi, şifre tabanlı kimlik doğrulama açıktı ve Fail2ban yoktu. Bu tür “miras sunucularda” nasıl ilerliyorum anlayım:

Önce sisteme kimin erişimi olduğunu anlayın. Eski çalışanların anahtarlarını temizleyin:

# Tüm kullanıcı hesaplarını ve son girişlerini listele
lastlog | grep -v "Never logged in"

# Yetkisiz sudo erişimi olan kullanıcıları bul
grep -Po '^sudo.+:K.*$' /etc/group | tr ',' 'n'

# Şüpheli cron job'ları kontrol et
sudo crontab -l
sudo ls -la /etc/cron.d/ /etc/cron.daily/ /etc/cron.weekly/

Temizlik yapın, yeni kullanıcılar oluşturun, anahtarları dağıtın, sonra sertleştirme adımlarını uygulayın. Bunu aşamalı yapın ve her adımda erişiminizin devam ettiğini doğrulayın.

Sonuç

SSH güvenliği tek seferlik bir görev değil, sürekli bir süreçtir. Özetlersek, öncelik sırasına göre yapmanız gerekenler şunlardır:

  • Hemen anahtar tabanlı kimlik doğrulamaya geçin ve şifre girişini kapatın
  • Root girişini engelleyin, sudo kullanın
  • SSH portunu değiştirin (isteğe bağlı ama etkili)
  • Fail2ban kurun ve yapılandırın
  • UFW ile erişimi sınırlandırın, mümkünse sadece belirli IP’lere izin verin
  • Gereksiz SSH özelliklerini (X11, TCP forwarding) kapatın
  • Güçlü kriptografi algoritmalarını zorunlu kılın
  • Logları izleyin, düzenli rapor alın

Bu adımları uyguladıktan sonra /var/log/auth.log dosyanız gözle görülür biçimde sakinleşecek. Botlar hala deneyecek ama sisteminize zarar veremeyecekler. Güvenlik katmanlı savunma ilkesiyle çalışır: Tek bir önlem yeterli değildir, birden fazla katmanın bir arada kullanılması gerekir.

Son bir hatırlatma: Tüm bu değişiklikleri yaparken sunucuya en az iki aktif SSH oturumu açık tutun. Birinde değişiklik yapın, diğerinde test edin. Bir hata yapıp kilitlenirseniz en azından mevcut oturumunuzla sorunu çözebilirsiniz. Bulut sunucularında genellikle web konsolu da bir son çare olarak mevcuttur.

Yorum yapın