LUKS — система надежного шифрования жестких дисков, разработанная для ОС Linux.
При начальном шифровании содержимого диска (например, в процессе установки операционной системы), необходимо указать пароль, который будет использоваться каждый раз при открытии раздела LUKS.
В дальнейшем, LUKS-пароль вводится лишь единожды — при загрузке ОС, то есть вы можете монтировать и демонтировать шифрованный раздел столько раз, сколько будет необходимо, без повторного ввода пароля.
При работе пользователя с системой, содержащей LUKS-разделы, могут возникнуть следующие кейсы:
- вы забыли свой пароль LUKS или получили систему с зашифрованным диском от кого-то без передачи LUKS-ключа. После перезагрузки системы, вы не сможете войти в нее.
- политики безопасности требуют частой смены LUKS-паролей. При этом необходимо изменить LUKS-ключи, не повредив данные раздела
Восемь слотов LUKS
Один LUKS-раздел может открываться одним из 8 возможных ключей. Конечно, можно использовать и единственный ключ в одном слоте.
Чтобы узнать текущее состояние всех слотов, используется команда cryptsetup luksDump:
# 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
- ENABLED указывает, что слот уже используется
- в данном случае для шифрованного раздела задано 2 пароля, и свободно еще 6
Добавление нового LUKS-ключа
Для добавления нового ключа LUKS на зашифрованный раздел /dev/sdb1 используется команда luksAddKey:
# cryptsetup luksAddKey /dev/sdb1 Enter any passphrase: Enter new passphrase for key slot: Verify passphrase:
Здесь:
- при запросе “Enter any passphrase:” требуется ввести один из уже имеющихся паролей для LUKS (например, для слотов 0 и 1)
- после этого нужно ввести новый пароль, который займет новый слот соответственно (здесь — слот 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
Добавление нового LUKS-ключа в определенный слот
Вместо назначения ключа LUKS в первый свободный слот, мы можем указать номер определенного слота с помощью опции -S номер_слота (в примере ниже, слот №5):
# 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: ENABLED Key Slot 6: DISABLED Key Slot 7: DISABLED
Удаление существующего ключа
Для удаления определенного ключа используется команда cryptsetup luksRemoveKey, после чего в ответ на приглашение “Enter LUKS passphrase to be deleted:” вводится пароль того ключа, который мы хотим удалить:
# cryptsetup luksRemoveKey /dev/sdb1 Enter LUKS passphrase to be deleted:
Удаление существующего ключа по номеру слота
Чтобы удалить какой-то определенный ключ 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 из файла
Новый ключ LUKS можно добавить из уже существующего файла ключей:
# cryptsetup luksAddKey /dev/sdb1 masterkeyfile Enter any passphrase:
Здесь:
- masterkeyfile задает имя бинарного файла, содержащего ключ LUKS
- при запросе “Enter any passphrase:” вводится любой из существующих паролей для LUKS-раздела /dev/sdb1
- для ключа из masterkeyfile пароль вводить не нужно
Сброс забытого ключа 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
Название тома — все, что следует в строке после /dev/mapper/ (1-й столбец. Так, в нашем примере, имя тома «home1».
Команда dmsetup table –showkeys покажет зашифрованные ключи всех разделов, которые установлены на вашей системе.
# dmsetup table --showkeys home1: 0 197259264 crypt aes-cbc-essiv:sha256 607f482870c795a9b1e307ffbfc6643eaa219e9ef8c6773de02cd298c8fcda3c 0 8:17 4096
Часть поля после «AES-CBC-essiv:sha256» является зашифрованным паролем. Сохраняем его в текстовый файл:
# VI existinglukskey.txt 607f482870c795a9b1e307ffbfc6643eaa219e9ef8c6773de02cd298c8fcda3c
Сброс забытого пароля LUKS — создание двоичного файла ключа
Теперь мы должны преобразовать этот существующий ключ из текстового файла в двоичный файл. Используем команду XXD:
# XXD -r -p existinglukskey.txt existinglukskey.bin
- -r опция ревреса (поскольку нам нужен бинарник из текста)
- -p указывает на непрерывный формат дампа
- existinglukskey.txt — входной файл
- existinglukskey.bin — файла, который будет содержать существующий зашифрованный пароль LUKS в бинарном виде
Сброс забытого ключа LUKS — добавление нового ключа
Наконец, добавляем новый ключ LUKS, используя существующий ключ LUKS, извлеченный в бинарный файл.
# cryptsetup luksAddKey /dev/sdb1 --master-key-file <(cat existinglukskey.bin) Enter new passphrase for key slot: Verify passphrase:
Здесь:
- –master-key-file определяет бинарный файл с ключем
- какой-то существующий пароль luksAddKey не запрашивал, поскольку он взял его из двоичного файла
- при запросе “Enter new passphrase for key slot:”, укажите новый пароль для LUKS. Постарайтесь его не забыть.
Но, если LUKS-пароль забыт уже после перезагрузки системы — обратного пути, увы, нет.
Освоить защиту данных с помощью LUKS, а также множество других инструментов защиты носителей данных и вычислительных сетей, вы можете на нашем авторском курсе «L2 — Security. Безопасность в Linux«.
Вау! Очень полезная статья. И не надо переносить сервера в облако, просто зашифровал данные и все.