Часть 3: Yubikey 4 и LUKS




Введение


В статье рассматривается реализация двухфакторной аутентификации с помощью ключа Yubikey 4 для монтирования зашифрованного раздела LUKS.

Процесс реализации двухфакторной аутентификации с помощью ключа Yubikey 4 для монтирования зашифрованного раздела LUKS можно разбить на три части:

1. Подготовка LUKS раздела.
2. Подготовка к использованию ключа Yubikey 4 в операционной системе.
3. Непосредственно использование ключа Yubikey 4 для двухфакторной аутентификации.

Начальные условия:

  • Linux Mint 18 Sarah 64-bit
  • Yubikey 4

Подготовка LUKS раздела




Необходимо провести предварительный анализ существующего LUKS раздела.

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

Кроме того, неплохо будет ввести дополнительный (резервный) ключ на случай потери (случайной перезаписи) основного ключа. Как дополнительная мера безопасности, может быть создан дамп MasterKey.

Важно отметить, что на реальной системе может использоваться не /dev/sdb1, а другое устройство. Команды в статье даны для иллюстрации. В вашей системе, например, это может быть устройство /dev/sdb5.

Восемь слотов для ключей LUKS


В LUKS для одного зашифрованного раздела используются восемь слотов, в каждом из которых может храниться отдельный ключ. Любой из восьми ключей может быть использован для расшифровки раздела. Можно использовать только один ключ, либо можно назначить все восемь.
Для просмотра всех слотов необходимо воспользоваться командой cryptsetup:

# cryptsetup luksDump /dev/sdb1 | grep Slot

Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

В данном примере:

  • /dev/sdb1 — LUKS раздел.
  • Слоты с ключами начинаются с номера 0. Таким образом, можно использовать слоты с 0 по 7.
  • ENABLED — слот содержит ключ назначенный для раздела LUKS.
  • Два слота назначены для хранения ключей.

Добавление нового ключа


Для добавления нового ключа — парольной фразы — шифрованного раздела LUKS используется команда luksAddKey:

# cryptsetup luksAddKey /dev/sdb1
Enter any passphrase: 
Enter new passphrase for key slot: 
Verify passphrase:

В данном примере:

  • /dev/sdb1 — зашифрованный раздел
  • Enter any passphrase: — ввод уже существующего любого ключа
  • Enter new passphrase for key slot: — ввод нового ключа
  • Verify passphrase: — повторение ввода нового ключа

Новый ключ будет добавлен в следующий по порядку доступный слот. В данном случае, это будет слот 2.

# cryptsetup luksDump /dev/sdb1 | grep Slot
Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: ENABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

Добавление нового ключа в указанный слот


Для добавления ключа в указанный слот используется опция -S с указанием номера слота:

# cryptsetup luksAddKey /dev/sdb1 -S 5

# cryptsetup luksDump /dev/sdb1 | grep Slot
Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: ENABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: <b>ENABLED</b>
Key Slot 6: DISABLED
Key Slot 7: DISABLED

Удаление существующего ключа


Для удаления существующего ключа используется команда luksRemoveKey:

# cryptsetup luksRemoveKey /dev/sdb1
Enter LUKS passphrase to be deleted:

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

# cryptsetup luksDump /dev/sdb1 | grep Slot
Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: ENABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

Удаление ключа


Для удаления ключа используется команда luksKillSlot. Эта команда используется в том случае, если вы не имеете ключа для целевого слота, но просто хотите удалить ключ из этого слота.

Удаление ключа из слота №2. Будет предложено ввести любой назначенный LUKS ключ.

# cryptsetup luksKillSlot /dev/sdb1 2
Enter any remaining LUKS passphrase:

Результат:

# cryptsetup luksDump /dev/sdb1 | grep Slot
Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

Добавление нового LUKS ключа из файла


Также возможно добавление нового ключа из файла:

# cryptsetup luksAddKey  /dev/sdb1 masterkeyfile
Enter any passphrase:

В этом примере:

  • masterkeyfile содержит новый ключ, который вы хотите добавить. Это должен быть двоичный (бинарный) файл.
  • При запросе ввода парольной фразы необходимо ввести любой из существующих ключей для указанного раздела /dev/sdb1.

Результат:

# cryptsetup luksDump /dev/sdb1 | grep Slot
Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: ENABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

Сброс забытого LUKS ключа — установка нового ключа


Если вы перезагрузили (ваш) сервер, и не можете смонтировать ваш зашифрованный LUKS раздел потому что вы забыли ваш LUKS пароль, вариантов у вас нет. Данные потеряны. Придётся вновь работать с разделом (шифровать, возможно переразмечать, создавать файловую систему, наполнять данными).

Однако, если зашифрованный LUKS раздел всё ещё открыт, вы не перезагружали систему и вы забыли LUKS пароль для этого раздела который ещё смонтирован, тогда вы можете назначить новый LUKS ключ.

В сценарии «я забыл мой LUKS пароль» вы можете сделать следующие два шага:

  • Выделить текущий ключ шифрования из LUKS раздела.
  • Создать новый LUKS ключ используя предварительно выделенный ключ.

В этом примере смонтирован раздел /home1, являющийся зашифрованным LUKS разделом, однако неизвестен пароль для него.

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             127G   44G   76G  37% /
/dev/mapper/home1      93G  188M   88G   1% /home1

Имя тома находится в первой колонке вывода команды «df -h» после «/dev/mapper/», в этом примере имя тома «home1».

Следующая команда покажет листинг всех ключей шифрования всех разделов которые смонтированы в системе:

# dmsetup table --showkeys 
home1: 0 197259264 crypt aes-cbc-essiv:sha256 607f482870c795a9b1e307ffbfc6643eaa219e9ef8c6773de02cd298c8fcda3c 0 8:17 4096

Поле после «aes-cbc-essiv:sha256» — зашифрованный пароль. Получим зашифрованный LUKS ключ и сохраним в файл:

# vi existinglukskey.txt
607f482870c795a9b1e307ffbfc6643eaa219e9ef8c6773de02cd298c8fcda3c

Итак, теперь сконвертируем полученный ключ из текстового файла в двоичный файл. Для этого воспользуемся командой «xxd»:

# xxd -r -p existinglukskey.txt existinglukskey.bin

В этом примере:

  • -r опция для обратного преобразования. Это будет конвертировать hexdump в binary.
  • -p опция для обработки postscript. Здесь мне трудно адекватно перевести руководство man (output in postscript continuous hexdump style. Also known as plain hexdump style).
  • existinglukskey.txt входной файл.
  • existinglukskey.bin выходной файл. Он будет содержать существующий зашифрованный LUKS пароль в двоичном файле.

И, наконец, добавим новый LUKS ключ используя выделенный в двоичный файл существующий ключ:

# cryptsetup luksAddKey /dev/sdb1 --master-key-file <(cat existinglukskey.bin)
Enter new passphrase for key slot: 
Verify passphrase:

В этом примере:

  • --master-key-file Определяет двоичный файл. Не используйте входной existinglukskey.txt файл. Используйте выходной existinglukskey.bin файл.
  • Как видно, команда «cryptsetup luksAddKey» не задаёт вопрос о существующем LUKS пароле, так как он берётся из двоичного файла.
  • Когда появляется приглашение командной строки «Enter new passphrase for key slot:», введите новый LUKS пароль. И, в этот раз, не забывайте его.

Дамп LUKS MasterKey


Вы также можете сделать дамп MasterKey и хранить его в безопасном месте. Помните, что используя MasterKey дамп кто угодно может иметь доступ к вашему LUKS разделу.

# cryptsetup luksDump --dump-master-key /dev/sdb1
Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase: 
LUKS header information for /dev/sdb1
Cipher name:    aes
Cipher mode:    cbc-essiv:sha256
Payload offset: 4096
UUID:           146d639a-757c-4bcb-aee6-8fe815345104
MK bits:        256
MK dump:        60 7f 48 28 70 c7 95 a9 b1 e3 07 ff bf c6 64 3e 
                aa 21 9e 9e f8 c6 77 3d e0 2c d2 98 c8 fc da 3c

Итак, используя вышеописанные методы, необходимо для дальнейших действий сделать следующее:

  • Определить устройство(а) с зашифрованным LUKS разделом.
  • Определить, какие слоты свободны для записи ключа(ей).
  • При необходимости — добавить новый ключ (резервный).

Источники
Перевод сделан на основе вот этого сайта.

Полное рассмотрение работы утилиты cryptsetup не входит в рамки данной статьи.
Желающие могут самостоятельно познакомиться с применением и опциями утилиты cryptsetup. Вот ресурсы для начального ознакомления: wiki.archlinux.org, gitlab.com.

Подготовка к использованию ключа Yubikey 4 в операционной системе


Необходимо установить программное обеспечение для работы с ключом Yubikey 4. В системах на основе Ubuntu версий 16.04 и старше выполняются следующие команды:

1. sudo apt-get install yubikey-luks
2. sudo apt-get install yubikey-personalization
3. Вставить в USB слот ключ Yubikey 4 и выполнить команду:

ykpersonalize -2 -ochal-resp -ochal-hmac -ohmac-lt64 -oserial-api-visible

Yubikey имеет два слота. Здесь используется слот №2, таким образом, слот №1 может использоваться в обычном «OTP» режиме.

4. Для «привязки» ключа Yubikey 4 к слоту LUKS используется команда «yubikey-luks-enroll». Исполняемый файл (скрипт) находится по адресу /usr/bin/yubikey-luks-enroll. В скрипте предполагается, что раздел LUKS находится на устройстве /dev/sda5. Если это не так в вашем случае, скопируйте скрипт в свой домашний каталог и откорректируйте строку:

DISK="/dev/sda5"

Необходимо заметить, что существует разница между именованием устройства, используемом для шифрованного раздела в системах с BIOS и UEFI. Для систем загружающихся с использованием BIOS по умолчанию имя тома для шифрования /dev/sda5. Для систем с загрузкой UEFI имя тома по умолчанию для шифрованных разделов /dev/sda3.

5. После корректировки параметров в скрипте yubikey-luks-enroll — запустите его. При выполнении скрипта будет запрошен новый пароль, который будет отправлен на Yubikey 4 для создания ответа (режим challenge-response) и который вы можете использовать для двухфакторной аутентификации при загрузке системы.

Использование ключа Yubikey 4 для двухфакторной аутентификации


  1. Вставьте ключ Yubikey 4 в USB слот компьютера.
  2. Включите компьютер.
  3. В поле ввода пароля введите пароль вызова — пароль созданный при запуске скрипта yubikey-luks-enroll. Нажмите клавишу ввода (Enter) на клавиатуре.
  4. После отправки пароля вызова на ключ Yubikey и получения ответа начнётся процесс расшифровки LUKS раздела, после чего будет загружена операционная система.
  5. После окончания процесса дешифрации ключ Yubikey 4 можно извлечь из слота USB.

В случае утери (отсутствия) ключа Yubikey 4 всё ещё остаётся возможность использовать ранее введённую парольную фразу для дешифрования раздела. Если, конечно, парольная фраза была предварительно введена и сохранена в одном из слотов LUKS раздела.

Заключение



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

Комментарии (21)


  1. nazarpc
    28.05.2017 20:07
    +1

    В случае утери (отсутствия) ключа Yubikey 4 всё ещё остаётся возможность использовать ранее введённую парольную фразу для дешифрования раздела.

    Вы меня, конечно, извините, но какая тогда это двухфакторная аутентификация?


    1. YourChief
      28.05.2017 21:37

      Я так понимаю, пароль к ключу из другого слота.


      1. nazarpc
        28.05.2017 21:49

        И что это меняет? Суть двухфакторной аутентификации в том, что нужно два фактора. А тут всего один.


        1. YourChief
          28.05.2017 21:57

          Тот слот, в котором ключ для юбикея, разблокируется только с помощью пароля и самого ключа. Наличие другого слота LUKS опционально: можно точно так же настроить его на запасной юбикей, можно вообще его не иметь и вместо этого для восстановления пользоваться резервной копией мастер-ключа.


          1. ElderMan
            29.05.2017 06:40

            Точно.


  1. helgihabr
    28.05.2017 20:25

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


    1. YourChief
      28.05.2017 21:11

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


      1. invite_ciel
        29.05.2017 06:31

        А это как же они умудряются расшифровывать симметричный шифр без извлечения непосредственно ключа шифрования в память машины?


        1. YourChief
          29.05.2017 07:00

          Карта содержит только закрытый асимметричный ключ. В распространённых асимметричных криптосистемах, для каждого сеанса или сообщения генерируется «сеансовый» симметричный ключ, который шифруется асимметричным ключом и передаётся вместе с сообщением. Принимающая сторона расшифровывает симметричный ключ, а им — всё сообщение.


    1. YourChief
      28.05.2017 21:28

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


      Я использую свой юбикей в режиме U2F и как OpenPGP-смарткарту. Через смарткарту у меня настроен GPG, который является ещё и SSH-агентом и использует ключ RSA для авторизации на серверах, менеджер паролей, E2E-шифрование почты и IM, подпись тэгов в гите и так далее.


      1. helgihabr
        28.05.2017 21:39

        Понял, спасибо. У нас на проекте внедряют Yubikey для почты, но раз он так крут, буду разбираться как его еще можно использовать. Т.к. у меня до этого было такое впечатление, что утеря Yubikey, как утеря листика с паролем и что любой сможет авторизоваться, например, в почте без пароля.


        1. saipr
          29.05.2017 10:30

          А что мешает использовать для защиты почты (электронная подпись/шифрование) сертификаты x509, которые хранятся вместе с ключом на токенах/смаркартах PKCS#11 ?
          Кстати, можно посмотреть и в сторону облачного токена.


          1. helgihabr
            29.05.2017 10:39

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


      1. welcomerooot
        29.05.2017 09:26

        Какой менеджер паролей используете?


        1. YourChief
          29.05.2017 10:07

          Вот этот: https://www.passwordstore.org. Синхронизирую между разными компьютерами через git.

          Присутствует в стандартных репозиториях. Хранит каждый секрет в шифрованном .gpg файле, который при случае может быть расшифрован самим GPG. Имеет CLI-интерфейс, автодополнение, копирование в буфер обмена со стиранием через 45 секунд.


          1. Tim0n
            29.05.2017 11:18

            А не подскажете менеджер паролей под Windows с полноценной поддержкой Yubikey? Когда-то искал, но безуспешно. То, как реализована поддержка Yubikey в KeePass не устраивает.


            1. YourChief
              29.05.2017 12:01

              Я не пользовался, но про все популярные менеджеры паролей и их интеграцию с Yubikey написано на странице Yubico: https://www.yubico.com/why-yubico/for-individuals/password-managers/.

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

              Для упомянутого выше Pass есть версия для Windows — Pass4Win, но похоже она не развивается. Учитывая, что сам pass устроен довольно просто, то наверное это не является большой проблемой.

              Кроме того, существуют мобильные приложения для работы с GPG ключами: OpenKeychain, который может использовать Yubikey по NFC. В дополнение к нему есть Password Store, интегрируемый с OpenKeychain, который как раз так же шифрует пароли заданным GPG-ключом.


  1. Cheater
    29.05.2017 11:27
    +1

    Часть 3 чего? Нет ссылок на предыдущие части.

    Думаю нелишним будет упомянуть, что у Yubikey закрытые исходники:
    https://github.com/Yubico/ykneo-openpgp/issues/2#issuecomment-218446368

    В то время как на рынке есть и open hardware / open source аналоги, например Nitrokey.


    1. ElderMan
      29.05.2017 12:22

      Часть 3 чего?


      Планируется такой порядок:

      1. Причины выбора ключа Yubikey как второго фактора. ТТХ — там много интересного.
      2. Заказ, оплата, доставка и получение ключа в России.
      3. Yubikey & LUKS.
      4. Yubikey и авторизация в сервисах Google.
      5. Yubikey и PAM модуль авторизации в Linux.
      6. Yubikey как смарткарта.


      у Yubikey закрытые исходники


      Да, это так.
      Тем не менее, можно обратить внимание на достаточно большой круг серьёзных компаний, которые, надо полагать, вполне доверяют решениям от Yubico.

      Может быть — причина вот в этом:
      U2F was created by Google and Yubico, and support from NXP, with the vision to take strong public key crypto to the mass market.


      1. Filippok
        29.05.2017 17:24

        Вторая часть когда планируется? Та, которая про заказ.


        1. ElderMan
          30.05.2017 04:44

          В ближайшее время планирую опубликовать 1 и 2 часть.

          Да, при ближайшем рассмотрении оказалось, что приобрести ключ в России на тот момент было нельзя. Насколько я понимаю, так обстоит дело и сейчас. Поэтому пришлось искать наименее затратный и наиболее быстрый способ заказа, покупки и доставки ключа из-за границы.