实验目的:
- 需要能够正常登录,使用ubuntu
- 在进入GRUB编辑启动参数、shell的时候,我们需要进行一个密码验证

正常情况下,我们的ubuntu系统并不会对grub中进行密码设置,所以可以通过按shift或者是Esc进入设置界面然后按e对启动参数进行修改,从而直接进入到root shell。所以我们需要对此情况进行防护。
一、生成GRUB密码
首先我们可以执行这串代码:
sudo grub-mkpasswd-pbkdf2
执行 sudo grub-mkpasswd-pbkdf2 的目的是生成一个加密的密码哈希值,用于在 GRUB 引导加载程序中设置密码保护。这个命令会交互式地要求你输入两次密码,然后输出一段以 grub.pbkdf2.sha512.10000. 开头的长字符串.
然后我们就可以得到一个类似于:

二、创建GRUB用户配置
我们可以使用如下代码:
sudo nano /etc/grub.d/01_users
这是用于创建或编辑一个 GRUB 配置脚本文件,该文件的作用是在生成最终的 GRUB 配置文件时,定义用户和密码信息,从而实现 GRUB 引导菜单的访问控制。
然后在打开的文件中写入:
#!/bin/sh
cat << EOF
set superusers="admin"
password_pbkdf2 admin grub.pbkdf2.sha512.xxxxxxxxxxxxxxxxx
export superusers
EOF
当这个脚本被 /etc/grub.d/ 机制执行时,它会输出这些 GRUB 配置命令到标准输出,最终被合并到 /boot/grub/grub.cfg 文件中。其目的是在 GRUB 中设置一个名为 admin 的超级用户及其密码哈希,从而启用密码保护。
三、赋予执行权限
使用如下指令来赋予执行权限:
sudo chmod 755 /etc/grub.d/01_users
赋予执行权限
四、修改启动项
首先执行修改10_linux的命令:
sudo nano /etc/grub.d/10_linux
然后将 menuentry 修改为:
在 linux_entry() 初做修改为:
if [ x$type != xsimple ] ; then
case $type in
recovery)
title="$(gettext_printf "%s, with Linux %s (%s)" "${os}" "${version}" "$(gettext "${GRUB_RECOVERY_TITLE}")")"
;;
*)
title="$(gettext_printf "%s, with Linux %s" "${os}" "${version}")"
;;
esac
case $type in
recovery)
echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
;;
*)
echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} --unrestricted \$menuentry_id_option 'gnulinux-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
;;
esac
else
echo "menuentry '$(echo "$os" | grub_quote)' ${CLASS} --unrestricted \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
fi
此代码的目的为在启用 GRUB 密码保护的环境下,为不同类型的 Linux 内核启动项定制化地设置访问权限,使得普通用户无需密码即可正常启动系统,而恢复模式等需要更高权限的选项则要求密码验证,从而提升系统安全性,同时保持菜单的易读性和结构的完整性。
最后我们执行:
sudo update-grub
就设置完毕了,接下来进行验证
reboot之后我们按住shift,然后按e可以看见如下情况:

有图可知我们设置成功了,进行输入密码尝试一下

输入我们的账号密码之后发现设置成功了。


Comments | NOTHING