Yubikey для дома и офиса
На приобретение Yubikey меня вдохновил Хабр материал из опубликованной ранее статьи. Может быть, и моё творчество способно вдохновить кого-то на подобные действия, и в результате будут появляться все новые и новые информационные блоки не раскрытых ранее областей применения подобных аппаратных ключей шифрования. Такой своего рода прирост человеческих знаний. IT-гикам будет понятнее, что с такой штукой можно сделать, куда её вставить и как применить по назначению. В статье рассмотрена модернизация входа в учётную запись Windows, работа с GPG шифрованием, в том числе использование Yubikey для SSH как на Linux, так и на Windows, подружим с ним LUKS, а также продемонстрируем работу TOTP аутентификации на примере Github. Материал не носит рекламный характер. Создан гиком для гиков, содержит только материалы практики. Минимум воды и научных изысканий.
Буквально пару месяцев назад стоимость такого аппаратного ключа шифрования составляла около 5 тысяч рублей. Это немало, с учётом того факта, что на рынке можно найти более дешёвые аналоги. Однако разбираться в них не хотелось, особенно, что касается интеграции в управляемую экосистему, поэтому было решено довериться мнению автора, ссылку на статью которого я приводил выше. Особенно с учётом того, что для меня было актуально всё, что в ней раскрыто. Токен был очно приобретён у официального поставщика на окраине Москвы, на что пришлось потратиться в плане личного времени. Нашёл нужную дверь в бизнес-центре, за которой вежливые ребята достали из коробки уже мой Yubikey, после чего и начался немного тернистый путь его интеграции в IT-инфраструктуру. Кстати, схема ниже, взятая на сайте производителя, показывает полный спектр применения аппаратного ключа, и кое-что из неё мы рассмотрим в статье.
Дополню немного о современных реалиях. Повторюсь, что до 24 февраля цена Yubikey составляла около 5 тысяч рублей. Теперь налицо реальные проблемы с его фактическим наличием и слегка подросшей ценой.
▍ Вход в учётную запись Windows
Самое лёгкое, что можно настроить, это дополнительную защиту учётной записи Windows при локальном входе. Открываем официальный сайт, скачиваем необходимую программу в разделе »Computer login tools», устанавливаем её в соответствии с инструкцией, там всё просто. После этого вход в операционную систему будет выглядеть, как показано ниже (картинка взята из официальной документации):
Для Windows 7 привожу иллюстрацию собственного изготовления, не такую красивую, зато handmade:
В процессе будет сгенерирован резервный код, которым можно воспользоваться для входа в операционную систему, если Yubikey будет утерян или недоступен. Записать его можно даже в память головного мозга блокнот, выглядит он примерно так:
D7FGL3J3KHTPA4CL34IVFOEIDIIKJ09JDLCKGI3KSAPME8XF
Применить такой ключ можно сколько угодно раз, однако будьте осторожны. Из личного опыта: были проблемы с повторным использованием резервного кода на некоторых старых версиях операционной системы. Это достаточно забавная ситуация, когда при первой попытке вход в Windows удаётся, а при следующей уже нет. При этом загрузиться с помощью Yubikey возможно. Далее ситуация повторяется. Однако, это исключение из правила, к которому нужно быть готовым.
У кого-то может возникнуть желание полностью отказаться от пароля для учётной записи. Вместо него — есть аппаратный ключ. Однако это не совсем безопасно, ведь сетевой доступ к операционной системе таким образом не защищён, в том числе по протоколу SMB. Другими словами, к общим файлам и папкам подключаемся — как обычно. Yubikey роли не играет.
▍ Работа с GPG шифрованием
Это блок появился благодаря острой необходимости подключения к удалённым серверам по протоколу SSH и желанием иметь секретный ключ, сохранённый в памяти аппаратного девайса. Работать с современным алгоритмом шифрования ed25519-sk, как подробно описано здесь, безболезненно не получится. Всё классно, и нажимать кнопку Yubikey тоже по душе и выглядит очень современно. Однако для работы с ним понадобится программное обеспечение OpenSSH версии 8.2, установленное на удалённом сервере, а это, например, Debian 10. С более старыми версиями операционной системы придётся заурядно поплясать, чего бы я ни рекомендовал делать, чтобы не терять время даром. Дополнительно, в качестве клиента часто выступают Windows-устройства, с установленным Putty, с которым ed25519-sk не умеет работать совсем. Выше озвучен проблемный вопрос. Решением его будет использование GPG шифрования при работе с SSH. Генерируем новые ключи прямо на Yubikey, для этого воспользуемся операционной системой Linux:
gpg --card-edit
admin
key-attr
1 #RSA sign
2048
1 #RSA crypt
2048
1 #RSA auth
2048
generate
n
0
y
...
O
Размер ключа рекомендую использовать 2048 байт, так как с 4096 в дальнейшем будут проблемы совместимости с серверным программным обеспечением. Если всё пройдёт нормально, то выглядеть это будет примерно так (кстати »gpg --card-edit» аналогично работает и в командной строке Windows):
Reader ...........: 0000:0000:000000000000:0
Application ID ...: 0000000000000000000
Application type .: OpenPGP
Version ..........: 3.4
Manufacturer .....: Yubico
Serial number ....: 0000000000
Name of cardholder: am
Language prefs ...: [not set]
Salutation .......:
URL of public key : https://github.com/am.keys
Login data .......: [not set]
Signature PIN ....: not forced
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 3 3
Signature counter : 4
KDF setting ......: off
Signature key ....: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
created ....: 2022-03-05 01:25:37
Encryption key....: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
created ....: 2022-03-05 01:25:37
Authentication key: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
created ....: 2022-03-05 01:25:37
General key info..:
pub rsa2048/0000000000 2022-03-05 my (yubikey)
sec> rsa2048/0000000000 created: 2022-03-05 expires: never
card-no: 0000 00000000
ssb> rsa2048/0000000000 created: 2022-03-05 expires: never
card-no: 0000 00000000
ssb> rsa2048/0000000000 created: 2022-03-05 expires: never
card-no: 0000 00000000
Перечень команд, которые поддерживаются программой GPG, приведу, для ознакомления, под спойлером.
admin
factory-reset
key-attr
info
list
passwd
generate
Commands:
-s, --sign make a signature
--clear-sign make a clear text signature
-b, --detach-sign make a detached signature
-e, --encrypt encrypt data
-c, --symmetric encryption only with symmetric cipher
-d, --decrypt decrypt data (default)
--verify verify a signature
-k, --list-keys list keys
--list-signatures list keys and signatures
--check-signatures list and check key signatures
--fingerprint list keys and fingerprints
-K, --list-secret-keys list secret keys
--generate-key generate a new key pair
--quick-generate-key quickly generate a new key pair
--quick-add-uid quickly add a new user-id
--quick-revoke-uid quickly revoke a user-id
--quick-set-expire quickly set a new expiration date
--full-generate-key full featured key pair generation
--generate-revocation generate a revocation certificate
--delete-keys remove keys from the public keyring
--delete-secret-keys remove keys from the secret keyring
--quick-sign-key quickly sign a key
--quick-lsign-key quickly sign a key locally
--quick-revoke-sig quickly revoke a key signature
--sign-key sign a key
--lsign-key sign a key locally
--edit-key sign or edit a key
--change-passphrase change a passphrase
--export export keys
--send-keys export keys to a keyserver
--receive-keys import keys from a keyserver
--search-keys search for keys on a keyserver
--refresh-keys update all keys from a keyserver
--import import/merge keys
--card-status print the card status
--edit-card change data on a card
--change-pin change a card’s PIN
--update-trustdb update the trust database
--print-md print message digests
--server run in server mode
--tofu-policy VALUE set the TOFU policy for a key
Options:
-a, --armor create ascii armored output
-r, --recipient USER-ID encrypt for USER-ID
-u, --local-user USER-ID use USER-ID to sign or decrypt
-z N set compress level to N (0 disables)
--textmode use canonical text mode
-o, --output FILE write output to FILE
-v, --verbose verbose
-n, --dry-run do not make any changes
-i, --interactive prompt before overwriting
--openpgp use strict OpenPGP behavior
Тоже самое, но уже в Kleopatra (Windows-клиенте для работы с GPG):
Отлично, RSA ключи имеются. Их можно без проблем использовать для шифрования и подписи файлов или даже текста через дружественный интерфейс Kleopatra. Например, открываем блокнот и пишем нужный текст, предварительно указав получателя:
Зашифровано:
Пробуем расшифровать. Разумеется, при обращении к private key — программа запросит PIN от Yubikey:
Теперь применим RSA для SSH. Экспортируем нужный ключ в файл, затем добавим его на удалённый сервер:
gpg --export --armor 000000000000000000000 > yubikey_auth_public.asc
cat yubikey_auth_public.asc >> .ssh/authorized_keys
Осталось настроить агент для GPG службы, чтобы он обращался при необходимости к аппаратному ключу шифрования. Для этого на Windows:
cmd.exe
gpg-connect-agent /bye
C:\Users\Администратор\AppData\Roaming\gnupg\gpg-agent.conf
enable-putty-support
enable-ssh-support
use-standard-socket
default-cache-ttl 600
max-cache-ttl 7200
gpg-connect-agent killagent /bye
gpg-connect-agent /bye
gpg --card-status
Пробуем воспользоваться Putty для подключения к удалённому серверу:
Для автоматизации запуска GPG агента после загрузки Windows подготовим скрипт »gpg-agent.bat, содержащий всего одну строку»:
gpgconf --launch gpg-agent
Далее можно воспользоваться планировщиком, создав простую задачу, которая при запуске компьютера будет исполнять соответствующий сценарий:
Того же результата возможно добиться посредством правки реестра:
regedit.exe
hklm\software\microsoft\windows\currentversion\run\Yubikey
"C:\ gpg-agent.bat"
Можно обойтись и без .bat файла, для этого при создании задачи в разделе Действия указываем Действие «Запуск программы», в Программа или сценарий «gpgconf» и Аргументом »--launch-gpg-agent».
Для настройки GPG агента в Linux выполняем следующие команды:
echo 'enable-ssh-support' > ~/.gnupg/gpg-agent.conf
systemctl --user enable gpg-agent
systemctl --user restart gpg-agent
echo 'export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)' >> ~/.bashrc
ssh root@my.ru
После этого GPG агент запросит PIN код от Yubikey (аналогично Putty), после корректного ввода которого произойдёт подключение к удалённому серверу по SSH протоколу:
login as: root
Authenticating with public key "cardno:00000000000000" from agent
Разберём SSH авторизацию с помощью аппаратного ключа на оборудовании MikroTik и Cisco. Для первого подготавливаем файл, содержащий открытый ключ, по аналогии с Linux сервером, копируем его на устройство и импортируем для нужного пользователя:
cat yubikey_auth_public.asc
ssh-rsa AA...VDX openpgp:0xBB...B
/user ssh-keys import user=admin public-key-file=flash/yubikey_auth_public.asc
Для Cisco немного сложнее. Разбиваем открытый ключ по 100 символов, так как IOS поддерживает не более 254 символов в одной строке. Далее импортируем для нужного пользователя открытый ключ полученными частями:
fold -b -w100 yubikey_auth_public.asc
AA...O
H...9
N...M
e...b
configure terminal
ip ssh pubkey-chain
username admin
key-string
AA...O
H...9
N...M
e...b
exit
show run | beg pubkey
На этом рассмотрение работы с GPG шифрованием закончим. Для кого тема совсем новая и непонятная, рекомендую к чтению свежие материалы с Хабра. Стоит упомянуть, что возможно сохранить уже имеющиеся RSA ключи на Yubikey, что удобно в определённой ситуации. Кроме этого, после генерации RSA ключей на девайсе, работать с ed25519-sk не выйдет, так как слот будет сконфигурирован под другой алгоритм шифрования.
▍ Yubikey и LUKS
Вход в учётную запись Linux с помощью аппаратного ключа шифрования по аналогии с операционной системой Windows настраивать не будем, а сразу перейдём к интеграции Yubikey в LUKS. Кто не в теме, пару слов, что это такое. Linux Unified Key Setup — это стандарт для создания криптоконтейнеров в Linux. Устанавливаем необходимое программное обеспечение и инициируем использование второго слота YubiKey:
apt install yubikey-luks yubikey-personalization scdaemon
ykpersonalize -2 -ochal-resp -ochal-hmac -ohmac-lt64 -oserial-api-visible
Y
Смотрим, где у нас создан криптоконтейнер и добавляем Yubikey для зашифрованного раздела жёсткого диска и раздела подкачки:
cat /etc/crypttab
yubikey-luks-enroll -d /dev/sda5
yubikey-luks-enroll -d /dev/sda6
Сначала нужно будет ввести короткий пароль для ключа в Yubikey, что-то вроде PIN. Затем его повторить. И в последнюю очередь ввести пароль доступа к криптоконтейнеру LUKS. Если всё нормально, то при перезагрузке будет предложено ввести «PIN код» (повторюсь, что-то вроде PIN) от аппаратного ключа шифрования:
Здесь важно отметить, что возможность входа по паролю доступа к криптоконтейнеру LUKS сохранилась. Это будет удобно, когда остро необходимо воспользоваться операционной системой Windows, защищённой с помощью »Computer login tools» от Yubikey и в условиях, когда аппаратного ключа шифрования нет под рукой. Можно без него загрузиться из-под Linux (разумеется, на ноутбуке должны быть установлены соответствующие операционные системы) и выписать на листочек резервный код для входа в Windows. Далее воспользоваться им по назначению, как описано в первой части статьи. «PIN код» может быть достаточно простым, в отличие от пароля LUKS, а использовать его модно и молодёжно.
▍ Работа TOTP аутентификации
Что такое TOTP аутентификация коротко и хорошо описано в статье, на которую я неоднократно ссылаюсь. Здесь рассмотрим этот вопрос с чисто практической стороны на примере Github. Устанавливаем на смартфон бесплатное приложение »Yubico Authenticator»:
Входим в личный кабинет github.com. Переходим в Settings → Password and authentication → Two-factor authentication → Authenticator app:
Далее выполняем действия, предлагаемые дружественным интерфейсом, и привязываем мобильное приложение »Yubico Authenticator» и Yubikey к личному кабинету (этап сканирования QR кода). В процессе будут созданы одноразовые Recovery codes, которые выглядят примерно так:
11111-111111
22222-222222
33333-222222
44444-222222
…
55555-222222
66666-222222
Теперь при входе в личный кабинет Github после ввода логина и пароля нас приветствует окно 2FA:
Authentication code сгенерирует программа на телефоне. Открываем »Yubico Authenticator», подносим вплотную аппаратный ключ к NFC считывателю смартфона. Для моего Iphone — это обратная сторона рядом с камерой:
Когда произойдёт беспроводное считывание, приложением будет сгенерирован Authentication code для ввода в личный кабинет Github, который имеет ограниченное время жизни, визуально выделенное секторально-уменьшающимся серым кружком, расположенным на экране справа:
Другие интернет-сервисы, имеющие возможность двух факторной авторизации на основе технологии TOTP, в том числе те, о которых нельзя говорить и думать вслух, настраиваются аналогичным образом. И их становится с каждым днём всё больше.
▍ Выводы
Подведём итоги. В статье исключительно с практической точки зрения рассмотрены пути применения аппаратного ключа Yubikey, которые могут быть адаптированы как для дома, так и для офиса. Аутентификация в Windows, GPG, SSH, LUKS и TOTP рассмотрены с позиции настройки. Разумеется, двухфакторная аутентификация задумана, чтобы сделать цифровой мир более безопасным. И одной из наиболее перспективных технологий, применяемых в ней, являются аппаратные ключи шифрования. Но между тем, зная, что без Yubikey в учётную запись не войти, можно использовать не криптостойкие пароли, полагаясь на сохранность ключа. И даже использовать один пароль для разных интернет-сервисов, защищённых посредством осязаемого токена, не переживая за инсайдерские и хакерские сливы. Только об этом никому ни слова.