GRUB菜单加密码仅限制启动时编辑内核参数,无法阻止Live USB启动、磁盘加密或物理拆盘;必须用grub2-mkpasswd-pbkdf2生成PBKDF2-SHA512哈希,写入/etc/grub.d/40_custom并执行对应发行版更新命令才生效。

GRUB 菜单加密码,**不能阻止别人从 Live USB 启动、不能加密磁盘、也不能防物理拆盘**——它只管住「启动时按 e/c/a 键改内核参数」这一条路。想靠它防 root 密码被绕过?必须配 rd.break 和 systemd.unit=emergency.target 的防护;想防硬盘被挂载读取?得上 LUKS。
用 grub2-mkpasswd-pbkdf2 生成强哈希密码
老式 grub-md5-crypt 或 grub-crypt --sha-256 已淘汰,现代发行版(RHEL 8+/Ubuntu 20.04+)强制要求 PBKDF2-SHA512。不生成这个,后续配置会静默失效。
- 运行
sudo grub2-mkpasswd-pbkdf2,输入两次密码 - 完整复制输出中
grub.pbkdf2.sha512.10000...开头的整行(含所有字符,一个都不能少) - 别手抖复制到换行符或空格——粘贴进配置后
update-grub不报错但密码无效 - 该命令在 CentOS/RHEL 上叫
grub2-mkpasswd-pbkdf2,Debian/Ubuntu 是grub-mkpasswd-pbkdf2,名字差一个2,输错就报 command not found
把密码写进 /etc/grub.d/40_custom 而不是主配置
直接改 /boot/grub2/grub.cfg 或硬塞进 /etc/default/grub 是错的:前者下次 update-grub 被覆盖,后者根本不起作用。正确位置是 /etc/grub.d/40_custom——它在生成配置时被自动 include,且不会被其他脚本覆盖。
- 用
sudo vi /etc/grub.d/40_custom,在文件末尾、exec tail行之后添加: set superusers="admin"-
password_pbkdf2 admin grub.pbkdf2.sha512.10000.67AA83DAE7175D7E...(粘贴你刚复制的整串) - 注意:用户名
admin可自定义,但前后两处必须一致;password_pbkdf2后面**不能有空格或换行** - 保存后必须执行更新命令,否则零效果
更新配置必须用对应发行版命令
update-grub 和 grub2-mkconfig 不通用。Debian/Ubuntu 用前者,RHEL/CentOS/Fedora 必须用后者,路径也不同——写错路径或命令,grub.cfg 文件不会更新,密码形同虚设。
- Debian/Ubuntu:
sudo update-grub - RHEL/CentOS/Fedora:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg - 检查是否生效:
grep -A2 "password_pbkdf2" /boot/grub2/grub.cfg—— 如果没输出,说明更新失败或写错位置 - 更新后不重启,
e键仍能编辑;只有重启进 GRUB 界面,按e或c才会弹密码框
加锁单个菜单项比全局锁更实用
全菜单加锁后,每次进 GRUB 都要输密码才能启动,默认体验极差。真正需要防护的是「编辑内核参数」这个动作,而不是「启动系统」本身。所以对特定菜单项加锁更合理——比如只锁住带 recovery 或 rescue 字样的项,或者你自己写的调试启动项。
- 打开
/etc/grub.d/40_custom,找到你要保护的menuentry块 - 在
menuentry行开头插入--users admin,例如:menuentry 'Ubuntu, with Linux 6.8.0-xx' --users admin { - 注意:不是所有发行版默认启用用户验证,需确认
superusers已设置,且该 menuentry 在生成后的grub.cfg中确实带--users参数 - 这种粒度控制能避免日常启动输密,又卡死关键入口,比全局锁更贴近真实运维场景
e 键,光标停在「Password:」后面——此时输错一次,grub 不提示错误也不重试,直接退回菜单;而那个被 --users 锁住的 recovery 项,连高亮都不可选。这些细节,恰恰是配置里最容易被忽略的验证点。











