Шифровка жестких дисков LUKS, а также — что делать, когда забыт LUKS-пароль?

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«.

  1 comment for “Шифровка жестких дисков LUKS, а также — что делать, когда забыт LUKS-пароль?

  1. Disko
    12.06.2017 at 13:30

    Вау! Очень полезная статья. И не надо переносить сервера в облако, просто зашифровал данные и все.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *