В OpenSSH добавлена поддержка универсальной двухфакторной аутентификации
В кодовую базу OpenSSH добавлена экспериментальная поддержка двухфакторной аутентификации с использованием устройств, поддерживающих протокол U2F, развиваемый альянсом FIDO. U2F позволяет создавать недорогие аппаратные токены для подтверждения физического присутствия пользователя, взаимодействие с которыми производится через USB, Bluetooth или NFC. Подобные устройства продвигаются в качестве средства для двухфакторной аутентификации на сайтах, уже поддерживаются основными браузерами и выпускаются различными производителями, включая Yubico, Feitian, Thetis и Kensington.

Для взаимодействия с устройствами, подтверждающими присутствие пользователя, в OpenSSH добавлен новый тип ключей "sk-ecdsa-sha2-nistp256@openssh.com" ("ecdsa-sk"), в котором используется алгоритм цифровой подписи ECDSA (Elliptic Curve Digital Signature Algorithm) с эллиптической кривой NIST P-256 и хэшем SHA-256. Процедуры взаимодействия с токенами вынесены в промежуточную библиотеку, которая загружается по аналогии с библиотекой для поддержки PKCS#11 и является обвязкой над библиотекой libfido2, предоставляющей средства для коммуникации с токенами поверх USB (поддерживается протоколы FIDO U2F/CTAP 1 и FIDO 2.0/CTAP 2). Подготовленная разработчиками OpenSSH промежуточная библиотека libsk-libfido2 включена в основной состав libfido2, как и HID-драйвер для OpenBSD.
Для включения U2F можно использовать свежий срез кодовой базы из репозитория OpenSSH и HEAD-ветку библиотеки libfido2, в которую уже входит необходимая для OpenSSH прослойка. Libfido2 поддерживает работу в OpenBSD, Linux, macOS и Windows.

Для аутентификации и генерации ключа необходимо выставить переменную окружения SSH_SK_PROVIDER, указав в ней путь к libsk-libfido2.so (export SSH_SK_PROVIDER=/path/to/libsk-libfido2.so), или определить библиотеку через настойку SecurityKeyProvider, после чего запустить "ssh-keygen -t ecdsa-sk" или, если ключи уже созданы и настроены, подключиться к серверу при помощи "ssh". При запуске ssh-keygen созданная пара ключей будет сохранена в "~/.ssh/id_ecdsa_sk" и может использоваться аналогично другим ключам.

Открытый ключ (id_ecdsa_sk.pub) следует скопировать на сервер в файл authorized_keys. На стороне сервера только проверяется цифровая подпись, а взаимодействие с токенами производится на стороне клиента (на сервере не нужно устанавливать libsk-libfido2, но сервер должен поддерживать тип ключей "ecdsa-sk"). Сгенерированный закрытый ключ (id_ecdsa_sk) по сути является дескриптором ключа, образующим реальный ключ только в сочетании с секретной последовательностью, хранимой на стороне токена U2F.

В случае попадания ключа id_ecdsa_sk в руки атакующего, для прохождения аутентификации ему также потребуется получить доступ к аппаратному токену, без которого сохранённый в файле id_ecdsa_sk закрытый ключ бесполезен. Кроме того, по умолчанию при выполнении любых операций с ключами (как при генерации, так и при аутентификации) требуется локальное подтверждение физического присутствия пользователя, например, предлагается коснуться сенсора на токене, что затрудняет проведение удалённых атак на системы с подключенным токеном. В качестве ещё одного рубежа защиты на этапе запуска ssh-keygen также может быть задан пароль для доступа к файлу с ключом.

Ключ U2F может быть добавлен в ssh-agent через "ssh-add ~/.ssh/id_ecdsa_sk", но ssh-agent должен быть собран с поддержкой ключей "ecdsa-sk", должна присутствовать прослойка libsk-libfido2 и агент должен выполняться на системе, к которой подключается токен. Новый тип ключей "ecdsa-sk" добавлен так как формат ecdsa-ключей OpenSSH отличается от формата U2F для цифровых подписей ECDSA наличием дополнительных полей.
Similar content:
show more less
Rudz
2019-11-06 02:39:10
Avatar
протоколы fido в ssh поддерживаются, о как :)
Setevoy
2019-11-06 15:36:26
Avatar
binkp over ssh )
vop
2019-11-06 16:49:48
Avatar
Забавная реализация u2f у того же kryptco. Единственное неудобство - надо паровать устройства. Это если работать на чужой технике. Если на своей ставить -то нет проблем.
You should to log in

loading