SSH Anahtar Tabanlı Kimlik Doğrulama Kurulumu

Sunucularınıza her giriş yaptığınızda parola yazmanın hem zahmetli hem de güvensiz olduğunu fark ettiniz mi? SSH anahtar tabanlı kimlik doğrulama, bu sorunu çözerken güvenliği de ciddi ölçüde artırıyor. Parola tabanlı girişlerde brute-force saldırıları, zayıf parola seçimleri ve parola sızıntıları gibi risklerle yaşamak zorunda kalıyorsunuz. Anahtar tabanlı kimlik doğrulamada ise matematiksel olarak birbirine bağlı bir anahtar çifti kullanıyorsunuz: özel anahtar sizde, açık anahtar sunucuda. Özel anahtarı ele geçiremeyen biri sisteme giremez. Bu yazıda sıfırdan başlayarak production ortamında kullanabileceğiniz, güvenli bir SSH anahtar altyapısı kuracağız.

SSH Anahtar Çiftinin Mantığı

Şifreli iletişimin temeli asimetrik kriptografiye dayanıyor. Bir anahtar çifti oluşturduğunuzda iki dosya elde ediyorsunuz:

  • Özel anahtar (private key): Bilgisayarınızda saklı kalır, kimseyle paylaşılmaz
  • Açık anahtar (public key): Giriş yapacağınız sunuculara kopyalanır

Giriş denemesinde sunucu, açık anahtarınızı kullanarak bir meydan okuma (challenge) oluşturuyor. Bu meydan okumayı yalnızca eşleşen özel anahtara sahip biri çözebiliyor. Parola hiç ağa gönderilmiyor, dolayısıyla dinleme saldırıları anlamsız hale geliyor.

Gerçek dünya senaryosu düşünelim: 50 sunucu yöneten bir sysadmin olarak her sunucuda farklı parola tutmanız pratikte imkansız, aynı parolayı kullanmanız ise güvenlik felaketi. Anahtar tabanlı kimlik doğrulamayla tek bir özel anahtarla (passphrase korumasıyla) onlarca sunucuya güvenle bağlanabilirsiniz.

Anahtar Oluşturma

Modern sistemlerde Ed25519 algoritmasını tercih etmelisiniz. RSA’ya göre hem daha hızlı hem de daha güvenli. RSA kullanmak zorundaysanız en az 4096 bit seçin.

# Ed25519 anahtar çifti oluşturma (önerilen)
ssh-keygen -t ed25519 -C "[email protected]"

# RSA alternatifi (eski sistemler için)
ssh-keygen -t rsa -b 4096 -C "[email protected]"

# Özel bir konuma kaydetmek için
ssh-keygen -t ed25519 -f ~/.ssh/production_key -C "production-sunucular"

Komutu çalıştırdığınızda sizden bir passphrase isteniyor. Bunu boş bırakmak teknik olarak mümkün ama güvenlik açısından kötü bir fikir. Özel anahtarınız çalınırsa passphrase olmadan direkt kullanılabilir. Güçlü bir passphrase belirleyin, bunu ssh-agent ile yönetiyorsunuz zaten (aşağıda anlatacağım).

Anahtar oluşturulduktan sonra şu dosyalar oluşuyor:

  • ~/.ssh/id_ed25519: Özel anahtar, asla paylaşmayın
  • ~/.ssh/id_ed25519.pub: Açık anahtar, sunuculara kopyalanacak
# Oluşan anahtarları doğrulama
ls -la ~/.ssh/
cat ~/.ssh/id_ed25519.pub

Açık anahtarın içeriği şöyle görünüyor:

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBkP... [email protected]

Açık Anahtarı Sunucuya Kopyalama

Üç farklı yöntem var, duruma göre birini seçeceksiniz.

Yöntem 1: ssh-copy-id (En Kolay)

# Standart port ve kullanıcı ile
ssh-copy-id kullanici@sunucu_ip

# Özel port kullanıyorsanız
ssh-copy-id -p 2222 kullanici@sunucu_ip

# Belirli bir anahtar dosyasını kopyalamak için
ssh-copy-id -i ~/.ssh/production_key.pub [email protected]

Bu komut açık anahtarı alıp hedef sunucudaki ~/.ssh/authorized_keys dosyasına ekliyor. Var olan anahtarları silmiyor, ekleme yapıyor.

Yöntem 2: Manuel Kopyalama

ssh-copy-id bulunmayan ortamlarda (bazı minimal kurulumlar, Windows) manuel yapıyorsunuz:

# Açık anahtarı sunucuya taşıma
cat ~/.ssh/id_ed25519.pub | ssh kullanici@sunucu_ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

# Doğru izinleri ayarlama (kritik!)
ssh kullanici@sunucu_ip "chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"

Yöntem 3: Çoklu Sunucu için Script

10 sunucunuz varsa tek tek kopyalamak yerine bir script yazın:

#!/bin/bash
# sunucu_listesi.txt dosyasından IP'leri oku
SUNUCULAR=("192.168.1.10" "192.168.1.11" "192.168.1.12" "192.168.1.13")
KULLANICI="admin"
ANAHTAR="$HOME/.ssh/id_ed25519.pub"

for SUNUCU in "${SUNUCULAR[@]}"; do
    echo "Kopyalanıyor: $SUNUCU"
    ssh-copy-id -i "$ANAHTAR" "$KULLANICI@$SUNUCU"
    if [ $? -eq 0 ]; then
        echo "Başarılı: $SUNUCU"
    else
        echo "HATA: $SUNUCU - Manuel kontrol edin"
    fi
done

SSH Server Yapılandırması

Anahtar kopyalamak yetmiyor, sunucu tarafında da doğru yapılandırma şart. /etc/ssh/sshd_config dosyasını düzenleyeceğiz.

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo nano /etc/ssh/sshd_config

Değiştirmeniz gereken temel parametreler:

  • PubkeyAuthentication yes: Anahtar tabanlı girişi etkinleştirir
  • AuthorizedKeysFile .ssh/authorized_keys: Anahtar dosyasının konumu
  • PasswordAuthentication no: Parola girişini kapatır (anahtar kurulumunu test ettikten sonra!)
  • PermitRootLogin no: Root ile direkt girişi engeller
  • PermitEmptyPasswords no: Boş parolalı hesaplara girişi engeller
  • MaxAuthTries 3: Maksimum deneme sayısı
  • Protocol 2: Sadece SSH protokol 2 kullanılır
# sshd_config için örnek güvenli yapılandırma bloğu
sudo tee -a /etc/ssh/sshd_config << 'EOF'

# Anahtar tabanlı kimlik doğrulama
PubkeyAuthentication yes
AuthorizedKeysFile     .ssh/authorized_keys

# Parola girişini kapat (anahtarları test ettikten sonra)
PasswordAuthentication no
PermitEmptyPasswords no

# Root girişini engelle
PermitRootLogin no

# Güvenlik kısıtlamaları
MaxAuthTries 3
MaxSessions 10
LoginGraceTime 30

# Eski protokolleri kapat
Protocol 2
EOF

Kritik uyarı: PasswordAuthentication no satırını açmadan önce, anahtar tabanlı girişin çalıştığını mutlaka doğrulayın. Aksi hâlde sunucunuza erişiminizi kalıcı olarak kaybedebilirsiniz. Test etmeden önce mevcut SSH oturumunuzu kapatmayın.

# Yapılandırmayı test etme
sudo sshd -t

# Hata yoksa servisi yeniden başlatma
sudo systemctl restart sshd

# Servis durumunu kontrol etme
sudo systemctl status sshd

ssh-agent ile Passphrase Yönetimi

Passphrase belirlediyseniz her bağlantıda girmeniz gerekiyor. ssh-agent bu sorunu çözüyor: anahtarı belleğe alıp oturum boyunca kullanılabilir hale getiriyor.

# ssh-agent başlatma
eval "$(ssh-agent -s)"

# Anahtarı agent'a ekleme
ssh-add ~/.ssh/id_ed25519

# Yüklü anahtarları görme
ssh-add -l

# Anahtarı agent'tan kaldırma
ssh-add -d ~/.ssh/id_ed25519

# Tüm anahtarları kaldırma
ssh-add -D

Agent’ın her terminalde otomatik başlaması için ~/.bashrc veya ~/.zshrc dosyanıza ekleyin:

# ~/.bashrc veya ~/.zshrc dosyasına eklenecek blok
if [ -z "$SSH_AUTH_SOCK" ]; then
    eval "$(ssh-agent -s)" > /dev/null 2>&1
    ssh-add ~/.ssh/id_ed25519 > /dev/null 2>&1
fi

macOS kullanıcıları için Keychain entegrasyonu daha temiz bir çözüm:

# ~/.ssh/config dosyasına ekle (macOS)
Host *
    AddKeysToAgent yes
    UseKeychain yes
    IdentityFile ~/.ssh/id_ed25519

SSH Config Dosyası ile Çoklu Sunucu Yönetimi

Birden fazla sunucu yönetiyorsanız ~/.ssh/config dosyası hayat kurtarıyor. Her sunucu için kullanıcı adı, port, anahtar gibi bilgileri burada tanımlıyorsunuz.

# ~/.ssh/config örneği
Host prod-web
    HostName 203.0.113.10
    User deploy
    Port 2222
    IdentityFile ~/.ssh/production_key
    ServerAliveInterval 60

Host prod-db
    HostName 203.0.113.20
    User dbadmin
    Port 22
    IdentityFile ~/.ssh/production_key

Host staging
    HostName 203.0.113.30
    User ubuntu
    IdentityFile ~/.ssh/staging_key

Host dev-*
    User developer
    IdentityFile ~/.ssh/dev_key
    StrictHostKeyChecking no

# Tüm bağlantılar için genel ayarlar
Host *
    ServerAliveInterval 120
    ServerAliveCountMax 3
    ConnectTimeout 10

Artık ssh prod-web yazmanız yeterli, geri kalanını config dosyası hallediyor.

İzin Sorunlarını Çözme

SSH anahtar doğrulamasının en yaygın sorunu yanlış dosya izinleri. SSH, güvenlik nedeniyle hatalı izinli dosyaları reddediyor.

# Doğru izinleri ayarlama
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/config

# Dizin sahibini doğrulama
ls -la ~/.ssh/
stat ~/.ssh/authorized_keys

Sorun yaşıyorsanız verbose mod ile bağlanarak detaylı hata mesajı alın:

# Birinci seviye detay
ssh -v kullanici@sunucu

# İkinci ve üçüncü seviye detay (daha fazla bilgi)
ssh -vv kullanici@sunucu
ssh -vvv kullanici@sunucu

Çıktıda Permission denied (publickey) görüyorsanız şunlara bakın:

  • Sunucudaki authorized_keys izni 600 olmalı
  • Sunucudaki .ssh dizin izni 700 olmalı
  • SELinux veya AppArmor kısıtlamaları olabilir
  • authorized_keys dosyası doğru kullanıcının home dizininde mi?
# SELinux bağlamını düzeltme (RHEL/CentOS)
restorecon -Rv ~/.ssh/

# Sunucu tarafında debug için auth log kontrolü
sudo tail -f /var/log/auth.log        # Debian/Ubuntu
sudo tail -f /var/log/secure          # RHEL/CentOS

Farklı Ortamlar için Anahtar Yönetimi

Profesyonel bir ortamda tek anahtar çifti yeterli değil. Production, staging, geliştirme ortamları ve farklı projeler için ayrı anahtarlar kullanmak iyi bir pratik.

# Ortam bazlı anahtar oluşturma
ssh-keygen -t ed25519 -f ~/.ssh/prod_key -C "production-2024"
ssh-keygen -t ed25519 -f ~/.ssh/staging_key -C "staging-2024"
ssh-keygen -t ed25519 -f ~/.ssh/github_key -C "github-ali"
ssh-keygen -t ed25519 -f ~/.ssh/backup_key -C "backup-sunucular"

# Tüm anahtarları listeleme
ls -la ~/.ssh/*.pub

Anahtar rotasyonu da ihmal edilmemeli. Altı ayda bir veya bir güvenlik olayı sonrasında anahtarları yenilemeniz öneriliyor:

#!/bin/bash
# Basit anahtar rotasyon scripti
TARIH=$(date +%Y%m%d)
ESKI_ANAHTAR="$HOME/.ssh/id_ed25519"
YENI_ANAHTAR="$HOME/.ssh/id_ed25519_$TARIH"

# Yeni anahtar oluştur
ssh-keygen -t ed25519 -f "$YENI_ANAHTAR" -C "rotated-$TARIH"

echo "Yeni açık anahtar:"
cat "${YENI_ANAHTAR}.pub"
echo ""
echo "Bu anahtarı sunuculara kopyaladıktan sonra eski anahtarı kaldırın"
echo "Eski anahtar: $ESKI_ANAHTAR"

Authorized Keys Yönetimi (Sunucu Tarafı)

Birden fazla kullanıcının aynı sunucuya erişmesi gerekiyorsa authorized_keys dosyasını düzenli tutun:

# Yetkili anahtarları görme
cat ~/.ssh/authorized_keys

# Belirli bir anahtarı kaldırma (satır numarasıyla)
# Önce hangi satırda olduğunu bul
grep -n "[email protected]" ~/.ssh/authorized_keys

# Sonra o satırı sil (örneğin 3. satır)
sed -i '3d' ~/.ssh/authorized_keys

Anahtarlara kısıtlama da ekleyebilirsiniz. authorized_keys dosyasında satır başına seçenekler yazılıyor:

  • command=”komut”: Bu anahtarla yalnızca belirtilen komutu çalıştırabilir
  • from=”ip_adresi”: Yalnızca belirtilen IP’den giriş hakkı verir
  • no-port-forwarding: Port yönlendirmeyi engeller
  • no-pty: Terminal açmayı engeller (backup script’leri için kullanışlı)
# Restricted authorized_keys örneği
# Yalnızca backup komutunu çalıştırabilir, sadece belirli IP'den
command="/usr/bin/rsync --server -vlogDtpre.iLsfxC . /backup/",from="192.168.1.50",no-pty,no-port-forwarding ssh-ed25519 AAAAC3Nza... [email protected]

Fail2ban ile SSH Korumasını Tamamlama

Anahtar tabanlı kimlik doğrulama kuruduktan sonra bile brute-force denemeleri log’larınızı kirletiyor ve sistem kaynaklarını tüketiyor. Fail2ban ile bu denemeleri otomatik engelleyebilirsiniz:

# Fail2ban kurulumu
sudo apt install fail2ban -y           # Debian/Ubuntu
sudo dnf install fail2ban -y           # RHEL/CentOS

# SSH için jail yapılandırması
sudo tee /etc/fail2ban/jail.local << 'EOF'
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
EOF

sudo systemctl enable fail2ban
sudo systemctl start fail2ban

# Yasaklı IP'leri görme
sudo fail2ban-client status sshd

Sonuç

SSH anahtar tabanlı kimlik doğrulama, herhangi bir Linux ortamının temel güvenlik katmanı olmalı. Parola girişinden bu sisteme geçmek ilk bakışta karmaşık görünse de adımları izlediğinizde birkaç dakika içinde kurulumu tamamlayabiliyorsunuz. Önemli noktaları özetleyecek olursam:

Ed25519 algoritmasıyla güçlü anahtar oluşturun ve mutlaka passphrase belirleyin. ssh-agent sayesinde bu passphrase’i her seferinde girmenize gerek kalmıyor. Açık anahtarı sunucuya kopyaladıktan sonra önce test edin, ardından parola girişini kapatın. ~/.ssh/config dosyasını aktif kullanmaya başlarsanız çoklu sunucu yönetimi çok daha pratik hale geliyor.

Farklı ortamlar için farklı anahtarlar kullanmak, düzenli anahtar rotasyonu yapmak ve authorized_keys dosyasını temiz tutmak kurumsal ortamlarda şart. Fail2ban gibi araçlarla bu güvenlik katmanını pekiştirdiğinizde, SSH altyapınız hem güvenli hem de yönetilebilir bir hale geliyor.

Bu kurulumu bir kez yapıp bırakmayın. Güvenlik denetimleri sırasında hangi anahtarların aktif olduğunu, kimlerin erişimi olduğunu ve son anahtar rotasyonunun ne zaman yapıldığını takip edin. Küçük bir SSH güvenlik ihmalinin büyük veri ihlallerine kapı araladığı gerçek vakalar düşünüldüğünde, bu birkaç dakikalık kuruluma değer.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir