- Вопрос или проблема
- Чего я хочу достичь:
- Чего я достиг до сих пор:
- Конфигурация
- Случай A
- Случай B
- Что совершенно не сработало
- Ответ или решение
- Достижение единственного запроса пароля при использовании Initramfs и LUKS
- Введение
- Цели
- Приобретенные результаты
- Конфигурация
- Проблема A
- Проблема B
- Неудачные решения
- Решение
- Обновление конфигурации crypttab
- Важно отметить
- Заключение
Вопрос или проблема
Чего я хочу достичь:
- Запрашивать пароль только один раз при загрузке;
- Другие (не root) разделы должны использовать ключевой файл в директории
/root/
.
Чего я достиг до сих пор:
- (A) Система загружается, но запрашивает пароль дважды (один раз для
/
, и один раз для/usr
). - Или: (B) система не загружается, запрашивает пароль один раз, но затем отказывается монтировать
/usr
, говоря, что не может найти группу/том LVM. Я попадаю в оболочку и вижу, что/root/.keyfile
недоступен./
еще не был смонтирован.
Конфигурация
Файл: /etc/crypttab
Случай A
sdc3_crypt /dev/sdc3 none luks
md0_crypt /dev/md0 none luks
Случай B
sdc3_crypt /dev/sdc3 none luks
md0_crypt /dev/md0 /root/.keyfile luks
Что совершенно не сработало
- Создание скриптовых файлов для ручного luksOpen требуемого диска: те, что в
/etc/initramfs-tools/scripts/local-premount
, вызываются до того, как/
становится доступным, но те, что в/etc/initramfs-tools/scripts/local-bottom
, вызываются после того, как система пытается открыть/usr
(поэтому уже слишком поздно).
На этой вики-странице (на немецком, к сожалению, я не нашел эквивалент на английском) предлагается использовать скрипт /lib/cryptsetup/scripts/decrypt_derived
для генерации ключа из открытого корневого устройства. Я постараюсь перевести важные части, но я НЕ пробовал эту процедуру.
Чтобы добавить ключ, вам нужно выполнить (от имени root)
mkdir /mnt/ram && mount -t ramfs -o size=1m ramfs /mnt/ram && chmod 600 /mnt/ram
/lib/cryptsetup/scripts/decrypt_derived <root_dev> > /mnt/ram/tmp.key && cryptsetup luksAddKey <usr_dev> /mnt/ram/tmp.key && rm /mnt/ram/tmp.key
umount /mnt/ram && rmdir /mnt/ram
где <root_name>
— это имя вашего корневого устройства, отображаемое в /dev/mapper
(вероятно, sdc3_crypt
), а <usr_dev>
— устройство, на котором находится /usr
(вероятно, /dev/md0
).
Строка для crypttab выглядит следующим образом:
<usr_name> UUID=<UUID> <root_name> luks,keyscript=/lib/cryptsetup/scripts/decrypt_derived
не забудьте выполнить
update-initramfs -u -k all
после изменения crypttab.
Вы должны сохранить “нормальный” пароль для вашего устройства usr, иначе вы не сможете открыть его в случае повреждения вашего корневого устройства.
Ответ или решение
Достижение единственного запроса пароля при использовании Initramfs и LUKS
Введение
На этапе загрузки системы важно обеспечить удобный и безопасный процесс разблокировки зашифрованных дисков. Если у вас есть корневой раздел и другие разделы (например, /usr
), зашифрованные с использованием LUKS, существует возможность настроить систему так, чтобы ввод пароля происходил только один раз на этапе загрузки, используя ключи, содержащиеся в /root/
. Эта статья детализирует подходы к решению данной задачи.
Цели
- Единый запрос пароля во время загрузки системы.
- Использование ключевого файла, расположенного в каталоге
/root/
, для разблокировки других зашифрованных разделов.
Приобретенные результаты
На текущий момент, вы столкнулись с двумя значительными проблемами во время загрузки:
- Проблема A – система загружается, но требует ввода пароля дважды: один раз для корня (
/
), а второй для раздела/usr
. - Проблема B – система не загружается, запрашивая пароль только один раз и затем отказываясь монтировать
/usr
, что говорит о том, что доступ к LVM группе или тому тому не возможен, так как/root/.keyfile
недоступен.
Конфигурация
Ваши попытки настроить файл конфигурации /etc/crypttab
были следующими:
Проблема A
sdc3_crypt /dev/sdc3 none luks
md0_crypt /dev/md0 none luks
Проблема B
sdc3_crypt /dev/sdc3 none luks
md0_crypt /dev/md0 /root/.keyfile luks
Неудачные решения
Вы пытались использовать скрипты для ручной разблокировки дисков в /etc/initramfs-tools/scripts/local-premount
, однако эти скрипты выполняются до монтирования корневого раздела. Скрипты в /etc/initramfs-tools/scripts/local-bottom
вызываются слишком поздно, когда система уже пытается открыть /usr
.
Решение
Чтобы добиться единственного запроса пароля, рекомендуется воспользоваться скриптом /lib/cryptsetup/scripts/decrypt_derived
, который позволяет генерировать ключи на основе уже открытого корневого устройства. Следуйте приведенной ниже процедуре:
-
Создание временного каталога:
mkdir /mnt/ram && mount -t ramfs -o size=1m ramfs /mnt/ram && chmod 600 /mnt/ram
-
Генерация ключа и добавление его для раздела
/usr
:/lib/cryptsetup/scripts/decrypt_derived <root_dev> > /mnt/ram/tmp.key && cryptsetup luksAddKey <usr_dev> /mnt/ram/tmp.key && rm /mnt/ram/tmp.key
-
Размонтирование временного каталога:
umount /mnt/ram && rmdir /mnt/ram
Где <root_dev>
— это имя вашего корневого устройства (обычно sdc3_crypt
), а <usr_dev>
— это устройство, на котором находится раздел /usr
(например, /dev/md0
).
Обновление конфигурации crypttab
Запись в crypttab
должна выглядеть следующим образом:
<usr_name> UUID=<UUID> <root_name> luks,keyscript=/lib/cryptsetup/scripts/decrypt_derived
Затем не забудьте обновить initramfs:
update-initramfs -u -k all
Важно отметить
Не рекомендуется полностью полагаться на возможность разблокировки без пароля для раздела /usr
, так как это может создать риск в случае повреждения корневого устройства. Поэтому сохраните "нормальный" пароль для вашего устройства /usr
.
Заключение
Применяя описанный подход, вы сможете осуществить разблокировку разделов с помощью единственного пароля при загрузке. Настройка LUKS для оптимизации работы системы — это дело, требующее внимания к деталям и правильной конфигурации, что в конечном итоге будет способствовать как безопасности, так и удобству.