YubiKey SSH Kurulumu: Sunucuya Donanım Anahtarıyla Güvenli Giriş (FIDO2)

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?

ŞifreNormal SSH anahtarıYubiKey (ed25519-sk)
Brute force ile kırılabilir mi?EvetHayırHayır
Bilgisayardan kopyalanabilir mi?EvetEvetHayır
Zararlı yazılım çalarsa giriş yapabilir mi?EvetEvetHayı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 -V ile 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 🙂

Kaynaklar

Yorum yapın