CentOS7 GRUB2加密防止单用户模式改密码:把“后门”彻底焊死
机房凌晨两点,空调嗡鸣,你正窝在值班室刷手机,突然监控群里炸锅:“业务系统被锁了!”冲过去一看,服务器已经被人重启,单用户模式里一条passwd root指令,root密码瞬间被改,数据盘被挂载复制,整套环境成了“公共菜园”。别问为啥物理机没上锁——快递小哥刚把机柜钥匙落在前台。想堵住这种“摸电门”式入侵?给GRUB2上把锁,比加摄像头管用。

单用户模式为啥成了“万能钥匙”
CentOS7默认把GRUB2菜单敞开,任何人只要在启动界面按个“e”,把ro crashkernel=auto改成rw init=/bin/bash,就能绕过PAM、绕过审计,直接拿root shell。物理机、云主机、甚至某些“云控制台”的重装救援模式,都这条路数。密码复杂度再高,也扛不住这种“本地降维打击”。
加密思路:让GRUB2先验“暗号”
GRUB2支持两种锁:
- 明文锁:改个菜单就能看,防君子不防小人;
- PBKDF2哈希锁:把密码拆成50万次哈希,逆向成本直接上天。

下面这套流程,全程离线操作,不依赖外网,哪怕机器在深山老林里的基站,也能一次搞定。
实操:一条命令生成“锁芯”

先给root留个“逃生通道”,防止手抖把自己锁外面:
cp /etc/grub.d/40_custom /boot/grub2/custom_backup用grub2-mkpasswd-pbkdf2生成哈希,密码别用键盘顺序,用一句你老婆都记不住的唠叨:
grub2-mkpasswd-pbkdf2输入两次口令,得到一串长得像
grub.pbkdf2.sha512.10000.C4E08...的东西,整段复制,丢进备忘录。
写锁文件,注意:别粘错空格,否则重启直接报错:
cat > /etc/grub.d/01_password <<'EOF'set superusers="lockadmin"
password_pbkdf2 lockadmin grub.pbkdf2.sha512.10000.C4E08...
EOF
这里lockadmin是自定义用户名,跟系统账号无关,别写成root。
给菜单加“挂锁”:编辑/etc/grub.d/10_linux,找到
CLASS="--class gnu-linux --class gnu --class os"改成
CLASS="--class gnu-linux --class gnu --class os --unrestricted"再把01_password文件权限锁死:
chmod 600 /etc/grub.d/01_password重新生成grub.cfg:
grub2-mkconfig -o /boot/grub2/grub.cfg如果机器是UEFI,把路径换成
/boot/efi/EFI/centos/grub.cfg
验证:重启后按“e”直接要密码
reboot,在GRUB2菜单随便按“e”或“c”,系统会弹出:
Enter username: lockadmin
Enter password: ********
输错三次自动退回菜单,单用户模式入口彻底消失。想改内核参数?先过哈希锁再说。
多人运维?分层授权更稳
把“只读 rescue”入口留给值班小弟,给“完全编辑”权限上二级锁:
cat >> /etc/grub.d/01_password <<'EOF'
set superusers="boss"
password_pbkdf2 boss grub.pbkdf2.sha512.10000.另一段哈希
class --unrestricted
EOF
这样普通重启无需密码,一旦想动内核行,必须boss账号。
云主机也能用?别忘了控制台“防重装”
阿里云、腾讯云、AWS的“救援模式”本质是把你的磁盘挂到别人系统,GRUB2锁挡不住。得再加一层:
- 开“开机密码”或“控制台密码”,跟GRUB2密码不同;
- 把重要分区用LUKS加密,密钥放KMS,哪怕磁盘被挂走,拿不到密钥也只能看乱码。
踩坑速查表
| 症状 | 多半原因 | 秒解 |
|---|---|---|
| 重启后卡在grub>命令行 | grub.cfg语法写错 | 用live CD挂载系统,重新grub2-mkconfig |
| 提示“access denied”但密码没错 | 复制哈希时多了空格 | 重新生成,用cat >> 追加,别手敲 |
| UEFI机器改完无效 | 路径写错 | 确认/boot/efi/EFI/centos/grub.cfg已更新 |
一句话总结
物理机只要别人能摸到键盘,没上GRUB2锁就等于没穿裤子。花五分钟把哈希锁敲进去,比事后跑路、写报告、挨客户骂强一万倍。下次再有人想按“e”改密码,让他先和50万次PBKDF2打一架。
