- Вопрос или проблема
- Сначала вы создаете ключ энтропии (так называется созданный артефакт, я думаю), он разблокирует ваш диск (поэтому держите его в безопасности!):
- Установите разрешения, как вы делаете это с любой другой приватной ключевой парой (ssh и т. д.):
- Вставьте его в список доверенных ключей в luks (есть ограничение на количество ключей, хотя это вполне достаточно, это всегда полезно знать):
- Здесь появляется ZuluCrypt, который я упомянул ранее. Он очень удобен для управления ключами, и у него есть интерфейс, если это необходимо или предпочитаете. С помощью команды ниже вы смонтируете его без пароля, но это еще не автоматизировано. Потому что вам все еще нужно поместить процесс в Grub.
- Вот секрет:
- Поместите его в crypttab
- Затем перестройте initram с ним внутри:
- Ответ или решение
Вопрос или проблема
Моя ситуация немного уникальна: Сценарий ~
Я успешно зашифровал свой корневой раздел и загрузочные разделы. Мой загрузочный раздел находится на моем 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-устройстве и лежащий рядом ключевой файл на нешифрованном разделе. Для реализации автоматического расшифрования необходимо:
-
Убедиться, что ваш GRUB поддерживает ключевые файлы. Для этого в командной строке GRUB выполните:
grub> insmod cryptodisk grub> help cryptomount
Если поддержка ключевых файлов отсутствует, обновите GRUB до версии 2.12 или новее.
-
Подготовить систему:
- Убедитесь, что раздел
/boot
зашифрован с использованием LUKS и параметрами--pbkdf=pbkdf2
, так как argon2 пока не поддерживается GRUB. - Используйте пароль с высокой энтропией.
- Убедитесь, что раздел
-
Настроить GRUB:
- В файл
/etc/default/grub
добавьте строкуGRUB_ENABLE_CRYPTODISK=y
. - Запустите
grub-install
с параметром--verbose
, чтобы отслеживать процесс установки.
- В файл
-
Модификация конфигурации GRUB:
Произведите изменения в процессе созданияcore.img
, которое производится командойgrub-mkimage
. Вам необходимо отредактировать файлload.cfg
, добавив в командуcryptomount
параметр для использования ключевого файла, например:-k (hd0,gpt1)/keyfile
. -
Обеспечьте доступность файловых систем, откуда будет загружаться ключевой файл. Возможно, вам потребуется добавить дополнительные модули в 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
. В некоторых случаях стоит пересмотреть подход к безопасности и выбрать методы, которые лучше соответствуют вашим требованиям.