Всё больше сервисов переходят на аутентификацию с помощью аппаратных ключей по стандарту FIDO2 (Fast Identity Online), обеспечивая защиту от фишинга и компрометации учётных данных.
Одним из таких решений является Рутокен MFA. В этой статье рассмотрим его использование для защиты SSH-подключений к контроллеру Wiren Board — устройству, применяемому в системах умного дома и автоматизации.
Ранее мы уже исследовали применение Рутокен ЭЦП в аналогичном сценарии, подробности в предыдущей публикации:
Перед продолжением предполагается, что вы уже ознакомились с официальным руководством Wiren Board по настройке SSH. В этой статье фокус сделан на аутентификации с использованием Рутокен MFA, а не на базовой настройке доступа.
Обнаружение в Windows
Устройство не требует установки драйверов и доступно сразу после подключения. В терминале Windows 11 можно вызвать ssh-keygen и сгенерировать ключевую пару ECDSA для работы с контроллером.
Подключение в WSL
Если вы впервые работаете с передачей USB-устройств в WSL, ознакомьтесь с базовым принципом настройки:
Рутокен MFA никак не выделяется из общего списка устройств в выводе команды usbipd list. Он фигурирует там под общим названием «USB-устройство ввода».
Однако в Диспетчере устройств, в разделе Human Interface Devices, появляется запись «HID-compliant fido», что подтверждает его распознавание системой в режиме FIDO2.
Чтобы точно идентифицировать токен, откройте свойства устройства, перейдите на вкладку Сведения и выберите параметр Путь к экземпляру. Сравнив значения VID (Vendor ID) и PID (Product ID) с выводом usbipd list, можно однозначно определить, какое устройство привязывать к WSL.
Подготовка в Linux Debian
Следующая инструкция актуальна как для отдельной инсталляции Linux, так и для подсистемы WSL.
Установите две утилиты — usbutils для проверки списка usb-устройств и fido2-tools для диагностики fido:
yes Y | (sudo apt update && sudo apt install usbutils fido2-tools)
Подключите токен и проверьте список устройств:
lsusb | grep -i fido
Должна появиться запись вида
Bus 001 Device 002: ID 0a89:0093 Aktiv FIDO
Проверьте наличие прав доступа:
fido2-token -L -d
Если попытка чтения токена закончилась ошибкой Permission Denied, потребуется добавить правило udev.
Настройка доступа к токену
Убедитесь, что пользователь состоит в группе plugdev:
getent group plugdev | grep $USER
Если нет — добавьте:
sudo usermod -aG plugdev $USER
Создайте правило udev:
sudo nano /etc/udev/rules.d/90-fido-hidraw.rules
Добавьте строчку:
TAG=="security-device",SUBSYSTEM=="hidraw",GROUP="plugdev",MODE="0660"
Сохраните через сочетание клавиш Ctrl+S и закройте редактор по Ctrl+X.
Примените новое правило:
sudo udevadm trigger
После этого утилита fido2-token сможет получить доступ к токену:
Генерация SSH-ключа на Рутокен MFA
Используйте ssh-keygen и сгенерируйте ключевую пару.
В Linux предварительно понадобится установить пакет openssh-client:
sudo apt install openssh-client
Выполните команду:
ssh-keygen -t ecdsa-sk -O resident -O verify-required -O application=ssh:wirenboard -C "username@wirenboard"
Рассмотрим параметры:
- -t ecdsa-sk — использовать ECDSA-ключ на FIDO2-устройстве (токене)
- -O resident — сохранить ключ на токене как резидентный — можно перечитать позже через ssh-add -L
- -O verify-required — требовать PIN-код при обращении к приватному ключу (если не указать, то для подтверждения понадобится только прикосновение к сенсорной кнопке)
- -O application=ssh:wirenboard — присвоить ключу метку приложения (полезно для идентификации)
- -C "username@wirenboard" — добавить комментарий (не влияет на безопасность, но помогает обнаружить нужный ключ среди прочих записей в authorized_keys).
В результате выполнения будут созданы два файла:
- id_ecdsa_sk — ссылка на приватный ключ в токене (пароль можно не задавать)
- id_ecdsa_sk.pub — публичный ключ, который нужно скопировать на контроллер в ~/.ssh/authorized_keys.
Куда поместить файл id_ecdsa_sk
Файл id_ecdsa_sk необходимо разместить в стандартном каталоге SSH-ключей пользователя.
При работе в Windows (OpenSSH):
C:\Users\username\.ssh\id_ecdsa_sk
При работе в Linux / WSL:
/home/username/.ssh/id_ecdsa_sk
Права доступа к файлу id_ecdsa_sk в Linux / WSL
Отдельно следует отметить настройку прав доступа в Linux. SSH требует строгих ограничений для защиты ключей. Здесь есть два важных условия:
- Владельцем папки и файла является текущий пользователь
- Каталог .ssh имеет права 700, а сам файл — 600.
Быстро проверить, кому принадлежат файлы и какие у них права, поможет команда
ls -la ~/.ssh
Чтобы настроить корректные права, в терминале Linux / WSL выполните следующие команды:
sudo chown $USER:$USER ~/.ssh
chmod 700 ~/.ssh
sudo chown $USER:$USER ~/.ssh/id_ecdsa_sk
chmod 600 ~/.ssh/id_ecdsa_sk
При работе с файловой системой WSL из проводника Windows в ряде случаев владельцем может оказаться root и возникнет сложно диагностируемый отказ в аутентификации. Всегда сверяйте владельца и права после копирования.
Добавление публичного ключа на контроллер
Необязательно использовать сложные команды вроде ssh-copy-id — особенно если у вас уже есть доступ к контроллеру. Проще сделать всё вручную.
1. На локальной машине:
- Откройте файл id_ecdsa_sk.pub в любом текстовом редакторе (например, Notepad, VS Code или nano).
- Скопируйте всю строку целиком. Она выглядит примерно так: ecdsa-sha2-nistp256 AAAAE2... username@wirenboard
2. На контроллере Wiren Board выполните
nano ~/.ssh/authorized_keys
Это откроет встроенный текстовый редактор:
- Если файла нет — он будет создан
- Вставьте скопированное содержимое как отдельную строку.
- Сохраните: Ctrl+S, затем вернитесь в терминал: Ctrl+X.
Подключение по SSH с применением Рутокен MFA
После настройки ключевой пары вы можете подключаться к контроллеру Wiren Board, используя Рутокен MFA как средство аутентификации.
Для этого укажите путь к приватному ключу с помощью флага -i. Команда отличается в зависимости от ОС:
Windows (PowerShell)
ssh -i $env:USERPROFILE\.ssh\id_ecdsa_sk username@192.168.42.1
Linux / WSL
ssh -i ~/.ssh/id_ecdsa_sk username@192.168.42.1
Если интересно разобраться в том, что происходит в этот момент, можно добавить к команде ключ -vvv для вывода подробной информации. Количество «v» в данном случае определяет уровень детализации.
Если ключ сгенерирован с параметром -O verify-required, будет запрошен пин-код. Затем система предложит подтвердить присутствие прикосновением к токену.
Примечание о совместимости с Миртой
Фреймворк Мирта предназначен для разработки сценариев автоматизации на JavaScript и TypeScript в экосистеме Wiren Board (на базе wb-rules).
При деплое решений на контроллер предпочтительнее использовать Рутокен ЭЦП, а не MFA. Основная причина — особенность работы ssh-agent с FIDO2: он не кэширует состояние аутентификации, и каждое SSH-подключение в рамках процесса деплоя требует отдельного подтверждения на токене. Учитывая, что деплой может включать несколько этапов, это создаёт определённые неудобства.
Кроме того, в OpenSSH 10.0p2 наблюдается поведение, при котором ssh-sk-helper интерпретирует запрос PIN-кода (при использовании -O verify-required) как сбой аутентификации, что приводит к её отклонению.
Полезные ссылки
Статья о том, как начать работу с Миртой:
Ссылка на репозиторий (исходные коды) фреймворка:
Выводы
Рутокен MFA реализует поддержку стандарта FIDO2. Ключи, сгенерированные по методу ecdsa-sk в средах с OpenSSH 8.2+, могут применяться для аутентификации по SSH. Использование токена ограничено сценариями, требующими участия пользователя на этапе подтверждения.