Давно не писав нічого про 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, мене найбільше дивує що не треба ставити ніякий додатковий софт, все вже тут :)