Шифрування дисків LUKS: що робити, коли забули пароль?
LUKS — система надійного шифрування жорстких дисків, розроблена для ОС Linux.
При початковому шифруванні вмісту диска (наприклад, в процесі установки операційної системи), необхідно вказати пароль, який буде використовуватися кожен раз при відкритті розділу LUKS.
Надалі, LUKS-пароль вводиться лише одного разу — під час завантаження ОС, тобто ви можете монтувати й демонтувати шифрований розділ стільки разів, скільки буде необхідно, без повторного введення пароля.
При роботі користувача з системою, що містить LUKS-розділи, можуть виникнути такі кейси:
- ви забули свій пароль LUKS або отримали систему з зашифрованим диском від когось без передачі LUKS-ключа. Після перезавантаження системи, ви не зможете увійти в неї.
- політики безпеки вимагають частої зміни LUKS-паролів. При цьому необхідно змінити LUKS-ключі, не пошкодивши дані розділу
Вісім слотів LUKS
Один LUKS-розділ може відкриватися одним з 8 можливих ключів. Звичайно, можна використовувати і єдиний ключ в одному слоті.
Щоб дізнатися поточний стан всіх слотів, використовується команда cryptsetup luksDump
:
# cryptsetup luksDump /dev/sdb1 | grepSlotSlot
Key0: 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
SlotKey0: 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
SlotKey0: 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
SlotKey0: 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-пароль забутий вже після перезавантаження системи, дороги назад, на жаль, немає.