SSH
Last updated
Last updated
Selamlar, bu yazıda SSH protokolününün ne olduğundan, nasıl çalıştığından, nasıl yapılandırıldığından ve nasıl kullanıldığından bahsedeceğim. Öncelikle SSH protokolünün ne olduğundan başlayalım.
Türkçe karşılığı Güvenli Soket Kabuğu olan İngilizcedeki Secure Socket Shell'in baş harflerinden isimlendirilen SSH, kullanıcılara ağ üzerinden bir bilgisayara erişmenin güvenli yolunu sağlayan bir network (ağ) protokolüdür. SSH, güçlü bir parola veya key (anahtar) doğrulaması ile ağ üzerindeki iki bilgisayar arasında şifreli iletişimi sağlar. Genelde sistem yöneticileri tarafından sistemleri uzaktan yönetmek için kullanılır. Güvenli olmayan uzaktan bağlantı uygulamalarının yerini almak üzere oluşturulmuştur.
Uzak sistemlerde komut çalıştırmak
Dosya aktarmak
Ağlar arası tünel açmak
SSH, bağlantının görüntülendiği SSH client (istemci) ile bağlantının çalıştırıldığı SSH server (sunucu) bağlantısını sağlayan client-server modelini kullanır. SSH, TCP/IP protokolleri ile çalışır.
SSH server, bağlantı için varsayılan olarak 22 portunu dinler ve TCP protokolünü kullanır.
SSH güvenlidir çünkü public key encryption (açık anahtar şifrelemesi) ile şifreleme ve kimlik doğrulama kullanır. Public key encryption, verilerin anahtarla şifrelenmesi yöntemidir. Public key (açık anahtar) oluşturulur ve bu key SSH server tarafına kopyalanır. Bu işlemlerden sonra yapacağınız her SSH bağlantısında server ve client taraflarındaki public keyler karşılaştırılır ve parola girmeden bağlantı sağlanır. Bağlantı sağlandığında kullanıcı, uzaktaki sunucuda komut çalıştırabilir.
Şimdi gelelim SSH kurulumuna, config dosyasının yapılandırılmasına ve bağlantının yapılmasına. Anlatırken Ubuntu Server 22.04 sistemini kullanacağım.
Öncelikle aşağıdaki komut ile Ubuntu Server'da openssh-server kuralım.
openssh-server başarıyla kurulduktan sonra aşağıdaki komutu yazarak openssh-server'ın çalışma durumunu kontrol edebilirsiniz.
Görselde aktif olduğunu görüyoruz. Eğer openssh-server aktif değilse service ssh start
komutu ile aktif halde çalıştırabilirsiniz. SSH config üzerinde hiçbir yapılandırma yapmadan, varsayılan yapılandırma ile SSH bağlantısı yapabiliriz.
SSH server IPv4 adresi: 10.10.67.102
SSH client IPv4 adresi: 10.10.67.41
Client üzerinden bağlantı için komut kullanımı ssh <user>@<host> -p <port>
şeklindedir. Komutu yazarak ubuntu
kullanıcısı ile SSH sunucusuna 22
portundan SSH bağlantısı isteği gönderelim.
Port belirtmezsek varsayılan olarak 22 portunu kullanır.
Komutu yazdıktan sonra parola sordu ve ubuntu
kullanıcının parolasını yazarak ssh bağlantısı yaptık.
SSH server; IPv6 adresi: fe80::20c:29ff:fed8:205c interface: ens33
SSH client; IPv6 adresi: fe80::7883:fa7a:b0eb:5e0 interface: eth0
Client üzerinden bağlantı için komut kullanımı IPv4 bağlantısı için ssh <user>@<host> -p <port>
şeklinde demiştik. Yine aynı formatta kullanacağız fakat IPv6 adresinin yanında %
işareti ile interface belirtmemiz gerekiyor. Yine ubuntu
kullanıcısı ile SSH sunucusuna 22 portundan SSH bağlantı isteği gönderelim.
Komutu yazdıktan sonra yine parola sordu ve ubuntu
kullanıcının parolasını yazarak ssh bağlantısı yaptık.
Öncelikle client üzerinde key oluşturmamız lazım. Aşağıdaki komut ile public key oluşturabiliriz. Dosya ismi ve parola soracak, enter'a basarak varsayılan dosya ile boş parola girebiliriz.
Çıktı aşağıdaki gibi:
Public key'imiz oluştu. Şimdi oluşan public key'imizi SSH server'a kopyalayalım. Aşağıdaki komut ile kopyalayabiliriz.
Oluşturduğumuz public key server'daki ubuntu kullanıcısı için kaydedilecek ve server'a ubuntu kullanıcısı ile parola kullanmadan bağlanabileceğiz. Yukarıdaki komutun çıktısı aşağıdaki gibi:
ssh-copy-id komutunu çalıştırdıktan sonra kopyalamak için parola sordu. Bağlanmaya çalıştığımız ubuntu kullanıcısının parolasını girdik ve kopyalama başarılı oldu. Hadi parola olmadan bağlanmayı deneyelim. ssh [email protected]
komutunu çalıştıralım.
Yukarıdaki çıktıda görüldüğü gibi parola sormadı ve direkt olarak bağlantı sağladık. Eğer oluşturduğunuz public key'i kopyalarken root kullanıcısı ile kopyalarsanız root ile parolasız bağlanabilirsiniz. Tabii ki öncelikle yapılandırmanızda root yetkileri ile bağlantıya izin vermelisiniz.
SSH server'da yapılandırma yapmak için sshd_config dosyasını düzenlememiz lazım. Yapılandırma için /etc/ssh/sshd_config
dosyasını açalım ve düzenleyelim.
Birçok parametre var ben sadece en önemli gördüğüm parametrelerden bahsedeceğim.
Dosyayı açık ve yukarıdaki parametreleri uyguladık. Bazı parametreler yorum satırı olabilir veya dosya içerisinde olmayabilir, sizin eklemeniz lazım. Dosyada değişlik yaptıktan sonra kaydedip dosyayı kapatalım. Değişikliklerin uygulanması için SSH servisini yeniden başlatmamız gerekiyor. Aşağıdaki komutu kullanarak SSH servisini yeniden başlatabilirsiniz.
Eğer yanlış yapılandırma yapmadıysanız hatasız olarak yeniden başlatılacaktır. Aktiflik durumundan emin olmak için service ssh status
komutunu kullanarak kontrol edebiliriz. Şimdi parametreleri yakından inceleyelim.
Kullanıcıya özel yapılandırma yapmak için Match parametresi kullanılabilir. Eğer kullanılmazsa yapılandırmalar tüm kullanıcılar için geçerli olur. Match all parametresi altında yazılan parametreler tüm kullanıcılar, gruplar, hostlar vb. için geçerli olur. Kullanıcıya veya kullanıcılara özel parametre belirtmek için Match User ... parametresi kullanılır. Aynı zamanda gruplara özel yapılandırma da yapılabilir. Örnek kullanım:
SSH bağlantısının hangi port üzerinden yapılacağını belirtiyoruz. Varsayılan olarak 22 ayarlanmıştır. Silinirse 22 portu üzerinden bağlantı yapılabilir.
SSH bağlantısının hangi adres ve port üzerinden bağlantıları kabul edileceğini belirtmek için kullanılır.
IPv4 adresleri için tüm interface'ler üzerinden bağlantıların kabul edilmesi için 0.0.0.0
IPv6 adresleri için tüm interface'ler üzerinden gelen bağlantıların kabul edilmesi için ::
kullanılır.
Bu parametreyi biraz daha detaylandıralım. SSH sunucusu üzerinde ip addr show
komutunu çalıştıralım.
Komutu çalıştırdık ve sunucu üzerindeki interface'leri görüntüledik. Yukarıdaki interface ve IP adreslerine göre aşağıdaki kullanımları inceleyelim.
ListenAddress 10.10.67.102
şeklinde kullandığımızda sadece 10.10.67.102 adresi üzerinden bağlantı sağlanabilir.
ListenAddress fe80::20c:29ff:fed8:205c%ens33
şeklinde kullandığımızda sadece ens33 interface'i üzerindeki fe80::20c:29ff:fed8:205c IPv6 adresi üzerinden bağlantı sağlanabilir.
Bu ayarlara göre IPv6 kullanarak sunucuya bağlanmaya çalışalım.
Yukarıda görüldüğü gibi sadece ListenAddress parametresi ile verilen IPv6 adresi üzerinden bağlantı sağlayabiliyoruz. Diğer IPv6 adresi üzerinden bağlanmaya çalıştığımızda Connection refused hatası ile karşılaşıyoruz.
SSH üzerinden root yetkileriyle bağlantı yapılıp yapılamayacağı ayarlanır. Varsayılan olarak prohibit-password ayarlanmıştır.
yes
- root yetkileri ile SSH bağlantısını kabul eder.
no
- root yetkileri ile SSH bağlantılarını engeller.
prohibit-password
- root yetkileri ile parolalı bağlantı kurulamaz. Root yetkileriyle sadece public key ile bağlantı sağlanabilir.
forced-commands-only
- Public key kullanılarak root yetkileriyle bağlantı kurulabilir ve sadece ForceCommand parametresi ile verilen komutlar çalıştırılabilir.
Parola ile SSH bağlantısı yapılıp yapılamayacağını belirtmek için kullanılır.
yes
- Kullanıcıların parola ile SSH bağlantısını kabul eder.
no
- Kullanıcıların parola ile SSH bağlantısı yapmasına izin vermez.
SSH bağlantısına izin verilen kullanıcıları belirlemek için kullanılır. Boşluklarla ayırarak kullanıcılar belirtilir. Varsayılan olarak tüm kullanıcılarla bağlantı yapılmasına izin verilir. Örnek kullanım:
Bu örnek kullanımda sadece ubuntu
ve mozlercelik
kullanıcılarının SSH ile bağlantı yapmasına izin verilmektedir.
SSH bağlantısına izin verilen kullanıcı gruplarını belirlemek için kullanılır. Boşluklarla ayırarak gruplar belirtilir. Varsayılan olarak tüm gruplara ait kullanıcıların bağlantı yapılmasına izin verilir.
Bu örnek kullanımda sadece ubuntu
ve yavuzlar
gruplarındaki kullanıcıların SSH ile bağlantı yapmasına izin verilmektedir.
Client'ın direkt olarak erişemediği hedef makineye, başka bir makine üzerinden sanki aynı ağ üzerindeymiş gibi erişebilmesidir. Örnek olarak yukarıdaki görseli inceleyelim. Yukarıdaki sistem hakkında bildiklerimiz:
Client makine internette
server 1, server 2 ve database, firewall arkasında kendi ağlarındalar.
Server 2 firewall üzerinden internete çıkabiliyor ve 22 portunda SSH servisi çalışıyor.
Bu senaryoda client, server 1'e 80 portundan erişmek istiyor. Bu bağlantı nasıl olabilir? Client ile server 1 farklı ağlarda olduklarından bağlantı kurulamıyor. Bu sebeple client, server 2 üzerinden SSH tünellemesi yaparak server 1'e erişebiliyor. Server 1, sadece kendi ağından gelen istekleri karşılayabiliyor ve tünelleme yapıldığında server 1, gelen paketin server 2'den geldiğini görüyor, gelen isteği karşılayabiliyor.
Yukarıdaki simülasyon üzerinde örnek yapalım. Client makine yani bizim makinemiz ile 8000 portunda HTTP server çalıştıran sunucuya bağlantı kuralım. Aşağıda topoloji hakkında bilgiler mevcut:
Client (biz):
10.10.67.185
Ara sunucu
interface 1
10.10.67.102
ssh/22 açık
interface 2 192.168.1.1
Hedef sunucu 192.168.1.10 http/8000 açık
10.10.67.102 IP adresine sahip makineden hedef sunucuya istek atalım.
Aynı ağda oldukları için iki makine haberleşebiliyor. Şimdi tünelleme yaparak client tarafından ulaşmaya çalışalım. Aşağıdaki komutu client üzerinde çalıştırıyoruz.
Yukarıdaki kodu parçalayıp inceleyelim. ssh -L dport:shost:sport user@tunnelip
ssh: SSH komutu.
-L: client üzerinde hangi portta dinleyeceğimizi belirtiyoruz.
dport: client üzerindeki port.
shost: Hedef sunucu. Hangi sunucu ile iletişim kurmak istiyorsak onu yazıyoruz.
sport: Hedef sunucu üzerinde iletişim kuracağımız port.
user: Tünelleme yapacağımız ara sunucudaki kullanıcı adı.
tunnelip: Tünelleme yapacağımız ara sunucunun adresi.
Yukarıdaki komuta göre client'ın 4444 portuna 192.168.1.10 IP adresine sahip sunucunun 8000 portunu bağladık. Client üzerinde 4444 portuna attığımız her istek hedef sunucunun 8000'in portuna gidecek ve dönen cevabı tünel üzerinden bize iletecek. Hadi deneyelim:
Tünelleme yapmadan önce (client): Tünelleme yapmadan önce client makinede 4444 portuna istek atıyoruz ve port üzerinde bir şey olmadığı için bağlanılamıyor.
Tünelleme yaptıktan sonra (client): Açtığımız tünel sayesinde hedef makinedeki 8000 portuna client'ın 4444 portundan ulaşabilmeliyiz. Tünelleme yaptıktan sonra client makinede 4444 portuna istek atıyoruz ve aşağıdaki sonucu alıyoruz. En başta ara sunucu üzerinden attığımız isteğin sonucu ile aynı. Bu demek oluyor ki tünelleme başarılı olmuş ve tünel üzerinden erişim sağlayabiliyoruz.
Yazının sonuna geldin! Umarım yazdıklarım faydalı olmuştur. Saygılarımla,