SSH Anahtar (Key) Oluşturma ve Kullanımı

SSH bağlantı sağladığınızda, her bağlatı yenilendiğinde karşılaştığız şifre işlemini pratik bir şekilde çözmek, kolay ve güvenli bir tanımlama işlemi oluşturmak için bu yazıda SSH anahtarı nasıl oluşturacak ve doğrulayacağımıza anlatacağım.

AA

GitHub ve DigitalOcean erişimlerinde de işinize oldukça yarayacak olan SSH anahtarının ne olduğuna bakalım.

SSH Anahtar (Key)

Güvenilir bir şifre oluşturmak, her servis için farklı şifreler tanımlamak, oluşturulan tüm bu şifreleri hatırlamak kullanılan servislerlerin yoğunluğa bağlı olarak sıkıntılı bir süreç oluşturabilmekte. Tek bir şifre ile tüm servislere erişim ise şifrenizin güvenilirliğine bağlı olarak biraz cesaret işi olacaktır. Alternatif durumda da tüm şifreleri belirli bir yapı takip edilmiyorsa hatırlamak çok da mümkün olamayabiliyor. Bu durumda şifreleri ya bir uygulama içerisinde tutmaya başlıyor ya da not almak durumunda kalıyoruz. İşlevsellik bağlamında değerlendirildiğinde sürecin çok da pratik ilerlemeyeceği ve bir noktada pes etmek durumunda kalabileceğimiz aşikar.

SSH keygen

Ağ trafiğinizin izlenmesi (sniff), doğrudan ya da dolaylı saldırılar hesaba katıldığında yaşanabilecek sorunlar sadece “an” uzaklığımızda oluyor. Yerel ağ içerisinde bile güvenliğin kolayca alt edilebileceği ihtimalini de hesaba katarsak sürekli bir tedbirli davranmak gerekiyor. Belirli dönemlerde yenilenmesi zorunlu olan servislerde ise takip ettiğimiz şifreleme örgüleri de bir noktadan sonra anlamsız bir yapıya kavuşabiliyor (bir de son 3 şifrenin tekrar kullanılamaması işleri arapsaçına çevirebilmekte). OpenSSH‘a tümleşik gelen açık public key authentication (anahtar doğrulama sistemi) bu anlamda daha güvenli bir yapı sunmanın yanı sıra hem de pratik bir kullanım sağlıyor.

OpenSSH

OpenBSD Project tarafından açık kaynak olarak geliştirilmiş, ağ erişimi (SSH Tunneling) aşamasında tüm trafiğin şirelenmesi, saldırılardan korunması için artırılmış güvenlik önlemleri, yeni yetenekler ve metotlar barındıran bir SSH protokolü versiyonudur. SSH, SCP, SFTP gibi bağlantı operasyonları, SSHAdd, SSH-Keysign, SSH-Keyscan ve SSH-Keygen gibi anahtar yönetimi, SSHD, SFtp-Server ve SSH-Agent gibi server taraflı oluşumları kapsar. Sunucu birden fazla kişinin ya da aracın erişimine açılacağı durumlar için en güvenli yöntemdir.

Public Key Authentication

Açık Anahtar Doğrulaması (PKI) public/secret (açık/gizli) anahtar çifti üzerinden işleyen bir yöntemdir. Bağlantı sürecinde açık anahtar paylaşılabilir ve paylaşılan herkes tarafından kullanılabilir. Açık anahtar ile veri şifrelenir. Bağlantı sürecinde şifrenin çözümlenmesi gizli anahtar tarafından gerçekleştirilir. Anahtar çifti içerisinde gizli anahtar silinmişse ya da değiştirilmişse açık anahtar kullanılamaz. Bu anahtar çifti sayesinde açık anahtara sahip herhangi bir istek üzerinden bilgi alışverişi yapılır ve isteği ileten gönderilen verinin gizli anahtar sayesinde okunacağından emindir. Uzak ağ erişimlerinde açık anahtar uzaktaki ağa yerleştirildiğinde gizli anahtar sayesinde erişim hızlı ve güvenli bir şekilde gerçekleşecektir. Şifre erişimine alternatif olarak server erişimlerinde sıklıkla tercih edilmektedir. Tanımlama aşamasının ardından bağlantı SSH protokolü seviyesinde otomatik olarak gerçekleşmektedir.

SSH keygen

Anahtar oluşturulurken ayrıca gizli anahtar erişiminde de şifre (passphrase) kullanılabilir. Bu sayede ek güvenlik önlemleri alabilirsiniz. Şifre belirlendikten sonra SSH gizli anahtara erişmek istediğinde önce parola girişi yapmanız gerekir. OpenSSH içindeki SSH-agent aracıyla bellekte passprase saklama özelliği kolaylaştırılmıştır.

SSH Anahtar (Key) Oluşturmak

DigitalOcean erişimlerinde sıklıkla kullanacağımız anahtarımızı oluşturmaya başlayalım o halde. SSH-Keygen ile anahtar çiftimizi oluşturalım. ssh-keygen -t rsa komutunu girdiğimizde bize anahtar üretme işleminin başladığını belirten bir bildirim iletilecek. Bildirimin bir alt satırında ise oluşturulacak anahtarın kayıt edileceği dosya ismini id_rsa görebilirsiniz. Genellikle SSH2 için id_dsa ya da id_rsa ve SSH1 için identity isimleri kullanılmakta. Farklı erişimler/kişiler/servisler için farklı dosyalar oluşturabilirsiniz. Alacağınız geri bildirim şuna benziyor olacak:

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/kullaniciadi/.ssh/<mark>id_rsa</mark>):

Onaylamak için klavyenizin “Enter” tuşuna basmanız yeterli. Sonraki aşamada sizden id_rsa erişimlerinde (gizli anahtar) girilmek üzere şifre (passphrase) girmek isteyip istemediğiniz sorulacak.

Enter passphrase (empty for no passphrase):
Enter same passphrase again:
SSH keygen

Tanımlama yapmak istemiyorsanız herhangi bir metin girişi yapmadan “Enter” ile devam edebilirsiniz. Onay aşamasının ardından id_rsa (gizli anahtar) ve id_rsa.pub (açık anahtar) dosyalarının oluşturulduğuna ve anahtar karşılaştırmalarında kullanacağınız fingerprint etiketine dair onay mesajı alacaksınız.

Your identification has been saved in /home/kullaniciadi/.ssh/id_rsa.
Your public key has been saved in /home/kullaniciadi/.ssh/id_rsa.pub.
The key fingerprint is:
f3:77:56:58:a8:bb:08:59:67:15:2c:0e:1d:d0:40:a3 kullaniciadi@localhost

Evet, hepsi bu kadar. Artık paylaşılmak üzere açık anahtarımız hazır.

Algoritma ve Anahtar Boyutu Seçimi

Aşağıdaki komutu uyguladığınızda rsa, ecdsa ve ed25519 üzerinden md5 olarak üretilmiş 3 farklı fingerprint göreceksiniz.

ssh-keygen -l -f key.pub -E md5

rsa

Eski bir algoritma. Tavsiye edilen key boyutu en az 2048 bit, ancak 4096 daha uygun bir seçenek olacaktır. Birçok SSH client tarafından desteklenen RSA uzun vadede daha az güvenilir olarak nitelendirilmekte. Aşağıda 4096 bit olarak anahtar oluşturmak için kullanabileceğiniz komutu iletiyorum.

ssh-keygen -t rsa -b 4096

dsa

Digital Signature Algorithm baş harflerinden oluşan DSA, Amerika Birleşik Devletleri tarafından kullanılan bir algoritma standardı olarak ifade edilebilir. Anahtar boyutu olarak 1024 kullanılabilir. Artık desteklenmemektedir. Aşağıda DSA algoritması üzerinden anahtar üretmek için kullanabileceğiniz komutu iletiyorum.

ssh-keygen -t dsa

ecdsa

Elliptic Curve Digital Signature Algorithm baş harflerinden oluşan ECDSA, Amerika Birleşik Devletleri tarafından günümüzde kullanılan standardı ifade etmekte. Güncel uygulamalar için oldukça güvenilir olduğu belirtilen algoritma 3 anahtar boyutunu desteklemekte; 256, 384 ve 521 bit. Özellikle tavsiye edilen 521 bitlik kullanım. Güncel bir çok SSH client tarafından desteklenmekte. Aşağıda 521 bit anahtar üretmek için kullanabileceğiniz kodu iletiyorum.

ssh-keygen -t ecdsa -b 521

ed25519

OpenSSH tarafından oluşturulmuş yeni bir algoritma olan ed25519 günümüzde sınırlı bir desteğe sahip, bu nedenle pek tavsiye edilmemekte. Aşağıda kullanabileceğiniz komutu iletiyorum.

ssh-keygen -t ed25519

Açık Anahtar İçin Spesifik İsim Belirleme

-f parametresiyle oluşturacağımız anahtar için isim belirlememiz mümkün.

ssh-keygen -f ~/.ssh/key-ecdsa -t ecdsa -b 521

Komutu sonrasında /Users/kullaniciadi/.ssh/key-ecdsa.pub anahtar dosyasına sahip olacaksınız. Farklı erişimler için farklı dosyalar tanımlayabilirsiniz.

Açık Anahtarın Uzak Sunucuya Kaydedilmesi

Konuyu dağıtmamak için DigitalOcean başlangıçta örneklendirme için kullanacağım servislerden biri. İlerleyen zaman içerisinde yeni servis ve araçlarda benzer düzenlemeler oldukça yazıya dahil edeceğim. Bunun yanı sıra olası yaşanabilecek sorunlarda doğrudan müdahale edebilmek adına server erişimi üzerinden de anahtar tanımlama işlemine ve uygulayabileceğiniz komutlara/parametrelere de göz atmalısınız.

SSH keygen

DigitalOcean SSH Açık Anahtar Kaydı

DigitalOcean > Ayarlar > Güvenlik > SSH Keys yolu üzerinden anahtar ekleyeceğimiz bölüme ulaşabilirsiniz. SSH Key Ekle butonunu tıkladığınızda açılacak olan SSH Anahtar İçeriği alanına bilgisayarımızda oluşturduğumuz açık anahtar kodumuzu ekleyeceğiz. İsim kısmını herhangi bir şekilde doldurabilirsiniz.

cat ~/.ssh/id_rsa.pub

Yukarıdaki komut ile id_rsa (veya uygun gördüğünüz bir başka açık anahtar) anahtar dosyasında yer alan açık anahtar kodunu görüntüleyebilirsiniz. Bu görüntülediğiniz kodu SSH Key Ekle bölümündeki içerik alanına yapıştırıp ekleme işlemini tamamlayabilirsiniz. Önceden tanımlanmış bir anahtar yerine yeni bir anahtarla tanımlama yapmak isterseniz aşağıdaki kodu kullanabilirsiniz.

cat ~/.ssh/id_rsa.pub | ssh root@[server-ip-adresi] "cat >> ~/.ssh/authorized_keys"

Yeni bir droplet oluşturmak istediğinizde kullanıcı hesabınızla ilişkilendirilmiş olan SSH anahtarlarını görebilir, istediğiniz anahtarlarla ilişkilendirme sağlayabilirsiniz.

authorized_keys SSH Açık Anahtar Kaydı

Server erişimi için açık anahtarınızın server’da kayıtlı olması gerekmektedir. Aksi durumda bağlantı isteğiniz reddedilecektir. Kayıt işlemini bir arayüz üzerinden gerçekleştirmenin yanı sıra doğrudan kayıt işlemi de yapılabilmektedir. authorized_keys tanımlama için ssh-copy-id aracını kullanmamız yeterlidir.

ssh-copy-id -i ~/.ssh/key-ecdsa root@ipadresi

Kullanılabilecek Komut ve Parametreler

-b “Bits”

Kullanılmak istenen bit sayısını belirtir. Ön tanımlı bit genişliği algoritmaya göre değişiklik gösterebilir.

-B Bubble babble

Anahtar dosyaya ait fingerprint değerini bubble babble (Tectia format) olarak gösterir.

-c Comment

Anahtar dosyası içerisindeki yorum alanını düzenler.

-e “Export”

Var olan anahtarların OpenSSH ve RFC 4716 (SSH Public Key Format) arasında yeniden tanımlanmasını sağlar.

-f File

Anahtar oluşturulurken isim tanımlamak için kullanılır.

-F

known_hosts dosyasında spesifik hostname değeri arar.

-i Input

SSH-Keygen var olan bir anahtara erişim istediğinde dosyanın ilişkilendirilmesi için kullanılır.

-l Fingerprint

Belirttiğiniz açık anahtara ait fingerprint değerini yansıtır.

-N New

Anahtar için yeni bir passphrase sağlar.

ssh-keygen -f $HOME/.ssh/id_rsa -t rsa -N ''

Yukarıdaki komut passphrase tanımlamadan id_rsa dosyasını oluşturur. '' içerisine minimum 5 karakter uzunluğunda tanımlanmasını istediğiniz passphrase (sistem parolası) değerini girebilirsiniz.

-p “Change the passphrase”

Özel anahtar oluşturma aşamasında istenen şifrenin (passphrase) değiştirilmesini sağlar. [-P eski_passphrase] ve [-N yeni_passphrase], [-f anahtar_dosyasi] parametreleriyle kullanılır.

-R

known_hosts içerisindeki tüm hostname tanımlamalarını siler.

-t “Type”

Anahtar tipini belirlemekte kullanılır. En yaygın kullanımlar: - rsa için RSA anahtarı - dsa için DSA anahtarı - ecdsa için elliptic curve DSA anahtarı vb.

-y

OpenSSH tanımlı gizli anahtarı okur ve OpenSSH açık anahtar olarak ekrana döker. Yukarıdaki komut ve parametreler karşılaşılabilecek durumları tahmin ederek ekledim. Çok daha detaylı bilgi almak için man ssh-keygen komutunu kullanabilir, ssh-keygen sayfasını inceleyebilirsiniz.

Son bir not; gizli anahtarınızı sadece sizin okuyabileceğiniz şekilde yetkilendirme yapmanız (700: owner okuyabilir, yazabilir, çalıştırabilir, 600: owner okuyabilir, yazabilir) uygun olacaktır.

chmod 700 ~/.ssh
ls -la ~/.ssh
chmod 600 ~/.ssh/id_rsa\*
ls -la .ssh