Как настроить защиту паролем grub2

Информация о тестовой платформе:
Operation system: Debian GNU/Linux 9.6
Grub version:  2.02~beta3-5+deb9u1 

1、Сгенерируйте хешированный пароль для GRUB
В этом примере в качестве пароля используется следующий пароль: "MangGuO93,*jqvt", такая комбинация является требованием для обеспечения надежности пароля.

# grub-mkpasswd-pbkdf2
Enter password: 
Reenter password: 
PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.F5CFD948DC06B644E05531FBF9773C086B228A87033642B32D41DBE141B10D2FD0604C8ABCDD2D2D76C834297969EADC64687EB32662CB59BCA0898AD69D7FE6.C698997624F217CDCE83446E80632FF9F7AFB1A0A6AE0B5752A81392F1BAA9A44C37AF5B29D7CEE13B9DE7D1207D5FB4A173A49D1518B1492BB6D9FE45444656

Он сгенерирует длинный пароль, зашифрованный следующим образом: grub.pbkdf2.sha512.10000........ Скопируйте полностью сгенерированный код.

2、Настройка защиты паролем

  1) Изменить /etc/grub.d/10_linux
  В /etc/grub.d/10_linux найдите следующую строку:

  echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-$version-$type-  $boot_device_id' {" | sed "s/^/$submenu_indentation/"

  Добавьте --users '':

  echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} --users '' \$menuentry_id_option 'gnulinux-$version-  $type-$boot_device_id' {" | sed "s/^/$submenu_indentation/"

  2) Изменить /etc/grub.d/30_os-prober
  Чтобы изменить /etc/grub.d/30_os-prober, чтобы добавить защиту паролем ко всем записям:

  # sed 's/--class os /--class os --users /' -i /etc/grub.d/30_os-prober

  3) Добавьте защиту паролем в /etc/grub.d/40_custom.

  set superusers="username"
  password_pbkdf2 username password

  Очевидно, вы должны заменить слова «имя пользователя» желаемым именем пользователя и словом «пароль» для   зашифрованного пароля, сгенерированного на предыдущем шаге. Формат записи зашифрованного пароля в файле   /etc/grub.d/40_custom будет выглядеть примерно так (в примере сокращено):

  set superusers="John"
  password_pbkdf2 John grub.pbkdf2.sha512.10000.F5CFD948DC06B644E05531FBF9773C086B228A87033642B32D41DBE141B10D2FD0604C8ABCDD2D2D76C834297969EADC64687EB32662CB59BCA0898AD69D7FE6.C698997624F217CDCE83446E80632FF9F7AFB1A0A6AE0B5752A81392F1BAA9A44C37AF5B29D7CEE13B9DE7D1207D5FB4A173A49D1518B1492BB6D9FE45444656 

  Сохраните файл и выйдите.

3. Создайте файл конфигурации grub2.

# update-grub2
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.9.0-8-amd64
Found initrd image: /boot/initrd.img-4.9.0-8-amd64
done
Вот и все, ваш grub2 защищен.

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

Найдите следующую строку в /etc/grub.d/10_linux:

echo "menuentry '$(echo "$os" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"

Добавьте --unrestricted:

echo "menuentry '$(echo "$os" | grub_quote)' ${CLASS} --unrestricted \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"

Дополнение:
Для загрузки Windows без пароля нужно в файле /etc/grub.d/30_os-prober добавить --unrestricted в две строки:

menuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' $CLASS --class os \$menuentry_id_option 'osprober-chain-$(grub_get_device_id "${DEVICE}"
)' {

 

menuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' $CLASS --class os \$menuentry_id_option 'osprober-efi-$(grub_get_device_id "${DEVICE}")'
 {

 

Должно получиться следующее:

menuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' --unrestricted $CLASS --class os \$menuentry_id_option 'osprober-chain-$(grub_get_device_id "${DEVICE}"
)' {

menuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' --unrestricted $CLASS --class os \$menuentry_id_option 'osprober-efi-$(grub_get_device_id "${DEVICE}")'
 {

5、Устранение неполадок
Если добавить защиту паролем в /etc/grub.d/00_header, возможно, вы получите сообщение об ошибке при выполнении exec update-grub2, например следующее:

# update-grub2
/etc/grub.d/00_header :274 /etc/grub.d/00_header password_pbkdf2 not found

Помните, что правильный файл для редактирования — 40_custom просто потому, что другие файлы, такие как grub.cfg или даже 00_header, автоматически обновляются системой при определенных обстоятельствах, и это приведет к потере этих изменений.

6, Ссылки

https://www.gnu.org/software/grub/manual/grub/html_node/Authentication-and-authorization.html#Authentication-and-authorisation
https://help.ubuntu.com/community/Grub2/Passwords

Источник: https://github.com/hardenedlinux/harbian-audit/blob/master/docs/configurations/manual-operation-docs/how_to_config_grub2_password_protection.mkd