Initramfs + 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

Что совершенно не сработало

  • Создание скриптовых файлов для ручного 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/. Эта статья детализирует подходы к решению данной задачи.

Цели

  1. Единый запрос пароля во время загрузки системы.
  2. Использование ключевого файла, расположенного в каталоге /root/, для разблокировки других зашифрованных разделов.

Приобретенные результаты

На текущий момент, вы столкнулись с двумя значительными проблемами во время загрузки:

  1. Проблема A – система загружается, но требует ввода пароля дважды: один раз для корня (/), а второй для раздела /usr.
  2. Проблема 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, который позволяет генерировать ключи на основе уже открытого корневого устройства. Следуйте приведенной ниже процедуре:

  1. Создание временного каталога:

    mkdir /mnt/ram && mount -t ramfs -o size=1m ramfs /mnt/ram && chmod 600 /mnt/ram
  2. Генерация ключа и добавление его для раздела /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
  3. Размонтирование временного каталога:

    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 для оптимизации работы системы — это дело, требующее внимания к деталям и правильной конфигурации, что в конечном итоге будет способствовать как безопасности, так и удобству.

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

Капча загружается...