Навіщо ключу SSH апаратний токен
Звичайний закритий ключ — це файл, і його можна вкрасти разом із диском чи резервною копією. У ключа на токені FIDO2 секрет зберігається в самому пристрої, а для входу потрібно фізично торкнутися токена. Файл на диску сам по собі входу не дає, а шкідлива програма не увійде на сервер без вашого дотику.
Якщо додати параметр verify-required, до дотику додасться PIN — вийде два фактори. Загальну схему описано в статті про двофакторну автентифікацію на сервері.
Що знадобиться
Потрібні OpenSSH 8.2 або новіший і токен FIDO/U2F. Підтримка таких ключів з’явилася в OpenSSH 8.2, а параметр verify-required, який вимагає PIN, — у 8.4. Для збережених ключів потрібен токен саме з FIDO2.
| Що | Вимога |
|---|---|
| Клієнт і сервер | OpenSSH 8.2 або новіший |
| PIN під час кожного підпису | параметр verify-required, OpenSSH 8.4 або новіший |
| ecdsa-sk | обов’язковий для будь-якого токена FIDO/U2F |
| ed25519-sk | підтримують не всі токени |
| Збережений (resident) ключ | токен FIDO2, зазвичай із заданим PIN |
| libfido2 | OpenSSH радить версію 1.5.0 або новішу |
Як створити ключ
Створення — одна команда ssh-keygen з типом ed25519-sk або ecdsa-sk. Токен має бути вставлений, а в потрібний момент до нього слід торкнутися. Якщо токен не підтримує ed25519-sk, оберіть ecdsa-sk.
- Вставте токен і переконайтеся, що встановлено OpenSSH 8.2 або новіший і libfido2.
- Виконайте
ssh-keygenз потрібним типом і, за бажанням, з-O verify-required; торкніться токена. - Задайте пароль на файл ключа, якщо хочете захистити й його.
- Скопіюйте відкриту частину на сервер.
- Відкрийте другу сесію та перевірте вхід, не закриваючи першу.
ssh-keygen -t ed25519-sk -O verify-required -f ~/.ssh/id_ed25519_sk
# якщо токен не знає ed25519-sk
ssh-keygen -t ecdsa-sk -O verify-required -f ~/.ssh/id_ecdsa_sk
ssh-copy-id -i ~/.ssh/id_ed25519_sk.pub user@server.exampleВ authorized_keys відкритий ключ почнеться з sk-ssh-ed25519@openssh.com, а для ecdsa-sk — з sk-ecdsa-sha2-nistp256@openssh.com. Загальні правила роботи з ключами — у статті про SSH-ключі для VDS.
Збережені ключі (resident)
Звичайний ключ складається з двох частин: файлу на комп’ютері та секрету в токені. У збереженого ключа файл-дескриптор лежить на самому токені, тому ключ можна вивантажити на інший комп’ютер командою ssh-keygen -K. Це зручно, але є ризик, про який нижче.
ssh-keygen -t ed25519-sk -O resident -O verify-required -O application=ssh:work
ssh-keygen -KПотрібен токен FIDO2, зазвичай із заздалегідь заданим PIN. За замовчуванням application дорівнює ssh:, і OpenSSH використовує лише збережені ключі з таким початком, тому свій суфікс ставте після нього. Команда з -K записує файли ключів у поточний каталог.
Застереження з довідки ssh-keygen: зберігання обох частин ключа на токені підвищує ймовірність того, що зловмисник зможе скористатися украденим токеном. Для збереженого ключа задавайте PIN і verify-required.
Налаштування сервера: дотик і PIN
За замовчуванням sshd вимагає дотику до токена. Це можна посилити параметром PubkeyAuthOptions у sshd_config або послабити для окремого ключа в authorized_keys. Послаблювати без потреби не варто: дотик — головний аргумент на користь такого ключа.
| Параметр | Де задається | Що робить |
|---|---|---|
| touch-required | PubkeyAuthOptions | вимагає дотику |
| verify-required | PubkeyAuthOptions або authorized_keys | вимагає перевірки користувача, зараз це PIN |
| no-touch-required | authorized_keys | дозволяє вхід ключа без дотику |
Ключ, створений із -O no-touch-required, на сервері без такого дозволу не спрацює. Решта налаштувань демона — у статті про захист sshd_config, а для множини серверів погляньте на SSH-сертифікати з центром сертифікації.
Як не втратити доступ
Токен можна загубити, зламати або залишити вдома, тому один токен — єдина точка відмови. Заведіть другий токен і зареєструйте обидва ключі на сервері, а старий спосіб входу не вимикайте, доки новий не перевірено в окремій сесії.
- Створіть ключ на другому токені й додайте обидва відкриті ключі в authorized_keys.
- Збережіть резервний звичайний ключ на офлайн-носії в надійному місці.
- Перевірте вхід за новим ключем у новій сесії, не закриваючи робочу.
- Лише після цього посилюйте sshd_config і прибирайте старі ключі чи паролі.
- Заздалегідь з’ясуйте, як потрапити на сервер через консоль хостера, якщо вхід за ключем не спрацює.
# на Debian і Ubuntu служба називається ssh
sshd -t && systemctl reload sshd
grep -c "^sk-" ~/.ssh/authorized_keysСекрет із токена за задумом FIDO не витягується, тому втрата єдиного токена без резерву — це втрата входу.
Обмеження та підводні камені
Головні обмеження такого входу — токен потрібен під рукою, а дотик не можна автоматизувати. Для скриптів, CI і cron ключ із дотиком не підходить: заведіть окремий звичайний ключ із вузькими правами. Сервери з OpenSSH нижчим за 8.2 ключі sk не приймуть.
- Не кожен токен уміє ed25519-sk: для FIDO/U2F обов’язковий лише ecdsa-sk.
- Не всі токени підтримують збережені ключі та verify-required.
Часті запитання
Який тип обрати: ed25519-sk чи ecdsa-sk?
Почніть з ed25519-sk. Якщо токен його не підтримує, беріть ecdsa-sk: саме він обов’язковий для всіх токенів FIDO/U2F.
Чи потрібен PIN?
Для збережених ключів зазвичай так. Для звичайних PIN за бажанням: параметр verify-required додає його до дотику, але не всі токени його підтримують.
Що робити в разі втрати токена?
Увійдіть резервним ключем або другим токеном, видаліть рядок втраченого ключа з authorized_keys і випустіть новий. Резерв потрібно готувати заздалегідь.
Що робити клієнтам ZevsHost?
На спільному хостингу ключі додаються через cPanel, а sshd належить серверу провайдера: ані обовʼязкового дотику, ані PIN ви там не ввімкнете, і чи прийме сервер sk-ключ, залежить від його версії OpenSSH. Токен розкривається на VPS і виділеному сервері, де authorized_keys і sshd_config ваші: спочатку другий токен і перевірка, потім посилення.