SSH sertifikaları: daha iyi bir SSH deneyimi
(jpmens.net)- SSH sertifikaları, geleneksel açık anahtar tabanlı SSH kimlik doğrulamasının zahmetini ortadan kaldırır ve istemci ile sunucu arasında otomatik güven sağlar
- OpenSSH 5.4’ten beri desteklenir; CA (sertifika otoritesi) kullanıcı ve host anahtarlarını imzalayarak
authorized_keysdosyasını değiştirmeden kimlik doğrulamayı mümkün kılar - Sertifikalar; geçerlilik süresi, izin verilen kullanıcı (principal), erişim IP’si, zorunlu komut (force-command) gibi bilgileri içererek ayrıntılı erişim kontrolü sağlar
- TOFU (Trust on First Use) süreci ortadan kalkar ve host anahtarı değiştiğinde uyarı olmadan güvenli bağlantı kurulabilir
- Otomatik imzalama sunucuları veya araçları kullanıldığında büyük ölçekli sunucu ortamlarında SSH yönetimi otomasyonu ve güvenlik iyileştirmesi sağlanabilir
SSH sertifikalarına genel bakış ve mevcut SSH anahtar tabanlı kimlik doğrulamanın sınırları
- SSH bağlantısında ilk kez bağlanılan sunucunun host anahtarı parmak izinin (fingerprint) doğrulanması gerekir; ancak çoğu kullanıcı bunu kontrol etmeden “yes” yazarak TOFU (Trust on First Use) yöntemini kullanır
- Yöneticiler sunucunun parmak izini doğrudan kontrol edebilir veya
ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_keykomutuyla doğrulayabilir
- Yöneticiler sunucunun parmak izini doğrudan kontrol edebilir veya
- Açık anahtar tabanlı kimlik doğrulama, parola olmadan erişim sağlar; ancak her sunucunun
authorized_keysdosyasına açık anahtarların dağıtılması gerekir - SSH agent (
ssh-agent) kullanıldığında özel anahtar bellekte tutulur ve tekrar tekrar giriş yapmadan kimlik doğrulama yapılabilir - Mevcut yöntemin sınırlamaları
- Her kullanıcı için açık anahtarın sunucuya kopyalanması gerekir
- Host anahtarı değiştiğinde istemcide uyarı mesajı oluşur
- TOFU nedeniyle güven yönetimi zahmetlidir
SSH sertifikaları ve sertifika otoritesi (CA)
- SSH sertifikaları (Certificate) OpenSSH 5.4’ten (Mart 2010) beri desteklenir ve mevcut SSH anahtar biçimini genişleten bir yapıdır
- SSH CA, bir SSH anahtar çiftinden oluşur ve açık anahtar güven kökü görevi görür
- Başlıca avantajlar
- Sunucudaki
authorized_keysdosyasını değiştirmeye gerek yoktur - Host anahtarı değiştirildiğinde uyarı çıkmaz
- TOFU sürecinin kaldırılmasıyla otomatik güven sağlanır
- Sertifikaya izin verilen kullanıcı (principal), izin verilen IP, geçerlilik süresi, zorunlu komut (force-command) gibi bilgiler eklenebilir
- Sertifika süresi dolduğunda erişim otomatik olarak engellenir
- Sunucudaki
SSH CA kurulumu ve imzalama süreci
- CA sisteminde ECDSA algoritmasıyla CA anahtar çifti oluşturma
ssh-keygen -t ecdsa -C "SSH CA" -f CA/ssh-ca
- Kullanıcı kendi açık anahtarını (
*.pub) CA’ye iletir; CA bunu imzalar (sign) ve bir sertifika (*-cert.pub) üretir- Örnek:
ssh-keygen -s CA/ssh-ca -I "Jane Jolie" -n jane -z 001 -V +1w jane.pub
- Örnek:
- Sunucu yapılandırması
- CA açık anahtarını
/etc/ssh/ssh-ca.pubiçine kaydedin veTrustedUserCAKeysayarını ekleyin - Sunucunun host anahtarını CA ile imzalayın (
ssh-keygen -h -s CA/ssh-ca ...) veHostCertificatealanına kaydedin
- CA açık anahtarını
- İstemci yapılandırması
known_hostsdosyasına bir@cert-authoritysatırı ekleyin- Örnek:
@cert-authority *.example.com $(cat CA/ssh-ca.pub)
SSH sertifikası tabanlı bağlantı ve doğrulama
- Kullanıcı, imzalanmış sertifika ile özel anahtarı birlikte kullanarak bağlanır (
ssh -i jane -l jane alice.example.com) - Sunucu günlüklerinde sertifikanın ID’si, seri numarası (serial), CA parmak izi kaydedilir
- Birden fazla host adı veya IP, sertifikadaki principal olarak eklenebilir
- Sertifikada tanımlı principal dışında bir kullanıcıyla oturum açılmaya çalışıldığında “Certificate invalid: name is not a listed principal” hatası oluşur
- Sertifikaya zorunlu komut (force-command) veya izin verilen IP (source-address) ayarı eklenerek ayrıntılı erişim kontrolü yapılabilir
Kontrol ve sorun giderme kontrol listesi
-
Sunucu tarafında kontrol edilecekler
TrustedUserCAKeysayarının ve CA açık anahtarının mevcut olması- Host anahtarının imzalanmış olması ve
HostCertificatedeğerinin tanımlanması sshdyeniden başlatılmalıdır
-
İstemci tarafında kontrol edilecekler
- Kullanıcı anahtarı CA tarafından imzalanmış olmalıdır
known_hostsiçindeki@cert-authoritykaydı ile principal eşleşmelidir- Sertifika süresi dolduğunda “Certificate invalid: expired” mesajı gösterilir
- Sertifika kısıtları uyuşmazsa parola istenir
- SSH agent’a sertifika eklendiğinde hem anahtar hem sertifika kaydedilir (
ssh-add jane) - İmzalama sırasında seçeneklerle (
-O) işlevler kontrol edilebilir - Örnek:
-O clearile tüm izinleri kaldırıp yalnızcapermit-agent-forwarding,permit-port-forwardingizinlerini vermek mümkündür
Host anahtarı sertifikası otomasyonu
- Python modülü sshkey-tools ve BottlePy kullanılarak otomatik imzalama sunucusu (hkbot) kurulabilir
- CA sunucusunda
hkbot.pyçalıştırıldıktan sonra host açık anahtarı HTTP isteğiyle yüklendiğinde otomatik olarak imzalanır - İstemcide
curl -F hostkey=@/etc/ssh/ssh_host_ed25519_key.pub http://CA:8870 | shkomutuyla otomatik kurulum yapılabilir /etc/ssh/sshd_configdosyası düzenlenip doğrulandıktan sonrasystemctl restart sshdile uygulanır
- CA sunucusunda
- Sonrasında SSH bağlantılarında sertifika tabanlı otomatik güven ve oturum açma kullanılabilir
SSH sertifikalarının avantajlarının özeti
- TOFU gerekmez, istemci ve sunucu arasında otomatik güven sağlanır
- Kısa ömürlü sertifikalar verilerek geçici erişim kontrolü yapılabilir
- Sertifika süresi dolduğunda erişim otomatik engellenir,
authorized_keystemizliği gerekmez - Zorunlu komut, PTY kısıtlaması, erişim IP kontrolü gibi ayrıntılı politika ayarları yapılabilir
- Otomasyon araçlarıyla büyük ölçekli sunucu ortamı yönetimi sadeleştirilebilir
- İlgili bir proje olarak Smallstep SSH tanıtılıyor
Ek başvuru kaynakları
- Mozilla’nın OpenSSH güvenlik rehberi
- DNS tabanlı SSH host anahtarı parmak izi doğrulaması üzerine araştırma makalesi
- PuTTY’nin OpenSSH sertifika desteği uygulama dokümantasyonu ve yapılandırma rehberi
Güncelleme
- SSH CA, özellikle kendi sunucularını işleten ve root yetkisine sahip olunan ortamlarda yararlıdır
- Çok kullanıcılı sistemlerde mevcut
known_hostsveauthorized_keysyöntemi hâlâ gereklidir - SSH sertifika biçimi için standardizasyon taslağı:
draft-miller-ssh-cert-06
1 yorum
Hacker News yorumları
İnsanların hâlâ SSH parolaları kullanmasına şaşırıyorum
Özellikle büyük şirket ortamlarında, birden fazla parola politikası iç içe geçtiği için sadece bir sunucuya bağlanmak bile uzun sürebiliyor
Bu yüzden onlara ssh-keygen ile anahtar kullanmalarını söyleseniz de çoğu “bir ara denerim” deyip sonunda hiç yapmıyor
Ama pratikte tek bir ortak anahtarın birden çok sunucuda kullanılması ya da anahtarların paylaşılması gibi nedenlerle yönetim kolayca dağılabiliyor
Parolaların en azından basit olma avantajı var
Parola yok ama giriş yaparken fiziksel olarak Yubikey’e dokunmanız gerekiyor
Birkaç ayda bir birileri yeniden SSH sertifikalarını keşfedip blog yazısı yazıyor
Ben de 15 yıl önce ilgili bir yazı yazmıştım ama bugün bakınca eksik kalmış
Güvenlik mühendisleri bile bazen SSH sertifikası değil, anahtar kimlik doğrulaması kullandıklarını unutuyor
Birden çok sunucunun anahtarlarını elle yönetmek fazla zahmetli
Yine de artık geçiş yapmaya değip değmeyeceğini düşünüyorum
TOFU (Trust On First Use) yaklaşımı basit ama oldukça ileri götürülebilir
Kendi sunucularımda host anahtarını doğrudan doğruladıktan sonra bu benim için yeterli oluyor
Büyük kurumsal ortamlarda, iç sunucuların açık anahtar listesini SSL ile imzalanmış dahili bir web sitesinde yayımlayabilirsiniz
Ama sunucu sayısı fazlaysa veya sık değişiyorsa sertifikalar çok daha iyidir ve TOFU’nun birçok açıdan sınırları vardır
Keşke tarayıcılarda da sunucunun TLS anahtarı değiştiğinde haber veren bir özellik olsa
Çoğu kişi sadece “yes” yazıp geçiyor
Şirkette Zscaler’ın SSL incelemesi yüzünden çok zaman ve para kaybettik
“self-signed certificate in certificate chain” hatası çıktığında iş her zaman sıkıntılı oluyor
Kendi kök sertifikasını yerleştiriyor ve tarayıcı ayarlarını kilitleyerek proxy kullanımını engelliyor
Firefox ya da Chrome ayar dosyalarını değiştirseniz bile anında üstüne yazıyor
Hatta GUI üzerinden kapatmak için bile IT parolası gerekiyor
Cybereason antivirüsünden sadece biraz daha iyi
HTTP tabanlı protokollerin hepsini bozuyor
Git, RubyGems, go mod, Nix ve daha birçok araç çalışmaz hale geliyor
Satıcı “şeffaf” diyor ama gerçekte hiç de öyle değil
Sorunu teşhis etmek saatler alıyor ve çoğu yönetici bunun ne kadar yıkıcı olduğunun farkında değil
Yazıda CA sertifikalarının sadece avantajlarından bahsedilmiş ama dezavantajları da açıkça var
TOFU kaynaklı bir güvenlik sorunu yaşadığım hiç olmadı
SSH sertifikalarının dezavantajları varsa bunun somut olarak ne olduğunu merak ediyorum
Güvenliği artırmak istiyorsanız açık anahtarları USB gibi güvenli bir kanal üzerinden değiş tokuş edebilirsiniz
Sertifika kullansanız bile sonunda aynı süreci izlemek gerekir; sadece yönetim yükü kullanıcıdan yöneticiye kayar
Büyük ölçekli kuruluşlarda sertifikalar faydalı olabilir ama genel güvenlik seviyesi aynıdır
Bunu kurulum betiğine ya da dağıtım imajına eklemek yeterlidir
TOFU sadece zaten kurulmuş bir kutuya erişirken anlamlıdır
Bizim dev/stg ortamımızda her gün makinelerin yarısını yeniden kuruyoruz
SSH host sertifikaları sayesinde
known_hostsdosyasını silmek ya da anahtarları korumak gerekmiyor; bu da işi çok kolaylaştırıyorKişisel bir proje olarak Sshifu adlı bir araç geliştiriyorum
SSH sertifikası tabanlı oturum açmayı ve SSO’yu kolaylaştıran bir araç
Sunucuya sshifu-server kurup bunu CA olarak kullanıyorsunuz, her SSH sunucusu da bu CA’ya güvenecek şekilde yapılandırılıyor
Kullanıcının tek yapması gereken
npx sshifukomutuyla giriş yapmakAyrıntılar için GitHub deposuna bakabilirsiniz
Gerçek üretim ortamlarında sertifika tabanlı erişim, karmaşık yönetim sorunlarına yol açıyor
Sertifika süresinin dolması, kullanıcı kaldırma, sunucu arızasında giriş yapma gibi çeşitli meseleler ortaya çıkıyor
Userify olarak 15 yıldır bu sorunlarla uğraşıyoruz; sağlam bir SSH kimlik doğrulama altyapısı kurmak hiç de kolay değil
pico.sh’ye SSH sertifikası desteği ekledim ve RBAC tarzı erişim denetimi uygulayabildiğim için bu çok yararlı oldu
Ayrıntılar için dokümantasyona bakın
Üretimde SSH sertifikaları aslında karmaşıklığı merkezileştirerek sorunu büyütüyor
Tek bir CA’nın her zaman erişilebilir olması gerekiyor ve arıza durumunda tüm erişim kesiliyor
TTL ayarlama, güven kökü yönetimi, zor hata ayıklama gibi pratik sorunlar da çok
Sonunda insanlar yine önbellek ya da ajan kullanmaya dönüyor
Biz bunun yerine her düğümün HTTPS üzerinden kullanıcı bilgilerini yerel
authorized_keysiçine eşitlemesini sağlıyoruzBöylece merkezi denetim korunurken arızalar yerel kalıyor
Userify bu yöntemi kullanıyor; yalnızca kimlik doğrulamayı değil, yetki yönetimini de ele alıyor
Sertifikalar tek başına kullanıcı oluşturma, sudo rolleri, home dizini temizliği gibi sorunları çözmüyor