О UEFI Сравнение версий

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
wiki:uefi [2019/03/21 18:38]
Sly_tom_catSly_tom_catSly_tom_catXubuntu 18.04 (64bit)Don't worry, be happy! [Создание UEFI ключей]
wiki:uefi [2019/10/13 03:12] (текущий)
Sly_tom_catSly_tom_catSly_tom_catXubuntu 18.04 (64bit)Don't worry, be happy! [Загрузка ядра Linux непосредственно из UEFI]
Строка 251: Строка 251:
  
 Кроме того, все известные сертификаты от разработчиков linux (Canonical, Fedora, AltLinux, openSUSE и др.) - тоже само-подписанные,​ их вы можете найти в на сайте проекта [[http://​www.rodsbooks.com/​refind/​|rEFInd]] или в проекте [[https://​github.com/​slytomcat/​UEFI-Boot/​tree/​master/​keys|UEFI-Boot на github]]</​note>​ Кроме того, все известные сертификаты от разработчиков linux (Canonical, Fedora, AltLinux, openSUSE и др.) - тоже само-подписанные,​ их вы можете найти в на сайте проекта [[http://​www.rodsbooks.com/​refind/​|rEFInd]] или в проекте [[https://​github.com/​slytomcat/​UEFI-Boot/​tree/​master/​keys|UEFI-Boot на github]]</​note>​
-==== Создание хранилища ключей ​=====+=== Создание хранилища ключей ===
 Далее нам потребуется создать хранилище ключей в стандартном месте, где утилита sbkeysync будет их искать. Далее нам потребуется создать хранилище ключей в стандартном месте, где утилита sbkeysync будет их искать.
  
Строка 261: Строка 261:
 На самом деле вы можете создать хранилище где угодно и указать утилите sbkeysync где оно находится в значении ключа --keystore. На самом деле вы можете создать хранилище где угодно и указать утилите sbkeysync где оно находится в значении ключа --keystore.
  
-==== Загрузка ключей ​==== +=== Загрузка ключей === 
-=== Через утилиту прошивки ​=== +== Через утилиту прошивки == 
 Загрузка ключей в UEFI может быть выполнена из утилиты настройки вашей материнской платы. Там нужно будет найти раздел (обычно Security) где задаются параметры SecureBoot. Возможно потребуется явно разрешить работу с ключами - выбрать режим управления ключами custom или как либо еще. Загрузка ключей в UEFI может быть выполнена из утилиты настройки вашей материнской платы. Там нужно будет найти раздел (обычно Security) где задаются параметры SecureBoot. Возможно потребуется явно разрешить работу с ключами - выбрать режим управления ключами custom или как либо еще.
 Попав в окно утилиты по управлению ключами,​ первым делом сохраните (на всякий случай) фабричные ключи((Если ваша прошивка предоставляет опцию установки/​восстановления фабричных ключей,​ то свою резервную копию фабричных ключей вам создавать не обязательно.)). После этого удалите все фабричные ключи, и по одному добавляйте ключи из вашего хранилища ключей (скорее всего, его придется перенести на ESP раздел,​ т.к. только этот раздел доступен для UEFI).\\ Попав в окно утилиты по управлению ключами,​ первым делом сохраните (на всякий случай) фабричные ключи((Если ваша прошивка предоставляет опцию установки/​восстановления фабричных ключей,​ то свою резервную копию фабричных ключей вам создавать не обязательно.)). После этого удалите все фабричные ключи, и по одному добавляйте ключи из вашего хранилища ключей (скорее всего, его придется перенести на ESP раздел,​ т.к. только этот раздел доступен для UEFI).\\
Строка 269: Строка 269:
  
 Следует также отметить,​ что формат,​ в котором прошивка умеет загружать ключи может разниться в разных прошивках UEFI. Например прошивка AMI из недавно купленного мини-PC может взять сертификат и из подготовленного контейнера,​ и непосредственно из файла .pem. Т.о. вся эта возня со специальными контейнерами,​ в этом случае,​ вовсе не нужна: один и тот же само-подписанный сертификат можно загрузить и в PK, и в KEK, и в db.    ​ Следует также отметить,​ что формат,​ в котором прошивка умеет загружать ключи может разниться в разных прошивках UEFI. Например прошивка AMI из недавно купленного мини-PC может взять сертификат и из подготовленного контейнера,​ и непосредственно из файла .pem. Т.о. вся эта возня со специальными контейнерами,​ в этом случае,​ вовсе не нужна: один и тот же само-подписанный сертификат можно загрузить и в PK, и в KEK, и в db.    ​
-=== Используя sbkeysync ​=== +== Используя sbkeysync ==
 Если UEFI находится в Setup режиме,​ то ключи можно загрузить и из ОС, используя утилиту sbkeysync. Но для начала воспользуйтесь опцией --dry-run, что бы убедится,​ что у вас все верно настроено и готово к этому важному процессу:​ Если UEFI находится в Setup режиме,​ то ключи можно загрузить и из ОС, используя утилиту sbkeysync. Но для начала воспользуйтесь опцией --dry-run, что бы убедится,​ что у вас все верно настроено и готово к этому важному процессу:​
  
Строка 303: Строка 303:
 <note important>​Будьте предельно осторожны выполняя загрузку ключей,​ т.к. как только PK будет записан прошивка UEFI перейдет в режим User, а в некоторых прошивках это еще автоматом включит SecureBoot режим. Вы должны быть уверены,​ что прошивка UEFI позволит вам вернутся в Setup режим и/или удалить PK.</​note>​ <note important>​Будьте предельно осторожны выполняя загрузку ключей,​ т.к. как только PK будет записан прошивка UEFI перейдет в режим User, а в некоторых прошивках это еще автоматом включит SecureBoot режим. Вы должны быть уверены,​ что прошивка UEFI позволит вам вернутся в Setup режим и/или удалить PK.</​note>​
 <​note>​Некоторые прошивки требуют перезагрузки для применения этих изменений в переменных UEFI. Прежде чем вы выполните перезагрузку,​ обязательно подпишите ваш загрузчик,​ иначе просто ничего не загрузится,​ ведь SecureBoot активирован и в db прописан ключ, которым будет проверяться подпись любого кода, который будет загружаться UEFI.</​note>​ <​note>​Некоторые прошивки требуют перезагрузки для применения этих изменений в переменных UEFI. Прежде чем вы выполните перезагрузку,​ обязательно подпишите ваш загрузчик,​ иначе просто ничего не загрузится,​ ведь SecureBoot активирован и в db прописан ключ, которым будет проверяться подпись любого кода, который будет загружаться UEFI.</​note>​
-==== Подписывание загрузчика ​====+=== Подписывание загрузчика ===
 Т.к. мы активировали SecureBoot, то теперь нам нужно подписать наш загрузчик что бы он мог быть загружен UEFI в этом режиме. ​ Т.к. мы активировали SecureBoot, то теперь нам нужно подписать наш загрузчик что бы он мог быть загружен UEFI в этом режиме. ​
 В нашем примере мы подпишем код загрузчика GRUB2. В нашем примере мы подпишем код загрузчика GRUB2.
Строка 314: Строка 314:
 Теперь,​ можно скрестить пальцы,​ плюнуть три раза через левое плечо ;-) и попробовать перегрузиться :-o Теперь,​ можно скрестить пальцы,​ плюнуть три раза через левое плечо ;-) и попробовать перегрузиться :-o
  
-==== Возврат в режим Setup ====+=== Возврат в режим Setup ===
 Переключаться обратно в режим Setup лучше всего из прошивки UEFI, однако теоретически это возможно и внутри OS. Т.к. мы имеем секретный ключ от нашего PK, мы можем попробовать вернуть UEFI из режима User в режим Setup. Для этого потребуется подготовить пустой ключ и записать его в переменную PK: Переключаться обратно в режим Setup лучше всего из прошивки UEFI, однако теоретически это возможно и внутри OS. Т.к. мы имеем секретный ключ от нашего PK, мы можем попробовать вернуть UEFI из режима User в режим Setup. Для этого потребуется подготовить пустой ключ и записать его в переменную PK:
  
Строка 446: Строка 446:
 <​code>​bcfg driver add 0 EFI\drivers\ext2_x64.efi "​EXT2-4 Driver"</​code>​ <​code>​bcfg driver add 0 EFI\drivers\ext2_x64.efi "​EXT2-4 Driver"</​code>​
  
-Все замечательно и этот драйвер,​ при каждом запуске системы,​ будет загружаться во время инициализации UEFI автоматически,​ но ремапинга не будет. Для того, что бы после загрузки драйвера инициировать ремапинг нужно в опции загрузки драйвера указать специальный атрибут LOAD_OPTION_FORCE_RECONNECT,​ однако ни одной командой UEFI-Shell или опцией efibootmgr этот атрибут не установить (по крайней мере мне не удалось найти такой команды). Перелопатив спецификацию UEFI можно понять,​ что нужно то всего прописать значение 3 вместо 1 в первом 32-битном слове UEFI переменной отвечающей за загрузку драйвера (той самой Driver0000, что мы создали командой bcfg или efibootmgr). Сделать это изменение можно любым HEX редактором (из загруженной системы),​ запущенным с правами рута, в котором на редактирование открывается файл /​sys/​firmware/​efi/​efivars/​Driver0000-8be4df61-93ca-11d2-aa0d-00e098032b8c (это маппинг в файловую систему sys переменной UEFI). В редакторе нужно 5-й байт от начала поменять с значения 01 на 03 и сохранить файл.+Все замечательно и этот драйвер,​ при каждом запуске системы,​ будет загружаться во время инициализации UEFI автоматически,​ но ремапинга не будет. Для того, чтобы после загрузки драйвера инициировать ремапинг нужно в опции загрузки драйвера указать специальный атрибут LOAD_OPTION_FORCE_RECONNECT,​ однако ни одной командой UEFI-Shell или опцией efibootmgr этот атрибут не установить (по крайней мере мне не удалось найти такой команды). Перелопатив спецификацию UEFI можно понять,​ что нужно то всего прописать значение 3 вместо 1 в первом 32-битном слове UEFI переменной отвечающей за загрузку драйвера (той самой Driver0000, что мы создали командой bcfg или efibootmgr). Сделать это изменение можно любым HEX редактором (из загруженной системы),​ запущенным с правами рута, в котором на редактирование открывается файл /​sys/​firmware/​efi/​efivars/​Driver0000-8be4df61-93ca-11d2-aa0d-00e098032b8c (это маппинг в файловую систему sys переменной UEFI). В редакторе нужно 5-й байт от начала поменять с значения 01 на 03 и сохранить файл.
 <note important>​После серии окирпиченных патчем Бармина машин (см. ниже эту замечательную историю) все UEFI переменные теперь защищены от изменений специальным атрибутом. Снять его перед редактированием можно командой chattr -i от рута. <note important>​После серии окирпиченных патчем Бармина машин (см. ниже эту замечательную историю) все UEFI переменные теперь защищены от изменений специальным атрибутом. Снять его перед редактированием можно командой chattr -i от рута.
  
 Хорошим тоном будет вернуть защиту после редактирования командой chattr +i </​note>​ Хорошим тоном будет вернуть защиту после редактирования командой chattr +i </​note>​
  
-<note important>​Я конечно понимаю,​ что такой хакерский метод - это уже просто за гранью разумного для большинства пользователей UBUNTU, но пока мне не удалось найти другого пути задать атрибут LOAD_OPTION_FORCE_RECONNECT в опции загрузки драйвера((Поэтому я завел [[https://​github.com/​rhboot/​efibootmgr/​issues/​108|ишью на гитхабе]] с просьбой автору efibootmgr реализовать эту возможность)). </​note>​+<note important>​Я конечно понимаю,​ что такой хакерский метод - это уже просто за гранью разумного для большинства пользователей UBUNTU, но пока мне не удалось найти другого пути задать атрибут LOAD_OPTION_FORCE_RECONNECT в опции загрузки драйвераПоэтому я завел [[https://​github.com/​rhboot/​efibootmgr/​issues/​108|ишью на гитхабе]] с просьбой авторам efibootmgr реализовать эту возможность. Позднее я даже оформил [[https://​github.com/​rhboot/​efibootmgr/​pull/​109|PR]] (Pull Requestс реализацией этой возможности. Однако этот PR добавили в мастер ветку только 7 месяцев спустя. И, видимо,​ эта новая возможность efibootmgr появится в версии 17. 
 +</​note>​
    
 После нашей хакерской атаки на UEFI 8-) можно перегрузиться в UEFI-Shell и там прямо при запуске увидеть,​ что все EXT4 разделы уже отмаплены в FS<n> "​диски",​ а значит на них можно сослаться при задании команды загрузки для опции загрузки ОС. После нашей хакерской атаки на UEFI 8-) можно перегрузиться в UEFI-Shell и там прямо при запуске увидеть,​ что все EXT4 разделы уже отмаплены в FS<n> "​диски",​ а значит на них можно сослаться при задании команды загрузки для опции загрузки ОС.
Строка 480: Строка 481:
 <note important>​Загрузка,​ организованная одним из вышеописанных способов,​ не требует наличия загрузчика (GRUB и Shim можно и нужно удалить из системы),​ ведь мы передаем UEFI все функции загрузчика ОС.  <note important>​Загрузка,​ организованная одним из вышеописанных способов,​ не требует наличия загрузчика (GRUB и Shim можно и нужно удалить из системы),​ ведь мы передаем UEFI все функции загрузчика ОС. 
  
-Устранение из процесса загрузки загрузчиков (оригинально это цепочка из двух: shim + GRUB) заметно (но не так что бы очень значительно) сокращает время загрузки ОС. Вот как это выглядит в цифрах на примере ​моего свежего mini-pc (I5 5257U, 8Gb RAM, SSD): утилита systemd-analyze сообщает,​ что на стадию работы загрузчиков в случае цепочки UEFI-Shim-GRUB-Kernel требуется чуть меньше секунды - 967ms, а на прямую загрузку UEFI-Kernel - 153ms. При полной (холодной) загрузке системы за ~14 секунд выигрыш составляет порядка 6%.</​note>​+Устранение из процесса загрузки загрузчиков (оригинально это цепочка из двух: shim + GRUB) заметно (но не так что бы очень значительно) сокращает время загрузки ОС. Вот как это выглядит в цифрах на примере одного mini-pc (I5 5257U, 8Gb RAM, SSD): утилита systemd-analyze сообщает,​ что на стадию работы загрузчиков в случае цепочки UEFI-Shim-GRUB-Kernel требуется чуть меньше секунды - 967ms, а на прямую загрузку UEFI-Kernel - 153ms. При полной (холодной) загрузке системы за ~14 секунд выигрыш составляет порядка 6%.</​note>​
  
 ===== Полезные утилиты для UEFI ===== ===== Полезные утилиты для UEFI =====
 В стандартных репозиториях Ubuntu есть несколько полезных пакетов с утилитами для работы с настройками UEFI. В стандартных репозиториях Ubuntu есть несколько полезных пакетов с утилитами для работы с настройками UEFI.
-  * efibootmgr - утилита,​ которой можно менять настройки загрузки UEFI, в частности:​ настраивать приоритет загрузки,​ создавать/​изменять/​удалять загрузочные записи UEFI. +  ​* **efibootmgr** - утилита,​ которой можно менять настройки загрузки UEFI, в частности:​ настраивать приоритет загрузки,​ создавать/​изменять/​удалять загрузочные записи UEFI. 
-  * efivar - простая утилита для работы с переменными UEFI. +  ​* **efivar** - простая утилита для работы с переменными UEFI. 
-  * efitool - набор утилит и efi-приложений для работы с ключами/​сертификатами,​ используемыми при загрузке в режиме Secure Boot. +  ​* **efitool** - набор утилит и efi-приложений для работы с ключами/​сертификатами,​ используемыми при загрузке в режиме Secure Boot. 
-  * sbsigntool - утилиты для подписывания и проверки подписей UEFI-приложений,​ для организации загрузки в Secure Boot режиме.+  ​* **sbsigntool** - утилиты для подписывания и проверки подписей UEFI-приложений,​ для организации загрузки в Secure Boot режиме.
 У всех этих утилит есть вполне толковые man-руководства и есть примеры использованию в Интернете,​ поэтому я не стану останавливаться на деталях использования этих утилит. У всех этих утилит есть вполне толковые man-руководства и есть примеры использованию в Интернете,​ поэтому я не стану останавливаться на деталях использования этих утилит.
  
Строка 505: Строка 506:
  
 Самое же примечательное в этой ситуации ИМХО в том, что 20 лет назад отпущенная шутка, до сих пор стреляет,​ да еще с невиданной доселе мощью. 8-) Самое же примечательное в этой ситуации ИМХО в том, что 20 лет назад отпущенная шутка, до сих пор стреляет,​ да еще с невиданной доселе мощью. 8-)
 +<​note>​Т.е. если раньше патч успешно уничтожал ОС на компьютере,​ то теперь стало возможным еще и вывести из строя компьютер (при кривой реализации UEFI).</​note>​
  
    
Строка 511: Строка 513:
 [[https://​ru.wikipedia.org/​wiki/​Extensible_Firmware_Interface|Википедия о UEFI]] \\ [[https://​ru.wikipedia.org/​wiki/​Extensible_Firmware_Interface|Википедия о UEFI]] \\
 [[https://​ru.wikipedia.org/​wiki/​%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0_%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%BE%D0%B2_GUID|Википедия о GPT]]\\ [[https://​ru.wikipedia.org/​wiki/​%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0_%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%BE%D0%B2_GUID|Википедия о GPT]]\\
-[[https://​wiki.archlinux.org/​index.php/​Unified_Extensible_Firmware_Interface_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)|Очень подробная Wiki по UEFI (к сожалению не полностью переведенная на русский язык)]]  +[[https://​wiki.archlinux.org/​index.php/​Unified_Extensible_Firmware_Interface_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)|Очень подробная Wiki по UEFI]] (к сожалению не полностью переведенная на русский язык)\\ 
-[[https://​habrahabr.ru/​post/​267953/​|Очень толковая статья о SecureBoot и методах борьбы с ним.+[[https://​habrahabr.ru/​post/​267953/​|Очень толковая статья о SecureBoot и методах борьбы с ним.]]
  
 {{tag>​uefi boot}} {{tag>​uefi boot}}