Как автоматически расшифровать зашифрованную файловую систему при следующей перезагрузке?

Цель

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

Система использует LVM.

Я не хочу вводить пароль в системе или использовать другую систему для его разблокировки, он должен разблокировать себя один раз.

У меня есть пароль, которым он зашифрован, и я хотел бы сохранить его в виде открытого текста на жестком диске. На данном этапе меня не интересует безопасность.

Предпосылки

У меня есть поток для развертывания Ubuntu, основанного на установке сервера Ubuntu с пользовательским файлом preseed и kickstart, kickstart устанавливает службу, которая запускается после первой перезагрузки (и только после первой перезагрузки) и затем перезагружается снова. Я пытаюсь реализовать шифрование диска LUKS в этом потоке, но мне нужно, чтобы он оставался неинтерактивным, поэтому он должен иметь возможность перезапускаться в первый раз без пароля.

Пароль, установленный во время установки, является временным и будет изменен службой, которая запускается после первой перезагрузки, поэтому первый пароль может быть сохранен в виде открытого текста.

Вещи, которые я изучил, прежде чем опубликовать этот вопрос

Я приложил немало усилий, чтобы попытаться выяснить это, и большая часть того, что я нашел, указывает на решение, которое заменяет файл initramfs. . [+1112]

Я нашел несколько ресурсов, которые объясняют, как использовать это для удаленной разблокировки системы, но мне нужно делать это без взаимодействия. Вот один из таких ресурсов: https://hamy.io/post/0005/remote-unlocking-of-luks-encrypted-root-in-ubuntu-debian/

Ближайший Решением, которое, как мне кажется, я нашел, является ресурс, который предположительно является способом достижения того, что я хочу для решения VPS, но это просто набор команд без объяснения причин, и я не знаю, как его адаптировать. : https://dradisframework.com/pro/support/guides/customization/auto-unlock-luks-encrypted-drive.html

Я также нашел этот ресурс для ArchLinux https://wiki.archlinux.org/index.php/Dm-crypt/System_configuration#cryptkey, и я попытался добавить параметры ядра, но мне тоже не повезло с этим. Я не знаю, так ли это, потому что LUKS не поддерживает эти параметры ядра.

7
задан 19 January 2018 в 12:26

1 ответ

Решение кажется довольно простым и в некотором роде описано в Как настроить LVM & amp; УДАЧИ автоматически дешифровать раздел?

Вот как мне удалось это сделать

Мой / загрузочный раздел - / dev / sda1

Мой том LVM, который я хочу расшифровать, является / dev / sda3

Я был пользователем root, но если вы не добавляете sudo ко всем командам.

Начните с создания ключевого файла с паролем (я генерирую псевдослучайный)

dd if=/dev/urandom of=/boot/keyfile bs=1024 count=4

Затем установите разрешение на чтение для root и ничего для кого-либо еще

chmod 0400 /boot/keyfile

Затем добавьте keyfile как ключ разблокировки

cryptsetup -v luksAddKey /dev/sda3 /boot/keyfile

(Вам будет предложено ввести пароль шифрования)

Найдите uuid раздела / boot с помощью (для этого не требуется root)

ls -l /dev/disk/by-uuid/

Вот пример того, как выглядит изображение (это не фактический вывод, когда я получил это с другой машины)

test@test:~$ ls -l /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 10 Jan 15 03:36 025c66a2-c683-42c5-b17c-322c2188fe3f -> ../../sda2
lrwxrwxrwx 1 root root 10 Jan 15 03:36 9e7a7336-3b81-4bbe-9f1a-d43415df1ccb -> ../../sda1

Затем отредактируйте / etc / crypttab с помощью любимый редактор

nano /etc/crypttab

Контент будет выглядеть примерно так (опять же, это с другой машины)

sda3_crypt UUID=025c66a2-c683-42c5-b17c-322c2188fe3f none luks,discard

То, что вы хотите сделать, вы хотите заменить нет с / dev / disk / by-uuid / [uuid раздела / boot] , и вы хотите заменить discard на keyscript = / lib / cryptsetup / scripts / passdev

Результат должен выглядеть примерно так

sda3_crypt UUID=025c66a2-c683-42c5-b17c-322c2188fe3f /dev/disk/by-uuid/9e7a7336-3b81-4bbe-9f1a-d43415df1ccb luks,keyscript=/lib/cryptsetup/scripts/passdev

Сохраните файл и продолжите обновление initramfs

update-initramfs -u

Вот и все, теперь вы можете перезагрузиться.

reboot

Чтобы удалить его снова (как я хотел)

Сначала я подтверждаю, что в системе есть только два ключа (исходный и новый файл ключей)

cryptsetup luksDump /dev/sda3 | grep BLED

Это сгенерирует вывод, подобный этому

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

Чтобы удалить ключ в слоте ключа 1 (ключевой файл)

cryptsetup luksKillSlot /dev/sda3 1

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

Затем удалите фактический файл ключей

rm /boot/keyfile

Обновите initramfs еще раз

update-initramfs -u

Теперь, когда вы перезагрузите компьютер, вам снова будет предложено ввести пароль. Вы сделали.

reboot
7
ответ дан 19 January 2018 в 12:26

Другие вопросы по тегам:

Похожие вопросы: