SSH (secure shell) farklı bir bilgisayardan hedef sunucunun terminalini doğrudan kullanmamızı sağlayan uzaktan erişim yöntemidir.
SSH bağlantısı kurmak için Windows’ta,
- Putty
- Mobaxterm araçlarını kullanabiliriz.
SSH bağlantıları Linux’ta openssh üzerinden yürütülür. Doğrudan indireceğimiz paket adını bilmiyorsak, apt search komutuyla arayabiliriz.
Yalnızca IP adresini yazarsak karşı bilgisayara bulunduğumuz kullanıcı adıyla bağlanmayı deneriz.
Farklı bir kullanıcıyla bağlanmak istiyorsak kullanıcı adını IP adresinin önünde belirtmemiz gerekir.
SSH Sunucu Anahtarı
Bir SSH sunucusuna ilk kez bağlanırken sunucunun kimliğine güvenip güvenmediğimiz sorulur. Bağlantıyı kabul ettiğimizde sunucunun anahtarı kullanıcının ~/.ssh/known_hosts dosyasına kaydedilir.
Bundan sonraki bağlantılarda sunucunun gönderdiği anahtar, daha önce kaydedilen anahtarla karşılaştırılır.

Sunucunun anahtarı değişirse SSH bize kimlik uyarısı verir. Bu durum sunucunun yeniden kurulmasından, IP adresinin başka bir sunucuya verilmesinden veya sunucu taşınırken SSH host anahtarlarının aktarılmamasından kaynaklanabilir.
Aynı uyarı ortadaki adam (man in the middle) saldırısında da görülebileceğinden, değişikliğin nedenini bilmeden bağlantıya devam etmemeliyiz.
Eski anahtarın gerçekten geçersiz olduğundan eminsek kaydı aşağıdaki şekilde silebiliriz.
-v parametresiyle bağlantı sırasında gerçekleşen işlemleri daha ayrıntılı görebiliriz. Bağlantının neden kurulamadığını araştırırken işimize yarayabilir.
Sunucu tarafındaki SSH servisinin loglarını ise journalctl üzerinden inceleyebiliriz.
/etc/ssh/ssh_config istemci ayarlarını, /etc/ssh/sshd_config ise SSH sunucusunun ayarlarını tutar.
Yapılandırma dosyasında bazı ayarlar yorum satırında görünmesine rağmen OpenSSH kendi varsayılan değerini kullanmaya devam eder. Varsayılan değer bizim için uygunsa başındaki # işaretini kaldırmamız gerekmez.
Debian ve Ubuntu sistemlerinde root kullanıcısının parolayla SSH girişi varsayılan olarak kapalıdır. Root kullanıcı adı herkes tarafından bilindiği için doğrudan parola denemelerinin önüne geçilmiş olur. Anahtar kullanımına izin verilip verilmemesi ise PermitRootLogin ayarına bağlıdır.
SSH sunucusunun ayar dosyasında yaptığımız değişikliğin uygulanması için servisi yeniden yüklememiz gerekir.
Public ve Private Key
SSH bağlantısında parolanın yerine anahtar çifti kullanabiliriz. Private key bağlandığımız bilgisayarda kalır (localde yani) ve kimseyle paylaşılmaz. Public key ise bağlanacağımız kullanıcı hesabına kopyalanır.
Anahtar çiftini aşağıdaki komutla oluşturabiliriz.
Not: Herhangi bir parametre vermeden doğrudan ssh-keygen yazdığımızda da ed25519 ile yeni key üretilir.
Public key hangi kullanıcı hesabına eklenirse o hesaba giriş yapmak için kullanılabilir. Aynı anahtar birden fazla sunucuya veya kullanıcı hesabına da eklenebilir.
Anahtarımızı karşı bilgisayardaki kullanıcıya ssh-copy-id ile kopyalayabiliriz.

Birden fazla anahtarımız varsa göndereceğimiz public key dosyasını -i ile belirtebiliriz.
Anahtar ile girişin çalıştığını kontrol ettikten sonra sunucu tarafındaki sshd_config dosyasında parolayla girişi kapatabiliriz.
Bunun için sshd_config dosyasında ve sshd_config.d dizinlerinde Password Authentication satırlarını no’ya çevirmemiz yeterlidir.
Değişikliğin geçerli olması için SSH servisini yeniden yüklememiz gerekir.
scp
scp, SSH bağlantısı üzerinden iki bilgisayar arasında dosya kopyalamamızı sağlar.
Uzak bilgisayardaki bir dosyayı kendi bilgisayarımıza da kopyalayabiliriz.
SFTP
SFTP, SSH üzerinden dosya aktarımı yapmamızı sağlar. Ayrı bir SFTP portu açmamıza gerek yoktur, SSH bağlantısı için kullandığımız port yeterlidir.
SFTP içerisinde pwd ve ls komutları karşı bilgisayarda çalışır. lpwd ve lls komutları ise kendi bilgisayarımızdaki dizinleri gösterir.
put ile karşı bilgisayara dosya gönderir, get ile karşı bilgisayardan dosya alırız.

rsync
rsync, iki konum arasındaki dosyaları senkronize etmek için kullanılır. SSH üzerinden çalıştırıldığında dosyalar şifreli bağlantı üzerinden aktarılır.
Burada -a parametresiyle dosyalar arasında hiyerarşiyi koruyup izinleriyle birlikte aldık, -v ile terminale hangi dosyaları aldığımızı yazmasını söyledik.
Rsync kendi daemon servisi üzerinden de çalışabilir. Bu yöntemde varsayılan olarak TCP 873 numaralı port kullanılır. Genellikle herkese açık bir dosya kaynağı sunulacaksa bu yöntem tercih edilebilir.
SSHFS
SSHFS, karşı bilgisayardaki bir dizini kendi sistemimizdeki normal bir dizin gibi bağlamamızı sağlar. Dosya aktarımı SSH üzerinden yapılır.
Bağladığımız dizini findmnt, mount veya df -h komutlarıyla görebiliriz.
İşimiz bittiğinde bağlantıyı kaldırabiliriz.
SSH bağlantısını etkileşimli bir terminal açmadan, karşı bilgisayarda tek bir komut çalıştırmak için de kullanabiliriz. Komut tamamlandıktan sonra bağlantı kapanır ve kendi terminalimize geri döneriz.

SSH kullanarak yapabileceğimiz farklı işlemler de bulunur. Örnek olarak,
SSH Agent Forwarding
Agent forwarding, kendi bilgisayarımızdaki SSH anahtarını başka bir makineye kopyalamadan o makine üzerinden üçüncü bir sunucuya bağlanmamızı sağlar.

Örneğin A makinesinden B makinesine bağlanabiliyoruz. B makinesi de C makinesine fiziksel yöntemlerle ya da ssh ile bağlanabiliyor ancak A makinesi C makinesine ssh ile bağlanamıyor. Bu durumda B üzerinden C makinesine bağlanmak istediğimizde, kimlik doğrulama isteği B üzerinden A makinesindeki SSH agent’a iletilir. Private key B makinesine kopyalanmaz.
SSH Ters Tünelleme
Ters tünelleme, doğrudan dışarıdan erişilemeyen bir makinedeki servisi SSH sunucusu üzerinden erişilebilir hale getirmemizi sağlar.

Kendi makinemizdeki bir port, uzak sunucudaki bir porta yönlendirilir. Uzak sunucunun ilgili portuna gelen istekler, kurulan tünel üzerinden bizim makinemize iletilir. Bu şekilde, normalde dışarıdan erişilemeyen kendi makinemize, uzak sunucu üzerinden dışarıdan erişilebilir hale geliriz.
SSH Tünelleme
SSH tünelleme ile kendi bilgisayarımızdaki bir portu, SSH sunucusunun ulaşabildiği başka bir servise aktarabiliriz. Makinelerin aynı ağda bulunması gerekmez ancak aralarında gerekli bağlantının kurulabiliyor olması gerekir.
Kendi bilgisayarımızdaki 8080 portuna gelen bağlantılar, SSH sunucusu üzerinden hedef sunucunun 80 numaralı portuna iletilir.
SSH SOCKS Proxy
SSH SOCKS Proxy, belirlediğimiz bir uygulamanın ağ trafiğini SSH sunucusu üzerinden göndermemizi sağlar. Örneğin tarayıcımızı bu proxy’yi kullanacak şekilde ayarlarsak, ziyaret ettiğimiz sitelere doğrudan kendi bilgisayarımızdan değil SSH sunucusu üzerinden ulaşırız.
SSH ile X11 Aktarımı
X11 aktarımı, uzak bilgisayarda çalışan grafik arayüzlü bir uygulamanın penceresini kendi ekranımızda göstermemizi sağlar. Bu işlem uzak masaüstü bağlantısı değildir, yalnızca çalıştırdığımız uygulamanın penceresi aktarılır.
Başta Doruk ve Onur hocalarım olmak üzere kampta emeği geçen herkese teşekkür ederim.
