SSH anahtarı oluşturma işlemi tek komutla biter: ssh-keygen -t ed25519. Bu komut birbirine matematiksel olarak bağlı iki dosya üretir. Biri özel anahtardır, sizin bilgisayarınızda kalır ve asla kimseyle paylaşılmaz. Diğeri açık anahtardır, sunucuya yüklenir ve kapıdaki kilidin görevini görür. Kilidi herkes görebilir; açacak anahtar yalnızca sizdedir.
Parola yerine anahtar kullanmak sunucu güvenliğinde yapabileceğiniz en etkili tek değişikliktir. Bir parola tahmin edilebilir, sızdırılmış bir listede bulunabilir, kaba kuvvetle denenebilir. 32 baytlık bir Ed25519 özel anahtarını ise denemekle bulmak mümkün değil. Üstelik şifresiz ssh bağlantısı günlük işi de hızlandırır: her bağlantıda parola yazmazsınız, betikleriniz ve yedekleme görevleriniz müdahalesiz çalışır.
Bu sayfada anahtar üretmeyi, açık anahtarı authorized_keys dosyasına eklemeyi, izin ayarlarını, Windows tarafındaki OpenSSH ve PuTTY yolunu, birden çok anahtarın yönetimini ve parola girişini güvenle kapatmayı adım adım göreceksiniz. Sunucuya nasıl bağlanılacağını henüz bilmiyorsanız önce SSH ile sunucuya bağlanma rehberini okuyun.
Anahtar Kimlik Doğrulaması Nasıl Çalışır?#
Mantık basit. Sunucu, sizin açık anahtarınızla şifrelediği rastgele bir veriyi gönderir. Siz bu veriyi yalnızca özel anahtarınızla çözebilirsiniz ve doğru cevabı geri yollarsınız. Sunucu cevabı doğrulayınca sizi içeri alır. Özel anahtar ağ üzerinden hiç geçmez — dinleyen biri olsa bile eline bir şey geçmez.
| Ölçüt | Parola ile giriş | Anahtar ile giriş |
|---|---|---|
| Kaba kuvvete dayanıklılık | Zayıf | Pratikte kırılamaz |
| Otomatik betiklerde kullanım | Parola gömmek gerekir | Müdahalesiz çalışır |
| Sızıntı riski | Parola tekrar kullanılıyorsa yüksek | Özel anahtar dosyası korunursa düşük |
| Kurulum zorluğu | Yok | Bir kereye mahsus 5 dakika |
| İptal etme | Parolayı değiştirirsiniz | Satırı authorized_keys’ten silersiniz |
Şu ayrımı en baştan oturtun: özel anahtar sizde kalır, açık anahtar sunucuya gider. Destek taleplerinde en sık gördüğümüz karışıklık, kullanıcıların id_ed25519 dosyasını sunucuya yüklemesi. O dosya sunucuya gitmez; giden dosya .pub uzantılı olandır.
Ed25519 Anahtar Üretme (ssh-keygen)#
Anahtarı bağlanacağınız sunucuda değil, kendi bilgisayarınızda üretin. Ubuntu 24.04, Debian, macOS ve Windows 10/11’de ssh-keygen komutu hazır gelir; ek bir kurulum gerekmez.
# Önerilen: Ed25519
ssh-keygen -t ed25519 -C "emre-laptop-2026"
# Yalnızca çok eski sistemlerle uyum gerekiyorsa
ssh-keygen -t rsa -b 4096 -C "emre-laptop-2026"
# Anahtara özel bir dosya adı vermek isterseniz
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_batihost -C "batihost-vds"
Komut üç soru sorar. Kayıt yolu (Enter yeterli), passphrase ve passphrase tekrarı. Ardından şu çıktıyı görürsünüz:
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/emre/.ssh/id_ed25519):
Enter passphrase for "/home/emre/.ssh/id_ed25519" (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/emre/.ssh/id_ed25519
Your public key has been saved in /home/emre/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:9xQ... emre-laptop-2026
-C parametresi anahtarın sonuna bir yorum ekler. Zorunlu değil ama çok işinize yarar: üç yıl sonra authorized_keys dosyasında beş satır gördüğünüzde hangisinin hangi makineye ait olduğunu bu yorumdan anlarsınız. “ofis-masaustu”, “ci-sunucusu”, “emre-laptop” gibi anlamlı bir şey yazın.
id_ed25519, uzantısız olan) hiçbir yere yüklemeyin, e-postayla göndermeyin, ekran görüntüsünü paylaşmayın, “yedek olsun” diye bulut depolamaya atmayın. Bu dosyayı ele geçiren kişi parolanızı bilmeden sunucunuza girer. Yalnızca .pub uzantılı dosyanın içeriği paylaşılabilir.Passphrase ve ssh-agent kullanımı#
Passphrase, özel anahtar dosyasını diskte şifreli tutar. Dosya çalınsa bile parola cümlesi olmadan kullanılamaz. Dizüstü bilgisayarda çalışıyorsanız — ki çoğumuz öyle çalışıyoruz — passphrase koymamak için gerçek bir sebep yok.
“Ama her bağlantıda yazmak istemiyorum” itirazının cevabı ssh-agent. Ajan, açtığınız anahtarı bellekte tutar ve sonraki bağlantılarda sizin yerinize kullanır. Oturum başında bir kez parola cümlesi girersiniz, gün boyu bir daha sorulmaz.
# Ajanı başlat (çoğu masaüstünde zaten çalışır)
eval "$(ssh-agent -s)"
# Anahtarı ajana ekle — passphrase burada bir kez sorulur
ssh-add ~/.ssh/id_ed25519
# Ajanda hangi anahtarlar var?
ssh-add -l
# Bilgisayardan kalkarken hepsini boşalt
ssh-add -D
~/.ssh/config dosyasına AddKeysToAgent yes satırını eklerseniz ilk kullanımda anahtar otomatik olarak ajana girer, ssh-add yazmanıza bile gerek kalmaz. Passphrase’i sonradan değiştirmek veya kaldırmak da mümkün: ssh-keygen -p -f ~/.ssh/id_ed25519.
Açık Anahtarı Sunucuya Ekleme#
Sunucu tarafında iş, açık anahtarın tek satır olarak ~/.ssh/authorized_keys dosyasına yazılmasından ibarettir. İki yolu var.
Yol 1: ssh-copy-id (kolay olan)#
# Varsayılan port
ssh-copy-id batihost@203.0.113.10
# Farklı port ve belirli bir anahtar
ssh-copy-id -p 2222 -i ~/.ssh/id_ed25519.pub batihost@203.0.113.10
Komut bir kez parolanızı sorar, dizini oluşturur, satırı ekler ve izinleri kendisi düzeltir. Ubuntu ve Debian’da openssh-client paketiyle gelir. Bir sonraki bağlantıda parola sorulmuyorsa iş tamamdır.
Yol 2: Elle ekleme#
ssh-copy-id yoksa (Windows’ta yok, bazı minimal imajlarda da bulunmaz) açık anahtarı boru hattıyla gönderirsiniz:
# Tek satırda: dizini oluştur, izinleri ayarla, anahtarı ekle
cat ~/.ssh/id_ed25519.pub | ssh batihost@203.0.113.10 \
"mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
# Ya da sunucuya girip nano ile yapıştırın
mkdir -p ~/.ssh && chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
Dosyadaki her anahtar tek satırda durmalıdır. Anahtar metnini kopyalarken araya satır sonu girerse anahtar tanınmaz; bu, elle ekleme yönteminde en sık yapılan hatadır. Satır ssh-ed25519 AAAAC3Nza... ile başlar, sonunda yorum kısmı bulunur.
authorized_keys dosyasına otomatik yazılır. Sunucunuz elinize geldiğinde yapılacak diğer işler için VDS ilk ayarlar listesine göz atın.Doğru İzinler: 700, 600 ve Ev Dizini Tuzağı#
OpenSSH, izinleri gereğinden gevşek olan anahtar dosyalarını sessizce görmezden gelir. Kullanıcıya “izin hatalı” demez, sadece “Permission denied (publickey)” der. Bu yüzden anahtarı doğru ekleyip yine de giremeyen insanların büyük kısmının sorunu izinlerdir.
# Sunucu tarafı
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R batihost:batihost /home/batihost/.ssh
# Ev dizini başkalarınca yazılabilir olmamalı
chmod 750 /home/batihost
# Kendi bilgisayarınızda
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
chmod 600 ~/.ssh/config
| Yol | İzin | Sahip | Neden |
|---|---|---|---|
/home/kullanici | 750 veya 755 | kullanıcı | Grup yazma yetkisi varsa sshd reddeder |
~/.ssh | 700 | kullanıcı | Sadece sahibi girebilmeli |
~/.ssh/authorized_keys | 600 | kullanıcı | Başkası yazabilirse kendi anahtarını ekler |
~/.ssh/id_ed25519 | 600 | kullanıcı | Özel anahtar okunmamalı |
~/.ssh/id_ed25519.pub | 644 | kullanıcı | Açık anahtar zaten geneldir |
Sorunu ararken sunucu günlüğü size doğrudan söyler. sudo journalctl -u ssh -n 50 ya da sudo tail -f /var/log/auth.log çalıştırıp bağlanmayı deneyin; “Authentication refused: bad ownership or modes for directory” satırını görürseniz sorun kesin olarak izindir. Bu tarz günlük okuma alışkanlığı için Linux temel komutları sayfası iyi bir başlangıç.
Windows Tarafı: OpenSSH ve PuTTY#
Windows 10 ve 11 artık OpenSSH istemcisiyle geliyor. Yani PowerShell açıp Linux’takiyle birebir aynı komutları çalıştırabilirsiniz. Anahtarlar C:\Users\KullaniciAdi\.ssh\ klasöründe durur.
# Anahtar üret
ssh-keygen -t ed25519 -C "windows-masaustu"
# Açık anahtarı ekrana bas (kopyalamak için)
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub
# ssh-copy-id Windows'ta yok; boru hattıyla gönderin
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub | ssh batihost@203.0.113.10 "mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys"
# ssh-agent hizmetini kalıcı açın (yönetici PowerShell gerekir)
Set-Service ssh-agent -StartupType Automatic
Start-Service ssh-agent
ssh-add $env:USERPROFILE\.ssh\id_ed25519
PuTTY ve .ppk dosyası#
PuTTY, OpenSSH’ın özel anahtar biçimini doğrudan okumaz; kendi .ppk biçimini kullanır. Bu yüzden PuTTY tarafında iki senaryo var.
- Sıfırdan üretme: PuTTYgen’i açın, alttan EdDSA (Ed25519) seçin, Generate’a basın ve fareyi pencerede gezdirin. Sonra Save private key ile
.ppkdosyasını kaydedin. - Var olan anahtarı dönüştürme: PuTTYgen’de Conversions > Import key ile
id_ed25519dosyasını açın, ardından Save private key deyin. Aynı anahtarı hem PowerShell hem PuTTY ile kullanabilirsiniz.
authorized_keys için kullanmayın. O düğme çok satırlı RFC 4716 biçiminde kaydeder ve OpenSSH bunu kabul etmez. Doğrusu, PuTTYgen penceresinin üstündeki kutuda görünen tek satırlık metni kopyalayıp sunucuya yapıştırmaktır.-
PuTTY (PuTTYgen ve Pageant dahil)Önerilenİndir
-
WinSCP (SFTP ile dosya düzenleme)İndir
-
Windows Terminal (çok sekmeli terminal)İndir
Bağlantılar resmî kaynaklara gider. SSH istemcisini üçüncü taraf sitelerden indirmeyin; değiştirilmiş sürümler ürettiğiniz anahtarı sızdırabilir.
Birden Fazla Anahtar ve ~/.ssh/config#
Bir süre sonra elinizde birden fazla anahtar olur: iş sunucuları için bir tane, kod deposu için bir tane, müşteri sunucusu için ayrı bir tane. SSH varsayılan olarak elindeki bütün anahtarları sırayla dener ve sunucu belli bir denemeden sonra kapıyı kapatır — meşhur “Too many authentication failures” hatası buradan gelir.
Çözüm, hangi sunucuya hangi anahtarın gideceğini ~/.ssh/config dosyasında yazmaktır. Bu dosya Windows’ta C:\Users\KullaniciAdi\.ssh\config yolundadır ve biçimi birebir aynıdır.
Host batihost-web
HostName 203.0.113.10
User batihost
Port 2222
IdentityFile ~/.ssh/id_ed25519_batihost
IdentitiesOnly yes
Host oyun
HostName 203.0.113.25
User minecraft
IdentityFile ~/.ssh/id_ed25519_oyun
IdentitiesOnly yes
Host *
AddKeysToAgent yes
ServerAliveInterval 60
ServerAliveCountMax 3
IdentitiesOnly yes satırı kritik: bu satır olmadan SSH yine ajandaki tüm anahtarları denemeye kalkar. Tanım bittikten sonra ssh batihost-web yazmanız yeterli olur; scp, sftp ve rsync de aynı takma adları tanır. Sunucu taşırken bu kısayollar epey vakit kazandırıyor, taşıma senaryosunun tamamı sunucu taşıma rehberinde anlatılıyor.
Parola Girişini Kapatma (PasswordAuthentication no)#
Anahtar çalışıyorsa sıra parola kapısını kapatmaya geldi. Ayar sunucudaki /etc/ssh/sshd_config dosyasında.
sudo nano /etc/ssh/sshd_config
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password
PermitEmptyPasswords no
MaxAuthTries 3
LoginGraceTime 30
sshd_config dosyasının başında Include /etc/ssh/sshd_config.d/*.conf satırı vardır. Bulut imajlarında bu klasörde çoğu zaman 50-cloud-init.conf dosyası bulunur ve içinde PasswordAuthentication yes yazar. SSH’ta ilk okunan değer geçerlidir, yani ana dosyanın altına yazdığınız no hiçbir işe yaramaz. Önce sudo grep -R "PasswordAuthentication" /etc/ssh/ çalıştırıp bu dosyaları kontrol edin.# Sözdizimini doğrulayın (hatalıysa servis açılmaz)
sudo sshd -t
# Gerçekte hangi değerler geçerli, onu görün
sudo sshd -T | grep -E "passwordauthentication|pubkeyauthentication|permitrootlogin"
# Servisi yeniden başlatın
sudo systemctl restart ssh
sudo systemctl status ssh
ssh kullanici@ip ile girebildiğinizi görün, ancak ondan sonra ilk oturumu kapatın. Bu sırayı atlayanlar hatalı bir yapılandırmada kendilerini sunucudan dışarıda bulur ve konsol erişimine muhtaç kalır. Kural basit: çalıştığını görmeden köprüyü yakma.Anahtarı Kaybederseniz: Panel Konsoluyla Kurtarma#
Diskiniz bozuldu, bilgisayarı sıfırladınız, .ssh klasörünü yanlışlıkla sildiniz. Parola girişi de kapalı. Sunucuya artık ağ üzerinden girilemiyor — ama kurtarmanın yolu var.
-
Panelden KVM/VNC konsolunu açın#
Sağlayıcı panelinizdeki konsol, sunucunun sanal ekranına bağlanır. SSH servisinden, güvenlik duvarından ve ağ ayarlarından bağımsız çalışır. Yani SSH kapalı olsa bile buradan giriş yapabilirsiniz. Kullanıcı adı ve kök parolanızı hazır bulundurun.
-
Yeni bir anahtar üretin ve ekleyin#
Kendi bilgisayarınızda
ssh-keygen -t ed25519ile yeni bir çift üretin..pubdosyasının içeriğini kopyalayıp konsoldan sunucudaki~/.ssh/authorized_keysdosyasına yeni satır olarak yapıştırın. -
Eski anahtarı iptal edin#
Kaybolan anahtara ait satırı dosyadan silin. Anahtarın nerede olduğunu bilmiyorsanız — çalınmış olabilir — bu adım isteğe bağlı değil, zorunludur.
-
Yeni oturumda test edin, sonra konsolu kapatın#
Yeni anahtarla bağlanabildiğinizi doğrulayın. Geçici olarak parola girişini açtıysanız işiniz bitince
PasswordAuthentication noayarına geri dönün.
Panelinizde konsol yoksa veya kök parolasını da bilmiyorsanız kurtarma (rescue) modu talep etmeniz gerekir. Batihost tarafında bunun için destek talebi açmanız yeterli; sunucu kurtarma imajıyla açılır, diskinizi bağlayıp authorized_keys dosyasını elle düzenlersiniz.
authorized_keys dosyasında dursun. Birini kaybederseniz diğeriyle girer, kaybolanı sakince silersiniz.Sorun Giderme ve Sonraki Adımlar#
Sık karşılaşılan sorunlar#
| Belirti | Muhtemel sebep | Çözüm |
|---|---|---|
| Permission denied (publickey) | Anahtar tanınmıyor veya izinler gevşek | 700/600 iznini doğrulayın, ssh -vvv çıktısına bakın |
| Hâlâ parola soruyor | Anahtar sunucuya ulaşmamış | authorized_keys içeriğini kontrol edin, satır bölünmüş olabilir |
| Too many authentication failures | Ajan çok fazla anahtar deniyor | IdentitiesOnly yes ekleyin veya -i ile tek anahtar verin |
| Bad permissions / UNPROTECTED KEY FILE | Özel anahtar herkese okunur | chmod 600 ~/.ssh/id_ed25519 |
| Ayar değişti ama etkisi yok | sshd_config.d içindeki dosya baskın | sudo sshd -T ile gerçek değeri görün |
| PuTTY “server refused our key” | Yanlış biçimde açık anahtar yapıştırılmış | PuTTYgen’in üstündeki tek satırlık metni kullanın |
Sorun devam ediyorsa iki tarafı birden dinleyin: kendi bilgisayarınızda ssh -vvv kullanici@ip, sunucuda sudo journalctl -u ssh -f. Hangi anahtarın sunulduğu ve neden reddedildiği bu iki çıktının kesişiminde net biçimde görünür.
Anahtardan sonra tamamlanacaklar#
Anahtar tabanlı girişe geçtiniz, parola kapısını kapattınız. İyi. Ama sunucu güvenliği tek bir ayardan ibaret değil; birkaç şeyi daha üst üste koymak gerekiyor.
- Fail2ban kurun. Anahtar kullansanız bile başarısız denemeler günlükleri şişirir ve kaynak yer. Kurulumu Fail2ban rehberinde adım adım anlatılıyor.
- Güvenlik duvarını yapılandırın. Yalnızca gerçekten gerekli portlar açık kalsın; UFW ve iptables örnekleri için güvenlik duvarı rehberine bakın.
- Root ile doğrudan girmeyin. Kendi kullanıcınızı açıp
sudokullanın.PermitRootLogin prohibit-passwordayarı root’a yalnızca anahtarla izin verir. - Hangi portun neye açık olduğunu bilin. Port açma ve test etme sayfası bu kontrolü kolaylaştırıyor.
- Sunucuyu izleyin. Girişleri ve kaynak kullanımını takip etmek için izleme rehberindeki araçları kurun.
Oyun sunucusu işletiyorsanız aynı anahtar mantığı orada da geçerli. Ubuntu üzerinde kurulum yapacaksanız Linux Minecraft sunucu kurulumu sayfası, sunucu donanımı seçerken de Ryzen tabanlı VDS paketleri işinizi görür. En düşük öneri her zaman 8 GB RAM, Ryzen 9 ve NVMe SSD; anahtar kurulumu bunlardan bağımsız olarak aynıdır.
Özetle#
SSH anahtarı oluşturma ssh-keygen -t ed25519 -C "aciklama" komutuyla başlar ve kendi bilgisayarınızda yapılır. Üretilen iki dosyadan .pub uzantılı olan sunucuya gider, uzantısız olan asla kimseyle paylaşılmaz. Yükleme için en pratik yol ssh-copy-id kullanici@ip; olmadığında içeriği tek satır hâlinde ~/.ssh/authorized_keys dosyasına eklersiniz.
İzinleri atlamayın: .ssh dizini 700, authorized_keys ve özel anahtar 600 olmalı, ev dizini başkalarınca yazılabilir olmamalı. Anahtara passphrase koyup ssh-agent kullanın; birden çok anahtarı ~/.ssh/config dosyasında IdentitiesOnly yes ile ayırın. Windows’ta OpenSSH aynı komutları çalıştırır, PuTTY kullanacaksanız anahtarı .ppk biçimine dönüştürürsünüz.
Son adım parola girişini kapatmak — ama önce ikinci bir terminalde anahtarla girebildiğinizi görün. Kilitli kalırsanız panelin KVM konsolu sizi kurtarır. Ardından Fail2ban ve güvenlik duvarıyla katmanları tamamlayın; herşey yerine oturduğunda sunucunuz otomatik saldırıların büyük kısmına kapalı hâle gelir.