Hizmetler Hosting & Sunucu Araçlar Blog Ara Kurumsal EnglishEN
Teklif Alın

Birden fazla sunucuyla çalışan herkes aynı sorunu yaşar: her bağlantı için ssh -i ~/.ssh/id_rsa -p 2222 deploy@203.0.113.10 gibi uzun bir komutu baştan sona yazmak ya da terminal geçmişinden bulmak. Sunucu sayısı üçü, beşi geçtiğinde bu komutlar birbirine karışır; yanlış anahtar dosyası, yanlış port ya da yanlış kullanıcı adıyla bağlanmaya çalışıp zaman kaybetmek işten bile değildir. Aynı bilgiyi scp, rsync ya da bir CI betiği için de tekrar tekrar hatırlamak, tek bir yazım hatasıyla yanlış sunucuya komut göndermek anlamına gelebilir. OpenSSH istemcisi bu tekrarı ortadan kaldırmak için bir çözüm sunar: ~/.ssh/config dosyası.

~/.ssh/config dosyası nedir, nerede durur

~/.ssh/config, OpenSSH istemcisinin her ssh komutundan önce okuduğu, kullanıcıya özel bağlantı ayarları dosyasıdır. Linux ve macOS'ta kullanıcının ana dizini altındaki .ssh klasöründe bulunur (yoksa elle oluşturulabilir); Windows'ta OpenSSH istemcisi kullanıyorsanız aynı dosya C:\Users\kullanıcı\.ssh\config yolunda tutulur. Dosyanın mantığı basittir: her Host satırı, ssh komutuna verdiğiniz alias ile eşleştirilen bir desendir (joker karakter de desteklenir) ve altına yazdığınız HostName, User, Port, IdentityFile gibi seçenekler o alias ile bağlanıldığında otomatik olarak uygulanır.

Yani ssh -p 2222 -i ~/.ssh/id_rsa deploy@203.0.113.10 yazmak yerine, aşağıdaki gibi bir blok tanımladıktan sonra sadece ssh myserver yazmak yeterli olur:

Host myserver
    HostName 203.0.113.10
    User deploy
    Port 2222
    IdentityFile ~/.ssh/id_rsa

Host bastion
    HostName 198.51.100.5
    User ops
    IdentityFile ~/.ssh/id_bastion

Host internal-db
    HostName 10.0.0.20
    User deploy
    IdentityFile ~/.ssh/id_rsa
    ProxyJump bastion
    ServerAliveInterval 60
    ServerAliveCountMax 3

Aynı dosyada istediğiniz kadar Host bloğu tanımlayabilirsiniz. Önemli bir detay: bir parametre için ilk eşleşen blokta bulunan değer geçerli olur, dosyanın devamındaki eşleşen bloklar o parametreyi geçersiz kılmaz. Bu yüzden genel kurallar (örneğin tüm sunucular için ortak bir User) dosyanın altına, özel tanımlar üste yazılmalıdır.

SeçenekNe işe yarar
HostAlias tanımı; ssh komutunda kullanılan kısa isim, joker karakter destekler
HostNameGerçek IP adresi veya domain
UserBağlanılacak kullanıcı adı
PortSSH portu (varsayılan 22 değilse belirtilir)
IdentityFileKullanılacak özel anahtarın (private key) dosya yolu
ProxyJumpBastion/jump sunucu üzerinden bağlanmak için hedef alias veya user@host
ServerAliveInterval / ServerAliveCountMaxBağlantıyı canlı tutmak için periyodik keepalive paketleri

Bu alias'lar yalnızca ssh komutuna özgü değildir. scp dosya.txt myserver:/var/www/ veya rsync -av klasor/ myserver:/backup/ gibi komutlar da aynı ~/.ssh/config dosyasını okur ve myserver alias'ının altındaki HostName, User, Port, IdentityFile değerlerini otomatik uygular. Aynı şekilde git clone ssh://myserver/proje.git gibi bir SSH tabanlı git bağlantısı da bu ayarlardan faydalanır. Yani tek bir Host bloğu, tek bir sunucuyla kurduğunuz tüm SSH tabanlı bağlantı türlerini kapsar.

ProxyJump ile bastion sunucu üzerinden bağlanma

Birçok altyapıda veritabanı ya da iç ağdaki sunuculara doğrudan internetten erişilemez; önce herkese açık bir bastion (jump) sunucuya, oradan da iç ağdaki hedefe atlanır. Bunun için OpenSSH'nin sunduğu yöntem ProxyJump'tır (komut satırındaki -J bayrağının config karşılığı). Yukarıdaki örnekte internal-db bloğundaki ProxyJump bastion satırı, önce bastion alias'ıyla tanımlı sunucuya bağlanıp oradan internal-db'ye geçilmesini sağlar; ayrı bir tünel komutu çalıştırmaya gerek kalmaz. ProxyJump, eskiden aynı iş için kullanılan ProxyCommand ssh -W %h:%p bastion veya ProxyCommand nc %h %p gibi dolaylı ve hataya açık yöntemlerin yerini almıştır; aynı sonucu tek satırla ve daha okunabilir şekilde verir.

Dosya izinleri: config ve anahtar dosyaları için chmod 600

OpenSSH, hem ~/.ssh/config dosyasının hem de özel anahtar (private key) dosyalarının izinlerini sıkı bir şekilde denetler ve buna "strict mode" denir. ~/.ssh/config dosyası chmod 600 olmalıdır, yani yalnızca sahibi okuyup yazabilmelidir; grup veya diğer kullanıcılar tarafından okunabilir/yazılabilir bir config dosyasını OpenSSH reddedebilir ya da sessizce göz ardı edip "Bad owner or permissions" uyarısı verebilir. Aynı kural özel anahtar dosyaları için de geçerlidir: id_rsa, id_ed25519 gibi dosyalar grup veya diğer kullanıcılar tarafından okunabilir haldeyse SSH bağlantıyı reddeder ve anahtarı kullanmaz.

Uyarı
IdentityFile'da belirtilen dosya, özel anahtarın kendisidir — içeriği hiçbir yere yapıştırılmamalı, kimseyle paylaşılmamalıdır. Paylaşılması gereken tek dosya .pub uzantılı genel anahtardır.

Sık yapılan hatalar

  • Anahtar dosyasında yanlış izin: private key dosyası grup/diğer kullanıcılar tarafından okunabilir bırakılırsa (ör. varsayılan olarak indirilen bir .pem dosyası) SSH bu anahtarı kullanmayı reddeder; çözüm chmod 600 anahtar_dosyası komutudur.
  • Host alias yazım hatası: ssh myserver yazdığınızda config'teki Host satırı harf harf eşleşmelidir; alias yanlış yazılırsa ssh o bloğu hiç bulamaz ve alias'ı doğrudan bir hostname gibi çözmeye çalışır, genelde "could not resolve hostname" hatasıyla karşılaşırsınız.
  • IdentitiesOnly unutulması: ssh-agent'ta veya ~/.ssh klasöründe birden fazla anahtar varsa, sunucu doğru anahtarı denemeden önce diğerlerini dener ve bazı sunucular çok fazla başarısız deneme sonrası bağlantıyı keser ("Too many authentication failures"). Bloğa IdentitiesOnly yes eklemek ssh'ı yalnızca o Host için tanımlı IdentityFile'ı kullanmaya zorlar.
  • Config dosyasının izinlerini atlamak: dosyayı elle oluşturduktan sonra izinleri düzeltmemek, dosyanın strict mode tarafından reddedilmesine yol açabilir; chmod 600 ~/.ssh/config ile kapatılması gereken bir adımdır.

Bu dört madde, SSH bağlantı sorunlarının büyük kısmını oluşturur ve genellikle dosyayı elle düzenlerken satır sırası veya girinti (indentation) karışıklığından kaynaklanır. Config dosyasında girinti zorunlu değildir ama okunabilirlik için önerilir; asıl kritik olan her Host bloğunun kendi altındaki seçenekleri doğru gruplamasıdır.

Config dosyasını elle yazmak yerine oluşturmak

Yukarıdaki tüm kuralları (doğru satır sırası, doğru anahtar isimleri, ProxyJump sözdizimi) her yeni sunucu için elle uygulamak yerine, gerekli alanları doldurup hazır bir Host bloğu üretmek pratik zaman kazandırır. KEYDAL'in SSH config oluşturucu aracı, alias, HostName, User, Port, IdentityFile ve isteğe bağlı ProxyJump değerlerini girmenizi ister; sonucunda kopyalanmaya hazır bir Host bloğu ve bağlanmak için kullanılacak komutu üretir.

WhatsApp