Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Управление загрузчиками EFI в Linux: режим безопасной загрузки Secure Boot (продолжение)

Оригинал: Managing EFI Boot Loaders for Linux: Dealing with Secure Boot
Автор: Roderick W. Smith
Перевод: Н.Ромоданов

Замена ключей в вашей прошивке

Можно заменить ключи фирмы Microsoft на ваши собственные ключи. Это может оказаться полезным в случае, если вам нужны преимущества режима Secure Boot, но вы не хотите доверять фирме Microsoft или кому-нибудь другому, кто будет подписывать двоичные файлы ключами Microsoft. Этот процесс состоит их следующих трех шагов: генерации ваших собственных ключей, подписывания ваших двоичные файлов и установка ключей в вашей прошивке. Ниже будут последовательно описаны каждый из этих шагов. Учтите, что, по крайней мере, по состоянию на конец 2012 года, процедуры, необходимые для добавления своих собственных ключей существенно улучшены. Например, я описываю, как получить необходимое программное обеспечение Linux с помощью команды git и как скомпилировать его локально. Если вы не знакомы с такими процедурами, вам, возможно, придется отказаться от этого подхода.

Генерация ваших собственных ключей

Примечание: Почти наверняка к результату, описанному здесь, можно придти более рациональным образом, чем тот, который я описываю. Поскольку я продолжаю самостоятельно осваивать эти инструментальные средства, я до сих пор не разобрался, от каких из них можно отказаться, а использование каких можно упростить. Если повезет, то в будущем эти инструментальные средства также станут удобными для пользователей

Первый шаг к использованию ваших собственных ключей режима Secure Boot состоит в генерации таких ключей. Чтобы это сделать, вам необходимо сначала установить две программы, причем обе они пока еще не доступны в двоичной форме. Первой из этих программ является программа efitools, а вторая - sbsigntool (эта же программа используется для подписывания с помощью ключей MOK). В обеих программах используется библиотека GNU-EFI. Процедура установки всех этих пакетов следующая:

  1. Перейдите на веб-сайт GNU-EFI и скачайте версию 3.0r пакета (gnu-efi_3.0r.orig.tar.gz). Формально требуется версия 3.0q или более поздняя, однако, я обнаружил, что двоичные файлы, собираемые для версии 3.0s, не работают. Возможно, эта проблема будет исправлена в будущих версиях GNU-EFI или в программах, которые собираются на основе этого пакета.
  2. Распакуйте архив gnu-efi_3.0r.orig.tar.gz, перейдите (команда cd) в получившийся в результате каталог, наберите команду make для того, чтобы собрать пакет, а затем в роли пользователя root введите команду make install для того, чтобы его установить.
  3. Перейдите в свой домашний каталог или в какое-нибудь другое удобное место, например, в /usr/src, и наберите команду git clone git://kernel.ubuntu.com/jk/sbsigntool. Этот шаг будет успешным только в случае, если установлена программа git, поэтому вам может потребоваться ее установить. Либо вы можете загрузить и установить двоичный пакет из сервиса OpenSUSE Build Service и сразу перейти к шагу 10.
  4. Перейдите в каталог sbsigntool, в котором находится результат, и наберите команду ./autogen.sh. На этом шаге из дерева каталогов sbsigntool будет выбран дополнительный исходный код. Если вы получите сообщения о том, не были найдены какие-либо программы, в том числе и automake, то вы должны установить пакет automake и повторить этот шаг.
  5. Отредактируйте конфигурационный скрипт configure и замените каждое вхождение строки /usr/include/efi на /usr/local/include/efi. Вам следует пропустить этот шаг в случае, если вы установили пакет GNU-EFI, так что входящие в него файлы находятся в каталоге /usr/include/efi.
  6. Для того, чтобы сконфигурировать пакет, наберите команду ./configure. Если в результате будут выдаваться сообщения об ошибках, указывающие об отсутствии пакетов разработчика, вам нужно будет их устанавливать и повторять этот шаг до тех пор, пока он не будет выполнен успешно.
  7. Наберите команду make для того, чтобы собрать пакет.
  8. В роли пользователя root наберите команду make install для того, чтобы установить программы sbsigntool.
  9. Выйдите из каталога sbsigntool ( например, в вашем домашнем каталоге или каталоге /usr/src).
  10. Наберите команду git clone git://git.kernel.org/pub/scm/linux/kernel/git/jejb/efitools.git. Это действие создаст каталог с именем efitools, в котором будет находиться дополнительный исходный код.
  11. Перейдите в каталог efitools.
  12. Откройте файл Make.rules в текстовом редакторе и замените каждый экземпляр /usr/include/efi на /usr/local/include/efi. Все они находятся в строке INCDIR в начале файла. Продолжите редактировать этот файл - замените каждый экземпляр /usr/lib64 на /usr/local/lib. Обратите внимание, что надо добавить подкаталог local и заменить lib64 на lib. Если вы установили GNU-EFI из двоичного пакета, то такое изменение может оказаться ненужным, или оно может быть другим.
  13. Наберите команду make. Результатом должно быть создание некоторого количества файлов и программ, в том числе в первую очередь программы LockDown.efi, устанавливающей ключи, которые были созданы в процессе сборки.
  14. Выйдите из каталога efitools
  15. Скопируйте весь каталог efitools на носитель, который вы сможете прочитать на целевом компьютере. Это может быть, например, системный раздел EFI System Partition (ESP) на компьютере, который использовался для сборки файлов или раздел FAT на флешке USB.

Предупреждение: Ваши ключи, созданные для подписи (DB.crt и, особенно, DB.key) чрезвычайно ценны! Любой с помощью этих ключей может подписать любой двоичный файл так, что его можно будет загрузить на ваш компьютер. Убедитесь, что вы ограничили доступ к этим ключам!

На данный момент, у вас есть ключи для режима Secure Boot, которые находятся в каталоге efitools, и программа LockDown.efi, которая установит их, как только вы запустите ее при соответствующих условиях из командной оболочки EFI. Конечно, нет никакого смысла блокировать прошивку в случае, если у вас нет подписанного загрузчика, так что следующим шагом будет … .

Подписывание ваших двоичных файлов

При выполнении следующих шагов, я предполагаю, что каталог efitools, который вы подготовили, находится в ~/efitools. вы должны изменить этот путь так, как это необходимо в вашей системе.

Вы, по-видимому, захотите подписать двоичные файлы, например, grub.efi или ядро Linux с загрузчиком-заглушкой EFI. Кроме того, если вы планируете двойную загрузку с Windows или с другой операционной системой, вы, вероятно, должны также подписать загрузчик этой второй системы. Это также необходимо в случае, даже если он уже был подписан с другим ключом — процедура, описываемая на этой странице, заменит ключи, имеющиеся в вашей прошивке, так что существующие подписи больше работать не будут и поэтому вы должны заменить подписи в существующих двоичных файлах.

В любом случае, после того, как вы установили пакет sbtools и создали ключи при помощи подготовленного пакет efitools, процедура подписания двоичного файла EFI довольно проста:

$ sbsign --key ~/efitools/DB.key --cert ~/efitools/DB.crt \
         --output vmlinuz-signed.efi vmlinuz.efi
warning: file-aligned section .text extends beyond end of file
warning: checksum areas are greater than image size. Invalid section table?

В этом примере подписывается двоичный файл vmlinuz.efi, расположенный в текущем каталоге, который затем будет переписан в виде подписанного двоичного файла vmlinuz-signed.efi. Конечно, вам следует поменять имена двоичных файлов так, чтобы они удовлетворяли вашим требованиям, а также настроить путь к ключам (DB.key и DB.crt).

В этом примере выдается два предупреждения. Я не утверждаю, что я полностью понял их, но, кажется, они не наносят никакого вреда - по крайней мере, двоичные файлы ядра Linux, для которых были выданы эти предупреждения когда я их подписывал, работали нормально. Также, по-видимому безобидно еще одно предупреждение, которое я видел для двоичных файлов, полученных с использованием GNU-EFI:

warning: data remaining[1231832 vs 1357089]: gaps between PE/COFF sections?

С другой стороны, в файле ChangeLog для GNU-EFI указывается, что двоичные файлы, созданные с помощью GNU-EFI версий ранее 3.0q, могут после того, когда они подписаны, не загрузиться в режиме Secure Boot, а при подписывании таких двоичных файлов выдается еще одно предупреждение:

warning: gap in section table:
    .text   : 0x00000400 - 0x00019c00,
    .reloc  : 0x00019c91 - 0x0001a091,
warning: gap in section table:
    .reloc  : 0x00019c91 - 0x0001a091,
    .data   : 0x0001a000 - 0x00035000,
gaps in the section table may result in different checksums

Если вы видите предупреждение, похожее на это, то вам, возможно, потребуется пересобрать ваш двоичный файл с использованием более свежей версии GNU-EFI.

Если вы используете загрузчик rEFIt, rEFInd или gummiboot, вы должны подписать не только двоичные файлы этих менеджеров загрузки, но также и загрузчики, которые они запускают, например, ядра Linux или двоичные файлы ELILO. Если вы этого не сделаете, вы не сможете запустить загрузчики, которые запускают менеджеры загрузки. Типовые версии загрузчиков ELILO и GRUB не проверяют статус Secure Boot или используют системные вызовы EFI для загрузки ядер, поэтому подписанные версии этих загрузчиков запустят любое ядро, которое вы им подсунете. Поэтому, это подрывает саму цель использования режима Secure Boot, по крайней мере, при запуске Linux. Возможно, некоторые будущие версии GRUB будут при аутентификации ядра Linux взаимодействовать с программой shim, так может произойти отказ запуска ядра Linux, которое не было подписано.

После того как вы подписали свои двоичные файлы, вы должны установить их в свой раздел ESP точно также, как вы устанавливаете неподписанные двоичные модули EFI. Подписанные двоичные модули должны работать нормально даже на системах, на которых вы отключили режим Secure Boot.

В качестве замечания: альтернативой sbtools является утилита pesign, которую можно получить с помощью команды git://github.com/vathpela/pesign.git; но поскольку efitools создана для использования sbtools, я только лишь взглянул на pesign. Но, если у вас будут проблемы с sbtools, возможно, вы захотите попробовать использовать эту утилиту.

Установка ваших ключей

Когда ваши ключи и ваши двоичные файлы подписаны, вы можете настроить свой компьютер таким образом, чтобы можно было ими пользоваться. К сожалению, этот процесс может существенно различаться в различных реализациях EFI. Следующий материал базируется на моем практическом опыте с материнской платой ASUS P8H77-I, так что если вы используете другие реализации EFI, вам может понадобиться искать варианты, которые похожи, но не идентичны тем, которые описаны здесь, или даже могут очень существенно отклоняться от следующих инструкций. С учетом этой оговорки ниже приведены инструкции установки ключей Secure Boot, по крайней мере, на некоторых компьютерах:

  1. Подготовьте загружаемый носитель EFI, на котором есть командная оболочка EFI. Вам следует установить командную оболочку EFI как EFI/BOOT/bootx64.efi или настроить ее так, чтобы она могла запускаться из собственного менеджера загрузки EFI или из загрузчиков rEFInd или gummiboot. Проверьте, чтобы убедиться, что вы можете войти эту оболочку. Если режим Secure Boot уже включен, то вам необходимо его сначала отключить.
  2. Войдите в утилиту настройки прошивки компьютера в setup), нажав клавишу Del на начальных стадиях процесса загрузки (прежде, чем появится какой-либо из системных загрузчиков). В некоторых компьютерах для этой цели используются другие клавиши; Чтобы узнать, что использовать, изучите самые первые сообщения, выдаваемые на экран во время загрузки, или прочитайте руководство вашего компьютера.
  3. Если у вас сконфигурирована загрузка в режиме EZ Mode, то нажмите клавишу F7 для того, чтобы войти в расширенный режим Advanced Mode.
  4. Перейдите на вкладку Boot (Загрузка).
  5. Выберите пункт Security Boot Parameters, который находится в нижней левой части экрана. На некоторых системах для того, чтобы это увидеть, вам, возможно, потребуется прокрутить изображение вниз.
  6. В пункте OS Type выберите вариант Windows 8 UEFI. Да, даже в том случае, если вы не хотите перегружаться в Windows.
  7. В пункте Secure Boot Mode выберите вариант Custom. Экран должен выглядеть примерно так:

  8. Выберите вариант управления ключами Key Management (Управление ключами) для того, чтобы добраться до страницы, на которой вы можете управлять ключами так, как показано здесь:

  9. Выберите в пункте Default Key Provisioning (Установить по умолчанию) вариант Disable (Отключить).
  10. Выберите вариант Clear Secure Boot Keys (Стереть ключи режима Secure Boot) для того, чтобы удалить все старые ключи.
  11. Если вы разместили каталог efitools на флешке USB, то вставьте флешку в компьютер.
  12. Нажмите клавишу F10 для того, чтобы сохранить изменения и перезагрузить компьютер.
  13. Когда компьютер будет запущен, нажмите, при необходимости, клавишу F8 для того, чтобы войти в менеджер загрузки и выбрать носитель, который вы подготовили для загрузки оболочки EFI. ( Клавиша F8 является клавишей, которую ASUS использует в P8H77-I для того, чтобы запустить менеджер загрузки; на других компьютерах эта клавиша может быть другой).
  14. Запустите вашу оболочку EFI.
  15. Перейдите в файловую систему, в которой находится каталог efitools и войдите в этот каталог. Например, можно ввести fs4:, а затем cd efitools.
  16. Наберите LockDown.efi для того, чтобы ввести ваши ключи в прошивку и включить режим Secure Boot. Если вы получите сообщение о том, что компьютер не находится в режиме настройки Setup, то вы должны изучить последние несколько шагов, или, если вы используете прошивку, отличную от ASUS, вам может понадобиться поэкспериментировать, чтобы узнать, как перевести вашу систему в режим настройки. Либо вы можете попробовать загрузить ваши различные ключи вручную, используя для этого различные параметры Set ... from File (Установить … из файла) в пользовательском интерфейсе.

На данный момент, ваш компьютер должен быть настроен для использования режима Secure Boot. Но, если вы еще не установили свои подписанные двоичные файлы EFI, вы должны сделать это сейчас. Вам следует перезагрузиться и использовать подписанные двоичные файлы, но двоичные файлы, которые не подписанные, или те, которые подписаны кем-нибудь, но не вами, работать не должны.

Заключительные соображения

В конце 2012 года, режим Secure Boot внес свою скромную лепту к основным хлопотам пользователей Linux. Хотя в нем есть потенциал для улучшения безопасности, исторически Linux не подвержен засилью вирусов, поэтому неясно, чем режим Secure Boot будет полезен на компьютерах только с Linux. Но если у вас двойная загрузка с Windows, вы можете оставить включенным режим Secure Boot. В среднесрочной и долгосрочной перспективе лучшим способом это сделать будет использование программы shim, взятой из дистрибутива Fedora; но по состоянию на начало января 2013 года то, что предварительно подписываемые, а затем загружаемые двоичные файлы, применяются редко, делает программу shim неудобной для установки и применения. В то же время, отключение режима Secure Boot является самым простым способом справиться с этим режимом. Подписывание своих собственных загрузчиков с тем, чтобы можно было пользоваться нативным механизмом Secure Boot и своим набором ключей, является еще одной альтернативой, которая предоставит вам наибольшую безопасность и гибкость, но этот подход реализуется труднее всего.

Другими словами: прямо сейчас с этим беспорядок, но разработчики Linux работают, чтобы добиться порядка.


Вернуться к началу статьи.