tr | en
12
Oca
2014
Daha Güvenli SSH Bağlantıları
Yazar: Federico Kereki    |   Kategori: İpucu
SSH bağlantılarınızı sağlamlaştırarak olası saldırıları engelleyin.

Eğer bir sunucuya uzaktan bağlanacaksanız büyük olasılıkla SSH kullanırsınız ve bunun mantıklı sebepleri vardır. Secure shell protokolü, İnternet gibi güvenliksiz ağlarda bile gizlilik ve mahremiyeti korumak için modern kriptografi yöntemlerini kullanır. Öte yandan yaygınlığıyla saldırganların ilgisini çeken bir hedef durumundadır, bu yüzden daha dirençli ve kırılması zor bir bağlantı için standart ayarlarını biraz güçlendirmeyi düşünmelisiniz. Bu makalede ekstra güvenlik getirecek bazı önlemleri ele alacağım: Basit konfigürasyon değişiklikleriyle başlayacağım, ardından PAM aracılığıyla erişim kısıtlamalarının nasıl yapılacağından bahsedeceğim, son olarak da açık sertifikalar yardımıyla kısıtlı bir şekilde nasıl parolasız erişime izin verilebileceği ile bitireceğim.

SSH Nerede?
Standartta tanımlandığı gibi, SSH ön tanımlı olarak 22 portunu kullanır. Bu da bize standart SSH konfigürasyonu kullanıldığı takdirde sunucunuzun saldırı için oldukça güzel bir hedef olduğunu söyler. Dikkate alınacak ilk yöntem oldukça basittir; SSH'ın kullandığı portu değiştirip daha az kullanılan, standart olmayan bir port belirleyin, mesela 22022 (1024'ten büyük sayılardaki portlar genellikle boş ve güvenlidir, yine de olası çakışmalardan kaçınmak için bu makalenin sonunda yer alan Kaynaklar bölümüne göz atın). Bu değişiklik uzaktan bağlanan kullanıcılarınızı fazla etkilemeyecektir. Sadece bağlantı kurarken ekstra bir parametre kullanmaya ihtiyaç duyacaklar, mesela şöyle:

ssh -p 22022 sunucunuzun_URL_adresi

Evet, bu tür bir değişiklik "bilinmezlik aracılığıyla güvenlik" denilen yaklaşıma -bazı şeyleri bilinmez yaparak kimsenin sizin yöntemlerinizi keşfedemeyeceğini ummak- dayanıyor ki bu yaklaşım genellikle bazı problemleri de barındırır. Yine de, en azından "script kiddie" adı verilen bilgi düzeyi düşük saldırganlara karşı yardımcı olur, çünkü bunların kullandıkları araçlar sisteminizdeki tüm açık portları tarayacak kadar gelişmiş değildir, sadece 22 portu üzerinden sisteme sızmaya çalışırlar.

SSH İçin Kapıyı Tıklama

Olası saldırganların SSH için açık bir kapı bulamamaları sunucunuza saldırmalarını zorlaştıracaktır. Bu makalede anlattığım yöntemler daha önce başka bir makalede ("Implement Port-Knocking Security with knockd", Ocak 2010) anlattığım kapıyı tıklama tekniği ile uyumludur, bu yazıda knockd konfigürasyonundan söz etmeyeceğim. Bütün bu teknikler birlikte kullanılırsa, saldırganlar sunucunuza ulaşmak için epey zor zamanlar geçirecekler (bu makalede anlatacağım diğer tekniklere henüz gelmedik bile), çünkü sunucunuza nereden saldırmaya başlayabileceklerini bile bilemeyecekler.

 

Bu değişikliği gerçekleştirmek için /etc/ssh/sshd_config dosyasını düzenlemeniz gerekir. root kullanıcısı olarak bir metin editörü ile dosyayı açın, "Port 22" yazan satırı bulun ve 22 yerine istediğiniz sayıyı yazın. Eğer satırın başında # işareti varsa bunu silin, çünkü bu işaret o satırın yorum satırı olarak değerlendirilmesine sebep olur. Değişikliği kaydedip ardından SSH'ı şu komutla yeniden başlatın:

/etc/init.d/sshd restart

Bazı dağıtımlarda komut şu şekilde de olabilir:

/etc/rc.d/ init.d/sshd restart

Son olarak, firewall üzerinden 22 portuna erişimi kapatmayı ve onun yerine kullanacağınız portu açmayı unutmayın. Böylelikle kullanıcılar yeni port üzerinden sisteme erişebilirler.

Hazır bunu yapmışken, ekstradan biraz daha güvenlik için SSH konfigürasyon dosyasında başka bazı satırları da değiştirebilir ya da dosyaya yeni satırlar ekleyebilirsiniz(bkz: Liste-1). "Protocol" satırı SSH protokolünün daha güçsüz eski sürümünün kullanımından kaçınmayı sağlar. "LoginGraceTime" kullanıcıya sisteme giriş işlemini tamamlaması için 30 saniye süre verir.

Liste-1: Bu küçük SSH konfigürasyonu değişiklikleri güvenliği bir parça daha artırabilir.
Port           22022
Protocol           2
LoginGraceTime    30
MaxAuthTries       3
PermitRootLogin   no

"MaxAuthTries", kullanıcıların reddedilmeden önce parolayı kaç kez yanlış girebileceklerini belirler. Son olarak, "PermitRootLogin", sisteme uzaktan "root" kullanıcısı ile giriş yapılabilmesini engeller (bir saldırgan bir şekilde sisteminize sızmış olsa bile root olabilmek için hâlâ uğraşması gerekir), böylelikle olası saldırganınız sunucunuzda kullanıcı ayrıcalıklarını elde etmek için zor zamanlar geçirecektir.

Bu değişiklileri yaptıktan sonra SSH servisini yeniden başlattığınızdan emin olun (sudo /etc/init.d/sshd restart komutu servisi yeniden başlatır), ve şimdiden, eskisine göre biraz daha güvenli (ama hâlâ çok güvenli değil) bir sisteme sahip olun. Ekstra kısıtlamalar ekleyip güvenliği artırmak için yazıya devam edelim.

SSH'ı Kimler Kullanabilir?

Makinanızda çeşitli sunucular bulunuyor olabilir, fakat uzaktan erişim hakkını sadece bazılarına verilecek şekilde kısıtlamak isteyebilirsiniz. Bunun için sshd_config dosyasını biraz daha makaslayabilir, "AllowUsers", "DenyUsers", AllowGroups" ve "DenyGroups" parametrelerini kullanabilirsiniz. İlki, "AllowUsers", yanına kullanıcı isimleri (ya da sadece * ve ? özel sembolleri ile tanımlanabilecek kalıplar) ya da kullanıcı@host ikilileri sıralanarak kullanıcıların sadece belirlenen kaynaklardan bağlanabilmelerine olanak verir. Benzer şekilde, "AllowGroups" parametresi, listelediğiniz grupların üyelerinin giriş yapabilmelerine olanak tanır. Son olarak "DenyUsers" ve "DenyGroups" da benzer şekilde çalışır, fakat belirli kullanıcı ve grupların engellenmesini sağlar. Not düşmekte fayda var, bu parametrelerin öncelik sırası "DenyUsers - AllowUsers - DenyGroups - AllowGroups" şeklindedir; yani bir kullanıcıyı "DenyUsers" parametresi ile engellerseniz diğer kuralların hiçbiri kullanıcının bağlanmasına izin veremez.

Örneğin, iç ağınızda genel bir kural olarak herkesin her sunucuya erişimi var (Makul bir uygulama gibi görünüyor, çünkü saldırılar genellikle ağın dışından gelir). Diyelim ki, iç ağınızın dışından sadece fkereki ve eguerrero kullanıcılarının sisteme erişebilmesini, başka hiç kimsenin erişememesini istiyorsunuz. Bu kısıtlamayı uygulamak için SSH konfigürasyon dosyasına aşağıdaki satırı ekleyip servisi yeniden başlatmanız  yeterli:

AllowUsers *:192.168.0.1.*, fkereki, eguerrero

Eğer jandrews kullanıcısının sisteme uzaktan erişimini engellemek isterseniz, ekstradan şu satırı kullanmanız gerekir:

DenyUsers jandrews

Daha özel amaçlara yönelik kurallar da eklenebilir (mesela, eguerrero kullanıcısı sadece evden bağlanabilsin), fakat çok fazla kural tanımlanırsa işler kontrolden çıkmaya başlayabilir. SSH konfigürasyon dosyasını düzenleme ve servisi yeniden başlatma fikri daha az cazip görünür. İşte bu noktada PAM aracılığıyla uygulayabileceğiniz, güvenlik kuralları için ayrık dosyaların kullanıldığı daha iyi bir çözüm var.


PAM Yöntemi

Yazılım mühendisliği noktasından bakacak olursak, her bir programın kendi kimlik doğrulama mantığını geliştirmek, tanımlamak ve uygulamaya dökmek zorunda olması berbat olurdu.

"PAM"in anlamı hakkında google araması yaparsanız birçok farklı tanımla karşılaşırsınız, kızartma yağından tutun da çeşitli kısaltmalara (mesela Power Amplitude Modulation ya da Positive Active Mass kısaltması olarak) kadar. Fakat bizim konumuz dahilinde ilgilenmeniz gereken, "Pluggable Authentication Modules" sözcükleri olmalı. PAM, sunucunuza erişimi zorlaştırmanın ve ekstra güvenlik kuralları sağlamanın yollarından biridir. Sunucunuza hangi kullanıcıların erişebileceğini belirlemek için alternatif bir çözüm olarak PAM'i nasıl kullanacağımıza bakalım.

Yazılım mühendisliği noktasından bakacak olursak, her bir programın kendi kimlik doğrulama mantığını geliştirmek, tanımlamak ve uygulamaya dökmek zorunda olması berbat olurdu. Tüm uygulamaların aynı şekilde, en ufak bir farklılık olmadan aynı kontrolleri yaparak ortak bir güvenlik politikası kullandıklarından nasıl emin olabilirsiniz? PAM size bunu sağlayacak bir yol sunar; diyelim bir program kullanıcılar için kimlik doğrulama gerektiriyorsa, istediğiniz tüm güvenlik kontrollerini yapacak olan PAM fonksiyonlarını çağırarak bu adımı gerçekleştirebilir. İstediğiniz güvenlik kontrollerini PAM konfigürasyon dosyalarında zaten tanımlamış olursunuz. PAM ile, yapmak istediğiniz kimlik doğrulama kuralları değişikliklerini sistemin çalışması sırasında bile yapabilirsiniz. Hatta, PAM'le ilgilenmekteki esas amacınız bu olmasa bile bir örnek verelim, sisteminize yeni bir biometrik güvenlik donanımı (mesela parmak izi okuyucusu, iris tarayıcı ya da yüz tanıma) ekleyecekseniz, uygun bir PAM ile yeni donanımınız tüm uygulamalarınız tarafından kullanılabilir hale gelebilir.


PAM, Her Yerde PAM

PAM'lerin "resmi" bir listesi olmasa da, birçok dağıtım aşağıdakileri içerir:

* pam_access: Erişimi /etc/security/access.conf dosyasına bakarak engeller ya da izin verir
* pam_cracklib: Parolaları sözlükten kontrol etmeye yarar
* pam_debug: Sadece test amaçlı kullanılır
* pam_deny: Erişimi her koşulda engeller
* pam_echo: Bir dosyanın içeriğini gösterir
* pam_env: Çevre değişkenlerini ayarlar ya da iptal eder
* pam_exec: Harici bir komut çalıştırmanızı sağlar
* pam_group: Kullanıcılara grup üyeliği sağlar
* pam_lastlog: Kullanıcının en son giriş yaptığı tarih ve saati gösterir
* pam_ldap: LDAP sunucu aracılığıyla giriş yapmayı sağlar
* pam_limits: /etc/security/limits.conf dosyası aracılığıyla sistem kaynaklarının kullanım limitlerini belirlemenizi sağlar
* pam_listfile: Bazı ekstra seçeneklerle pam_access'in bir alternatifidir
* pam_mail: Kullanıcının bekleyen e-postası olup olmadığını kontrol eder
* pam_make: Verilen bir dizinde make komutunu çalıştırır
* pam_motd: "günün mesajı" dosyasını görüntüler; genellikle /etc/motd dosyası olur bu dosya
* pam_nologin: Tüm girişleri engeller, /etc/nologin dosyası mevcut olmalıdır
* pam_permit: Erişime her zaman izin verir
* pam_pwcheck: Parolaların güçlülüğünü kontrol eder
* pam_pwhistory: Parola tekrarlarından kaçınılması için yeni parolaları eskileriyle karşılaştırır
* pam_rootok: Genellikle /etc/pam.d/su dosyasında barındırılır, root kullanıcısının parola gerektirmeden diğer kullanıcılar gibi davranabilmesi için gerekli testleri yapar
* pam_selinux: SELinux için ön tanımlı güvenlik bağlamını belirler
* pam_sepermit: SELinux durumuna göre giriş yapılmasına izin verir ya da engeller
* pam_shells: Sadece kullanıcının kabuğu /etc/shells dosyasında listelenenler arasında mevcutsa erişime izin verir
* pam_succeed_if: Hesabın özelliklerini kontrol eder, mesela verilen bir gruba üye olup olmadığını
* pam_tally: Erişim denemelerinin sayısını tutar ve çok fazla sayıda başarısız deneme varsa erişimi engelleyebilir
* pam_time: Erişimi /etc/security/time.conf dosyasının içeriğine göre kısıtlayabilir
* pam_umask: Yeni oluşturulacak dosyalar için bir dosya mod şablonu (umask'ı düşünün) belirlemeyi sağlar
* pam_unix (ya da pam_unix2): Klasik UNIX yaklaşımıyla /etc/passwd ve /etc/shadow dosyaları aracılığıyla erişim özelliği sağlar
* pam_userdb: Bir Berkeley veritabanı aracılığıyla kullanıcıların kimlik doğrulamalarının yapılabilmesini sağlar
* pam_warn: Logları sistem loglarına kaydeder
* parm_wheel: Sadece wheel grubundakilere root erişimi verir

Dosyaların yerleri değişebilir, gerçekte hangi modüllerin sizde bulunduğunu kontrol etmek için /usr/lib/security ya da /lib/security (ya da 64-bit Linux sistemlerde lib yerine lib64) dizinlerini kontrol edebilirsiniz. Her bir modül hakkında daha fazla bilgi edinmek için "man modülün.adı" komutunu çalıştırabilirsiniz, ama bunları konsolda çalıştırmaya çalışmayın çünkü o şekilde çalışmazlar.

 

PAM'ler, 4 farklı güvenlik kaygısıyla kullanılabilir: kullanıcı hesaplarının limitleri (kullanıcıların neleri yapmaya izinli olacakları), kimlik doğrulama (kullanıcıların kendilerini sisteme tanıtmaları), parolalar ve oturumlar. PAM kontrol seçenekleri şu şekillerde işaretlenebilir: opsiyonel (başarılı da olabilir başarısız da), gerekli (başarılı olmalıdır), zorunlu (başarılı olmalıdır, eğer olmazsa başka kontrol yapmadan dur) ve yeterli (eğer başarılı olursa başka kontrol yapma); böylelikle güvenlik politikanızı çeşitlendirebilirsiniz. Bu detayların tamamını burada ele almayacağım, onun yerine sisteminize kimin giriş yapabileceğini ya da yapamayacağını nasıl belirleyeceğinizi anlatarak devam edeceğim. Bazı kullanışlı modüllerin listesini görmek için "PAM, Her Yerde PAM" adlı listeye göz atabilirsiniz.

PAM konfigürasyonları /etc/pam.d dizininde tutulur, her bir komutun çalıştırabileceği bir dosya bulunur. root olarak, /etc/pam.d/sshd dosyasını açın, "account" satırlarından sonra şu satırı ekleyin:

account required pam_access.so

Değişiklik sonrası dosyanın içeriği Liste-2'deki gibi görünecektir (Dosyanın sizdeki spesifik versiyonu farklı seçenekleri de barındırıyor olabilir; sadece bu tek satırı ekleyin, hepsi o kadar). Bunun ardından SSH konfigürasyon dosyasını da düzenlemeniz gerekecek (daha önce düzenlemiştiniz) ki o da PAM'i kullansın; dosyaya şu satırı ekleyip SSH servisini yeniden başlatın:

UsePAM    yes

Burada önemli olan, "account" kısmı. Parolanızı standart UNIX yöntemiyle kontrol ettikten sonra (genellikle /etc/passwd ve /etc/shadow dosyalarından kontrol eder), pam_access.so modülünü kullanarak kullanıcının Liste-3'te gösterilen gibi listede olup olmadığını kontrol edecek. Her iki "account" modülü de "required" şeklinde işaretlendiği için kullanıcı devam edebilmek için her iki kontrolden de geçmek zorunda. Ekstra kısıtlamalar için, pam_access'e benzeyen ama daha çok seçenek sunan pam_listfile modülüne ve zaman kısıtlamaları sunan pam_time modülüne göz atabilirsiniz. Bunlar için /etc/pam.d/sshd dosyasına ekstra "account" satırları eklemeniz gerekebilir.

 

Liste-2: pam_access.so modülünü ekleyerek PAM hesap kontrollerinin size hangi kullanıcıların SSH erişimini belirlerken yardımcı olmasını sağlayabilirsiniz.

account  required    pam_unix2.so
account  required    pam_access.so

auth     required    pam_env.so
auth     required    pam_unix2.so
auth     required    pam_nologin.so

password requisite   pam_pwcheck.so nullok cracklib
password required    pam_unix2.so use_authtok nullok

session  required    pam_limits.so
session  required    pam_unix2.so
session  optional    pam_umask.so


Hangi kullanıcıların sunucunuza erişebileceğini belirlemek için /etc/security/access.conf dosyasını düzenlemelisiniz, Liste-3'te örneğini görebilirsiniz. Her satır artı işareti (erişim izni verildiği anlamına gelir) ya da eksi işareti (erişimin engellendiği anlamına gelir) ile başlar, ardından gelen sütunda bir kullanıcı adı (ya da ALL), son sütunda da host bilgisi (ya da ALL) yer alır. Eklediğimiz pam_access.so modülü listede sırayla yukarıdan aşağıya doğru ilerler, kullanıcıya uyan ilk kuralı tespit ettiğinde uygulamaya geçirip engeller ya da erişim izni verir. Bu yüzden kuralların sıraları önemlidir. Liste-3'teki örneği inceleyecek olursak; ilk olarak jandrews kullanıcısının girişi engellenmiştir, ardından iç ağdaki tüm kullanıcıların sunucuya giriş yapabilmesi için izin verilmiştir. Ardından, fkereki ve eguerrero kullanıcılarının herhangi bir makinadan bağlanabilecekleri belirtilmiştir. Son satırda ise, önceki satırlardan hiçbirisiyle ilişkilendirilemeyen kullanıcıların girişleri engellenmiştir; bu satır daima bulunmalıdır.

Liste-3: /etc/security/access.conf dosyası hangi kullanıcıların hangi makinalardan bağlanabileceklerini belirler.

-:jandrews:ALL
+:ALL:192.168.1.
+fkereki:ALL
+eguerrero:ALL
-:ALL:ALL

Bu konfigürasyonu başka programlar ve servisler için de (mesela FTP, neden olmasın?) kullanabileceğinize ve aynı kuralların uygulanabileceğine dikkatinizi çekerim. Bu, PAM'in bir avantajıdır. İkinci bir avantajı ise, sistem çalışmakta iken bile kuralları değiştirebilmenizdir, SSH servisini yeniden başlatmanıza gerek kalmaz. Çalışan servislere bulaşmamak her zaman iyi bir fikirdir! PAM kullanmak, kimlerin SSH ile erişebileceklerini belirleme işini birazcık daha zor hale getirir, çok değil. Şimdi, sunucunuza kimlerin erişebileceğini söylemenin daha da güvenli bir yolunu görmek için sertifikaların nasıl kullanılabileceğine bakalım.

 

Parolasız Bağlantılar

Parolalar makul derece güvenli olabilirler, ama onları bir post-it kağıdına yazıp bilgisayarınızın üzerine yapıştırmazsınız değil mi? Öte yandan, çok karmaşık olmayan bir parola (yani bir brute force saldırısı ya da sözlük saldırısı ile bulunabilecek bir parola) kullanırsanız da sisteminiz büyük risk altında olacak, ki saldırganların istediği de budur. Daha güvenli bir yöntem var: Açık ya da gizli anahtarları kullanarak, uzaktaki sisteminize parolaları kullanmadan da bağlanabilirsiniz. Parola yerine, bir çift anahtarınız olacak: "özel" kısmı bilgisayarınızda, "açık" kısmı ise uzaktaki sunucunuzda bulunacak. Başkalarıyla paylaşmadığınız sürece özel anahtarınız taklit edilemez, bilgisayar gücü ile de tahmin edilerek kırılamaz. Şimdi bu anahtarların nasıl üretileceğinin detaylarına hiç girmeden, onları nasıl kullanacağınızı anlatalım.

 

Liste-4: ssh-keygen komutu ile bir açık/gizli anahtar çifti üretmek oldukça kolaydır. Anahtarlarınızı kullanırken bir parola kullanmak da ekstra güvenlik sağlar.

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/fkereki/.ssh/id_rsa):
Created directory '/home/fkereki/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/fkereki/.ssh/id_rsa.
Your public key has been saved in /home/fkereki/.ssh/id_rsa.pub.
The key fingerprint is:
84:13:e6:07:a3:b1:b4:c6:6f:29:b8:40:58:f5:23:26 fkereki@fedoraxfce
The key's randomart image is:
+--[ RSA 2048]----+
|  ..+ =                  |
|.. o O =                |
|..E 0 * o               |
|.  = o B                |
|. . . + S                |
| . . .                      |
|  .                         |
|                            |
|                            |
+--------------------+


Öncelikle, SSH konfigürasyonunuzun özel anahtar ile giriş yapılmasına izin verdiğinden emin olun. Bunun için konfigürasyon dosyasında aşağıdaki satırlar bulunmalıdır:

RSAAuthentication yes
PubkeyAuthentication yes

Eğer SSH konfigürasyon dosyanızda bu satırlar yoksa bu satırları ekleyin ve SSH servisinizi daha önce anlatıldığı şekilde yeniden başlatın. Bu satırlar olmadan, aşağıda açıklayacağım şeyler çalışmaz. Ardından, ssh-keygen komutunu kullanarak kendinize bir açık/gizli anahtar ikilisi yaratın. Bu komutu herhangi bir parametre girmeden çalıştırdığınızda (bkz: Liste-4), anahtarın nereye kaydedileceğini size soracak (önerilen standart dizini kabul edin), ekstra güvenlik için parola kullanmak isteyip istemediğinizi soracak (aşağıda bundan tekrar bahsedeceğim, ama kullanmanızda fayda olduğunu belirteyim) ve anahtar ikilisi yaratılacak. Anahtarı kaydettiğimiz dosya adına dikkat edin, birazdan ona ihtiyacımız olacak.

Şimdi, uzaktaki sunucuya bu anahtarı kullanarak bağlanabilmek için, oraya kopyalamanız gerekecek. İnternet'te araştırırsanız, birçok sitede bunu yapmak için ilgili dosyaları elle düzenlemenin önerildiğini göreceksiniz, fakat ssh-copy-id komutunu kullanmak bundan çok daha hızlıdır. Sadece açık anahtarınızın bulunduğu dosyanın konumunu ve uzaktaki sunucunuzdaki kullanıcı adınızla sunucunun adresini belirterek şu komutu yazıp çalıştırmanız yeterli:

ssh-copy-id -i açık_anahtarınızın_bulunduğu_dosya uzaktaki_sunucudaki_kullanıcınız@sunucu_adresi

 

Liste-6: Açık anahtarınızı kopyaladıktan sonra, sunucunuza bu anahtar sayesinde parola kullanmadan bağlanabilirsiniz. Eğer açık/özel anahtar ikilisini oluştururken bunları kullanmak için parola girilmesini tercih ettiyseniz bağlanırken o parolayı girmeniz gerekecek.

$ ssh fkereki@192.168.1.107
Enter passphrase for key '/home/fkereki/.ssh/id_rsa':
Last login: Mon Jan 10 18:40:11 2011

6.0 Light Final built on March 31, 2009 on Linux 2.6.27.12
You are working as fkereki
Frequently used programs:
Configuration   : vasm
File manager    : mc (press F2 for useful menu)
Editor:         : mcedit, nano, vi
Multimedia      : alsamixer, play
vector:/~
$logout
Connection to 192.168.1.107 closed.

 

Yeni, parolasız bağlantınızı test etmek için, sadece şu komutu yazıp çalıştırın:

ssh uzaktaki_sunucudaki_kullanıcınız@sunucu_adresi

Eğer anahtar çiftinizi oluştururken bir parola kullandıysanız, komutu çalıştırmanızın ardından o parola sorulacak. Anahtar çiftinizin parolası yoksa doğrudan sunucu ile bağlantınız kurulacak ve uzaktaki sunucunun parolasını girmenize gerek kalmayacak (bkz: Liste-6).

Şimdi, anahtarlarınızı oluştururken kullandığınız parolaya biraz değinelim. Eğer açık/özel anahtar ikilisini bir parola kullanmadan oluşturduysanız, bilgisayarınıza ve özel anahtarınıza erişebilen birisi hemen uzaktaki sunucunuza da erişebilir. Anahtarlarınız için bir parola kullanmak, sunucuya bağlanma adımınıza bir güvenlik katmanı daha ekler. Öte yandan, her seferinde bu parolayı girmek zorunda kalmak can sıkıcı olabilir. En iyisi, ssh-agent komutunu kullanarak bu parolanın hatırlanmasını sağlayın ki, uzaktaki sunucunuza bağlanmaya çalıştığınızda parolayı "hatırlasın" ve otomatik olarak bağlanın. Bunun için ssh-agent komutunun ardından ssh-add komutunu çalıştırmalısınız (birden fazla anahtarınız varsa komutu birkaç kez çalıştırmalısınız). Bunu yaptıktan sonra uzaktaki sunucunuza bağlanmaya çalıştığınızda anahtarlarınızın parolasını tekrar girmenize gerek kalmayacak (bkz: Liste-7). Eğer oturumu sonlandırmak isterseniz ssh-agent -k komutunu çalıştırın, bunun ardından anahtarınızı kullanarak tekrar uzaktaki sunucuya bağlanmak isterseniz parolanızı yeniden yazmanız gerekecek.

 

Liste-7: ssh-agent komutu sizi anahtarlarınızın parolasını defalarca girmekten kurtarır.

$ ssh-agent

SSH_AUTH_SOCK=/tmp/ssh-Rvhhx30943/agent.30943; export SSH_AUTH_SOCK;
SSH_AGENT_PID=30944; export SSH_AGENT_PID;
echo Agent pid 30944;

$ ssh-add
Enter passphrase for /home/fkereki/.ssh/id_rsa:
Identity added: /home/fkereki/.ssh/id_rsa (/home/fkereki/.ssh/id_rsa)

$ ssh fkereki@192.168.1.107
Last Login: Mon Jun 10 18:44:15 2013 from 192.168.1.108
6.0 Light Final built on March 31, 2009 on Linux 2.6.27.12
You are working as fkereki
Frequently used programs:
Configuration   : vasm
File manager    : mc (press F2 for useful menu)
Editor:         : mcedit, nano, vi
Multimedia      : alsamixer, play

 

Ayrıca, ssh-agent komutunu farklı girişleriniz arasında tekrar kullanmanızı sağlayacak olan, yani sisteminizden çıkış yapıp tekrar giriş yapınca da parolanızı hatırlamasını sağlayacak olan keychain komutuna göz atabilirsiniz (bütün dağıtımlarda bu komut ön tanımlı olarak yüklenmiş olmayabilir, bu durumda paket yöneticiniz ile sisteminize yüklemelisiniz). Sadece şu komutu çalıştırmanız (bkz: Resim-1) yeterli:

keychain özel_anahtarınızın_yeri

Böylelikle sunucunuz yeniden başlatılana ya da siz keychain uygulamasını durdurmak için "keychain -k all" komutunu çalıştırana kadar anahtarlarınızın parolası saklanacak ve defalarca parolayı yazmak zorunda kalmayacaksınız. Not düşmekte fayda var, bir kez keychain'i çalıştırdıktan sonra sistemden çıkış yapsanız bile tekrar girdiğinizde anahtarınız hâlâ erişilebilir olacak, bu yüzden bellekte tutulan anahtarları temizlemek için "keychain --clear" komutunu kullanabilirsiniz.

aa

Resim-1: Parolanızı bir kez keychain ile girdiğinizde, sistemden çıkış yapsanız bile tekrar giriş yaptığınızda hatırlanacak.

Eğer anahtarlarınız için bir parola kullandıysanız, özel anahtarınızı bir USB bellek ya da benzeri aygıtta taşıyarak, herhangi bir bilgisayardan uzaktaki sunucunuza erişmek için kullanabilirsiniz. Fakat parola kullanmadıysanız bunu yapmak oldukça tehlikelidir. USB belleğiniz uzaktan bağlanabildiğiniz tüm sunucuların otomatik olarak tehlikeye girmesine sebep olabilir. Yani, anahtarlarınız için kullanacağınız bir parola, ekstra bir güvenlik katmanıdır. Özel anahtarınızı ele geçirseler bile parolanızı bulamadıkları sürece özel anahtarınızı kullanamazlar.

Son olarak, sunucunuza bağlanacak tüm kullanıcıların parolasız erişim için ayarlarının yapıldığından eminseniz, atılacak son adımı atabilir ve SSH konfigürasyon dosyasını düzenleyerek sunucunuza parola ile erişimi kapatabilirsiniz. Bunun için SSH konfigürasyon dosyanızdaki ilgili satırları şu şekilde değiştirmelisiniz:

PasswordAuthentication no
UsePAM no

Bu son işlemi yapmadan önce her şeyin doğru çalıştığından emin olun; aksi takdirde problemlerle karşılaşırsınız.

Yaygın kullanılan PuTTY programıyla da SSH açık/gizli anahtar ikilinizi kullanabilirsiniz, fakat doğrudan değil. PuTTY'nin kendine özgü bir formatı olduğu için farklı bir anahtar dosyası kullanmanız gerekir. SSH anahtarınızı PuTTY ile kullanabileceğiniz hale dönüştürmek için puttygen komutunu kullanabilirsiniz:

puttygen $HOME/.ssh/özel_anahtarınız -o putty_için_özel_anahtarınız

Bunun ardından, PuTTY'yi çalıştırın, sırasıyla Connection, SSH ve Auth sekmelerine gidin. "Private key file for authentication" alanında PuTTY için oluşturduğunuz yeni anahtar dosyanızı seçip ekleyin.


Sonuç

Saldırganların sunucunuza erişimini engellemeyi %100 garanti edebilecek bir güvenlik önlemleri seti bulunmuyor. Fakat ekstra güvenlik katmanları eklemek sisteminizi sağlamlaştıracak ve saldırıların başarıya ulaşma ihtimalini düşürecektir. Bu makalede birkaç farklı yöntemi anlattım; SSH konfigürasyonunuzu değiştirmeyi, erişim kontrolü için PAM'i kullanmayı ve parolasız girişler için açık/gizli anahtar ile şifrelemeyi ele aldım. Bunların her biri güvenliğinizi artıracaktır. Tüm bu yöntemler sunucunuza saldırıları güçleştirecek olsa da, her zaman bir saldırı olabileceğini hatırlayın ve saldırganların önüne elinizden geldiği kadar çok engel koyun.

 

Kaynaklar

SSH protokolü çok sayıda RFC belgesinde tanımlanmıştır, bir listesini görmek için şu adresi ziyaret edebilirsiniz:
http://en.wikipedia.org/wiki/Secure_Shell#Internet_standard_documentation

Port numaraları IANA(Internet Assigned Numbers Authority) tarafından belirlenir, belirli portların lsitesi için şu adresi ziyaret edebilirsiniz:
http://www.iana.org/assignments/port-numbers

PAM için birincil dağıtım sitesi ve geliştiricilerin sitesi için şu adresleri ziyaret edebilirsiniz:
http://www.linux-pam.org
https://fedorahosted.org/linux-pam

keychain hakkında daha fazla bilgi için geliştiricisi Daniel Robbins tarafından yazılanları okuyabilirsiniz:
http://www.funtoo.org/wiki/Keychain

RSA'nın orijinal patentini şu adreste görebilirsiniz:
http://www.google.com/patents?vid=4405829

RSA Şifreleme Standardını şu adreste bulabilirsiniz:
http://www.emc.com/emc-plus/rsa-labs/pkcs/files/
h11300-wp-pkcs-1v2-2-rsa-cryptography-standard.pdf

Ekstra güvenlik önemleri için Linux Journal'ın 2010 Ocak sayısındaki "Implement Port-Knocking Seciruty with knockd" makalesini okuyabilirsiniz. İnternet üzerinden okumak için:
http://www.linuxjournal.com/article/10600


Yorum Ekle (giriş yapın)