Применение Shim-загрузчика на системах с UEFI Secure Boot
Как известно, при сертификации устройств на совместимость с ОС Windows 8, компания Microsoft требует обязательно активировать режим UEFI Secure Boot. Режим позволяет блокировать загрузку сторонних систем, у которых отсутствует заверенная цифровая подпись. При этом компании нецелесообразно поставлять свои проверочные ключи, так как для этого потребуется встраивать соответствующие ключи в прошивку, что означает, во-первых, необходимость множества согласований с производителями оборудования (со всеми вытекающими трудностями), а во-вторых, в этом случае на рынке неизбежно появится оборудование, не поддерживающее систему Linux.
Впрочем, требование относится только к первоначальной защите на стадии загрузки. Спецификация безопасного загрузчика UEFI вполне допускает отсутствие подписи для драйверов и, собственно, ядра. В этой связи стала возможна разработка компанией Linux первичного загрузчика, который она выпустила в свободное пользование. Загрузчик Shim предназначен для обеспечения загрузки дистрибутивов Linux на сертифицированном для Windows 8 оборудовании. Shim заверен необходимым ключом от Microsoft и может использоваться разработчиками сторонних систем, которые, ввиду отсутствия финансовой возможности, а порой и желания, не заверяют свои загрузчики у Microsoft.
У Linux и ранее существовали наработки (проект SUSE) подобных загрузчиков. Однако они содержали проверочные ключи, требующиеся для второй фазы загрузки. В случае невозможности их подтверждения загрузка блокировалась.
Разработчик ядер Linux Мэтью Гаррет несколько видоизменил этот вариант. Его загрузчик работает по следующему принципу. Создатели основного дистрибутива заверяют свой загрузчик ключом. Когда Shim передает управление основному загрузчику, происходит проверка этого ключа. Если оказывается так, что ключа нет, либо он неизвестен, дальнейшая загрузка будет прервана, а пользователь увидит предупреждение. Это сделано для того, чтобы Shim применяли только по его прямому назначению. Что касается следующей фазы загрузки, то сам по себе Shim не содержит каких-либо ключей для подтверждения на этой фазе, но может использовать ключи, расположенные на диске, в чем и заключается его преимущество. Если созданный SUSE вариант при невозможности проверки блокировал загрузку полностью, то новый Shim предоставляет интерфейс для выбора пути к ключу, расположенному извне.
Чтобы все это работало, создатели дистрибутивов должны присвоить бинарному файлу shim.efi новое имя bootx64.efi и поместить его на UEFI-разделе, в каталог efi/boot вместе со штатным загрузчиком. К примеру, при использовании GRUB2 скопировать загрузчик grubx64.efi. Скопированный загрузчик (grubx64.efi) подписать сгенерированным закрытым ключом, а публичный ключ указать на носителе установочных файлов. Так дистрибутив можно будет загружать на системах с UEFE Secure Boot. При загрузке образа Shim будет выведено соответствующее меню для выбора пути к ранее сохраненному публичному верификационному ключу. В случае удачной его проверки управление процессом загрузки перейдет к оригинальному загрузчику дистрибутива. Таким образом, Shim представляет собой нечто вроде промежуточного звена.
Для защиты же дальнейшего процесса использования системы, разработчики дистрибутивов, применяющие Shim, могут использовать любые удобные им методы, как генерируя верификационные ключи только для загрузчика (Ubuntu), так и защищая все загружаемые модули и ядро Linux (Fedora).
Кстати, Linux Foundation хочет предложить похожий вариант с использованием загрузчика efitfools. Разница состоит в том, что в случае отсутствия ключей у основных загрузчиков, управление им передается путем ручного подтверждения.