Linux Sunucu Üzerinde Güvenli SSH Bağlantısı Nasıl Yapılır?

Merhaba ;

Uzak sunucularınıza SSH üzerinden bağlanırken bu bağlantıyı daha güvenli hale getirebilirsiniz. OpenSSH, komutları başka bir makinede çalıştırmanıza olanak tanıyan bir uzaktan yönetim aracıdır. OpenBSD Projesi tarafından geliştirilmiştir. OpenSSH 22 portunu kullanılır. kullanıcıadi@Ip_adresi ya da hostadı şeklinde bağlantı kurulur. Eğer sunucunuzda ya da client bilgisayarınız üzerinde ssh aktif değil ise hızlıca aşağıdaki şekilde kurabilirsiniz;

sudo apt install openssh-server   # debian için kurulum komutu
sudo systemctl status ssh         # ssh servisinin çalıştığını doğrulama
sudo ufw allow ssh                # Cihaz güvenlik duvarı devrede ise ssh(22) aktif etmek için

Sonrasında ilgili sunucunun şifresini girerek 22 portu üzerinden bağlantı kurarsınız. ccorbaci kullanıcısı ile client cihazımdan homesrv adlı 192.168.1.100 Ip adresli sunucuma bağlanmak istersem;

ssh ccorbaci@192.168.1.100
ssh ccorbaci@homesrv

Bu kısa hatırlatmadan sonra SSH ile public-private key ilişkisine bakalım. SSH (Secure Shell) protokolünün public-private key ile birlikte kullanımı, bir kullanıcı ile uzaktaki bir sunucu-servis arasında güvenli, şifrelenmiş bir bağlantı kurmak için kullanılan bir kimlik doğrulama yöntemidir. Bu yöntemde, bir anahtar çifti (public key ve private key) oluşturulur ve kullanılır. Özellikle Linux sistemlerinde sıkça kullanılan bu yöntem, parolasız giriş yapmayı sağlar ve güvenliği artırır. Bu siz sunucunuza bağlanırken ya da ssh kullanan bir servis yapılandırırken ya da github reponuza erişirken de sıkça kullanacağınız bir yöntem olarak karşınıza çıkacaktır.

SSH Anahtar Çifti Nedir?

SSH anahtar çifti, asimetrik şifreleme temelinde çalışır ve iki parçadan oluşur:

  • Public Key (Açık Anahtar): Bu anahtar herkesle paylaşılabilir ve sunucuda saklanır. Public key, kimlik doğrulaması sırasında kullanıcının private key’ine karşılık gelir.
  • Private Key (Özel Anahtar): Bu anahtar yalnızca kullanıcıda saklanır ve kimseyle paylaşılmaz. Sunucu, kullanıcıyı doğrulamak için public key ile private key’in uyumlu olup olmadığını kontrol eder.

SSH Anahtar Doğrulama Süreci

SSH anahtar doğrulama süreci şu adımları izler:

  • Anahtar Çifti Oluşturma: Kullanıcı, kendi bilgisayarında bir public-private key çifti oluşturur.
  • Public Key Sunucuya Kopyalama: Public key, kullanıcı tarafından bağlanılacak olan uzak sunucuya yüklenir.
  • Kimlik Doğrulama: Kullanıcı, sunucuya bağlanmaya çalıştığında, sunucu public key’in kullanıcının private key’i ile eşleşip eşleşmediğini kontrol eder. Eğer eşleşiyorsa, giriş yapılır ve bağlantı sağlanır. Bu yöntemle şifre girmeye gerek kalmaz.

Private key, sadece kullanıcının bilgisayarında tutulduğu için çok daha güvenlidir. Şifre bazlı kimlik doğrulamada kullanılan şifreler genellikle kaba kuvvet saldırılarına karşı savunmasız olabilirken, anahtar doğrulama bu riski azaltır. Anahtar doğrulaması ile parolasız giriş yapılabilir, bu da kullanıcıların sık sık şifre girmesini engeller. Parolasız oturum açma, script’lerin ve otomasyon işlemlerinin kolayca gerçekleştirilmesini sağlar.

.ssh

SSH ile ilgili olan ~/.ssh klasörü , SSH ile ilgili anahtarlar ve konfigürasyon dosyalarını barındıran dizindir. Bu dizindeki önemli dosyalar şunlardır:

  • id_rsa (Private Key): SSH bağlantıları için kullanılan özel anahtardır. Bu dosya gizli tutulmalıdır ve sadece o bilgisayardaki kullanıcı tarafından erişilebilir olmalıdır. Kimseyle paylaşılmaması gereken dosyadır. Varsayılan dosya izni: 600 (yalnızca sahibi okuyup yazabilir).
  • id_rsa.pub (Public Key): SSH bağlantılarında kullanılan açık anahtardır. Bu anahtar, uzak sunuculara gönderilir ve kimlik doğrulama işlemi bu anahtar ile yapılır. Public key, sunuculardaki ~/.ssh/authorized_keys dosyasına eklenir.
  • authorized_keys: Bu dosya, sunucuda oturum açmasına izin verilen public key’lerin saklandığı yerdir. Eğer bir client, sunucuya public key ile bağlanmaya çalışıyorsa, bu dosyada kayıtlı olan anahtarlarla doğrulama yapılır. Public key’i buraya ekleyerek parolasız SSH bağlantısı sağlanabilir.
  • known_hosts: SSH ile daha önce bağlandığın sunucuların fingerprint’lerini (kimlik doğrulama bilgilerini) saklar. Eğer bir sunucuya ilk defa bağlanıyorsanız, SSH bu sunucunun fingerprint’ini onaylar ve bu dosyaya kaydeder. Bir sunucunun fingerprint’i değişirse, SSH uyarı verir ve sunucunun güvenilir olup olmadığını sorgular.
  • config: SSH bağlantılarını kişiselleştirmek için kullanılan ayar dosyasıdır. Farklı sunucular için özel bağlantı ayarları, port numaraları, anahtar dosyaları gibi bilgiler burada tanımlanabilir. Örneğin, belirli bir sunucuya her zaman farklı bir kullanıcı adıyla bağlanmak istiyorsan, bu dosyada ayarlayabilirsiniz.
  • id_dsa ve id_dsa.pub (Eski DSA Anahtarları): DSA algoritmasıyla oluşturulmuş eski anahtar çiftleridir. Modern sistemlerde genellikle RSA veya ECDSA kullanılır, bu yüzden yeni SSH anahtarları oluşturulurken genelde tercih edilmez.

ssh-keygen Komutu ile Anahtar Çifti Oluşturma

SSH anahtar çifti oluşturmak için ssh-keygen komutu kullanılır. Bu komut, kullanıcıya özel bir private ve public key oluşturur. İlk olarak, client bilgisayarında bir public-private key çifti oluşturacağız. Terminalde ;

ccorbaci@X1:~/.ssh$ ssh-keygen -t rsa -b 4096 -C "ccorbaci@X1"

Generating public/private rsa key pair.
Enter file in which to save the key (/home/ccorbaci/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/ccorbaci/.ssh/id_rsa
Your public key has been saved in /home/ccorbaci/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:BhI/SQeaHB71bd7sz/HVy6n73AOtOQVe0Hvl59zr9fM ccorbaci@X1
The key's randomart image is:
+---[RSA 4096]----+
|    . oo=.o.  .  |
|     = * o  o. ..|
|    . O    o o..o|
|     . o    ..oo+|
|        S   ..+o=|
|       .     o.+*|
|              *oO|
|             +.BB|
|             o*+E|
+----[SHA256]-----+
ccorbaci@X1:~/.ssh$ ll

total 12
drwx------ 1 ccorbaci ccorbaci   44 Oct 19 09:57 ./
drwxr-x--- 1 ccorbaci ccorbaci  578 Oct 10 08:15 ../
-rw------- 1 ccorbaci ccorbaci  341 Oct 19 07:50 config
-rw------- 1 ccorbaci ccorbaci 3369 Oct 19 09:57 id_rsa
-rw-r--r-- 1 ccorbaci ccorbaci  737 Oct 19 09:57 id_rsa.pub
ccorbaci@X1:~/.ssh$ 


# -t rsa: Anahtar türü olarak RSA algoritmasını seçer.
# -b 4096: Anahtar boyutunu 4096 bit olarak belirler (daha uzun anahtar daha güvenlidir).
# -C "ccorbaci@X1": Anahtar çifti için bir yorum ekler. Bu yorum genellikle kullanıcı adı veya e-posta adresi olur.
# Bu kısımda bu anahtar için şifre de belirtebilirsiniz ben boş bıraktım.

Bu komutla RSA algoritmasını kullanarak 4096 bitlik bir anahtar çifti oluşturuyoruz (komut çıktısı yukarıdaki kod satırında var adım adım tekrar açıklamaya çalışayım. Bu aşamada, sana anahtarın kaydedileceği yeri soracak:

Enter file in which to save the key (/home/kullanici/.ssh/id_rsa):

Varsayılan yeri kullanmak isterseniz, sadece Enter tuşuna basın. Bu durumda, private key /home/kullanici/.ssh/id_rsa dosyasına, public key ise /home/kullanici/.ssh/id_rsa.pub dosyasına kaydedilecektir.

Artık anahtarlarımız hazır. Anahtar çifti oluşturduktan sonra, public key’i sunucuya kopyalamamız gerekiyor. Bunu, ssh-copy-id komutuyla yapabiliriz. Bu komut, public key’in sunucudaki ~/.ssh/authorized_keys dosyasına otomatik olarak eklenmesini sağlar. Aşağıdaki komutla public key’i sunucuya gönderelim:

ccorbaci@X1:~/.ssh$ ssh-copy-id ccorbaci@homesrv

The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
ED25519 key fingerprint is SHA256:tKZ8y9miFmzd+Hdeeo2514YgaIMpXmK4KXpTtHfqsDM.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 2 key(s) remain to be installed -- if you are prompted now it is to install the new keys
ccorbaci@192.168.1.100's password: 

Number of key(s) added: 2

Now try logging into the machine, with:   "ssh 'ccorbaci@homesrv'"
and check to make sure that only the key(s) you wanted were added.

ccorbaci@X1:~/.ssh$

Eğer private key’e parola koyduysanız, bu aşamada private key’in parolasını girmen istenecek. Eğer parolasız oluşturduysanız, direkt olarak sunucuya bağlanacaksın. Sonrasında ssh homesrv şeklinde bağlantı sağlayabilirsiniz.

Ek Bilgiler

Sunucu IP adresim 192.168.1.100. Ortamımda DNS gibi bir servis yok Ip adresi yazmak ta istemiyorum. Bilgisayarımda /etc/hosts dosyama sunucu Ip adresimi kaydettim. Sonrasında isimle bağlanabilirim.

127.0.0.1 localhost
127.0.1.1 X1

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

192.168.1.100 homesrv

Peki sunucu üzerinde gelen ssh bağlantılarını log nasıl görürüm? /var/log/auth.log bu logların tutulduğu yerdir.

Config Dosyası Hakkında

~/.ssh/config dosyası, SSH bağlantılarını kişiselleştirmek ve kolaylaştırmak için kullanılan bir yapılandırma dosyasıdır. Bu dosyada sunuculara özel SSH bağlantı ayarları yapabilir ve belirli bir sunucuya bağlanırken her seferinde uzun komutlar yazmak zorunda kalmadan bağlantı sağlayabilirsin. Bunun yanısıra;

  • Sunucuya Özel Ayarlar: Aynı SSH parametrelerini her defasında tekrar yazmamak için belirli sunuculara özel kullanıcı adı, port, IP adresi gibi ayarlar tanımlanabilir.

  • Çoklu Sunucu Yönetimi: Birden fazla sunucuya bağlanıyorsan, her biri için farklı konfigürasyonlar yaparak bağlantıyı hızlandırabilirsin.

  • Alias (Kısa İsimler): Sunuculara kısa takma adlar (alias) tanımlayarak, uzun hostname ve IP adreslerini tekrar yazmadan kısa adlarla bağlantı kurabilirsin.
  • Özel SSH Anahtarları: Her bir sunucu için farklı bir SSH anahtar çifti kullanmak istiyorsan, bu dosyada bunu yapılandırabilirsin.

Yapılandırma dosyası ve bazı anahtarlar bu şekilde;

Host homeserver                  # 'homeserver' adında bir bağlantı oluşturuyoruz. SSH bağlantısı bu takma isim ile yapılacak.
    Hostname 192.168.1.100       # Bağlanılacak sunucunun IP adresi veya hostname'i.
    Port 22                      # Bağlantının yapılacağı port (varsayılan SSH portu 22'dir).
    User ccorbaci                # SSH oturumu açarken kullanılacak kullanıcı adı.
    IdentityFile ~/.ssh/id_rsa   # Özel SSH anahtarının yolu. Oturum açmak için bu anahtar kullanılacak.
    ServerAliveInterval 60       # SSH bağlantısı süresince sunucuya belirli aralıklarla sinyal göndererek bağlantının canlı kalmasını sağlar.
    Compression yes              # SSH oturumundaki veri sıkıştırmasını aktif hale getirir. Bağlantı hızını artırabilir.
    ForwardAgent yes             # SSH bağlantısı sırasında kimlik doğrulama anahtarlarını uzak sunucudan ajan ile iletmeye olanak tanır.
    StrictHostKeyChecking no     # Otomasyon senaryolarında ,otomatik bağlantı kurulması gereken ortamlarda (örneğin, CI/CD süreçlerinde veya script'lerde), her seferinde kullanıcıdan onay istenmesini engellemek için kullanılır.
		LogLevel VERBOSE             # SSH bağlantısı sırasında ayrıntılı log (günlük) bilgisi verir. Hata ayıklamada yardımcı olabilir.

Host github.com-repo             # Github repolarınıza bağlanırken de config dosyasını aşağıdakine benzer şekilde yapılandırabilirsiniz. Bununla ilgili yazıyı bloğumda bulabilirsiniz.
      Hostname github.com
      IdentityFile=/home/ccorbaci/.ssh/GitHub_rsa

/etc/ssh_config Dosyası Hakkında

/etc/ssh/ssh_config, SSH istemcisinin (client) genel yapılandırma dosyasıdır. Bu dosya, bir SSH istemcisi olarak sunuculara bağlandığınızda istemcinin davranışlarını belirleyen çeşitli ayarları içerir. SSH sunucusuna bağlanırken varsayılan olarak hangi parametrelerin kullanılacağını bu dosya belirler.

SSH istemcisi, bir sunucuya bağlanırken belirli ayarları manuel olarak belirtmediğinizde, bu dosyadaki ayarları kullanır. Eğer kullanıcı düzeyinde özel ayarlar yapmak isterseniz, kendi kullanıcı dizininizdeki ~/.ssh/config dosyasını da kullanabilirsiniz. Ancak, /etc/ssh/ssh_config sistem genelinde geçerli olan varsayılan ayarları içerir.

Include /etc/ssh/ssh_config.d/*.conf                               # Diğer yapılandırma dosyalarını dahil eder.

Host *                                                             # Tüm sunucular için geçerli ayarları belirtir.
   ForwardAgent no                                                 # SSH anahtarlarını başka bir sunucuya iletmez.
   ForwardX11 no                                                   # X11 ile uzaktan grafik uygulamaları çalıştırmayı devre dışı bırakır.
   ForwardX11Trusted yes                                           # Güvenilen X11 yönlendirmesini etkinleştirir.
   PasswordAuthentication yes                                      # Parola ile kimlik doğrulamayı etkinleştirir.
   HostbasedAuthentication no                                      # Ana bilgisayara dayalı kimlik doğrulamayı devre dışı bırakır.
   GSSAPIAuthentication no                                         # GSSAPI ile kimlik doğrulamayı devre dışı bırakır.
   GSSAPIDelegateCredentials no                                    # GSSAPI kimlik bilgilerini yönlendirmeyi devre dışı bırakır.
   GSSAPIKeyExchange no                                            # GSSAPI ile anahtar değişimini devre dışı bırakır.
   GSSAPITrustDNS no                                               # GSSAPI DNS'e güvenmeyi devre dışı bırakır.
   BatchMode no                                                    # SSH'yi betik modunda kullanırken parola istemlerini engellemez.
   CheckHostIP no                                                  # Sunucunun IP adresini kontrol etmeyi devre dışı bırakır.
   AddressFamily any                                               # Bağlantının IPv4 veya IPv6 ile yapılabileceğini belirtir.
   ConnectTimeout 0                                                # Bağlantı için zaman aşımı süresi yoktur (süresiz bekler).
   StrictHostKeyChecking ask                                       # Sunucu anahtarı değiştiğinde kullanıcıdan onay ister.
   IdentityFile ~/.ssh/id_rsa                                      # RSA özel anahtar dosyasını kullanır.
   IdentityFile ~/.ssh/id_dsa                                      # DSA özel anahtar dosyasını kullanır.
   IdentityFile ~/.ssh/id_ecdsa                                    # ECDSA özel anahtar dosyasını kullanır.
   IdentityFile ~/.ssh/id_ed25519                                  # Ed25519 özel anahtar dosyasını kullanır.
   Port 22                                                         # SSH bağlantısı için varsayılan olarak 22 numaralı portu kullanır.
   Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc    # Kullanılacak şifreleme algoritmalarını belirler.
   MACs hmac-md5,hmac-sha1,umac-64@openssh.com                     # Mesaj kimlik doğrulama kodlarını (MAC) tanımlar.
   EscapeChar ~                                                    # SSH bağlantısında kaçış karakterini belirtir.
   Tunnel no                                                       # SSH tünellemesini devre dışı bırakır.
   TunnelDevice any:any                                            # SSH tünel cihazlarını yapılandırır.
   PermitLocalCommand no                                           # Yerel komutların SSH bağlantısından çalıştırılmasına izin vermez.
   VisualHostKey no                                                # Bağlantı sırasında sunucunun anahtarını grafiksel olarak göstermez.
   ProxyCommand ssh -q -W %h:%p gateway.example.com                # Belirtilen proxy sunucusu üzerinden bağlantı kurar.
   RekeyLimit 1G 1h                                                # Şifreleme anahtarlarını her 1 GB veri veya 1 saatlik bağlantıda yeniler.
   UserKnownHostsFile ~/.ssh/known_hosts.d/%k                      # Bilinen anahtarlar dosyasının yolunu belirtir.
   SendEnv LANG LC_*                                               # Ortam değişkenlerini sunucuya gönderir.
   HashKnownHosts yes                                              # Bilinen sunucuların anahtarlarını hash ile saklar.
   GSSAPIAuthentication yes                                        # GSSAPI ile kimlik doğrulamayı etkinleştirir.

Leave a Comment