24 Haziran 2016 Cuma

SSH Nedir ? Nasıl Çalışır ?

SSH kısacası bir network protokolüdür.linux işletim sisteminin bir çok dağıtımında bu protokole ilişkin uygulamalar hazır olarak gelmektedir.windows tarafında ise ssh client programı
olarak putty  programı mevcuttur.(benim bildiğim tabi detaylı araştırabilirsiniz.)

burada ssh protokolü gerçekleştirilirken bir takım programlar kullanılmıştır bunlar linux işletim sisteminde mevcut programlardır.





SSH protokolünün gerçeklendiği alanlar,uzak sunucu bağlantısı(remote host) ve port forwarding işlemidir.

öncelikle uzak sunucu bağlantısından kasıt shell codelarının ve linux komutlarının uzak sunucuda execute edilmesidir.peki bunu gerçekleyen diğer araçlar mevcut iken neden böyle birşeye ihtiyaç duyulmuş diye sorabilirsiniz ? örneğin telnet de bu amaca hizmet etmektedir.fakat telnet ile ssh arasında önemli bir fark vardır buda GÜVENLİKdir.telnet client ile server arasında başlattığı tüm sessionı plaintext(ascii form) yani açık bir şekilde gerçekleştirirken, SSH,client ve server arasında sessionı başlattığında bunu secure tunnel üzerinden yapar.yani tüm network paketlerini şifreli
bir şekilde client ve server arasında gönderip almaktadır.

bu anlatılanları resmetecek olursak şöyle birşey olurdu ;





SSH ile remote host üzerinde çalışmak için bir istek gönderdiğimizde(client olarak biz) karşı sunucu(o bir ssh serverdır) bizi tanımak ister,bunun için
iki yöntem mevcuttur.

birincisi bilindik username,password kullanılarak ssh sunucuya bağlanılır.
ikincisi anahtar doğrulamalı giriş yapmaktır.

birincisi dediğim gibi bilindik bir olay gayet basit kullanıcı adı ve şifre yazılarak ssh sunucuya bağlanılır.

ikinci yöntem de ise ssh servera kendimizi kanıtlamamız gerekir.öncelikle şu işlemleri yaparız.

iki adet anahtar üretiriz bunlardan birisi private(id_rsa) diğeri ise public(id_rsa.pub).

public olanı ssh sunucumuza yükleriz,private olan anahtarımız ise bizde kalır.
bu iki anahtar birbirine bağlı anahtarlardır birisi mesajı encrypt ederken diğeride mesajı decrypt eder.


bu ilişkili anahtarları linux da ssh-keygen ile üretebiliriz.otomatik olarak bu iki key ~/.ssh directoryisinin altına atılacaktır.
buradaki public keyi eğer çalıştığımız sunucu bir linux sunucuysa o halde ~/.ssh/authorized_keys(yoksa da oluşturulur) dosyasına ekleriz.

ssh-keygen ile üretilen anahtarlar default olarak 2048 bit ve RSA şifreleme methodu baz alınarak üretilmiştir.bunlar ssh-keygene gerekli
parametreler geçirilerek değiştirilebilir.

varsayalım ki public keyi servera yerleştirdik şöyle gerçekleştirilebilir(tabi sunucuya burada username password ile log in olduk) :

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys


ve artık kullanıcı parola ile ssh sunucuya bağlanmak yerine key doğrulamalı bir şekilde sunucuya bağlanmak istiyoruz.o da şu şekilde gerçekleştirilebilir :

ssh -i ~/.ssh/id_rsa user@serverexample.com 

buradaki ~/.ssh/id_rsa bizim serverdaki usera ait public key(id_rsa.pub) için private key(id_rsa) sahip olduğumuzu göstermek içindir.

peki bu aşamada ne oluyor ?

şöyleki biz client olarak yine servera xxx kulanıcı adı ile bir bağlantı girişiminde bulunuruz fakat bu sefer elimizde bir private key(id_rsa) vardır.yapılan işlemler biz farkında olmadan client ile server arasında şu şekildedir :

1->client olarak xxx kullanıcı ile ssh sunucuya bağlantı girişiminde bulunduk.
2->server bize kendimizi kanıtlamamız için bir challenge text gönderdi.
3->biz bu challenge texti kendi private_keyimiz(id_rsa) ile şifreledik ve bunu tekrar servera gönderdik.
4->server bu şifreli challenge texti alıp  xxx kullanıcısına ait olan public_key(id_rsa.pub) ile decrypt etti.
5->decrypyt ettiği  text ile gönderdiği challenge texti karşılaştırır eğer aynıysa evet bu durumda ssh sunucu bizi tanır giriş yaparız,fakat değilse ssh sunucu bizi tanımaz ve girişi ret eder.


aşağıdaki resim yukarıda bahsettiğim handshaking(el sıkışma) olayıdır.





SSH PORT FORWARDING

SSH uygulamalarından biride port forward olayıdır.(port yönlendirme)

PORT FORWARDING ile uzak sunucunuzdaki belirlemiş olduğunuz bir portdaki trafiği kendinize yönlendirebilir  ya da kendi kullanmış olduğunuz local bilgisayarınızdaki  belirlemiş olduğunuz port daki tüm trafiği uzak sunucuya iletebilirsiniz.bunlara sırasıyla remote port forwarding  ve local port forwarding denilmektedir.

port forwarding gizlilik ve bir takım kısıtlamaları aşma amaçlı kullanılmaktadır.örneğin bulunduğunuz local network den ulaşmak istediğiniz bir web sayfası var fakat bu sayfaya erişim internet servis
sağlayınıcız tarafından ya da şirketinizde bulunan bir firewall aracılığı ile engellenmiş olsun.bu gibi bir durumda port yönlendirmesi yaparak ssh sunucunuza bağlantınızı yönlendirebilirsiniz(belirli bir port üzerinden) ve ssh sunucunuz o sayfayı ziyaret edip size gönderebilir.



gizlilik sağladığını zaten biliyoruz çünkü ssh client ile server arasıda başlattığı  sessionı tunneling yapılarak korunmaktadır.


local port forwardinge örnek olarak :


ssh -L 80:100.27.46.87:80 remotehostssh

bunun ile  80 nolu portunuzdaki trafiği remotehostssh yönlendirmiş olursunuz bu sayede    remotehostssh üzerinden  100.27.46.87 web sayfasına erişmiş olursunuz.kısacası  ssh sunucu sizin adınıza 100.27.46.87 adresinden(bir web adresinin ip adresi olsun) istekte bulunmaktadır.ve bunu size iletmektedir.(HTTP 80 portundan çalışmaktadır.)


bu bahsettiğimiz olayın görselleştirilmiş hali şu şekilde:

bunun tersi de mümkündür buna da  remote port forwarding deniliyor.
ssh -R 80:100.27.46.87:80 remotehostssh

burada ise ssh sunucusundaki 80 nolu porttaki network trafiğini kendimize yönlendiriyoruz.

bu olayın görselleştirilmiş hali şu şekilde :







son port forwarding türümüz dynamic port forwarding.
bunu anlatmadan önce kısaca local port forwarding ve remote port forwarding ile ne yaptığımızı anlayalım.

local port forwarding ile  local de belirtmiş olduğumuz portdaki tüm network trafiğini uzak sunucuda belirttiğimiz belirli bir porta iletiyoruz.

remote port forwarding ise bunun aksini yapıyor,yani ssh serverda belirtilmiş bir port local(kendi pcmiz) deki bir porta yönlediriliyor.


dynamic port forwarding de destination host(yani ssh sunucu üzerinden bağlantısı gerçekleştirilecek olan host) belirtilmez.

dynamic port forwarding den bahsetmeden önce kısaca  SOCKS dan bahsetelim şöyleki SOCKS client ile server arasında network packetlerinin alınıp verilmesini socks proxy server üzerinden sağlayan bir internet protokolüdür.normalde http proxylerle sadece http requestlerini gönderebiliriz,fakat SOCKS Proxylerde  POP3,SMTP,IRC,FTP gibi network trafiklerini de gönderip alabiliriz.

dynamic Port forwarding   çeşitli programlardan  gelen bağlantıları SSH clienta iletilir,daha sonra SSH client bunu SSH servera iletir,
ve daha sonrada istenilen sunucuya erişilmiş olunur.

eğer ssh serverınızı bir sock servera dönüştürmek istiyorsanız yapmanız gereken şey sadece şu komut :

SSH -D 1080 remote_ssh


peki burada ne yapıldı ?

dynamic port forwarding kullanarak aslında socks proxy hizmetinden yararlanırız.dynamic port forwarding kullanılarak ssh client tarafı artık bir
socks client(bunlar çeşitli programlar olabilir) ve aynı şekilde ssh server da bir socks proxy server olur.



dynamic port forwarding daha iyi anlayabilmemiz için bir örnek verecek olursak:

web browser da gezindiğimiz tüm web sayfalarına ssh serverımız üzerinden çıkmak istediğimizi(secure channel üzerinden) düşünelim bu durumda şunları yapmamız yeterli olacaktır.


SSH -D 1080 remote_ssh ile ssh serverımızı bir sock proxy serverına ceviriyoruz.

daha sonra web browserımızda bir takım basit ayarlar gerçekleştiriyoruz.

web browserımızın(firefox için) Edit -> Preferences -> Advanced -> Network -> Connection -> Settings erişiyoruz bu durumda aşağıdaki gibi
bir pencere karşımıza çıkıyor.ve bu penceredeki ayarlarıda aşağıdaki gibi yapıyoruz.








artık firefox bir socks client olarak tüm trafiği 1080 portuna iletiyor  ve buradaki trafik ise 22 portuna yönlendiriliyor bu port default olarak ssh serverla haberleşilen portdur, daha sonra ssh server tıpkı bir socks proxy server gibi bu paketleri alıyor ve işliyor.bu paketler illa bir web sayfası isteği olmak zorunda değil aynı port üzerinden istersek ftp protokolü aracılığıyla dosya transferini gerçekleştiririz,burada mühim olan secure tunnel üzerinden artık şifreli bir şekilde dış dünya ile haberleşiyor olmamız.


bunu daha iyi anlamak için resmetmek gerekirse şöyle birşey olurdu:






EOF

Hiç yorum yok:

Yorum Gönder