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çenek | Ne işe yarar |
|---|---|
| Host | Alias tanımı; ssh komutunda kullanılan kısa isim, joker karakter destekler |
| HostName | Gerçek IP adresi veya domain |
| User | Bağlanılacak kullanıcı adı |
| Port | SSH portu (varsayılan 22 değilse belirtilir) |
| IdentityFile | Kullanılacak özel anahtarın (private key) dosya yolu |
| ProxyJump | Bastion/jump sunucu üzerinden bağlanmak için hedef alias veya user@host |
| ServerAliveInterval / ServerAliveCountMax | Bağ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.
.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 myserveryazdığınızda config'tekiHostsatı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 yeseklemek 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/configile 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.
Alias, HostName, User, Port, IdentityFile ve ProxyJump bilgilerini girin; kopyalamaya hazır bir ~/.ssh/config Host bloğu alın.