GRUB superuser密码是防止本地提权进入单用户模式的第一道关键防线;需用grub2-mkpasswd-pbkdf2生成加密hash,配置superusers并更新grub.cfg,同时清除危险内核参数、屏蔽rescue/emergency.target,并确保默认target与登录服务正常启用。

直接在 GRUB 引导层加密码锁,是防止本地提权进入单用户模式最有效的方式。单用户模式本身不校验登录凭证,只要能编辑内核参数(如加 init=/bin/bash 或 rd.break),就能绕过所有系统认证拿到 root shell。所以防护重点不是“给单用户模式设密码”,而是“不让任何人随意编辑启动项”。
用 GRUB superuser 密码锁定编辑权限
这是第一道也是最关键的防线。没有它,后续所有加固都形同虚设。
- 运行
grub2-mkpasswd-pbkdf2,输入两次密码,复制输出的加密 hash(比 MD5/SHA 更安全) - 编辑
/etc/grub.d/40_custom,在末尾添加:set superusers="admin"<br>password_pbkdf2 admin <刚复制的hash>
- 执行
grub2-mkconfig -o /boot/grub2/grub.cfg生效 - 重启后进 GRUB 菜单按
e或c,会提示输入 superuser 用户名和密码
清除并禁用危险内核启动参数
即使 GRUB 加了锁,若配置残留或未屏蔽参数,仍可能被利用。
- 检查
/etc/default/grub中的GRUB_CMDLINE_LINUX,确保不含:rd.break、init=/bin/bash、systemd.unit=emergency.target - 强制覆盖为安全值:
rd.shell=0 rd.break=0 systemd.unit=multi-user.target - 更新配置:
grub2-mkconfig -o /boot/grub2/grub.cfg
禁用 rescue 和 emergency 目标
这两个 target 是 systemd 下的“官方单用户入口”,默认无密码即可触发。
- 执行:
systemctl mask rescue.target emergency.target - 该命令会创建指向
/dev/null的符号链接,彻底阻止激活 - 验证:运行
systemctl list-unit-files | grep -E "(rescue|emergency)",状态应为masked
确认默认启动目标与登录机制完整
运行级(target)本身不决定是否要密码,但错误设置会让 getty 或显示管理器失效。
- 设为标准多用户目标:
systemctl set-default multi-user.target(服务器)或graphical.target(桌面) - 检查 getty@tty1.service 是否启用:
systemctl is-enabled getty@tty1.service,应返回enabled - 若用图形界面,确认 GDM/SDDM 等显示管理器已安装且正在运行,而非退回到无认证的文本控制台


















