На приобретение Yubikey меня вдохновил
Буквально пару месяцев назад стоимость такого аппаратного ключа шифрования составляла около 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) <admin@my.ru>
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 в учётную запись не войти, можно использовать не криптостойкие пароли, полагаясь на сохранность ключа. И даже использовать один пароль для разных интернет-сервисов, защищённых посредством осязаемого токена, не переживая за инсайдерские и хакерские сливы. Только об этом никому ни слова.
Комментарии (27)
13werwolf13
21.04.2022 13:16Windows-устройства, с установленным Putty
а зачем?
1) в windows встроен вот уже не один год как есть нативный ssh клиент собранный под винду из того же openssh
2) не putty единым, есть например Bitvise который предлагается на putty.org ибо он от тех же разрабов уже давно переросших своё первое творениеDeeZ
21.04.2022 14:44По-моему уже есть нативный в самой винде, теперь вообще не надо сторонних ставить.
DeeZ
21.04.2022 14:43+2Когда только появился Yubikey, было ощущение что это просто ключ от всего, который достаточно вставить, отсканировав отпечаток пальца сбоку, и он сам волшебным образом войдет на сайт, в систему, и тд.
Не помню так ли он подавался, или это мое искаженное восприятие так хотело считать.А по факту это просто костыль, в котором хранится RSA ключ. В чем его преимущество перед простым USB токеном за 800р? у меня ровно так же на токене хранятся не извлекаемые ключи, так же я могу логиниться в винду и по SSH на свои сервера (вход в linux просто не было задачи, но думаю тоже можно). Так же лежит ключевой файл от VeraCrypt, от зашифрованного диска.
А какой смысл во втором факторе, защищенным третим фактором - вообще не понятно. Это ровно противоположное тому, что от "ключа" ожидалось вначале. Теперь надо знать логин, пароль, иметь телефон с приложением и токен что бы сгенерироввать OTP, который потом тоже ввести руками.
При всей моей паранойи и включении везде 2 фактора, OTP вводит Keepass автоматически (увы. даже за телефоном иногда лень бежать).Спасибо за статью ) теперь я уверен что оно мне не надо. А так тоже хотел купить.
olegtsss Автор
21.04.2022 16:05Все так и есть. Могу отметить, что Yubikey красивый сам по себе, но с функционалом и его интеграцией все не так просто, как кажется на первый взгляд.
stork_teadfort
21.04.2022 16:27+2Так надо его в качестве WebAuthn-аутентификатора использовать, а не TOTP. Тогда и будет "ключ от всего".
В куче сервисов есть поддержка, в т.ч. в Windows Hello.
Stam_emg
22.04.2022 14:28как обладатель этого ключа, я пока в wh вижу только смену пинкода и его сброс. но я пока не разбирался, как его нормально настроить как смарткарту. использовать плагин из статьи для входа - не вдохновляет.
но на тот же google, ms, ggithub или cloudflare он работает отлично - вставил в usb, ввел пинкод, приложил палец - вошел.
DeeZ
21.04.2022 16:48+3Сейчас вспомнил еще про один страх, когда все яйца в одной корзине. При работе с токенами, иногда сервисы инициализируют токен. прежде чем записать туда свой сертификат и ключ, что разумеется приводит к стиранию всего что ты туда так тщательно складывал.
А учитывая что правильные ключи должны быть неизвлекаемыми - сделать бэкап невозможно в принципе, и шанс махом лишиться доступа ко всему очень высок.
lukasafonov
21.04.2022 16:18-1Yubikey отличный токен, но пару ложек:
они сильно подорожали
при этом их нет в наличии.
Dolios
21.04.2022 17:59Authentication code сгенерирует программа на телефоне. Открываем «Yubico Authenticator»
А возможен вариант без телефона? Чтобы я мог воткнуть ключ в USB порт компьютера и наличие там этого ключа и было вторым фактором?
botka4aet
22.04.2022 10:26-1Наличие такого ключа избавит вас от проблем с терморектальным криптоанализом
Stas911
23.04.2022 06:31Он для работы в корпоративной сети больше удобен. У нас по нему вход в SSO и VPN сделаны. Один раз в день залогинился и нет проблем (ну как нет - дятлы периодически его задевают пальцем и в слак им печатают :))
QuAzI
Это всё удобно/прекрасно ровно до момента когда нужен бэкап, чтобы не протерять всё с одним единственным свистком, и тут резко становится не очень понятно, как это синкать. Поэтому KeePassXC наше всё. А за советы использовать один пароль на всё вообще а-та-та
olegtsss Автор
1) Производитель рекомендует использовать 2 свистка, одновременно привязанных к каждому аккаунту, на случай утери одного из них.
2) Приведите описание рисков по второй части вашего комментария, я расширю статью.
tbp2k5
Тоже завел себе пару свистков, сделал привязку, и т.п. Тем не менее ощущаю дискомфорт: в поездке желательно с собой оба не таскать — риски потери, кражи, и.т.д., но в таком случае сложно добавлять новые сайты/сервисы и держать оба ключа в синхронном состоянии.
olegtsss Автор
Вы используете Yubikey?
tbp2k5
Да, как и вы, я тоже загорелся идеей пощупать эту технологию после предыдущей статьи (той на которую вы ссылаетесь) и взял пару YubiKey 5 NFC. Все в принципе прикольно но есть вопросы для которых я не вижу пока решения:
— синхронизация доступа ключей — уже думал не докупить-ли еще пару (два с собой, два спрятаны) + напоминалки в календарь обновить доступ после возвращения домой. У меня кстати есть смутный воспоминания что некоторые сайты больше двух ключей не берут…
— не появилось пока уверенности в том как оно будет на длительной дистанции — пароль он и в Африке пароль, а как с ключём? К примеру обновился навигатор и сломалась поддержка или что-то на стороне сайта — в общем не покидает ощущение «хрупкости» самой системы использования ключей. У вас оно проявилось в доступе к виндовс — я эту часть не пробовал — мне там удобнее биометрия.
— Не нравиться мне и «видимость» этой части безопасности: знающий человек (на границе например) может специально заинтересоваться «а что это мы тут защищаем». Особенно в наше время когда на границе не гнушаются лазить в телефоны/девайсы (у меня такого опыта не было, и тем не менее)
olegtsss Автор
Вы какие-то другие области применения Yubikey, кроме описанных в статьях, используете ?
tbp2k5
Пока нет — все руки не дойдут…
olegtsss Автор
KeePassXC - да. Но статья про настройку Yubikey.