Технологии безопасности

Сайт посвященный вопросам безопасности

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

(adsbygoogle = window.adsbygoogle || []).push({});

Часть 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

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

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

Удаление ключа из слота №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 для двухфакторной аутентификации

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

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

Заключение

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