[Конкурс 2022] Coreboot и настоящее полнодисковое шифрование вкл. /boot ¶
By: PRSG on 2022-06-20 18 ч.
2. Пути решения проблемы
3. Как это будет работать
4. Сборка coreboot.rom и перепрошивка
5. Установка и настройка ОС
6. Добавим проверку компонентов загрузки
7. Заключение
Предупреждение 1: Все ссылки ведут в clearnet!
Предупреждение 2: Автор не несет ответственности за потерянное время, нервы, файлы, оборудование, здоровье, годы жизни...
Как известно устанавливая GNU/Linux дистрибутив (Ubuntu, Debian, etc) можно включить дисковое шифрование, однако полным оно не является, так как раздел /boot останется открытым чтобы ОС могла загружаться. А это на минуточку, загрузчик и ядро. Пропади устройство из поля вашего зрения и доблестный тащ майор дежурящий под окном воспользуется ситуацией и подменит шаловливыми ручонками важные компоненты и станут все ваши секретики общественным достоянием. А ведь нам оно не надо, безопасность и осторожность излишними не бывают.
В своей предыдущей статье я уже описывал способ установки открытой альтернативы BIOS/UEFI и устранение бекдоров в виде Intel ME и AMD PSP. Здесь же эта инструкция будет дополнена установкой ОС с полноценным полнодисковым шифрованием, развернута доп. настройками и описаны способы претворения этого в жизнь с минимальными усилиями.
1) На Windows полнодисковое шифрование настраивается через TrueCrypt или VeraCrypt. Но если вы тут и все еще сидите на винде, то вскоре будете сидеть в иных местах, так что отметаем сразу. На самом деле в GNU/Linux все быстрее и проще, но об этом дальше.
2) Новомодно-дырявая штука вроде UEFI, которая будет сверять подписи компонентов хранимых в разделе /boot достойна выброса в ту же помойку, где винда. Не только за закрытость, но и за дырявость. Мы ведь никому не верим. (у UEFI есть открытая альтернатива TianoCore, но лучше сделать /boot недоступным даже для просмотра).
3) Один истинный путь:
Если в области открытой ОС выбор обширен, то в области открытых альтернативных BIOS/UEFI вариантов немного:
Coreboot — основной и наиболее продвинутый вариант, все нижеследующее сделано на его базе. Допускает некоторое незначительное количество проприетарного кода (блобов) для запуска того или иного аппаратного обеспечения: драйверов для обнаружения адаптеров, видеокарт, ethernet, части кода для Intel ME и т.д. Coreboot отвечает за инициализацию аппаратного обеспечения во время включения устройства и передачу процесса загрузки дальше по цепочке (т.н. payload, а те в свою очередь уже загрузчику и ядру).
Самый свежий поддерживаемый ноутбук Lenovo ThinkPad T440p, самая свежая матплата MSI PRO Z690-A , кастомные ноутбуки со свежим «железом» выпускает Purism.
Libreboot — ответвление Coreboot, не допускающее наличие блобов, в следствие чего не поддерживает оборудование свежее 2008-2009 годов. Максимально возможный уровень открытости на серийно производимых и все еще доступных устройствах. Процесс сборки и прошивки сильно упрощен в сравнении с Coreboot. Дедушка Столлман пользуется таким на T400s с установленным Trisquel.
Skulls — вариант сборки Coreboot на основе готовых образов для ноутбуков Lenovo (X230, X230t, T430, T530, T440p), упрощенный процесс сборки и прошивки.
osboot — задумка как и в Skulls: упрощение процесса сборки и прошивки для большей части устройств с поддержкой Coreboot, по дефолту включает также payload GRUB2.
Heads — вариант сборки Coreboot на основе готовых образов, содержит инструменты и окружение Linux для создания доверенной цепочки загрузки с использованием ключей GPG и TPM, которые при каждом запуске будут сверять подписи и целостность компонентов прошивки устройства и загрузчика. Установку и настройку простыми не назвать. Рекомендуется использовать в связке с QubesOS. Я не проверял работу SeaBIOS и GRUB2 на нем и вероятно в рамках данной темы он не подойдет. Название перекликается с другой стороной монеты, которая именуется Tails.
1vyrain — модификация заводской прошивки для ноутбуков Lenovo (X230, X230t, T430, T430s, T530, W530), снимает блоки (whitelist) на нештатное оборудование, частично отключает (но не удаляет) Intel ME. Но, самое важное, позволяет прошить Coreboot программным методом не прибегая к программатору, подключению второго устройства, разборке ноутбука, и т.д., но об этом далее.
Таким образом, на первом этапе необходимо выбрать: устройство (чаще всего это ноутбук) из списка поддерживаемого и вариант установки Coreboot наиболее подходящий под ваши умения, а также определиться с дистрибутивом GNU/Linux.
Хозяйке на заметку: ноутбук Lenovo G505s — наиболее производительный ноутбук полностью лишенный бэкдоров в виде Intel ME или AMD PSP. Coreboot поддерживается и рекомендуется.
На этапе сборки Coreboot нам понадобится добавить доп. модули («полезные нагрузки», payload):
SeaBIOS — открытый аналог BIOS, при загрузке нажав Esc можно выбрать диск, флешку, другой payload и т.д.
GRUB2 — с его помощью можно расшифровывать полностью зашифрованный диск и далее загрузить саму ОС.
(опционально): KolibriOS — минималистичная ОС на полтора мегабайта работающая из ОЗУ.
(опционально):
В итоге получится следующая цепочка (как примеры):
Lenovo T440p → Coreboot → SeaBIOS → GRUB2 → Debian
Lenovo T400s → Libreboot → SeaBIOS → GRUB2 → Trisquel
Lenovo X230 → osboot → SeaBIOS → GRUB2 → Hyperbola
Т.е. при включении Coreboot (или его разновидность) инициализирует (запустит) все «железо» и передаст процесс загрузки в SeaBIOS, где нажав Esc мы выберем payload GRUB2, введем пароль от диска и загрузится наша ОС.
Если выбрали Coreboot, то действуем по инструкции из моей предыдущей статьи, но отметим в:
Payload ---> Secondary Payloads ---> Load GRUB2 as a secondary payload
GRUB2 version (2.04) ---> HEAD
Если по каким-то причинам GRUB2 не собирается или не стартует, его можно взять из *.rom собранного в Libreboot или osboot, извлечь:
./build/cbfstool build/*имя*.rom extract -m x86 -n img/grub2 -f grub2.elf
И добавить в ваш *.rom:
./build/cbfstool build/coreboot.rom add-payload -f grub2.elf -n img/grub2 -c lzma
Если выбрали Libreboot: делаем по прекрасной инструкции, payload GRUB2 соберется автоматически, вариант для прошивки выбирайте seabios_withgrub_*_usqwerty.rom.
Если выбрали Skulls: инструкция на сайте, добавлять payload GRUB2 надо вручную.
Пример:
1. run sudo ./skulls.sh -b t440p on your current T440P Linux system
2. Power down, remove the battery. Remove the keyboard and palmrest. Connect a hardware flasher to an external PC (or a Raspberry Pi with a SPI 8-pin chip clip can directly be used), and run sudo ./external_install_bottom.sh on the lower chip and sudo ./external_install_top.sh -b t440p on the top chip of the two.
3. For updating later, run ./skulls.sh -b t440p. No need to disassemble.
Если выбрали osboot: инструкция на сайте, payload GRUB2 соберется автоматически, вариант для прошивки выбирайте seabios_withgrub_*_usqwerty.rom
Пример:
## подготовить:
git clone https://notabug.org/osboot/osbmk
cd osbmk
sudo ./build dependencies debian
## снять дампы и соединить их в один:
cat bottom.rom top.rom > full_backup.bin
## извлечь блобы из дампа:
./blobutil extract x230_12mb full_backup.bin
## собрать прошивку:
./build boot roms x230_12mb
## добавить блобы в прошивку:
./blobutil inject -r x230_osboot.rom -b x230_12mb
Если выбрали Heads: как я и отметил выше
Как только собрали *.rom не спешите его прошивать. Вне зависимости от разновидности Coreboot, создайте файл grub.cfg с текстом:
set prefix=(memdisk)/boot/grub
insmod ahci
insmod crypto
insmod cryptodisk
insmod btrfs
insmod ext2
insmod gcry_rijndael
insmod gcry_sha256
insmod luks
insmod lvm
insmod nativedisk
insmod part_gpt
insmod part_msdos
insmod password_pbkdf2
insmod pbkdf2
insmod regexp
insmod usb_keyboard
insmod usb
insmod usbms
set gfxpayload=keep
set default="0"
set timeout=3
set pager=1
menuentry 'Load Operating System (incl. fully encrypted disks) [o]' --hotkey='o' {
cryptomount -a
set root='(lvm/matrix-rootvol)'
configfile (lvm/matrix-boot)/grub/grub.cfg
}
menuentry 'Poweroff [p]' --hotkey='p' {
halt
}
menuentry 'Reboot [r]' --hotkey='r' {
reboot
}
И добавьте этот grub.cfg в ваш *.rom, например:
./build/cbfstool build/coreboot.rom add -n grub.cfg -f grub.cfg -t raw
(опционально): для KolibriOS: распаковать kolibri.img и выполнить:
./build/cbfstool build/coreboot.rom add -f kolibri.img -n floppyimg/kolibri.lzma -t raw -c lzma
После чего остается прошить *.rom в ваше устройство, обычно аппаратным способом, отсылаю к своей предыдущей статье. Но если выбрали 1vyra1n и ноутбук из поддерживаемых, вот видео как прошить без разборки и программатора или читать под спойлером:
1. First make sure you have a coreboot rom for your laptop ready, then copy it to a usb drive. (you'll need two drives for this)
2. Download 1vyra1n and IVprep
3. copy IVprep on a windows installation and run downgrade.bat NOT as administrator. the laptop will reboot and downgrade itself to the last vulnerable bios
4. prepare a bootable USB with 1vyra1n using rufus
5. reboot to bios setup and do the following:
6. if you have a bios password set, disable it.
7. enable UEFI boot (Boot Options -> UEFI Mode)
8. disable CSM (Boot Options -> Launch CSM)
9. enable bios flashing from non-supervisors and bios rollback (Security -> BIOS)
10. disable secure boot
11. Now connect your laptop to the internet using lan and reboot to the usb drive with 1vyra1n. When prompted, press enter and wait until your device goes to sleep. wake it up (press the power button), then you'll be greeted with a menu.
12. I'm assuming you don't have a web server ready to use with option 2 from 1vyra1n menu. so, like i did, we'll replace the existing unlocked bios rom with coreboot manually.
13. Press Control+C to exit out of the menu, run "lsblk" to find the other usb drive with coreboot on it. now let's say this usb drive is 32gb, you'll find something like this:
14. NAME MAJ:MIN RM SIZE RO TYPE
15. sdX(where X is a letter) 259:0 0 32G 0 DISK
16. now what you need is name and size to make sure you're working with the correct usb drive
17. once you find it, run "mount /dev/sdX /mnt" where X is a letter
18. then, "***** /mnt/coreboot* ~/patched-bioses/ && rm ~/patched-bioses/T430.rom && mv ~/patched-bioses/coreboot* ~/patched-bioses/T430.rom"
19. now run ". ~/start.sh" and press 1 when prompted to flash patched lenovo bios
20. reboot and, assuming you did everything right, welcome to coreboot
Взято отсюда.
После прошивки убедитесь, что все штатно работает, payload`ы грузятся, а Intel ME обрезан:
sudo apt update && sudo apt upgrade
sudo apt install -y git libpci-dev zlib1g-dev
git clone --depth=1 https://review.coreboot.org/coreboot
cd coreboot/util/intelmetool
make
sudo ./intelmetool -m
И только после этого переходите к следующему шагу.
Поисковики по теме "Full Disk Encryption including /boot" чаще всего выдают эту статью про Debian, статью с проекта Hyperbola , либо с проекта Libreboot , хотя последняя скорее запутывает, чем помогает. Много чего лишнего, часть команд (на загрузку) не работает, кое о чем умолчали и как по мне ее давно не проверяли (судя по "apt-get"). Рискну ее исправить и дополнить в силу своего неосилятора и недостаточной красноглазости.
Опишу установку на примере Debian GNU/Linux 11, вы можете выбрать любой другой по желанию, принцип один и тот же: скачать и сверить скачанное с контрольными суммами на сайте и/или проверить gpg подписи, разметить диск и задать названия группы и разделов LVM (как у меня в примерах, либо придумать свои, но не забыть изменить их в grub.cfg), cконвертировать Argon2i в PBKDF2 (либо LUKSv2 переконвертировать в LUKSv1).
1) Берем тут debian-live-11.*-amd64-*.iso.torrent , сверяем хеш сумму скачанного файла, качаем iso образ, устанавливаем на флешку, загружаемся в текстовый или графический установщик.
2) Размечаем диск как на скриншоте 1. Названия разделов LVM в точности также, а размеры дисков и типы ФС на ваш вкус, и добавьте swap раздел если вам нужен создав его также в LVM.
3) Завершив установку, GRUB2 из payload расшифровать диск не сможет — скажет, что неверный пароль. Надо загрузиться с Live системы (можно с той же флешки с Debian 11 с которой была установка) и cконвертировать Argon2i в PBKDF2:
sudo cryptsetup luksConvertKey --pbkdf pbkdf2 /dev/sdX
4) Далее, не перезагружаясь, разблокируем зашифрованный диск и отредактируем файл /etc/default/grub дописав строки:
GRUB_CMDLINE_LINUX="cryptdevice=/dev/mapper/matrix-rootvol:root"
GRUB_ENABLE_CRYPTODISK=y
5) Перезагрузитесь в установленную ОС (пароль расшифровки спросят дважды) и убедитесь, что все работает.
(опционально): Чтобы не вводить пароль расшифровки дважды, выполнить шаги раздела: "4 Avoiding the extra password prompt".
(опционально): Расшифровка из payload GRUB2 будет проходить значительно медленнее обычного, чтобы ускорить загрузку можно снизить кол-во итераций, но это снизит устойчивость к brute-force атаке.
И как обещано в начале: простейший способ установки для самых ленивых:
1) Берем тут debian-live-11.*-amd64-*.iso.torrent , сверяем хеш сумму скачанного торрент-файла, качаем iso образ, устанавливаем на флешку, загружаемся.
2) С рабочего стола запускаем инсталлятор (Calamares), выбираем раскладку и на "Manual partitioning" выбираем наш диск (который желательно заранее полностью форматнуть), "Create partition" и делаем как на скриншоте 2.
3) Далее-далее, устанавливаем имя пользователя и пароль, далее-далее. После окончания установки перезапускаемся.
4) В SeaBIOS достаточно выбрать сам диск, а не payload GRUB2, ввести пароль и загрузиться в ОС.
ОС будет загружаться ровно также даже на штатном BIOS, но советовать так делать я конечно не буду.
Хозяйке на заметку: если вдруг вами установленная не по этой инструкции система не грузится (по этой она грузиться будет), то зайдя в GRUB2 нажмите кнопку E, обратите внимание на пути для запуска ядра и initramfs, измените их при необходимости, дополнение работает через команду TAB.
Этот пункт необязателен, но желателен. Длинное объяснение можете прочесть тут, я объясню короче, а инструкцию опишу подробнее. Термин "hardening" можно перевести как упрочнение, это мы и проделаем. С помощью gpg ключей сделаем проверку подписей компонентов загрузки.
Выполняем команды в папке libreboot/ :
./build module cbutils
./download coreboot
./download grub
./build module grub
grub-mkpasswd-pbkdf2
Придумываете и вводите пароль, результат будет такого вида:
PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.7104DB07CD070F7CAB74EBDF037A74AE67986B84FFD7A045367D5F0427A3A6CAA148FE81039A67BD1FFB726E97C1BA9685033677AEDA8719E7B8ABE465F13369.5C9DBE6AA062F56C6E0F1E4BC681DFC6D92B9C2677B6B1E1468D3F1F4FC25FDD8A1EDA78A69AAD9C467B97BBDA865880ACBFE25EC3384EA29E3227396C322B73
Добавляем в grub.cfg эти строки перед "menuentry":
trust (cbfsdisk)/boot.key
set check_signatures=enforce
set superusers="root"
password_pbkdf2 root grub.pbkdf2.sha512.10000.7104DB07CD070F7CAB74EBDF037A74AE67986B84FFD7A045367D5F0427A3A6CAA148FE81039A67BD1FFB726E97C1BA9685033677AEDA8719E7B8ABE465F13369.5C9DBE6AA062F56C6E0F1E4BC681DFC6D92B9C2677B6B1E1468D3F1F4FC25FDD8A1EDA78A69AAD9C467B97BBDA865880ACBFE25EC3384EA29E3227396C322B73
Теперь нужно сгенерировать ключи и подписать компоненты загрузки (на выбор: либо vmlinuz и initrd.img, либо grub.cfg в /boot/grub/, для примера выберу второе).
Выполняем команды:
mkdir --mode 0700 keys
gpg --homedir keys --gen-key
gpg --homedir keys --export-secret-keys --armor > boot.secret.key # backup
gpg --homedir keys --export > boot.key
gpg --homedir keys --detach-sign grub.cfg
sudo gpg --homedir keys --detach-sign /boot/grub/grub.cfg
Выполняем команды в папке с нашим *.rom:
./build/cbfstool build/coreboot.rom remove -n grub.cfg
./build/cbfstool build/coreboot.rom add -n boot.key -f boot.key -t raw
./build/cbfstool build/coreboot.rom add -n grub.cfg -f grub.cfg -t raw
./build/cbfstool build/coreboot.rom add -n grub.cfg.sig -f grub.cfg.sig -t raw
Снова прошиваем получившийся *.rom в устройство, программным или аппаратным способом.
(опционально): При каждом обновлении ядра придется заново подписывать файлы в /boot на диске (но изменять в *.rom на устройстве ничего не нужно). Как это автоматизировать с помощью скрипта написано здесь.
Итого: при загрузке устройства в SeaBIOS нажимаем Esc выбираем grub2, на вопрос username вводим root, пароль вводим что генерировали к команде grub-mkpasswd-pbkdf2. Затем пароль для расшифровки диска и ждем загрузки ОС.
На этом все. Степень безопасности устройства повышена и оно полностью готово к
Возражения, исправления, критика принимаются. Вероятно, как и в предыдущей статье, повелители командной строки могли бы придумать решения элегантнее, но я отталкивался от умений и знаний среднестатистического пользователя, коим я и являюсь.
мойник@airmail.cc | ключ