• Linux Sistem Yönetimi | LKD #9

    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.

    bash
    mehmet@debian ~$ apt search openssh-server

    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.

    bash
    mehmet@debian ~$ ssh kullanici_adi@ip_adresi

    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.

    bash
    mehmet@debian ~$ ssh-keygen -R ip_adresi

    -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.

    bash
    mehmet@debian ~$ ssh -v kullanici_adi@ip_adresi

    Sunucu tarafındaki SSH servisinin loglarını ise journalctl üzerinden inceleyebiliriz.

    bash
    mehmet@debian ~$ journalctl -u ssh

    /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.

    bash
    mehmet@debian ~$ sudo systemctl reload ssh

    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.

    bash
    mehmet@debian ~$ ssh-keygen -t ed25519

    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.

    bash
    mehmet@debian ~$ ssh-copy-id mehmet@192.168.57.11

    Birden fazla anahtarımız varsa göndereceğimiz public key dosyasını -i ile belirtebiliriz.

    bash
    mehmet@debian ~$ ssh-copy-id -i ~/.ssh/id_ed25519.pub mehmet@192.168.57.11

    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.

    bash
    mehmet@debian ~$ scp deneme.txt mehmet@192.168.57.11:/home/mehmet/

    Uzak bilgisayardaki bir dosyayı kendi bilgisayarımıza da kopyalayabiliriz.

    bash
    mehmet@debian ~$ scp mehmet@192.168.57.11:/home/mehmet/deneme.txt .

    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.

    bash
    mehmet@debian ~$ sftp mehmet@192.168.57.11

    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.

    bash
    mehmet@debian ~$ rsync -av belgeler/ mehmet@192.168.57.11:/home/mehmet/belgeler/

    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.

    bash
    mehmet@debian ~$ mkdir uzak-dizin
    mehmet@debian ~$ sshfs mehmet@192.168.57.11:/home/mehmet uzak-dizin

    Bağladığımız dizini findmnt, mount veya df -h komutlarıyla görebiliriz.

    İşimiz bittiğinde bağlantıyı kaldırabiliriz.

    bash
    mehmet@debian ~$ fusermount3 -u uzak-dizin

    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.

    bash
    mehmet@debian ~$ ssh mehmet@192.168.57.11 ls

    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.