Автор статьи: Рустем Галиев

IBM Senior DevOps Engineer & Integration Architect. Официальный DevOps ментор и коуч в IBM

Привет, Хабр! Сегодня я покажу вам, как защитить загрузчик.

Безопасность компьютерных систем является одним из ключевых аспектов в современном мире цифровых технологий. С каждым днем возрастает число кибератак, направленных на нарушение конфиденциальности данных, а также вторжение в личную жизнь и нанесение ущерба бизнесу. В этом контексте обеспечение безопасности загрузчика GRUB, используемого в операционных системах Linux, становится неотъемлемой составляющей защиты системы. В данной статье мы рассмотрим шаги по обеспечению безопасности загрузчика GRUB, начиная с генерации зашифрованного пароля и заканчивая его внедрением в систему.

Значение безопасности загрузчика GRUB:

GRUB (Grand Unified Bootloader) является ключевым элементом при загрузке операционной системы Linux. Этот процесс начинается с выполнения кода BIOS, который затем передает управление загрузчику GRUB. В случае нарушения безопасности загрузчика, злоумышленники могут получить доступ к системе исключительно путем обхода авторизации, изменения конфигурации или запуска специальных режимов, что может привести к серьезным последствиям, вплоть до полного контроля над системой.

Обеспечение безопасности загрузчика GRUB позволяет предотвратить подобные атаки, обеспечивая аутентификацию пользователей и защиту от несанкционированного доступа к системе уже на этапе ее загрузки. Такой подход обеспечивает надежную защиту операционной системы Linux и способствует сохранению целостности и конфиденциальности данных.

Когда компьютер запускается, первый выполняемый код - это BIOS.

Это происходит очень быстро, и выполняется тест самопроверки.

Затем он выполняет код в секторе Master Boot Record диска, где находится загрузчик.

Загрузчик затем загружает ядро, которое инициализирует всю систему.

Сегодня все основные дистрибутивы Linux используют GRUB 2 в качестве загрузчика. Хакер может изменить GRUB и загрузить систему в специальный режим работы (называемый режимом одиночного пользователя), где root входит автоматически без пароля. Атакующий также может использовать интерфейс редактора GRUB для изменения его конфигурации или сбора информации о системе; или если это двойная загрузка, атакующий может выбрать во время загрузки другую операционную систему, которая игнорирует контроль доступа и права доступа к файлам.

Для решения этих проблем безопасности мы защитим загрузчик GRUB с помощью пароля. Обратите внимание, что люди с физическим доступом к компьютеру могут получить доступ к файлам через другие методы, которые не могут предотвратить GRUB.

Один из таких методов — это загрузка системы с другого носителя, такого как USB-накопитель.

Также стоит установить пароль BIOS и настроить систему на автоматическую загрузку с раздела, на котором установлен Linux.

На самом деле, первым уровнем защиты, который вам следует учитывать, является физическая защита вашего компьютера.

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

Я выполняю:

grub-mkpasswd-pbkdf2

PBKDF2 — это функция вывода ключа, основанная на пароле.

И я ввожу пароль.

И она сгенерировала хешированную форму пароля.

Следующим шагом после генерации хешированного пароля является редактирование основного файла конфигурации GRUB и добавление хеша пароля.

Таким образом, ваш фактический пароль не виден в сценариях GRUB, и возможный хакер не может его увидеть.

Основной файл конфигурации GRUB2 находится в /boot/grub/grub.cfg

Однако этот файл не изменяется напрямую пользователем. Он перезаписывается определенными обновлениями GRUB при добавлении или удалении ядра или когда пользователь выполняет команду обновления GRUB 2.

Так что, фактически, GRUB использует серию скриптов для построения этого файла конфигурации, они находятся в /etc/grub.d

Поэтому мы изменяем файлы в этом каталоге, а затем выполняем update-grub2.

Эта команда, основанная на содержимом этих файлов в /etc/grub.d, сгенерирует grub.cfg, основной файл конфигурации.

Я предпочитаю изменить настраиваемый файл, такой как 40_custom, потому что он не будет перезаписан, даже когда пакет GRUB будет обновлен.

Давайте посмотрим на хешированный пароль, который мы только что сгенерировали.

И я копирую эту строку в буфер обмена, начиная с grub.pbkdf2.

И как root, я открываю 40_custom, так что sudo vim /etc/grub.d/40_custom и в конце файла добавляю

set superusers="root"
password_pbkdf2 root

и вставляю хешированный пароль.

Я сохраняю файл и выхожу.

Следующим шагом я обновляю файл конфигурации GRUB.

Я выполняю команду update-grub2 от имени root. Эта команда сгенерирует новый файл grub.cfg.

И вот он.

Вот и все! Теперь GRUB запрашивает пароль при загрузке; он больше не загружает систему напрямую в первую ОС. Так что я ввожу имя пользователя, которое является root, и пароль, который я установил.

И он загружает ОС.


Материал подготовлен в преддверии старта специализации "Administrator Linux".

Комментарии (10)


  1. kvazimoda24
    24.04.2024 05:13
    +3

    Эм... BIOS? MBR? Вы из какого года? Давно уже везде UEFI и GPT.

    И в таком варианте гораздо больше безопасности, если вообще выкинуть загрузчик, ядро собрать вместе с initrd в один файл, подписать это всё своим сертификатом, сертификат прописать в UEFI, и туда же прописать запуск нашего ядра. И, конечно, не забыть про пароль на UEFI.


  1. CrazyOpossum
    24.04.2024 05:13

    Предполагается физический доступ у злоумышленника, но пароль на загрузчик не имеет смысла пока диски нешифрованы, а в биосе не залочена загрузка. Полнодисковое шифрование с загрузчиком решает все проблемы.


    1. MountainGoat
      24.04.2024 05:13
      +1

      Когда была подобная проблема, я просто поставил загрузчик на флешку, которую уносил с собой. Диск шифрованый, пароль на той же флешке, UEFI тогда не было.


      1. CrazyOpossum
        24.04.2024 05:13

        Тоже норм, но я постоянно флешки продалбываю, мне бы не подошло.


  1. aruslantsev
    24.04.2024 05:13

    И это все?

    А как же очень удобная опция --unrestricted для menuentry, которая позволяет загрузить выбранный пункт, но для изменения параметров загрузки потребует пароль.

    Еще в core.img можно интегрировать свой ключ, и тогда grub будет загружать только подписанные вами же ядра и initramfs. Смотрите опцию --pubkey у grub-install.

    Или воспользоваться secure boot, прописать свои ключи, да и вообще отказаться от загрузчика. Или подписать grub своим сертификатом, чтобы uefi проверял подпись загрузчика, а загрузчик - подписи ядер и initramfs


  1. wifage
    24.04.2024 05:13

    Лучше расскажите как 2fa к загрузке прикрутить.


    1. dartraiden
      24.04.2024 05:13

      Зашифровать диск с паролем, а заголовок LUKS поместить на флешку (detached header), которую носить с собой.

      Для расшифровки понадобится флешка (то, что у вас есть) и пароль (то, что вы знаете).


  1. Kil1J0y
    24.04.2024 05:13

    Все равно не надёжно, 1 что нужно использовать это gpg подпись загрузчика и ядра, да да, через gpg совместимый токен, 2 это luks, а для того что бы пользователи не забывали про токен, прикручиваем к luks ключевой файл из токена. А дальше настраиваем индикацию о валидной подписи загрузчика с ядром, и вот тогда можно смело сказать что у вас в систему внести данные будет сложно. И вот у вас уже альтернатива ноуту librem с токеном.

    Я пошёл другим путем т.к. не смог по вменяемой цене найти токен gpg, и просто купил рутокен, собрал mini os под себя разбил токен на два раздела 1 с системой в режиме ro, второй раздел veracrypt , ключевым файлом с токена и паролем, и закинул данные и перевёл в ro для защиты от удаления. Нужно записать временно перевел в rw через rtadmin, ключи для ssh так же на токене, нужно обновить систему загружаешься с токена собираешь модуль с обновлениями, временно переводишь в rw раздел с системой. Выключаешь (пока питание на токене есть он останется в rw). Извлекаешь, и снова с токена грузишься. Или можно купить barium os для токенов. (В бесплатной версии нет необходимых скриптов для установки на токены)


  1. Shaman_RSHU
    24.04.2024 05:13

    А зачем вообще сейчас нужен GRUB, Lilo... когда одна ОС установлена (например, на сервере)?


    1. ohno1052
      24.04.2024 05:13

      гроб нужен только в неизвестных средах, например на подключаемой флешке или для экзотических юзкейсов, например загрузки по сети. С остальным прекрасно справится загрузка линукса напрямую, а бут менеджером может быть сам uefi.