如何轻松设置GRUB2密码?

我需要在Ubuntu 14.04 LTS amd64上为GRUB2设置密码。 我试图达到的设置是[e] dit和[c] onsole选项受密码保护,但启动操作系统条目(Ubuntu,Windows)不受保护。

我研究过Grub2 /密码 (它已经过时,非常混乱,几乎不可读),似乎我需要设置超级用户密码并在菜单条目中添加--unrestricted选项。 好的,但我在哪里添加了这个--unrestricted选项?

如果在/boot/grub/grub.cfg那么这不是最聪明的想法,因为每次运行grub-update时都会覆盖此文件。 所以这对我来说不是一个选择,因为 – 让我们假设 – 我喜欢每周两次更改GRUB背景图像。 而且,/ /boot/grub/grub.cfg可读性远非完美; 放置--unrestricted选项仍然不明显。

如果在/etc/grub.d/*中的菜单条目文件中,则比编辑/boot/grub/grub.cfg更糟糕。 这些文件在可读性方面相当混乱,因此编辑它们就更加困难了。

有没有像我描述的那样设置GRUB2密码的简洁方法? 也许除了我在这篇文章中链接的文档之外,还有一些精彩的文档

根据保护条目部分 :

目前没有添加用户或指定要保护的菜单项的自动方法。 用户必须手动编辑GRUB 2脚本。 GRUB 2菜单是几个脚本输入的汇编。 /etc/grub.d/10_linux文件负责将默认的Ubuntu OS添加到GRUB 2菜单。 […]这些部分中的大多数专门用于编辑位于/etc/grub.d/文件夹中的默认脚本。

在下一节中 :

GRUB 2菜单包括通过/etc/grub.d/30_os-prober脚本为默认Ubuntu OS以外的操作系统选择。 […]这将包括其他Ubuntu和Linux安装,Windows等。

30_os-prober脚本查找特定类型的操作系统。 用户可以通过单个命令对所有操作系统进行更改,也可以按操作系统类型单独进行更改,如下所述。

因此,您似乎必须编辑/etc/grub.d/的文件。 至少对于添加超级用户,您无需编辑其中一个文件,但可以创建新文件 :

超级用户/用户信息和密码不必包含在/etc/grub.d/00_header文件中。 只要该文件合并到grub.cfg中,该信息就可以放在任何/etc/grub.d文件中。 用户可能更喜欢将此数据输入到自定义文件中,例如/etc/grub.d/40_custom,因此如果更新Grub包,则不会覆盖该文件。 如果将信息放在自定义文件中,请不要包含“cat << EOF”和“EOF”行,因为内容会自动从这些文件中添加。

在GRUB官方文件另有说明之前,这些段落仍然有用:

grub-mkconfig程序还没有内置支持来生成带有身份validation的配置文件。

(无论那是什么意思。)


高达Ubuntu 12.04

以下是保护菜单条目的过时说明:

在/etc/grub.d/10_linux中,找到以下行:

 printf "menuentry '${title}' ${CLASS} {\n" "${os}" "${version}" 

添加--users ''

 printf "menuentry '${title}' ${CLASS} --users '' {\n" "${os}" "${version}" 

对于30_os-prober所有条目:

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

Ubuntu软件包没有列出Ubuntu 12.10,所以我不确定12.10是使用旧方法还是新方法。

Ubuntu 13.04及更高版本

现在, 10_linux文件使用echo而不是printf

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

30_os-prober文件使用cat和heredocs:

 # The minix entry cat << EOF menuentry "${LONGNAME} (on ${DEVICE}, Multiboot)" { EOF # The hurd entry cat << EOF menuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' --class hurd --class gnu --class os \$menuentry_id_option 'osprober-gnuhurd-/boot/gnumach.gz-false-$(grub_get_device_id "${DEVICE}")' { EOF 

所以你可以在menuentry结束之前(在大括号打开之前)将--user ""部分粘贴在某处。

请记住备份您修改的任何文件,并在修改后运行update-grub

配置superusers 。 为此,例如, /etc/grub.d/00_header添加到/etc/grub.d/00_header

 # Support user protection on entries cat << EOF set superusers="admin" password_pbkdf2 admin grub.pbkdf2.sha512.10000.8E51188BE7DF732DDF102C918DEC152087558E04DA843B4A74C3EA8374BAB1ECA493399D62E3F2779F55C5BE2E8B65B8636113A99C09BFB892DB64626337904C.3016474FE6B420DBE6371B41D9BE8471B135CDF4BE674AC1265D3BA123CD9E459E960AEC199AB8C7C1C1A6BAF45314C64591E85E404AB54F4777E032A50CC731 EOF 

使用grub-mkpasswd-pbkdf2命令的输出更新加密密码。 在我们的示例中,您需要更改的是以下信息:

 grub.pbkdf2.sha512.10000.8E51188BE7DF732DDF102C918DEC152087558E04DA843B4A74C3EA8374BAB1ECA493399D62E3F2779F55C5BE2E8B65B8636113A99C09BFB892DB64626337904C.3016474FE6B420DBE6371B41D9BE8471B135CDF4BE674AC1265D3BA123CD9E459E960AEC199AB8C7C1C1A6BAF45314C64591E85E404AB54F4777E032A50CC731 

编辑/etc/grub.d/10_linux文件并查找第129行(在Ubuntu 14.04 LTS中)。 在其原始forms,它应如下所示:

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

在此处,在CLASS变量之后添加--unrestricted选项以完成配置行:

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

重建/boot/grub/grub.cfg 。 要执行此操作,请运行sudo update-grub命令。

重新启动系统并尝试。

现在你应该有一个配置:

  • 主Ubuntu操作系统条目将正常启动,但除superusers之外没有人能够编辑列表中的相关条目。

  • 只有superusers才能启动和编辑列表中的所有其他条目。


也可以看看:

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sec-GRUB_2_Password_Protection.html