Зачем ключу 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 ваши: сначала второй токен и проверка, потом ужесточение.