FIDO2 та SSH

Давно не писав нічого про SSH. Оскільки я останніми днями іноді граюся з апаратними ключами безпеки FIDO2, то розкажу, як одне може бути пов’язано з іншим :)

Спершу я загуглив, чи взагалі існує така інтеграція, і знайшов відповідний офіційний пост від Yubico. Далі я почав експериментувати. Найбільше мене зацікавила можливість піти кудись по SSH, використовуючи тільки апаратний токен і жодних файлових ключів (забігаючи наперед: так, це можна).

Спочатку генеруємо identity.

ssh-keygen -t ed25519-sk -O resident
  • потребує інтеракції з апаратним ключем (спитає pin-код ключа, треба буде натиснути кнопку на ключі)
  • створює файли id_ed25519_sk та id_ed25519_sk.pub

Далі файл id_ed25519_sk.pub, як і всі звичайні публічні ключі, треба покласти в належне місце — додати в ~/.ssh/authorized_keys на потрібних вам хостах. Можна вручну, можна через ssh-copy-id.

Далі є варіанти. Якщо id_ed25519_sk лежить в ~/.ssh, то все працює як задумано: команда ssh user@host потребує взаємодії з токеном, а потім пускає куди треба. Це такий особливий файл, який не є повноцінним закритим ключем; цей id_ed25519_sk є таким собі посиланням на апаратний токен.

Але мене дуже цікавила можливість обійтись взагалі без файлів. Якщо вже я чомусь змушений тягати з собою флешку з ключами (а краще з базою KeePassX з приватними ключами), то нащо тоді той ключ безпеки? Тільки заради кнопочки, що підтверджує дії користувача?

Так от, файл ~/.ssh/id_ed25519_sk насправді необов’язковий. Можна просто завантажити цю identity прямо з токена одною командою:

ssh-add -K
  • cпитає pin-код токена

Це працює на моїй основній системі. Але, на жаль, чомусь не спрацювало на першій-ліпшій liveUSB. Десь різні версії пакетів, і щось пішло не так. Буває.

Знайшов такий workaround, зробити завантаження наявного identity через ssh-keygen:

ssh-keygen -K
  • потрібна буде інтеракція користувача з токеном
  • cпитає passphrase (для локальних файлів)
  • створює файли id_ed25519_sk_rk та id_ed25519_sk_rk.pub
  • id_ed25519_sk_rk треба покласти в ~/.ssh/id_ed25519_sk (без оцього от _rk в кінці)

Після цього можна робити ssh user@host, натискати кнопочку на токені для підтвердження використання ключа, і все, зашибісь, ми кудись йдемо.

Як і з WebAuthn, мене найбільше дивує що не треба ставити ніякий додатковий софт, все вже тут :)