Перейти к содержанию
ERITKOM
БезопасностьРазбор

OpenSSH и FIDO-ключ: что остаётся в файле и зачем серверу подтверждение касанием

Аппаратные ecdsa-sk и ed25519-sk, resident credentials, PIN, агент и границы защиты удалённого SSH-доступа.

Аппаратный ключ YubiKey5C NFC
Daniel Aleksandersen · CC BY4.0 · Изменены размер и формат.

Аппаратный ключ не заменяет SSH целиком

Поддержка FIDO/U2F появилась в OpenSSH 8.2, выпущенном 14 февраля 2020 года. Она добавила типы ecdsa-sk и ed25519-sk и соответствующие варианты сертификатов. Это историческая точка появления механизма, а не дата сегодняшнего обновления. Такой ключ участвует в аутентификации пользователя внутри SSH, сохраняя обычную структуру соединения и серверную проверку открытого ключа.

Устройство выполняет необходимую криптографическую операцию и обычно требует явного действия пользователя. Ключ должен быть доступен в момент использования. Но поддержка алгоритмов и дополнительных возможностей зависит от authenticator: наличие FIDO не гарантирует одинакового набора опций у всех устройств. В частности, поддержка Ed25519 исторически менее распространена, чем ECDSA-P256. Поэтому название физического разъёма или похожий корпус не подтверждают совместимость с конкретным типом SSH-ключа. На фотографиях показаны определённые устройства, а не универсальный сертификат поддержки всех рассматриваемых режимов.

Локальный файл всё равно существует

В обычной FIDO-модели OpenSSH локальный private-key-файл содержит key handle — часть, необходимую для обращения к ключу устройства. Самостоятельно этот файл не позволяет воспроизвести аппаратную операцию без соответствующего authenticator. Поэтому выражение «закрытый ключ остаётся в устройстве» не означает отсутствия любых файлов идентичности на компьютере.

Resident-режим хранит key handle на самом authenticator. Это упрощает перенос между компьютерами: необходимую информацию можно получить с устройства. При этом не экспортируется исходный аппаратный секрет в виде обычного программного закрытого ключа. Упрощение переноса имеет и другую сторону: похищенное устройство содержит больше необходимых частей для использования credential. Документация ssh-keygen прямо связывает resident keys с дополнительным риском при краже и необходимостью подходящего PIN. Удобство восстановления локальной идентичности и возможность её применения посторонним — связанные свойства одного режима, а не два независимых переключателя.

Resident не означает синхронизируемую облачную копию: речь идёт о размещении handle в authenticator. Возможность получить его на другом компьютере зависит от поддержки устройства и подходящего клиента. Обычное копирование одного локального файла, получение resident identity и создание нового независимого credential являются тремя разными операциями с разными результатами.

Версия клиента — только одно условие

Руководство Yubico указывает OpenSSH 8.2 как исходное требование для аппаратных FIDO-ключей, 8.3 — для получения resident keys через ssh-keygen, 8.4 — для verify-required. Эти границы описывают появление возможностей, а не рекомендацию устанавливать старые выпуски. Фактическая поддержка зависит также от сборки с FIDO-компонентами.

Например, руководство отдельно различает системную поставку macOS и сборку с libfido2. Поэтому одинаковый номер OpenSSH в двух окружениях не гарантирует одинаковой работы hardware-backed credentials. К выбору типа добавляются возможности устройства и его firmware. Ошибка при создании ed25519-sk не доказывает, что устройство вообще непригодно для любой FIDO-аутентификации: может отличаться набор алгоритмов. Аналогично наличие USB-C либо NFC описывает способ связи, а не автоматически доступные resident-опции. Совместимость складывается из клиента, поставщика FIDO, устройства и серверной политики, причём каждый из этих участников отвечает за отдельную часть операции.

FIDO2-совместимый YubiKey5 NFC с разъёмом USB-A
FIDO2-совместимый YubiKey5 NFC с разъёмом USB-A. FelixLadd · CC BY-SA4.0 · Изменены размер и формат.

Касание и PIN можно требовать на сервере

PubkeyAuthOptions у sshd содержит touch-required и verify-required. Первая опция требует свидетельства присутствия пользователя при подписи FIDO-ключом, обычно касания устройства. Вторая требует подтверждения проверки пользователя, например через PIN. Эти условия не оказывают действия на обычные не-FIDO типы открытых ключей.

По умолчанию сервер уже требует присутствия для FIDO-подписи, если отдельное authorized_keys-условие не изменило поведение. touch-required запрещает такое ослабление. Следовательно, простая надпись «ключ с касанием» в клиентской инструкции не является единственным местом настройки: сервер может закреплять требование независимо. Проверка присутствия и проверка пользователя не взаимозаменяемы. Касание показывает физическое взаимодействие, но не обязательно различает владельца устройства и другого человека рядом с ним. При этом парольная аутентификация, альтернативные ключи и другие способы входа описываются отдельными серверными настройками. Ужесточение одного FIDO-пути само по себе не утверждает, что все остальные разрешённые пути имеют такую же модель подтверждения.

Фотография физического FIDO2 USB-token YubiKey5 NFC
Фотография физического FIDO2 USB-token YubiKey5 NFC. Yubinerd123; кадрирование Wdwd · CC BY-SA4.0 · Изменены размер и формат.
Серверные требования к FIDO-подписи
ОпцияПодтверждениеДля обычных не-FIDO ключей
touch-required Физическое присутствие, обычно касание Не действует
verify-required Проверка пользователя, например PIN Не действует

Источник: OpenBSD: PubkeyAuthOptions

Клиент выбирает, какую идентичность предлагать

IdentityFile задаёт файлы идентичности, а IdentitiesOnly ограничивает использование настроенными identities даже тогда, когда агент предлагает дополнительные. Это полезное различие для окружения с несколькими ключами. Наличие правильного аппаратного credential в агенте ещё не означает, что клиент выбрал именно его для данного хоста.

Конфигурация SSH использует секции Host и Match; для большинства параметров действует первое полученное значение. Поэтому более конкретные параметры и общие значения по умолчанию имеют значение в порядке чтения. IdentityFile относится к исключениям, допускающим накопление нескольких записей. ForwardAgent является отдельной настройкой и по умолчанию выключен. Он передаёт доступ к агенту удалённой стороне, а не копирует закрытый ключ на сервер. Но возможность использовать агент и возможность извлечь его ключевой материал различаются: удалённая сторона с соответствующим доступом может запросить операции, даже не получая файл. Аппаратная защита секрета не превращает любое предоставление доступа к агенту в нейтральное действие.

Агент хранит доступ к операциям, не вечную сессию

ssh-agent начинает без загруженных identities; они добавляются отдельно. Через сокет клиент обращается к агенту за операциями аутентификации. Для identities можно задавать срок жизни. Завершение агента и завершение конкретного соединения — разные события, а доступность сокета влияет на то, какие программы могут пользоваться его возможностями.

Для FIDO существует дополнительная граница между SSH и веб-аутентификацией. По умолчанию агент ограничивает подписи, которые могли бы выглядеть как запросы входа на сайты, и учитывает application string с префиксом ssh:. Руководство объясняет цель: forwarding SSH-агента не должен неявно превращаться в передачу возможности входить на веб-сайты тем же устройством. Это ограничение модели подписания, а не обещание защиты от всех действий вредоносного процесса. При работе с аппаратным authenticator по-прежнему важно различать сохранённую identity, доступ к агенту, физическое подтверждение и результат серверной проверки. Ни одно из этих состояний не описывает автоматически остальные.

Источники

Принципы журнала и исправления.

ERITKOM / НОВЫЙ ПРОЕКТ

Расскажите о задаче и оставьте контакты. Мы свяжемся с вами, чтобы обсудить проект.

  1. 01 Контакты
  2. 02 Ваша задача