Как автоматически открыть зашифрованный /boot на USB

Вопрос или проблема

Моя ситуация немного уникальна: Сценарий ~

Я успешно зашифровал свой корневой раздел и загрузочные разделы. Мой загрузочный раздел находится на моем USB вместе с /boot/efi на отдельном незашифрованном разделе на USB. Я использую grub, и моя система работает нормально как есть. Но я хотел бы избежать ввода пароля при загрузке (так как я буду держать свой USB в безопасности) и просто зашифровать загрузочный раздел на всякий случай. Таким образом, у меня уже есть ключевой файл, связанный с загрузочным разделом, и он хорошо спрятан и замаскирован, чтобы никто не предположил, что он там находится на незашифрованном разделе /boot/efi внутри USB.

С учетом всего сказанного, как мне настроить grub для использования этого ключевого файла для расшифровки загрузочного раздела при загрузке? (Я видел руководство, демонстрирующее нечто подобное на страницах wiki arch для dm-crypt, но его методы не работали, возможно, они устарели?)

Или есть ли лучший метод обеспечения безопасности моего загрузочного USB? Я даже пытался использовать скрытые тома veracrypt на линуксе с небольшим успехом.

Примечание: Этот ответ фокусируется на том, как заставить GRUB использовать пароль или ключевой файл для автоматической расшифровки /boot. Он не охватывает ничего другого, например, USB-накопители, двухфакторную защиту и т. д. Вам придется адаптировать его самостоятельно.

Вам нужна команда cryptomount GRUB с поддержкой паролей или ключевых файлов.

Вы можете проверить это прямо в консоли Grub:

grub> insmod cryptodisk
grub> help cryptomount
Usage: cryptomount [ [-p password] | [-k keyfile …
                      ^^^^^^^         ^^^^^^

Или в терминале:

$ strings {/boot,/usr/lib}/grub/*/cryptodisk.mod | grep keyfile
[ [-p password] | [-k keyfile …

Если ключевые файлы не поддерживаются, обновите GRUB до версии 2.12 или новее.


Начальная точка — зашифровать /boot стандартным способом Grub. Это описано почти в каждом вики, в основном:

  • используйте LUKS с --pbkdf=pbkdf2 (argon2 не поддерживается GRUB) и, возможно, с --pbkdf-force-iterations=1024 или подобным для уменьшения количества итераций (GRUB очень медленный)
  • используйте пароль с высокой энтропией (на манере XKCD). Обратите внимание, что GRUB также не поддерживает очень большие ключевые файлы.
  • установите GRUB_ENABLE_CRYPTODISK=y в /etc/default/grub
  • запустите grub-install

И результат должен быть примерно таким:

Welcome to GRUB!
Enter passphrase for …: _

Теперь, как автоматизировать это для незапланированной загрузки?

Официально это не поддерживается, поэтому вам придется стать магом.

Это не просто, так как поведение GRUB_ENABLE_CRYPTODISK запрограммировано в grub-install. К счастью, вы можете увидеть немного того, что она делает, если запустите с опцией --verbose. Это производит много вывода, но действительно интересны две строки:

  • grub-install: info: grub-mkimage --directory '/usr/lib/grub/i386-pc' --prefix '(cryptouuid/1bf1…)/grub' --output '/boot/grub/i386-pc/core.img' --format 'i386-pc' --compression 'auto' --config '/boot/grub/i386-pc/load.cfg' … 'cryptodisk' 'luks2' ….
  • grub-install: info: grub-bios-setup --verbose --directory='/boot/grub/i386-pc' --device-map='/boot/grub/device.map' '/dev/sdx'.

Первая строка создает core.img GRUB. Вторая строка устанавливает его на целевое устройство.

В EFI режиме это выглядит немного иначе:

  • grub-install: info: grub-mkimage --directory '/usr/lib/grub/x86_64-efi' --prefix '(cryptouuid/1bf1…)/grub' --output '/boot/grub/x86_64-efi/core.efi' --format 'x86_64-efi' --compression 'auto' --config '/boot/grub/x86_64-efi/load.cfg' … 'cryptodisk' 'luks2' ….
  • grub-install: info: copying `/boot/grub/x86_64-efi/core.efi' -> `/boot/efi/EFI/arch/grubx64.efi'.

Итак, что здесь происходит?

Утилиты GRUB оказались разделены на несколько отдельных бинарных файлов. grub-install устанавливает GRUB, grub-mkimage генерирует core.img / core.efi, grub-bios-setup встраивает core.img в BIOS окружение (или он копируется в случае EFI) и так далее.

Частично из-за этой концепции разделенной утилиты, grub-install генерирует некоторые временные файлы, которые будут использоваться следующей утилитой в многоступенчатом процессе.

В обоих случаях она встраивает файл load.cfg, который выглядит следующим образом:

cryptomount -u 1bf1…

Все, что он делает, это выполняет cryptomount с параметром -u uuid. Здесь вы хотите добавить параметр -k keyfile, или -p password, если предпочитаете.


Итак, все, что нам нужно сделать, это отредактировать этот файл load.cfg, верно? К сожалению, нет. GRUB не использует этот файл при загрузке (он зашифрован, помните?); grub-install не учитывает изменения в этом файле; она переписывает его каждый раз. Если вы попытаетесь обмануть и защитите его от записи, вы даже получите ошибку сегментации…

Так что мы могли бы сделать обертку вокруг grub-mkimage, верно? К сожалению, тоже нет. Хотя сообщение отладки заставляет думать, что grub-install выполняет grub-mkimage, этого на самом деле никогда не происходит. Утилиты GRUB структурированы таким образом, что эти вызовы происходят внутренне. Вы можете полностью удалить grub-mkimage, и grub-install все равно будет работать, даже несмотря на то, что используется grub-mkimage

Так как же внедрить загвоздку в процесс?

Трюк в том, чтобы запустить grub-install с --verbose, извлечь из нее эти две строки, а затем выполнить эти две команды самостоятельно (с вашим собственным load.cfg).

grub-install выполняет всю тяжелую работу: оно обнаруживает вашу конфигурацию, составляет список необходимых модулей GRUB, обнаруживает UUID и строит правильный load.cfg и командную строку grub-mkimage, и встраивает все.

Вы берете это, строите пользовательский core.img и устанавливаете его.


Некоторые подводные камни: grub-install не знает, что вы собираетесь загрузить ключевой файл с другого раздела и файловой системы. Возможно, вам придется встроить дополнительные модули GRUB в core.img, чтобы поддерживать это, что можно сделать с помощью grub-install --modules="…" (список отсутствующих модулей через пробел).

Если вы хотите написать более сложный load.cfg, вы можете попытаться сделать это, но не все работает; эта конфигурация по-прежнему выполняется в режиме с ограниченными функциями. Переключение на нормальный режим GRUB происходит только после того, как вы расшифруете /boot.

Таким образом можно легко сломать GRUB (и не только). Имейте другой загрузочный накопитель для аварийной загрузки. Вы также можете поместить свой кастомный grub.efi под отдельным именем и зарегистрировать его с efibootmgr (также показано в grub-install --verbose). Таким образом, вы сможете выбрать официальный/ручной vs. ваш кастомный/автоматизированный вариант в меню загрузки EFI.


Короче говоря:

  • запустите grub-install с --verbose и сохраните его вывод (перенаправление в оболочке или выделенное окно терминала)
  • отредактируйте load.cfg, например, добавьте -p mysecretpassword или -k (hd0,gpt1)/keyfile или подобное к команде cryptmount (проверьте эти команды в оболочке grub заранее)
  • запустите grub-mkimage (как показано grub-install --verbose)
  • запустите grub-bios-setup или скопируйте файл core.efi (как показано grub-install --verbose)

И если вы сделали это правильно, GRUB будет полностью расшифровывать /boot без взаимодействия с пользователем:

Welcome to GRUB!
Slot "0" opened

PS: Помните, все, что вы помещаете в core.img, не является большим секретом.

$ binwalk --lzma --extract core.img
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
3344          0xD10           Raw LZMA compression stream, properties: 0x5D [pb: 2, lp: 0, lc: 0], dictionary size: 33554432
$ strings _core.img.extracted/D10 | grep cryptomount
cryptomount
cryptomount -u … -p MyNotVerySecretPassword

Так что в случае пароля или ключевого файла на том же устройстве это не более чем обычная обфускация.

Кроме того, сам GRUB раскрывает ключ тома в оболочке GRUB:

grub> cat (proc)/luks_script
luks2_mount … aes-xts-plain64 e7385a067a6e8b…

Дружище, я долгое время использовал KickSecure (дистрибутив на базе Debian с концепцией нативного усиления безопасности и т. д.) с шифрованием, но в какой-то момент я устал от этого и начал исследовать. Они использовали ZuluCrypt для управления этим. На тот момент я увидел, что мне нужно сделать процесс и так далее, поэтому я сохранил это здесь (я сохранил все) в скрипте на всякий случай. Я объясню тебе в целом, потому что прошло много времени, но если тебе нужно больше деталей, я вернусь и постараюсь просветить тебя больше. В любом случае, вот скрипт:

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

sudo dd if=/dev/random of=keyfile.bin bs=64 count=1

Установите разрешения, как вы делаете это с любой другой приватной ключевой парой (ssh и т. д.):

sudo chmod 600 keyfile.bin

Вставьте его в список доверенных ключей в luks (есть ограничение на количество ключей, хотя это вполне достаточно, это всегда полезно знать):

sudo cryptsetup luksAddKey /dev/sdX keyfile.bin

Здесь появляется ZuluCrypt, который я упомянул ранее. Он очень удобен для управления ключами, и у него есть интерфейс, если это необходимо или предпочитаете. С помощью команды ниже вы смонтируете его без пароля, но это еще не автоматизировано. Потому что вам все еще нужно поместить процесс в Grub.

sudo zuluCrypt-cli -o -d /dev/sdX -f keyfile.bin -m usbCrypt

Начиная отсюда, вот процесс вставки его в grub:

sudo mv keyfile.bin /root/keyfile.bin
sudo chmod 600 /root/keyfile.bin

Вот секрет:

Поместите его в crypttab

echo "usbCrypt /dev/sdX /root/keyfile.bin luks" | sudo tee -a /etc/crypttab

Затем перестройте initram с ним внутри:

sudo update-initramfs -u

Но после использования этого таким образом в течение некоторого времени я много думал об этом, и как-то потерял смысл в том, чтобы иметь шифрование, которое не требует ключа, так как оно уже встроено в таблицу. Поэтому я отформатировал и переустановил без этого. Сегодня я чувствую себя счастливее, прирост производительности был действительно значительным для меня. Большой SSD с множеством данных, чем больше данных, тем хуже становилось.

Но это все, надеюсь, я помог!

.

Ответ или решение

Ваша задача заключается в автоматическом открытии зашифрованного раздела /boot на USB-носителе, минуя ввод пароля, и использованию ключевого файла для этого процесса. Решение подобной задачи требует глубокого понимания процесса шифрования и работы загрузчика GRUB, поскольку последнему необходимо добавить функциональность, которая не поддерживается из коробки для шифрования /boot.

Теория:

Загрузчик GRUB версии 2.x поддерживает шифрование разделов с использованием LUKS, но автоматическое использование ключевого файла для расшифровки при загрузке официально не поддерживается. Основная сложность заключается в том, что GRUB должен получить доступ к ключевому файлу до включения механизмов, позволяющих расшифровать и загрузить /boot. По умолчанию, GRUB использует команду cryptomount для монтирования зашифрованного раздела, где можно указать UUID раздела и, теоретически, ключевой файл, но этот способ не всегда работает без дополнительных вмешательств.

Пример:

Процесс описывается следующим образом. Предположим, у вас есть LUKS-зашифрованный раздел /boot на USB-устройстве и лежащий рядом ключевой файл на нешифрованном разделе. Для реализации автоматического расшифрования необходимо:

  1. Убедиться, что ваш GRUB поддерживает ключевые файлы. Для этого в командной строке GRUB выполните:

    grub> insmod cryptodisk
    grub> help cryptomount

    Если поддержка ключевых файлов отсутствует, обновите GRUB до версии 2.12 или новее.

  2. Подготовить систему:

    • Убедитесь, что раздел /boot зашифрован с использованием LUKS и параметрами --pbkdf=pbkdf2, так как argon2 пока не поддерживается GRUB.
    • Используйте пароль с высокой энтропией.
  3. Настроить GRUB:

    • В файл /etc/default/grub добавьте строку GRUB_ENABLE_CRYPTODISK=y.
    • Запустите grub-install с параметром --verbose, чтобы отслеживать процесс установки.
  4. Модификация конфигурации GRUB:
    Произведите изменения в процессе создания core.img, которое производится командой grub-mkimage. Вам необходимо отредактировать файл load.cfg, добавив в команду cryptomount параметр для использования ключевого файла, например: -k (hd0,gpt1)/keyfile.

  5. Обеспечьте доступность файловых систем, откуда будет загружаться ключевой файл. Возможно, вам потребуется добавить дополнительные модули в GRUB для поддержки необходимых файловых систем, например:

    grub-install --modules="nыбecake fshelp fshelp2"

Применение:

Теперь, имея команду grub-mkimage с кастомным load.cfg, необходимо завершить процесс установки GRUB, используя команды, подробно представленные вами (например, grub-bios-setup для BIOS или копирование core.efi для EFI). Это позволит вам создать загрузочный образ, использующий ключевой файл для расшифровки /boot без ручного ввода пароля. После такой конфигурации система будет загружаться автоматически, если USB с ключевым файлом подключен:

Welcome to GRUB!
Slot "0" opened

Важно: Тщательно протестируйте изменения на запасной системе или через установку параллельной записи в UEFI (если применимо), чтобы избежать потери доступа к вашим данным. Необходимо учитывать, что ключ в core.img минимально защищен и его использование должно принимать во внимание возможность компрометации, если физический доступ к устройству не ограничен.

В целом, если вы действительно обеспокоены компрометацией, использование закрытых ключей для защиты может обеспечить более высокую безопасность, чем простое обфусцирование в core.img. В некоторых случаях стоит пересмотреть подход к безопасности и выбрать методы, которые лучше соответствуют вашим требованиям.

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

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