- Güvenlik belirteçleri, özel anahtarı cihazın dışına çıkarmadan cihaz içinde imza atar ve kullanıcının fiziksel bir eylemini gerektirerek uzaktaki bir saldırganın keyfi imza üretmesini zorlaştırır
- SSH kimlik doğrulaması, U2F, parolasız yerel oturum açma,
sudo ve git commit imzalamada kullanılabilir; modern dizüstü bilgisayarlar ve akıllı telefonlardaki yerleşik güvenlik donanımı YubiKey’in yerini alabilir
ssh-keygen -t ed25519-sk ile oluşturulan “özel anahtar” dosyası gerçek özel anahtar değil, belirteç içindeki anahtarı işaret eden bir handle’dır; aynı belirteçle başka bir bilgisayarda da aynı SSH anahtar dosyası oluşturulabilir
- MacBook’ta secure element SSH anahtarı olarak ayarlanabildi ve Touch ID tabanlı SSH oturum açma mümkün oldu; git commit imzalamada ise dosya yolu yerine
ssh-agent ve key:: biçiminde user.signingKey ayarı gerekti
- Güvenlik belirteçlerinde kayıp durumunda özel anahtar kurtarılamaz ve tekrarlanan dokunmalara alışmanın kullanılabilirlik riski vardır; Windows dizüstü bilgisayarlarda Windows Hello, SSH anahtarı kullanımını yüz tanıma, parmak izi veya PIN ile onaylayabildi
Güvenlik belirteçlerinin avantajları ve sınırları
-
Uzaktan saldırıları engelleyen temel yapı
- Güvenlik belirteci, özel anahtar/açık anahtar çiftini cihazın içinde tutan; açık anahtarı kolayca dışarı verebilen ama özel anahtarın cihazın dışına çıkmasına izin vermeyen bir aygıttır
- İmzalanacak veri paketi cihaza gönderildiğinde, cihaz içinde özel anahtarla imzalanır ve genellikle yanıp sönen dokunmatik düğmeye basmak gibi fiziksel bir kullanıcı eylemi gerekir
- Uzak bir saldırgan bilgisayara erişse bile kullanıcı gerçek dünyada eylemde bulunmadıkça güvenlik belirteci keyfi bir imza üretmeyeceği için,
~/.ssh dizininde tam SSH özel anahtar/açık anahtar çiftini dosya olarak tutma yöntemine göre daha iyi görünür
- SoloKeys ve Nitrokeys gibi, FOSS firmware isteyenler için seçenekler de vardır
- Daha üst seviye güvenlik belirteçleri yerleşik parmak izi okuyucu gibi biyometrik doğrulama eklese de, özünde önemli olan özel anahtarın cihaz dışına çıkmamasıdır
-
Kullanılabilirlikten doğan riskler
- Kullanıcı güvenlik belirteci her yanıp söndüğünde basmaya alışırsa, kötü niyetli isteklere de düşünmeden yanıt verebilir
- Art arda imzalama yapılan işlerde belirtece tekrar tekrar dokunmak gerektiğinde, bir kez daha yanıp sönen isteği gerçekten fark etmek zor olabilir
- Apple ve Microsoft, akıllı telefon doğrulama uygulamalarında her erişim isteğine rastgele bir sayı kodu ekleyip bunu kullanıcıya girdirtme yöntemini kullanır; ancak bu zahmetlidir ve TOTP kullanan Authy veya Google Authenticator uygulamalarına kıyasla güvenlik belirteçlerinin kullanılabilirlik avantajını azaltır
-
Kayıp ve yedekleme sorunu
- Güvenlik belirteci kaybedilirse ilgili özel anahtar kalıcı olarak yok olur ve yedekleme yolu yoktur
- Birden fazla hesapta kilitli kalma riskinden kaçınmak için güvenlik belirteci alırken en az 2 tane alıp aynı hizmetlere kaydetmek gerekir
- Alternatif olarak BIP 39 gibi, özel anahtarı insanların okuyabileceği kelime listesine çevirip yazmaya dayanan yedekleme/kurtarma yöntemleri vardır
- Özel anahtar güvenli enclave’in dışına çıkabiliyorsa, kullanıcının kelime listesini yanlış bir yere yazmasını sağlamaya yönelik phishing saldırıları da mümkün hale gelir
- Tüm güvenlik belirteçlerini kaybetme olasılığı ciddi bir endişeyse, BIP 39 kelime listesi sisteme erişimi geri kazanmak için son çare olabilir
SSH ve git’te güvenlik belirteci kullanımı
-
SSH özel anahtarını güvenlik belirtecinde tutmak
- Normalde
ssh-keygen çalıştırıldığında tam özel anahtarı içeren bir dosya çifti oluşturulur
- Özel anahtarı güvenlik belirtecinde tutmak için Yubico’nun FIDO/U2F rehberi doğrultusunda libfido2 kurulur ve güvenlik belirteci takılıyken
ssh-keygen -t ed25519-sk çalıştırılır
- Bu durumda da bir dosya çifti oluşur, ancak “özel anahtar” dosyası gerçek özel anahtar değil, güvenlik belirteci içindeki özel anahtarı gösteren bir handle’dır
- Aynı güvenlik belirteciyle
ssh-keygen -t ed25519-sk yeniden çalıştırılırsa herhangi bir bilgisayarda aynı özel anahtar/açık anahtar dosyaları üretilebilir; böylece SSH erişim yetkisi belirli bir bilgisayardaki belirli bir dosyaya değil, güvenlik belirteciyle birlikte taşınır
-
git kimlik doğrulama ve commit imzalama
- Güvenlik belirtecine dokunulan durumların yaklaşık %90’ı git kullanımı nedeniyle olur
- Git forge’ları push ve pull işlemleri için SSH kimlik doğrulaması sunar; yukarıda oluşturulan
id_ed25519_sk.pub dosyası yüklenirse güvenlik belirteci anahtar çifti kullanılabilir
- git, commit imzalamada da SSH anahtarlarını destekler; GitHub belgelerindeki SSH anahtarıyla imzalama anahtarı ayarlama adımları izlenip ardından
git config --global commit.gpgsign true çalıştırılırsa tüm commit’ler otomatik olarak imzalanır
- Git forge’ın commit’i size ait imza olarak tanıması için açık anahtarın yeniden yüklenmesi gerekir; bu alan genellikle SSH kimlik doğrulama alanından ayrıdır
-
Commit imzalamanın zorlukları
- Uzun bir commit listesini rebase ederken tüm commit’leri yeniden imzalamak gerekir
- Parmak izi okuyuculu YubiKey, onlarca commit’i art arda imzalamak için fazla yüksek bir parmak izi başarısızlık oranına sahip olduğundan kullanım bırakılabilir
- git’in “rebase/amend merkezli” wrapper’ı jujutsu’da, commit’leri yalnızca push anında imzalama yöntemi vardır
-
Linux’ta yerel oturum açma ve sudo
MacBook’un secure element’ini SSH anahtarı olarak kullanmak
- USB-C porta güvenlik belirtecini sürekli takılı bırakmak, yanlışlıkla düşürme veya çarpma durumunda portu ve belirteci bozabilecek küçük bir kaldıraç gibi dışarı taşmasına neden olur
- 2020 model M1 MacBook Air’de Arian van Putten’ın rehberi izlenerek yerleşik güvenlik bileşeni SSH anahtarı olarak ayarlandı
sc_auth create-ctk-identity -l ssh -k p-256-ne -t bio
ssh-keygen -w /usr/lib/ssh-keychain.dylib -K -N ""
- Bu komut,
id_ecdsa_sk_rk özel anahtar/açık anahtar dosya çiftini oluşturur ve bu dosyalar ~/.ssh dizinine taşınır
- Burada da özel anahtar dosyası gerçek özel anahtar değil, cihaz içindeki anahtara yönelik bir handle olduğu için açıkça paylaşılıp yapıştırılabilecek biçimdedir
- Açık anahtarı homelab sunucusunda authorized key olarak eklemek için şu komut çalıştırılır
ssh-copy-id -i ~/.ssh/id_ecdsa_sk_rk.pub <server nickname>
- Sonrasında
~/.ssh/config içine şu ayar eklenir
Host *
IdentityFile ~/.ssh/id_ecdsa_sk_rk
SecurityKeyProvider=/usr/lib/ssh-keychain.dylib
ssh <server nickname> çalıştırıldığında macOS girişten önce otomatik olarak parmak izi istemini gösterir ve ardından SSH oturumu normal şekilde açılır
MacBook secure element ile git commit imzalamak
git config --global user.signingKey /Users/ahelwer/.ssh/id_ecdsa_sk_rk ayarlanıp .ssh/allowed_signers dosyası güncellense bile git commit imzalama hemen çalışmaz
- git, commit imzalamada başarısız olur ve
device not found? benzeri hata verir
error: Signing file /var/folders/l5/5wqvq2l10p96wtdtfr6lvrvw0000gn/T//.git_signing_buffer_tmpc4uQgO
Confirm user presence for key ECDSA-SK SHA256:oQDA2SNYb2MoSQcxJVSmWyAeAWPqMp7rxliBRfi87as
Couldn't sign message: device not found?
Signing /var/folders/l5/5wqvq2l10p96wtdtfr6lvrvw0000gn/T//.git_signing_buffer_tmpc4uQgO failed: device not found?
fatal: failed to write commit object
- Çözüm,
~/.ssh dizinindeki dosyayı doğrudan göstermek yerine ssh-agent kullanmaktır
- Yukarıdaki rehbere göre şu komutla anahtar çifti ssh-agent’a eklenir
ssh-add -K -S /usr/lib/ssh-keychain.dylib
- Ardından
user.signingKey için dosya yolu değil, ~/.ssh/id_ecdsa_sk_rk.pub içeriğinin başına key:: eklenmiş anahtarın kendisi ~/.gitconfig içine yazılır
[user]
name = Andrew Helwer
signingKey = "key::sk-ecdsa-sha2-nistp256@openssh.com AAAAInNrLWVjZHNhLXNoYTItbmlzdHAyNTZAb3BlbnNzaC5jb20AAAAIbmlzdHAyNTYAAABBBGxFEdnIg6ppz+pQCdd1eisjOV4gxrjMv1Y4SbtdLoSm6CJCgPZ6q7lnNyuQQsdnS4/Tllsc656AQL7BO3OS47cAAAAEc3NoOg== ssh:"
- Bu ayardan sonra MacBook’un secure element’indeki anahtarla dosyalar imzalanabildi ve GitLab Pages sitesi push edilebildi
Windows ve Linux’ta deneme sonuçları
- Şirketin verdiği Windows dizüstü bilgisayarda da hızlı bir deneme yapıldı
winget install Microsoft.OpenSSH.preview
ssh-keygen -t ecdsa-sk
- Bu komut da bir özel anahtar/açık anahtar dosya çifti oluşturdu ve SSH bağlantısında Windows Hello’nun standart oturum açma akışı üzerinden yüz tanıma, parmak izi veya PIN’den biri kabul edildi
- Linux’ta ise benzer bir gerçek kullanıcı varlığı doğrulamasının ardından secure element’e bağlı dizüstü bilgisayara erişim olmadığı için demo yapılamadı
1 yorum
Lobste.rs görüşleri
Harika bir yazı; sırf bunun mümkün olduğunu göstermesi bile çok faydalı
Ben şahsen bunu çalıştıracak doğru kütüphane sürümünü bulamadım ama 1Password 8'in SSH anahtarlarını güvenli biçimde sakladığını ve aracının biyometrik doğrulamayla anahtar kilidini açmayı desteklediğini öğrendim
Böylece artık sadece parmağımı dokundurarak hem git işleri yapabiliyor hem de SSH hostlarına giriş yapabiliyorum
Kılavuz: https://developer.1password.com/docs/ssh/get-started/
Bu yalnızca Mac'e özel gibi görünüyor
Böyle bir güvenlik unsuruna sahip bir Linux sistemi deneme fırsatım olmadı; Linux iş istasyonumda V1 TPM var ama imzalama işlemlerinin gerçekten yalnızca kullanıcı varlığı doğrulandıktan sonra çalışmasını nasıl garanti ederim, bilmiyorum
Belki Framework gibi bir Linux dizüstüsüne sahip biri bunu deneyebilir. Hatta Asahi'de bile gerçekten çalışabilir
Peki sağlanan private key dosyasının içinde tam olarak ne var?
ssh:kısmı, yani uygulama, passkey'deki origin'e karşılık geliyor ve host ya da alan adı başına resident key oluştururken faydalı oluyorÖrneğin aynı fiziksel Yubikey içinde bile amaçlara göre anahtarları ayırmak için kullanılıyor
flags, donanımın anahtarı nasıl işlemesi gerektiğini belirtir [1]. Aracı da kendi kısıtlarını ekleyebilirTeknik olarak FIDO anahtarına başka blob'lar ya da uzantılar da kaydedilebilir; önceki iş yerimde bunu kimlik doğrulamayla birlikte X.509 açık anahtarı gibi yardımcı kimlik bilgileri aktarmak için kullanmıştım. Oldukça hoş bir yöntem
[1]
Dış sarmalayıcıda
openssh-key-v1\0sihirli değeri,cipher=none,kdf=nonevar; yani şifreli değil74 baytlık açık anahtar blob'unda
sk-ssh-ed25519@openssh.comanahtar türü, 32 baytlık Ed25519 noktasıfdcce889…03e7852bve uygulamassh:bulunuyor; bu değer SSH ile WebAuthn'ın FIDO kimlik bilgilerini ad alanı bazında ayırıyorÖzel bölüm 248 bayt ve
cipher=noneolduğu için düz metin. İçindecheckint1 == checkint2 == 0x46744267rastgele değeri, tekrarlanan anahtar türü ve açık anahtar, uygulamassh:,flags: 0x01yer alıyorBu bayrak
USER_PRESENCE_REQUIREDanlamına geliyor; yani dokunma gerekiyor ama PIN/kullanıcı doğrulaması yok ve bu, yerleşik olmayan bir anahtarkey_handle,authenticatorGetAssertion'a verilen 128 baytlık opak bir kimlik bilgisi ID'si; cihaz bunu içeride çözüp Ed25519 tohumunu geri yüklüyorBunun dışında boş
reserved, yorumahelwer@ah-mbair.localve dolgu01 02 03varBu yazı sadece SSH'den bahsediyor gibi; bilgisayarımdaki Secure Enclave ya da TPM'i FIDO2 veya U2F anahtarı olarak kullanmanın bir yolu var mı?
Passkey de her web sitesi için ayrı bir özel anahtar kullanan bu yaklaşımın bir biçimi
Bu durum, donanıma bağlanabilen asimetrik veya HMAC API anahtarları desteğinin neden daha yaygın olmadığını düşündürüyor
WebAuthn, DBSC(Device-Bound Session Credentials) ve OAuth2 DPOP gibi bunu daha da ileri taşıyan spesifikasyonların artması sevindirici