На сайте компании Wirenboard есть замечательное руководство с описанием защиты доступа по SSH при помощи ключа и дальнейшим запретом авторизации по паролю - подключение к консоли контроллера по SSH.
Принцип заключается в создании двух ключей - открытого и закрытого. Открытый копируется на контроллер, где используется для шифрования соединения, а закрытый остаётся у пользователя и необходим для расшифровки.
Однако, хранить закрытый ключ на жёстком диске или обычной флешке не безопасно. Для этих целей лучше применять специальный ключевой носитель, который обеспечивает двухфакторную аутентификацию. Ключи особым образом генерируются в защищённой области памяти, откуда их в дальнейшем нельзя скопировать.
Почему при использовании ключевого носителя аутентификация становится двухфакторной? Первый фактор - наличие на руках физического носителя, а второй - знание пин-кода, которым снимается блокировка чипа.
Токен можно перемещать с компьютера на компьютер без риска утечки ключевой информации, прятать в сейф или любое другое надёжное место.
В данной статье рассмотрим усиление безопасности в виде генерации неизвлекаемого приватного ключа на активном ключевом носителе Рутокен ЭЦП 3.0.
Существуют различные исполнения под любые потребности - Type-A и Type-C, миниатюрные «микро» и сверхкомпактные «нано», даже цельнометаллические. В отдельных случаях добавляется ещё и третий фактор - для применения ключа необходимо коснуться сенсорной кнопки на корпусе токена, чтобы подтвердить своё присутствие.
Созданная на токене ключевая пара не имеет срока действия, поскольку для доступа по SSH не используется удостоверяющий сертификат.
Подготовка к генерации защищённой ключевой пары в системе Windows 11
Для удобства, вызов утилит командной строки Linux осуществляется через подсистему Windows для Linux (WSL), о работе с которой можно прочесть в отдельной статье. Там рассказывается о том, как подготовить дистрибутив и подключить в него USB-токен, после чего становятся доступны все используемые ниже команды.
Здесь и далее подразумевается использование подсистемы Windows для Linux (предполагается наличие открытого терминала WSL), однако перечисленные действия легко адаптировать к отдельной системе, целиком работающей на базе Linux.
Чтобы принципы и структура команд не отличались от контроллера Wirenboard, в примерах используется дистрибутив Debian.
Подготовка Debian к работе с USB-токеном
После создания учётной записи пользователя и установки пароля понадобится установить несколько дополнительных пакетов.
Прежде всего, выполнить
sudo apt-get update
В ином случае могут возникнуть проблемы с установкой библиотеки PKCS#11.
Установить библиотеки OpenSC и OpenSSH
Набор библиотек и инструментов для доступа к ключевым носителям (смарт-картам и токенам), пакет OpenSSH для конвертации открытого ключа SSH (утилита ssh-keygen):
sudo apt-get install opensc openssh-client
Установить библиотеку PKCS#11
Библиотека, предоставляющая интерфейс RSALabs PKCS#11, является одним из ключевых элементов программного обеспечения Рутокен.
Нас интересует пакет rtPKCS11ecp для GNU/Linux DEB 64-bit (x64). Актуальную версию можно скачать в центре загрузок Рутокен. Пролистываем страничку до раздела «Пользователям GNU/Linux» и выбираем вариант, соответствующий дистрибутиву Debian 64-bit (x64).
По умолчанию WSL устанавливает текущей директорией корневую папку профиля пользователя в Windows.
В терминале Linux переходим в каталог Downloads и выполняем команду установки, подставив в качестве [package_name] название загруженного пакета. Например, librtpkcs11ecp_2.17.3.0-1_amd64.deb (версия на момент написания статьи).
cd Downloads
sudo dpkg -i [package_name]
Сформировать ключевой идентификатор
Для идентификации ключей в pkcs11-tool используется шестнадцатеричный идентификатор ключа. Создать такой идентификатор можно с помощью команды xxd из любой фразы:
echo -n "Wirenboard" | xxd -p
576972656e626f617264
Если xxd отсутствует, установить командой
sudo apt-get install xxd
Генерация ключевой пары на USB-токене
Выполнение следующей команды (одной строкой) сопровождается вводом пин-кода пользователя Рутокен и занимает продолжительное время. Обратите внимание, здесь в параметре --id передаётся ключевой идентификатор, созданный нами на предыдущем шаге.
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --keypairgen --key-type rsa:2048 -l --id 576972656e626f617264
Конвертирование открытого ключа в формат SSH
Создать ключ в текущем расположении Windows (при последовательном выполнении инструкции это папка Downloads):
ssh-keygen -D /usr/lib/librtpkcs11ecp.so -I 0:576972656e626f617264 >> id_rsa.pub
Здесь через -I указан номер слота в токене и после двоеточия - ключевой идентификатор. Результат выполнения операции через оператор перенаправления (две угловые скобки) выводится в файл "id_rsa.pub".
Одна угловая скобка перезаписывает файл, две - дополняют.
Вспомогательные команды
Для просмотра ключей на токене, выполнить
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --list-objects -l
После ввода пин-кода пользователя будет выведен перечень ключей (как закрытых, так и публичных).
Загрузка открытого ключа на контроллер
После генерации ключей нужно загрузить публичный ключ на контроллер. В процессе будет предложено ввести пароль от учётной записи на контроллере.
В PowerShell выполняем команду
type $env:USERPROFILE\Downloads\id_rsa.pub | ssh root@<server_address> "cat >> .ssh/authorized_keys"
<server_address> - здесь и далее адрес контроллера Wirenboard.
Данное действие читает содержимое файла с открытым ключом, который после конвертации утилитой ssh-keygen появился в каталоге Downloads и вносит его в файл authorized_keys на контроллере.
Подключение к контроллеру
В Терминале Windows:
ssh -I "C:\Windows\System32\rtPKCS11ECP.dll" root@<server_address>
Обратите внимание, что перед этим в систему должен быть установлен драйвер Рутокен для Windows.
Если в Терминал добавить профиль для быстрого доступа, то подключение к контроллеру появится в раскрывающемся меню рядом со вкладками.
В терминале Linux:
ssh -I /usr/lib/librtpkcs11ecp.so root@<server_address>
При этом в консоли сперва появляется короткая строчка с приглашением ввести пин-код от токена. После ввода правильного значения соединение устанавливается и на экране отображается стандартное приветствие контроллера.
Послесловие
Встречал утверждение, что предпочтительно использование алгоритма Ed25519 вместо RSA. Если знаете, как подружить его с чипом Рутокен ЭЦП, расскажите в комментариях.