Çoğumuz bulunduğumuz bilgisayardan; okuldaki, evdeki, komşudaki, kısaca uzaktaki bilgisayarlara ulaşmak için SSH(Secure Shell – Güvenli Kabuk) kullanıyoruz. Ne kadar yaygın ve pratik olarak kullansak da, sanırım SSH kullanıcılarının en büyük keşkesi, “her seferinde parolamızı girmek zorunda kalmasak :(“ olsa gerek. Ama iyi haber, birkaç ufak değişiklikle, güvenlikten ödün vermeden, her seferinde parolamızı girmekten kurtulabiliriz. Bu yazımda parola kullanımını minimuma indiren değişiklikleri anlatmaya çalışacağım.

SSH'ın yaptıklarına kısaca değinirsek, bir bilgisayara bağlanmak için “ssh kullanıcı@uzakdiyarlar” komutunu verdiğimizde, bizden bir parola ister. Parolamızı girdikten sonra, kendine özgü bir yöntemle parolamızı şifreleyerek bağlanmak istediğimiz bilgisayara gönderir. Bu şifrelemenin amacı, bilgilerimizin gönderildiği yola istenmeyen herhangi bir erişim olması halinde şifremizin hala güvenli kalmasının sağlanmasıdır. Parola bazlı bu protokolün yanı sıra, SSH'ın önemli özelliklerinden biri de kullanıcıları RSA ve DSA izin protokolleri aracılığıyla izinlendirmesidir. Bu RSA/DSA izinlerini kısaca bazı numerik giriş kartları olarak düşünebiliriz. Bir kere alınan bu giriş kartları sayesinde, bir parola teminine gerek kalmadan uzaktaki sistemlere erişim sağlayabiliriz.

Gelelim RSA/DSA çalışma prensibine. Bu numerik kartları alabilmek için tabi ki bazı başlangıç konfigürasyonları yapmamız gerekiyor. RSA izinlendirmesini kurmak için, ilk önce iki tane anahtar oluşturacağız, özel anahtar (private key) ve genel anahtar (public key). Bu iki anahtar, giriş kartımızın oluşması için yardımcı oluyor ve aslında iki bilgisayarın da bizi tanımasını sağlıyorlar. Genel anahtar bir mesajı şifrelemek için kullanırken, bu şifrelenen mesajı sadece özel anahtarın sahibi çözebiliyor. (Terminolojide ikisini de anahtar olarak görüyoruz; ama bir yandan da anahtar-kilit ilişkisine benzetebiliriz; bağlanacağımız bilgisayara kilit takıyoruz ve anahtarı sadece bizde :) İşte bizim parola yazmaktan kurtulmak için yaptığımız başlangıç ayarları, sadece bu iki anahtarı belirli yerlere oturtmak ve bu sayede iki bilgisayar arasındaki parola alış verişini kaldırmak. Tahmin edebileceğiniz gibi, genel anahtarın başkalarının eline geçmesinde aslında pek bir sakınca yok, nitekim sadece şifrelemeye yarıyor. O yüzden genel anahtarımızı uzaktaki bilgisayara koyarken, özel anahtar bizde kalıyor.

Gerekenleri yaptıktan sonra, kısaca şunlar oluyor. Yine ssh komutuyla bağlanmak istediğimizi söylüyoruz. Fakat bu sefer parola izni protokolünü kullanmak yerine, RSA protokolünü kullanacağını bildiriyor bilgisayarımız. Devreye özel ve genel anahtarlarımız giriyor ve eğer genel anahtarın (kilidin) eşi, bizim özel anahtarımızsa (anahtar), kapı açılıyor :) Böylece uzaktaki bilgisayara girme iznimiz verilmiş oluyor.

Sistemin nasıl çalıştığını bildikten sonra, yapacaklarımızın daha anlamlı geleceğini düşünüyorum. Yani artık adım adım RSA protokolünü kullanmaya hazırız :) Dediğim gibi, ilk önce anahtarlarımızı oluşturmamız gerekiyor. Bunun için konsolda şunları yapıyoruz:

ev ilke # ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
    //default olarak gösterilen yerde kalması en sağlıklısı, enter diyip geçiyoruz
Enter passphrase (empty for no passphrase):
    //Bu passphrase tahmin edilmesi zor, en az 7 harfli bir kelime olmalı; 
    çünkü bu özel anahtarımızı korumak için gereken başka bir çeşit parola.
Enter same passphrase again:
    //Tekrar giriyoruz.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
13:de:7y:9s:m5:şş:43:e3:il:ke:fe:44:6d:7x:a1:m6 root@ev

undefinedBöylece “id_rsa” adlı özel anahtarımız, ve “id_rsa.pub” adlı genel anahtarımız oluşturulup, belirtilen klasöre kaydedilmiş oluyor. Şimdi bu “passphrase” denen başka bir parola nereden çıktı diyeceksiniz; ama bu olmazsa özel anahtarınızın güvenliği, dolayısıyla bağlantınızın güvenliği tehlikeye düşer. (Anahtarımızı genelde çantamızda taşırız değil mi?) Kullanıcıların yaptığı yaygın hatalardan biri de, demin yaptığımız parola oluşturma kısmında parola oluşturmadan, enter deyip geçmek. Bu tamamen güvensiz bir yoldur; çünkü bu hata yapıldığında özel anahtarımız şifrelenmez! Evet bir sonraki adımlarda parola yazılmasına gerek kalmaz; fakat bunun başka çözümleri de var, hatta bu bir çözüm bile değil. O yüzden anahtarımızı çantamıza koyalım, kapının önüne değil :)

Başta da belirttiğim gibi, anahtarlarımızı oluşturduktan sonra, yapmamız gereken bunları gerekli yerlere koymak. Scp komutu ile genel anahtarımızı bağlanmak istediğimiz bilgisayara yolluyoruz. (Daha açıklayıcı bir örnek olması için, bağlanacağımız yer olarak okulumuzu seçtim, burada “ilke@external.ceng.metu.edu.tr” bölümünü “kullanıcıadınız@bağlanacağınızbilgisayar” olarak düşünebilirsiniz.)

ev ilke # scp /root/.ssh/id_rsa.pub ilke@external.ceng.metu.edu.tr:
Password:

Henüz RSA izni alma işlemini bitirmediğimiz için, bizden parolamızı isteyecek. Parolamızı girdikten sonra genel anahtarımızı bağlanmak istediğimiz bilgisayara aktarmış olduk; ancak istediğimiz yerde değil. Bağlanacağımız bilgisayarın genel anahtarımızı kolaylıkla bulması için belirlenmiş bir dosyada bulunması gerekiyor. Bu dosyanın konumu .ssh/authorized_keys (izinli anahtarlar). Buraya genel anahtarımızı eklemek için, son kez eski yöntemle uzaktaki bilgisayara bağlanıp parolamızı giriyoruz, ve izinli anahtarların bulunduğu dosyanın sonuna kendi genel anahtarımızı yapıştırıyoruz.

ev ilke # ssh ilke@external.ceng.metu.edu.tr
Password:
Linux divan 2.6.18-3-686 #1 SMP Mon Dec 4 16:41:14 UTC 2006 i686
Last login: Sat Jan 26 16:28:36 2008 from 88.254.225.191
ilke@divan:~$ cat id_rsa.pub >> ~/.ssh/authorized_keys
ilke@divan:~$ exit
logout
Connection to external.ceng.metu.edu.tr closed.

Eveeet, artık uzaktaki bu bilgisayara bağlanmak istediğimizde parolamızı sormak yerine, özel anahtarımızı koruyan “passphrase”imizi soracak. Bundan sonra eski parolamızla en ufak bir işimiz kalmadı; ama hala kurtulamadık bir bilgi girmekten değil mi :) Az kaldı, bu aşamada devreye ssh-agent giriyor. Ssh-agent sadece özel anahtarlarımızın deşifre edilmiş halini güvenli bir şekilde saklamak için üretilmiş bir program. Her yeni bağlantı için bizi rahatsız edip yeniden parola girmemizi istemesi yerine, özel anahtarlarımızı ssh-agent'a emanet edebiliyoruz. Bir kereliğine verdikten sonra, ssh artık parolamızı her istediğinde bizden değil de, ssh-agent'dan istiyor. Bunun için:

ev ilke # eval `ssh-agent`
Agent pid 11481
ev ilke # ssh-add /root/.ssh/id_rsa
Enter passphrase for /root/.ssh/id_rsa:
    //genel anahtarımızı şifreleyen parolayı giriyoruz.
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)

adımlarını uyguluyoruz. Böylece her bağlanma talebinde passphrase yazma derdinden kurtuluyoruz; ancak hesabımıza her girişte yazmak zorundayız. Çünkü her girişte ayrı bir ssh-agent işlemi başlatılıyor. Her girişte değil de, her sistem açılışı için bir kere yazıyor olmamız ne kadar güzel olurdu değil mi :) Yani zaten parolamızı aklında tutan bir bekçi varsa, neden her seferinde başka bekçi çağıralım :) Onun da yolu var! Anahtar zinciri ile (key chain) bu mümkün. Anahtar zincirinin yapacağı ilk şey halihazırda çalışan ssh-agent'lara bakmak olacak. Eğer çalışan bir ssh-agent varsa onun üzerinden işlemlerimizi yürütecek, yoksa yenisini açacak. Ama bunun için öncelikle bu programcığı indiriyoruz ve ~/.bash_profile dosyamıza üç satır ekliyoruz. Programı indirmek için, Google'a “keychain tar” yazmamız yeterli. Örnek olarak:

ev ilke # wget [http://fresh.t-systems-sfr.com/unix/privat/keychain-2.6.8.tar.gz](http://fresh.t-systems-sfr.com/unix/privat/keychain-2.6.8.tar.gz)
--16:46:32-- [http://fresh.t-systems-sfr.com/unix/privat/keychain-2.6.8.tar.gz](http://fresh.t-systems-sfr.com/unix/privat/keychain-2.6.8.tar.gz)
=> `keychain-2.6.8.tar.gz'
fresh.t-systems-sfr.com çözümleniyor... 129.247.247.184
fresh.t-systems-sfr.com[129.247.247.184]:80 bağlanılıyor... bağlantı kuruldu.
HTTP isteği gönderildi, yanıt bekleniyor... 200 OK
Uzunluk: 36.292 (35K) [application/octet-stream] 
100%[====================================>] 36.292 50.61K/s

16:46:33 (50.54 KB/s) - `keychain-2.6.8.tar.gz' kaydedildi [36292/36292]
ev ilke # tar xzvf keychain-2.6.8.tar.gz
ev ilke # cd keychain-2.6.8
ev ilke/keychain-2.6.8 # install -m0755 keychain /usr/bin

Bu üç adımı yaptıktan sonra, anahtar zincirimiz /usr/bin dizininin içerisine kurulmuş oluyor. Sıra geldi dosyayı değiştirmeye, vi ile ~/.bash_profile dosyasına girdikten sonra eklememiz gereken üç satır şunlar:

/usr/bin/keychain ~/.ssh/id_rsa
source ~/.ssh-agent > /dev/null
source ~/.bashrc

Bu satırlar aracılığıyla, anahtar zincirimize özel anahtarımızı kullanarak gerekenleri yapmasını söylemiş oluyoruz. Örnekte anahtar zincirimize RSA anahtarımızı ekledik; ancak DSA anahtarını da aynı satırın sonuna ekleyerek birden çok anahtar kullandırabiliriz.Bunları da ekledikten sonra, artık hiçbir sorunumuz kalmadı :) İşte sonuç:

ev ilke # ssh ilke@external.ceng.metu.edu.tr
Linux divan 2.6.18-3-686 #1 SMP Mon Dec 4 16:41:14 UTC 2006 i686
Last login: Sat Jan 26 16:50:29 2008 from 88.254.225.191
ilke@divan:~$

Biz adım adım tüm gerekenleri yaptığımız için şu anda ssh komutuyla sorunsuz olarak bağlanıyor. Fakat bulunduğunuz kabuğu kapatıp yeni bir konsol açtığınızda, tekrar parola istediğini göreceksiniz. Korkmayın, henüz anahtar zinciri çalışmaya başlamadığı için böyle bir istemde bulunuyor. Hesabınızdan çıkıp tekrar girdiğinizde size bir kez parolanızı soracak, girdikten sonra ssh-agent'a parolamız emanet edilmiş olacak ve daha sonra anahtar zinciri çalışacak. Artık her bağlanmamızda değil, hatta yerel hesabımıza her girişimizde de değil, yerel sistemi her yeniden başlattığımızda bir kez parola gireceğiz.

RSA ve DSA anahtar çiftleri dedim; ancak DSA'dan söz etmedim. RSA SSH protokol 1 için kullanılırken, DSA hem SSH protokol 1 hem de SSH protokol 2 için kullanılabiliyor. Farkları, yararlanılan şifreleme algoritmalarının farklı olması. Onun dışında genel kullanımda belirgin bir farklılık yok. DSA protokolüne anahtar çiftimizin oluşturulması ise RSA ile neredeyse aynı. Sadece başta ssh-keygen ile anahtar çiftlerimizi oluştururken komuta bir argüman katıyoruz ve

ev ilke # ssh-keygen -t

olarak kullandığımızda, anahtar çiftimiz “id_dsa” ve “id_dsa.pub” olarak oluşuyor. Sürecin geri kalanı tamamen aynı.

İşte SSH'ın en çok sorulan sorunlarından birini daha çözdük. Ufak birkaç değişiklikle, parola girme sıklığımız, sistemi açma sayımıza kadar düşmüş ve güvenliğinizden de vazgeçmemiş çok daha rahat birer SSH kullanıcısıyız. Böylece bir nasıl yapılır köşesinin daha sonuna geldik. Yeni çözümlerle karşınızda olacağız :)

Kaynaklar: