На приобретение 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) <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, приведу, для ознакомления, под спойлером.

GPG help
gpg --card-edit --expert
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)


  1. QuAzI
    21.04.2022 12:04
    +5

    Это всё удобно/прекрасно ровно до момента когда нужен бэкап, чтобы не протерять всё с одним единственным свистком, и тут резко становится не очень понятно, как это синкать. Поэтому KeePassXC наше всё. А за советы использовать один пароль на всё вообще а-та-та


    1. olegtsss Автор
      21.04.2022 12:25
      +1

      1) Производитель рекомендует использовать 2 свистка, одновременно привязанных к каждому аккаунту, на случай утери одного из них.

      2) Приведите описание рисков по второй части вашего комментария, я расширю статью.


      1. tbp2k5
        21.04.2022 23:14

        Тоже завел себе пару свистков, сделал привязку, и т.п. Тем не менее ощущаю дискомфорт: в поездке желательно с собой оба не таскать — риски потери, кражи, и.т.д., но в таком случае сложно добавлять новые сайты/сервисы и держать оба ключа в синхронном состоянии.


        1. olegtsss Автор
          22.04.2022 03:18

          Вы используете Yubikey?


          1. tbp2k5
            22.04.2022 10:15

            Да, как и вы, я тоже загорелся идеей пощупать эту технологию после предыдущей статьи (той на которую вы ссылаетесь) и взял пару YubiKey 5 NFC. Все в принципе прикольно но есть вопросы для которых я не вижу пока решения:
            — синхронизация доступа ключей — уже думал не докупить-ли еще пару (два с собой, два спрятаны) + напоминалки в календарь обновить доступ после возвращения домой. У меня кстати есть смутный воспоминания что некоторые сайты больше двух ключей не берут…
            — не появилось пока уверенности в том как оно будет на длительной дистанции — пароль он и в Африке пароль, а как с ключём? К примеру обновился навигатор и сломалась поддержка или что-то на стороне сайта — в общем не покидает ощущение «хрупкости» самой системы использования ключей. У вас оно проявилось в доступе к виндовс — я эту часть не пробовал — мне там удобнее биометрия.
            — Не нравиться мне и «видимость» этой части безопасности: знающий человек (на границе например) может специально заинтересоваться «а что это мы тут защищаем». Особенно в наше время когда на границе не гнушаются лазить в телефоны/девайсы (у меня такого опыта не было, и тем не менее)


            1. olegtsss Автор
              22.04.2022 11:23

              Вы какие-то другие области применения Yubikey, кроме описанных в статьях, используете ?


              1. tbp2k5
                22.04.2022 14:15
                +1

                Пока нет — все руки не дойдут…


    1. olegtsss Автор
      21.04.2022 12:29

      KeePassXC - да. Но статья про настройку Yubikey.


  1. 13werwolf13
    21.04.2022 13:16

    Windows-устройства, с установленным Putty

    а зачем?
    1) в windows встроен вот уже не один год как есть нативный ssh клиент собранный под винду из того же openssh
    2) не putty единым, есть например Bitvise который предлагается на putty.org ибо он от тех же разрабов уже давно переросших своё первое творение


    1. DeeZ
      21.04.2022 14:44

      По-моему уже есть нативный в самой винде, теперь вообще не надо сторонних ставить.


  1. olegtsss Автор
    21.04.2022 13:20

    1) не везде есть

    2) хорошая идея, а что там с поддержкой ed25519-sk?


  1. DeeZ
    21.04.2022 14:43
    +2

    Когда только появился Yubikey, было ощущение что это просто ключ от всего, который достаточно вставить, отсканировав отпечаток пальца сбоку, и он сам волшебным образом войдет на сайт, в систему, и тд.
    Не помню так ли он подавался, или это мое искаженное восприятие так хотело считать.

    А по факту это просто костыль, в котором хранится RSA ключ. В чем его преимущество перед простым USB токеном за 800р? у меня ровно так же на токене хранятся не извлекаемые ключи, так же я могу логиниться в винду и по SSH на свои сервера (вход в linux просто не было задачи, но думаю тоже можно). Так же лежит ключевой файл от VeraCrypt, от зашифрованного диска.

    А какой смысл во втором факторе, защищенным третим фактором - вообще не понятно. Это ровно противоположное тому, что от "ключа" ожидалось вначале. Теперь надо знать логин, пароль, иметь телефон с приложением и токен что бы сгенерироввать OTP, который потом тоже ввести руками.

    При всей моей паранойи и включении везде 2 фактора, OTP вводит Keepass автоматически (увы. даже за телефоном иногда лень бежать).

    Спасибо за статью ) теперь я уверен что оно мне не надо. А так тоже хотел купить.


    1. olegtsss Автор
      21.04.2022 16:05

      Все так и есть. Могу отметить, что Yubikey красивый сам по себе, но с функционалом и его интеграцией все не так просто, как кажется на первый взгляд.


    1. stork_teadfort
      21.04.2022 16:27
      +2

      Так надо его в качестве WebAuthn-аутентификатора использовать, а не TOTP. Тогда и будет "ключ от всего".

      В куче сервисов есть поддержка, в т.ч. в Windows Hello.


      1. Stam_emg
        22.04.2022 14:28

        как обладатель этого ключа, я пока в wh вижу только смену пинкода и его сброс. но я пока не разбирался, как его нормально настроить как смарткарту. использовать плагин из статьи для входа - не вдохновляет.

        но на тот же google, ms, ggithub или cloudflare он работает отлично - вставил в usb, ввел пинкод, приложил палец - вошел.


        1. olegtsss Автор
          22.04.2022 18:33
          +2

          Настроите, присылайте материалы. Расширимся для всех.


    1. DeeZ
      21.04.2022 16:48
      +3

      Сейчас вспомнил еще про один страх, когда все яйца в одной корзине. При работе с токенами, иногда сервисы инициализируют токен. прежде чем записать туда свой сертификат и ключ, что разумеется приводит к стиранию всего что ты туда так тщательно складывал.

      А учитывая что правильные ключи должны быть неизвлекаемыми - сделать бэкап невозможно в принципе, и шанс махом лишиться доступа ко всему очень высок.


  1. lukasafonov
    21.04.2022 16:18
    -1

    Yubikey отличный токен, но пару ложек:

    • они сильно подорожали

    • при этом их нет в наличии.


    1. olegtsss Автор
      21.04.2022 20:09

      В статье я также обращаю на это отдельное внимание.


  1. Dolios
    21.04.2022 17:59

    Authentication code сгенерирует программа на телефоне. Открываем «Yubico Authenticator»

    А возможен вариант без телефона? Чтобы я мог воткнуть ключ в USB порт компьютера и наличие там этого ключа и было вторым фактором?


    1. olegtsss Автор
      21.04.2022 18:09

  1. DrMefistO
    21.04.2022 19:34

    Подскажите, а с гугловским Titan Key оно будет работать?


  1. olegtsss Автор
    21.04.2022 19:46
    -2

    Не подскажу, надо пробовать руками.


  1. botka4aet
    22.04.2022 10:26
    -1

    Наличие такого ключа избавит вас от проблем с терморектальным криптоанализом


  1. Stas911
    23.04.2022 06:31

    Он для работы в корпоративной сети больше удобен. У нас по нему вход в SSO и VPN сделаны. Один раз в день залогинился и нет проблем (ну как нет - дятлы периодически его задевают пальцем и в слак им печатают :))


    1. olegtsss Автор
      23.04.2022 09:31
      -1

      У каждого получается по личному ключу? А VPN какой используете?


      1. Stas911
        23.04.2022 18:07

        Да у каждого по Ubikey 5C Nano, у меня он просто воткнут на постоянку в порт. Как с серверной стороны устроено я не в курсе.