Public key kimlik denetiminin birincil avantajı, aÄŸ üzerinden karşı sisteme iletilecek bir ÅŸifre giriÅŸine ihtiyaç duyulmaması, public-private anahtar çiftini (public-private key pair) oluÅŸturan anahtarlardan “private” olanının kimlik denetimi esnasında ve ya herhangi zaman diliminde karşı tarafa ya da üçüncü bir ÅŸahıs/partiye transferinin ve ya ifÅŸasının gerekli olmayışı sebebiyle daha yüksek seviyede güvenlik saÄŸlıyor olması diyebiliriz.
.
.
Özellikle cleartext ÅŸifre ile denetim tamamiyle iptal edilerek söz konusu private key iyi korunduÄŸunda, kimlik doÄŸrulama sürecinin sadece bu key’e bağımlı olarak yürütülmesi nedeniyle güvenlik seviyesinde tatminkar bir düzeye çıkılmış olunacaktır. Aynı zamanda ortak internet kullanımı hizmeti verilen public alanlardan, gerek aÄŸ geçidinde firewall, gerekse sunucu tarafında ssh-wrapping ile statik IP denetiminin mümkün olmadığı diÄŸer koÅŸullarda, yoÄŸun olarak mobile uzaktan eriÅŸim gereksiniminde olan kiÅŸiler için kafi derecede eriÅŸim güvenliÄŸi sunmasının yanı sıra kolaylık saÄŸlayacak bir method olarakta deÄŸerlendirebilir. Ayrıca cleartext ÅŸifre ile kimlik denetimi ve ÅŸifrelenmemiÅŸ veri transferinin aksine, ÅŸifre odaklı brute force saldırılarına ve ssh tunneling ile birlikte kullanıldığında man-in-the-middle tehditlerine karşı nitelikli bir önlem teÅŸkil etmesi, kimlik denetiminin otomatikleÅŸtirilebilmesi, farklı kullanıcılar arasında yetki dağılımının gerçekleÅŸtirilmesi ve yönetilmesi konularında saÄŸladığı pratiklik diÄŸer önemli artıları olarak sıralanabilir.
Åžifreleme algoritmaları arasında hem ÅŸifreleme (encryption) hem de çözümleme (decryption) için aynı gizli anahtarı kullananlar simetrik algoritma, “public key” kriptografisi çatısı altında encryption için bir tane, decryption için farklı bir tane olmak üzere iki farklı anahtar kullananlar ise asimetrik algoritma olarak adlandırılırlar. AES (Advanced Encryption Standard), RC2, RC4, DES (Data Encryption Standard), 3DES (Triple-DES), IDEA (International Data Encryption Algorithm), BLOWFISH, TWOFISH simetrik algoritmalar olup, kullanıldıklarında iki parti (istemci ve sunucu) aynı gizli anahtarı paylaşırlar ve güvenilirliÄŸin devamı için bu tek anahtarın korunması gereklidir. Özellikle sayıca fazla hedeflere ÅŸifrelenmiÅŸ veri iletiminde decryption süreci için de söz konusu anahtarın ortak kullanılması gerekliliÄŸi sebebiyle, anahtar aÄŸ üzerinde ne kadar güvenle dağıtılırsa dağıtılsın kullanıcılardan bir tanesi anahtarın gizliliÄŸini tehlikeye attığında ve ya anahtarı kaybettiÄŸinde söz konusu iletiÅŸim altyapısına dahil tüm istemcilerin anahtarları ve haberleÅŸmeler risk altına girdiÄŸi için anahtarın yenilenerek tekrar dağıtılması gereklidir.
Asimetrik bir public key kriptografisi algoritması olan RSA (ve ya alternatif olarak DSA) ile kimlik doğrulama metodolojisi, istemci (client) sistemi üzerinde özel olarak oluşturulmuş kriptografik anahtar çiftine dayalıdır. Public key, herkes tarafından görülebilir ve sadece verilerin şifrelenmesi amacıyla kullanılır. Private key ise sadece eşlenik public key tarafından kodlanmış şifrelerin çözümlenmesi esnasında devreye girer. Kimlik doğrulama işleminin gerçekleşebilmesi için public anahtarın bağlantı gerçekleştirilmek istenen SSH sunucusuna kopyalanması ve ssh sunucu konfigürasyonunda yeri belirtilen ve yetkilendirilmiş anahtarların listesini içeren dosyasının (varsayılan $HOME/.ssh/authorized_keys) sonuna eklenmesi gerekir. Bu şekilde tek bir anahtar çifti üreterek, public anahtarı istediğimiz sayıda sunucuya dağıtabilir, tek bir key ile birden fazla sunucuda kimlik doğrulaması gerçekleştirebiliriz. Bu anlamda kimlik doğrulama sürecinde asıl olarak korunması gereken private anahtardır.
Komplike matematiksel hesaplamalara dayalı olması sebebiyle asimetrik algoritmaların hesaplanma hızları simetrik olanlara oranla çok daha düşüktür, kaynak kullanımı ise daha fazladır. Bu sebeple uygulamada, anahtarın korunması hassasiyetinin gerekliliğine rağmen veri değiş-tokuşu miktarı fazla olmayan ve bu nedenle yüksek hız gerektirmeyen kimlik doğrulaması sürecinde asimetrik, akabinde gerçekleşecek veri akışının şifrelenmesi sürecinde ise simetrik yöntemlerin tercih edilerek kullanılmasına dayalı bir birliktelik (Ör: RSA/IDEA) mantıklı olacaktır. İki sistemin de avantajlarından yararlanmak adına public key kriptosisteminin güvenilirliğini ve simetrik kriptosistemin verimliliğini birleştirerek meydana getirilen modern hibrid kriptosistemler (SSL, PGP, GPG), yüklü verilerin şifrelemesini üstlenen simetrik kriptosistem anahtarlarının asimetrik algoritmalar vasıtasıyla şifrelenerek dağıtımı esasına dayanmaktadır.
Uygulamamızda bir SSH sunucuna bağlanırken oturumun başında kimlik doğrulama gerçekleştireceğimiz için buraya kadar aktardığım ön bilgiler ışığında public key kriptografisi çerçevesinde hareket edeceğiz ve RSA algoritmasını kullanacağız.
Genel olarak denetimin yapılandırılma şeklini aşağıdaki diagram ile ifade edebiliriz.

İlk önce public-private anahtar çifti oluşturmalıyız. Bunun için aynı zamanda SSH sunucusuna bağlantı gerçekleştirirken yararlanacağımız SecureCRT terminal emulation yazılımını kullanacağız. Dilerseniz PuTTY gibi ücretsiz bir yazılımı da tercih edebilirsiniz.
Aşağıdaki gösterildiği şekilde anahtar oluşturma sihirbazını çalıştırarak public anahtar tipini RSA olarak seçiyoruz.



Private anahtarın sadece istemci tarafında bulundurulacak olması dolayısıyla her ne kadar bu anahtara iliÅŸkin ÅŸifre belirleme iÅŸlemi opsiyonel olsada, özellikle private anahtarın kendisine izinsiz fiziksel eriÅŸim ve dolayısıyla da bu anahtarın eriÅŸim yetkisi bulunan sistemlere uzaktan eriÅŸim ihtimaline karşı güvenilirliÄŸini saÄŸlamak anlamında mutlaka bir ÅŸifre verilmesi ve bu ÅŸifre olmaksızın kullanılmasının önlenmesi son derece önemlidir. Bunun ötesinde özellikle ciddi uygulamalarda, verilecek olan ÅŸifrenin güvenilir ÅŸifre belirlemek için bilinen genel kriterler doÄŸrultusunda; kullanıcı ismi, isim – soyad, doÄŸum günü, adres /coÄŸrafi lokasyon gibi kiÅŸisel bilgiler, sözlük kelimeleri, tekrarlama ve ardaşık karakterler içermeyen, rakam + sembol + büyük ve küçük harf kombinasyonu ile ve mümkün olduÄŸunca yüksek entropy deÄŸerine sahip olacak uzunlukta (~ min. 12 karakter) seçilmesi önerilir.

Anahtar uzunluÄŸumuzu 2048 bit olarak belirliyoruz.

Anahtarın oluÅŸturulabilmesi için gereken rastlantısal giriÅŸi saÄŸlayabilmek üzere ilk bar dolana dek mouse’umuzu pencere içerisinde rastgele hareket ettiriyor ve daha sonra anahtarın oluÅŸturulması iÅŸleminin tamamlanmasını bekliyoruz.

SSH baÄŸlantısı gerçekleÅŸtirmek istediÄŸimiz sunucuda OpenSSH uygulaması çalışmakta ise anahtar formatını “OpenSSH Key format” olarak seçiyoruz ve anahtar çiftine verilecek isim ile birlikte kaydedileceÄŸi klasörü belirtiyoruz. EÄŸer format seçeneÄŸinin bulunmadığı SecureCRT’nin eski bir versiyonunu (Ör: version 5.2) kullanmaktaysanız ya da bu uygulamayı gerçekleÅŸtirdiÄŸiniz emulation yazılımı, oluÅŸturulan anahtarları OpenSSH formatına çevirme özelliÄŸi içermiyorsa standart formatta anahtar oluÅŸturarak dönüştürme iÅŸlemini SSH sunucusu üzerinde kendimiz manüel olarak gerçekleÅŸtirebiliriz. Bu ayrıntıya bir sonraki adımda, sunucu tarafındaki yapılandırmadan bahsederken deÄŸineceÄŸim.

Sihirbaz yönergelerini tamamladığımızda anahtar çiftimiz belirtmiÅŸ olduÄŸumuz lokasyona kaydedilmiÅŸ olacaktır. Åžimdi sunucu tarafında gerçekleÅŸtirilmesi gereken yapılandırmaya geçebiliriz. Bunun için ilk önce public anahtarımız olan Identity.pub’ı güvenilir herhangi bir yöntemle sunucumuzdaki home klasörümüze transfer etmeliyiz. Alternatif olarak lokalde notepad ile açtığımız anahtar dosyası içeriÄŸini sunucuda aynı isimle yaratacağımız dosya içerisine aÅŸağıda gösterildiÄŸi ÅŸekilde manüel yapıştırabiliriz;
STANDART ANAHTAR FORMATINDA SADECE VURGULANAN ANAHTAR VERİSİ KISMINI:
---- BEGIN SSH2 PUBLIC KEY ---- Subject: Sezgin Bayrak Comment: "sbayrak@SBMobile" ModBitSize: 2048 AEQAB3NzsC1yc2EcA8ADAQABAA5BAQDJrOQ7BkfG9NuWqU4nAK6W5/UsDu6bLy8Y g9IxfbE/lc7QjA9p9T8aGAG03JSLJWSr4rCflm8VUsqSkh24XxyWx5829OD3OVOO 1tbDQLaF84LefC5k6eLtOsBniLlh5DRoLx4YUZtzaeGHd5EWgINSDK22VCIonLTZ r4h6dDmp6Gn3aHZkAP5mQwhi/lXV3Ys5BaefyVkulpXCbaprs/jOMw5TyWUrsm4S 4Gjluoxc/OIAD5Sc6UMTVgj438JxwVbDfgNbERAzvpe+sccTREqZ/Q9Z8hFqc1FB u+G+OkstH0/ZVGxLxOfeAA6FpCvsYjCFe39cDFEoa4gJu/SLXDHJ ---- END SSH2 PUBLIC KEY ----
OPENSSH ANAHTAR FORMATINDA TAMAMINI:
ssh-rsa AEQAB3NzsC1yc2EcA8ADAQABAAABAQDGN9ZZl+LKRd7JYWmKsdh9cdnYYrljsFAw7LrM9y3puCsr3iOQBNQc74Ss316gXU9e/nQ2jl/6CI4t4f9UFXiR54scdJB5Ds4dDjsfCPOC/o9hBQ1wf /U9GUmvLS1giV/Xd2KAYPle6KokcGGyadPkrZksjI8I88LB1gqD6IF560Qvr39risYdOZyPbGxVS9HFyDMjUKSJ9ZA3Kn10yn0yjno97kKPuZQFjjKUfkQrmTUXFPQitKW5VELICQ7Fge41t5u2vbnlB5 owChadRY4zBCO9/t05D1V4uIp2F6ItJimCN8mzA7H/mAwXkXKGRZ5eqLDXSUHO/VdiQ7vBFRBN sbayrak@SBMobile
kopyalayarak aşağıdaki komutla yapıştırma işlemini tamamlayın.
# cat > /home/user/Identity.pub <anahtar verisini buraya yapıştırın> ^D (CTRL-D)
Ardından mevcut deÄŸil ise /home/user dizinimizde “.ssh” klasörü yaratarak public anahtarımızı, oluÅŸturacağımız /home/user/.ssh/authorized_keys dosyasının sonuna eklemeliyiz. DiÄŸer kullanıcıların anahtar datasına eriÅŸimini engellemek için ise gerekli ownership ve permission ayarlarını unutmamalıyız. Biz örnek user’ımızın wheel grubuna dahil olduÄŸunu varsayarak bu grubu kullandık. Siz uygulamada grubu kullanıcınıza uygun ÅŸekilde deÄŸiÅŸtirin;
STANDART ANAHTAR FORMATINDA:
RFC 4716 Secure Shell (SSH) Public Key File formatındaki anahtarımızı, ssh-keygen komutunu kullanarak authorized_keys dosyasına OpenSSH formatına dönüştürerek ekleyeceğiz;
# cd /home/user/
# mkdir .ssh # chown user:wheel .ssh # chmod 700 .ssh # ssh-keygen -i -f Identity.pub >> .ssh/authorized_keys # chown user:wheel .ssh/authorized_keys # chmod 600 .ssh/authorized_keys # rm Identity.pub
Notepad içerisinden manüel kopyalama ve yapıştırma metodunu tercih ettiyseniz salt anahtar verisi yerine yanlışlıkla fazladan karakter copy-paste ettiyseniz ya da anahtarı ftp ile sunucuya transfer ettikten sonra anahtar verisi haricinde kalan kısımları silmediyseniz yukarıda 4. satırda vurgulanan ssh-keygen komutu çalıştırdığınızda “input line too long.” hatasını alırsınız ki bu durumda sadece anahtar verisini kopyaladığınızdan emin olun.
OPENSSH ANAHTAR FORMATINDA:
Anahtarımız zaten OpenSSH formatında olduğu için authorized_keys dosyasına direk ekleyeceğiz.
# cd /home/user/
# mkdir .ssh # chown user:wheel .ssh # chmod 700 .ssh # cat Identity.pub >> .ssh/authorized_keys # chown user:wheel .ssh/authorized_keys # chmod 600 .ssh/authorized_keys # rm Identity.pub
Şimdi OpenSSH sunucusunun konfigürasyon dosyasında birkaç değişiklik gerçekleştirerek sunucumuzun RSA public key kimlik doğrulamasına izin vermesini sağlayacağız. Daha sonra public key denetiminin çalıştığından emin olduktan sonra aynı dosya içerisinde şifre ile denetimi tamamen iptal edeceğiz. FreeBSD üzerinde söz konusu konfigürasyon dosyası /etc/ssh/sshd_config olup diğer *NIX türevlerinde /usr/local/etc/sshd_config vb. farklı dizinlerde bulunabilir. Dosya içerisinde ilgili parametreleri aşağıdaki şekilde değiştirin ve kaydedin;
RSAAuthentication yes AuthorizedKeysFile     .ssh/authorized_keys
Değişikliklerin devreye girmesi için sshd prosesini konumlandırın ve restart edin.
# ps aux | grep ssh root   73467 0.0 0.1 25108 3864 ?? Is  11:30PM  0:00.00 /usr/sbin/sshd
# kill -HUP 73467
Sunucumuza SSH baÄŸlantısı gerçekleÅŸtirmek ve bu baÄŸlantıya iliÅŸkin kimlik doÄŸrulamasının yeni oluÅŸturduÄŸumuz public anahtar ile gerçekleÅŸtirilmesini saÄŸlamak üzere SecureCRT’de yeni bir baÄŸlantı oluÅŸturarak Session Options içerisinde Authentication metodunu PublicKey olarak belirleyin ve özellikleri içerisinde yeni yaratmış olduÄŸunuz Identity.pub anahtar lokasyonunu gösterin.

Bu ayarlar ile bağlantı gerçekleştirdiğinizde, daha önce anahtar oluştururken private key için belirlediğiniz şifreyi girmeniz istenecektir. Kimlik doğrulama başarılı olduğunda sunucu tarafında aşağıdaki logu göreceksiniz. Artık sunucunuzda RSA public key ile kimlik doğrulama gerçekleştirebilirsiniz.
# tail -f /var/log/auth.log Jan 29 22:43:08 your_ssh_server sshd[59286]: Accepted publickey for user from y.y.y.y port 64723 ssh2
Public key denetiminin çalıştığından emin olduğumuza göre sshd_config içerisinde yer alan ilgili parametreleri aşağıdaki duruma getirerek şifre ile denetimi tamamen iptal edebiliriz. Eğer bu işlemi public key testini başarıyla tamamlamadan gerçekleştirir ve aktif oturumlarınızı sonlandırırsanız sunucunuza erişemeyebilirsiniz!
PasswordAuthentication no ChallengeResponseAuthentication no
# ps aux | grep sshd root    976 0.0 0.1 25108 2916 ?? Is  17Feb10  0:00.37 /usr/sbin/sshd
# kill -HUP 976
Buraya kadar anlattıklarımız, public anahtarın bir Windows istemci üzerinde nasıl oluÅŸturulacağı ve kullanılacağı ile ilgiliydi. Åžimdi “istemci” olarak *NIX bir iÅŸletim sistemi kullanılacaksa aynı uygulamanın nasıl gerçekleÅŸtirileceÄŸine deyinelim. Bunun için öncelikle istemci üzerinde SSH uygulaması olarak OpenSSH’in kurulu olup olmadığını kontrol edelim;
client# ssh -V OpenSSH_5.2p1 FreeBSD-20090522, OpenSSL 0.9.8k 25 Mar 2009
/home/user dizinimizde “.ssh” klasörü mevcut deÄŸil ise yaratalım;
# mkdir .ssh # chown user:wheel .ssh # chmod 700 .ssh
client# cd /home/user/.ssh
2048 bit RSA public – private anahtar çiftimizi bu klasör içerisinde oluÅŸturalım (elbette daha önce deÄŸindiÄŸimiz gibi burada da private anahtar için ÅŸifre belirtmemiz istendiÄŸinde boÅŸ bırakmamaya özen göstermemiz güvenlik açısından önemli);
client# ssh-keygen -b 2048 -f id_rsa -t rsa Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): passphrase Enter same passphrase again: passphrase Your identification has been saved in .ssh/id_rsa. Your public key has been saved in .ssh/id_rsa.pub. The key fingerprint is: 5a:13:69:ed:14:ce:c2:e9:a2:34:75:41:c4:b3:4d:fd user@host.yourdomain.com
OluÅŸturmuÅŸ olduÄŸumuz anahtar çiftinden public olanını baÄŸlantı kurmak istediÄŸimiz sunucumuza (Ör: your.remote_ssh_server.com) transfer edelim. Herhangi bir host ile ilk defa baÄŸlantı kurulduÄŸunda her zaman söz konusu remote host’un tanınmadığına iliÅŸkin bir uyarı alırsınız. Bu uyarı ile birlikte sorulan soruya baÄŸlantıya devam etmek istediÄŸinizi onaylayacak ÅŸekilde “yes” yanıtını verdiÄŸinizde host’un ismi ve DSA verisi ~/.ssh/known_hosts dosyası içerisine kaydedilecektir. Daha sonra bu host ile baÄŸlantı kurduÄŸunuzda aynı uyarı ile karşılaÅŸmayacaksınız.
client# scp id_rsa.pub user@your.remote_ssh_server.com: The authenticity of host 'your.remote_ssh_server.com (212.x.x.x)' can't be established. DSA key fingerprint is 58:14:29:ac:6d:94:8d:48:89:3a:cf:95:36:1b:a3:72. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'your.remote_ssh_server.com' (DSA) to the list of known hosts. Password: passphrase (ssh sunucusundaki kullanıcının PAM şifresi) id_rsa.pub                                           100% 406    0.4KB/s  00:00
“scp” ile id_rsa.pub public anahtarımızı SSH sunucumuza aktarmış ve SSH sunucumuzun host DSA anahtarını da istemcimiz üzerinde ~/.ssh/known_hosts içerisine kalıcı ÅŸekilde kaydettirmiÅŸ olduk. “scp” komutunu kullanmak yerine anahtarımızı daha önce deÄŸindiÄŸimiz ÅŸekilde notepad içerisinden copy/paste yöntemi ile de SSH sunucumuza aktarabilirdik.
“scp” komutunu çalıştırdığınızda “Error reading response length from authentication socket.” hatası alırsanız, oluÅŸturmuÅŸ olduÄŸunuz id_rsa ve id_rsa.pub anahtarlarını silin, # cat /dev/null > /<user>/.ssh/known_hosts komutu ile aktif kullanıcınıza iliÅŸkin known_hosts dosyasının içeriÄŸini boÅŸaltın ve anahtarınızı tekrar yaratarak scp ile SSH sunucunuza bir kez daha transfer edin.
id_rsa.pub public anahtarınız SSH sunucunuza başarıyla aktarıldıysa daha önce yaptığımız gibi bu anahtarı da sunucuda .ssh/authorized_keys dosyasının sonuna aşağıdaki komutla eklemeliyiz;
server# cat id_rsa.pub >> .ssh/authorized_keys
Şimdi istemcimiz üzerinde aşağıdaki komut satırını kullanarak sunucumuza RSA kimlik doğrulaması ile başlatılacak ssh bağlantısı kurabiliriz;
client# ssh -o PreferredAuthentications=publickey -i /home/user/.ssh/id_rsa -l user your.remote_ssh_server.com Enter passphrase for key '/home/user/.ssh/id_rsa': ********
Sorulduğunda private anahtarınız için belirlemiş olduğunuz şifreyi girin. RSA public key kimlik denetiminin gerçekleşmiş ve bağlantının başarılı ile kurulmuş olması gerekir.
BÖLÜM 2′de, agent-forwarding ve port forwarding gibi detayları ele alırken aynı zamanda Public Key kimlik doÄŸrulaması ile gerçekleÅŸtirmiÅŸ olduÄŸumuz SSH oturumları üzerinden SSH Tunneling ile yapabileceklerimizi inceliyor olacağız.







RSS feed for comments on this post.




