Merhabalar uzun zamandır yapmak istediğim bir şeyi sonunda tüm sunucularımda yaptım: artık sunucularıma şifreyle veya bilgisayarda duran normal bir SSH anahtarıyla değil, sadece YubiKey takılıyken giriş yapabiliyorum. Bilgisayarım çalınsa ya da bir zararlı yazılım SSH anahtarlarımı kopyalasa bile YubiKey fiziksel olarak yanımda olmadan kimse sunucuya bağlanamıyor. Bu yazıda YubiKey SSH kurulumunu en baştan, karşılaştığım hatalarla beraber detaylıca anlatacağım.
YubiKey Nedir?
Kısa cevap: YubiKey, Yubico firmasının ürettiği, USB veya NFC ile bağlanan bir donanımsal güvenlik anahtarıdır. Gizli anahtar cihazın içinde üretilir ve dışarı çıkarılamaz, bu yüzden kopyalanması mümkün değildir.
YubiKey FIDO2/U2F, OTP, PIV (akıllı kart) ve OpenPGP gibi birçok standardı destekler. SSH tarafında en pratik yöntem OpenSSH 8.2 ile gelen FIDO2 desteğidir. Bu yöntemde ed25519-sk tipinde bir anahtar oluşturulur; sondaki “sk” security key yani güvenlik anahtarı anlamına gelir. Her bağlantıda imza işlemi YubiKey üzerinde yapılır ve ayarınıza göre PIN girmeniz ve YubiKey’e dokunmanız gerekir.
YubiKey SSH Neden Daha Güvenli?
| Şifre | Normal SSH anahtarı | YubiKey (ed25519-sk) | |
|---|---|---|---|
| Brute force ile kırılabilir mi? | Evet | Hayır | Hayır |
| Bilgisayardan kopyalanabilir mi? | Evet | Evet | Hayır |
| Zararlı yazılım çalarsa giriş yapabilir mi? | Evet | Evet | Hayır, fiziksel dokunuş gerekir |
| PIN koruması | – | Parola (isteğe bağlı) | Cihaz üzerinde PIN |
Gereksinimler
- FIDO2 destekleyen bir YubiKey (YubiKey 5 serisi veya Security Key serisi). ed25519-sk için firmware 5.2.3 ve üzeri gerekiyor.
- Bilgisayarınızda ve sunucuda OpenSSH 8.2 veya üzeri.
ssh -Vile kontrol edebilirsiniz. - Sunucuya hala erişebildiğiniz bir oturum (işlem bitene kadar kapatmayın).
macOS kullanıcıları dikkat: macOS ile gelen ssh genelde FIDO desteği olmadan derleniyor ve anahtar oluştururken hata veriyor. Bu yüzden ben Homebrew üzerinden OpenSSH kurdum:
brew install openssh ykman which ssh # /opt/homebrew/bin/ssh olmalı
Ubuntu/Debian tarafında ise gerekli kütüphane şu şekilde kuruluyor:
sudo apt install -y openssh-client libfido2-1 yubikey-manager
1) YubiKey FIDO2 PIN Belirleme
YubiKey’in FIDO2 PIN’i yoksa ilk iş onu belirliyoruz. Bu PIN her bağlantıda soracağımız şifre olacak, en az 4 karakter ama ben daha uzun olmasını tavsiye ederim. Arka arkaya 8 kez yanlış girilirse FIDO2 kilitleniyor, bunu da aklınızda tutun.
ykman fido info ykman fido access change-pin
2) YubiKey SSH Anahtarı Oluşturma
Şimdi asıl işi yapıyoruz. Ben anahtarı resident yani YubiKey’in içine kayıtlı olacak şekilde oluşturuyorum, böylece başka bir bilgisayarda da aynı anahtarı kullanabiliyorum.
ssh-keygen -t ed25519-sk \ -O resident \ -O verify-required \ -O application=ssh:srv1 \ -O user=srv1 \ -C "srv1" \ -f ~/.ssh/id_ed25519_sk_rk_srv1
Komutu açıklamak gerekirse:
-t ed25519-sk: YubiKey destekli ed25519 anahtar tipi-O resident: Anahtar bilgisi YubiKey’in içine kaydedilir, başka bilgisayarda geri yüklenebilir-O verify-required: Her kullanımda PIN sorulur (dokunuşa ek olarak)-O application=ssh:srv1: YubiKey içinde bu anahtarı ayırt etmek için bir isim-O user=srv1: Aynı application ile birden fazla anahtar tutmak için kullanıcı etiketi-C "srv1": Anahtarın yorumu-f: Anahtar dosyasının kaydedileceği yer
Komutu çalıştırınca önce PIN soruyor, sonra YubiKey’in ışığı yanıp sönüyor ve dokunmanızı bekliyor. Dokunduktan sonra iki dosya oluşuyor: id_ed25519_sk_rk_srv1 ve id_ed25519_sk_rk_srv1.pub. Buradaki ilk dosya normal anahtarlardaki gibi gizli anahtar değil, sadece YubiKey’deki anahtarı işaret eden bir tanıtıcı. YubiKey olmadan tek başına hiçbir işe yaramıyor.
Ufak bir tavsiye: Anahtar yorumuna, application ve user kısmına proje adınızı ya da domaininizi yazmayın. Public key sunucudaki authorized_keys dosyasında açıkça durduğu için ben her zaman srv1, ops gibi nötr isimler kullanıyorum.
3) Public Key’i Sunucuya Ekleme
ssh-copy-id -i ~/.ssh/id_ed25519_sk_rk_srv1.pub -p 22 kullanici@SUNUCU_IP
ssh-copy-id yoksa .pub dosyasının içeriğini sunucuda ~/.ssh/authorized_keys dosyasına yeni bir satır olarak ekleyebilirsiniz. PIN zorunluluğunu sunucu tarafında da garanti altına almak için satırın başına verify-required ekleyebilirsiniz:
verify-required [email protected] AAAAGnNrLXNzaC1lZDI1NTE5... srv1
4) Bilgisayarda SSH Config Ayarı
Her seferinde uzun komut yazmamak için ~/.ssh/config dosyasına sunucuyu ekliyorum. Benim kullandığım ayarlar şu şekilde:
Host srv1
HostName SUNUCU_IP
Port 2220
User ops
IdentityFile ~/.ssh/id_ed25519_sk_rk_srv1
IdentitiesOnly yes
IdentityAgent none
IdentitiesOnly yes: Sadece belirttiğimiz anahtarı dener, agent’taki diğer anahtarları denemez.IdentityAgent none: macOS’ta agent kaynaklı hataları engellemek için agent’ı devre dışı bırakır, PIN’i doğrudan terminalde sorar.
Artık ssh srv1 yazmanız yeterli. PIN’i girip YubiKey’e dokunduğunuzda bağlantı açılıyor.
5) Her Komutta Dokunmamak İçin ControlMaster
Sunucuda çok işlem yapıyorsanız her yeni bağlantıda PIN girip dokunmak bir süre sonra yorucu olabiliyor. Bunun için SSH’ın ControlMaster özelliğini kullanıyorum: bir kere PIN girip dokunuyorum, sonraki bağlantılar 4 saat boyunca aynı kanal üzerinden açılıyor.
ssh -fN -o ControlMaster=yes -o ControlPath=~/.ssh/cm-%C -o ControlPersist=4h -o ServerAliveInterval=30 srv1
Bu komuttan sonra ssh -o ControlPath=~/.ssh/cm-%C srv1 ile açılan bağlantılar PIN sormuyor. ServerAliveInterval=30 eklememin sebebi ise bazı ağlarda boşta kalan bağlantının kopması; 30 saniyede bir sinyal gönderince bağlantı ayakta kalıyor. İşiniz bitince kanalı kapatmak için:
ssh -O exit -o ControlPath=~/.ssh/cm-%C srv1
6) Sunucuda Şifreli Girişi Tamamen Kapatma
YubiKey ile girişin çalıştığından emin olduktan sonra (bunu mutlaka yeni bir terminal açıp test edin) şifreyle girişi kapatıyoruz. Ben ayarları ana dosya yerine ayrı bir dosyaya yazmayı tercih ediyorum:
sudo nano /etc/ssh/sshd_config.d/00-hardening.conf
PasswordAuthentication no KbdInteractiveAuthentication no PermitRootLogin prohibit-password PubkeyAuthentication yes # Sadece donanım anahtarlarına izin vermek isterseniz: PubkeyAcceptedAlgorithms [email protected],[email protected]
Ubuntu’da benim de yaşadığım bir tuzak var: cloud sunucularda /etc/ssh/sshd_config.d/50-cloud-init.conf dosyası PasswordAuthentication yes içeriyor ve siz ana dosyada kapatsanız bile şifreli giriş açık kalabiliyor. sshd ayarlarda ilk okuduğu değeri kullandığı için dosya adını 00- ile başlattım. Gerçekte hangi değerin geçerli olduğunu şu komutla kontrol edebilirsiniz:
sudo sshd -T | grep -E "passwordauthentication|kbdinteractive|pubkeyacceptedalgorithms" sudo sshd -t && sudo systemctl reload ssh
sshd -t hata vermezse ayarları yüklüyoruz. Açık olan eski oturumunuzu kapatmadan yeni bir terminalden tekrar bağlanmayı deneyin, sorun çıkarsa eski oturumdan geri alabilirsiniz.
7) Yeni Bilgisayarda Anahtarı Geri Yükleme
Resident anahtar kullanmanın en güzel tarafı burada. Yeni bir bilgisayara geçtiğinizde anahtar dosyalarını kopyalamanıza gerek yok, YubiKey’i takıp şu komutu çalıştırmanız yeterli:
cd ~/.ssh ssh-keygen -K
PIN girdikten sonra YubiKey’deki tüm resident anahtarlar bulunduğunuz klasöre id_ed25519_sk_rk_... adıyla iniyor. Sonrasında ssh config dosyanızı ayarlayıp kullanmaya devam ediyorsunuz.
8) Yedek YubiKey Mutlaka Olsun
YubiKey’i kaybederseniz ya da bozulursa sunucuya giriş yolunuz kapanır. Bu yüzden ikinci bir YubiKey alıp aynı adımlarla onun için de bir anahtar oluşturun ve iki public key’i de authorized_keys dosyasına ekleyin. Yedek anahtarı da güvenli bir yerde saklayın. Her ihtimale karşı sunucu sağlayıcınızın web konsolu (VNC/KVM) üzerinden nasıl giriş yapılacağını da önceden öğrenmenizi tavsiye ederim.
Sık Karşılaşılan YubiKey SSH Hataları
“incorrect passphrase supplied to decrypt private key”
sign_and_send_pubkey: signing failed for ED25519-SK "/Users/kullanici/.ssh/id_ed25519_sk_rk_srv1": incorrect passphrase supplied to decrypt private key
Bu hatayı ilk gördüğümde PIN’i yanlış girdiğimi sandım ama asıl sebep PIN’in hiç sorulamamasıydı. Bağlantıyı bir script içinden veya BatchMode=yes ile açmaya çalışırsanız ssh PIN’i soramıyor ve bu hatayı veriyor. Çözümü bağlantıyı normal bir terminalden açmak ya da yukarıdaki ControlMaster yöntemini kullanmak.
“Key enrollment failed: invalid format” veya “unknown key type”
Genelde OpenSSH sürümünüz eski ya da FIDO desteği olmadan derlenmiş demektir. macOS’ta Homebrew’den kurduğunuz ssh’ı kullandığınızdan emin olun (which ssh).
“device not found”
YubiKey takılı değil, takılı olsa bile başka bir uygulama tarafından kullanılıyor olabilir. YubiKey’i çıkarıp tekrar takmayı ve ykman list ile görünüp görünmediğini kontrol etmeyi deneyin.
Sıkça Sorulan Sorular
YubiKey SSH için hangi model gerekli?
FIDO2 destekleyen YubiKey 5 serisi veya Security Key serisi yeterli. ed25519-sk anahtar tipi için firmware 5.2.3 ve üzeri gerekiyor.
YubiKey’i kaybedersem ne olur?
O YubiKey’e bağlı anahtarla giriş yapamazsınız. Bu yüzden ikinci bir YubiKey’i yedek olarak eklemeniz ve sunucu sağlayıcınızın konsol erişimini bilmeniz gerekir.
Resident key nedir?
Anahtar bilgisinin YubiKey’in içinde saklanmasıdır. Bu sayede ssh-keygen -K ile anahtarı başka bir bilgisayara geri yükleyebilirsiniz.
Her bağlantıda YubiKey’e dokunmak zorunda mıyım?
Varsayılan olarak evet. ControlMaster kullanarak bir kez dokunup belirli bir süre boyunca aynı bağlantı kanalını tekrar kullanabilirsiniz.
Windows’ta YubiKey ile SSH kullanılır mı?
Evet, Windows 10/11 ile gelen OpenSSH’ın güncel sürümleri FIDO2 anahtarlarını destekliyor. Adımlar büyük ölçüde aynı.
Bu yazımızda YubiKey SSH kurulumunu, şifreli girişi kapatmayı ve karşılaşabileceğiniz hataları gördük. Ben bu yapıya geçtikten sonra sunucularımın güvenliği konusunda çok daha rahatım, umarım sizin de işinize yarar 🙂










