核心是锁死grub编辑入口,需用pbkdf2-sha512生成强哈希口令(如grub2-mkpasswd-pbkdf2),写入/etc/grub.d/40_custom并更新配置,同时清除rd.break等危险内核参数、屏蔽emergency.target,确保默认启动multi-user.target且getty启用。

核心不是“禁用单用户模式”,而是锁死 GRUB 编辑入口——只要能按 e 修改内核参数,攻击者就能加 rd.break 或 init=/bin/bash 直接获得 root shell,完全绕过所有系统级认证。
生成强加密的 GRUB 管理员口令
明文密码绝对不可行,必须用 PBKDF2 哈希(比 MD5/SHA-256 更抗暴力破解):
- CentOS/RHEL/Rocky/AlmaLinux:运行
sudo grub2-mkpasswd-pbkdf2 - Debian/Ubuntu:运行
sudo grub-mkpasswd-pbkdf2 - 输入两次你想设的强密码(如
GrubAdmin@2026!),命令会输出一长串以grub.pbkdf2.sha512开头的密文
配置 superusers 并锁定 GRUB 编辑权限
编辑 /etc/grub.d/40_custom(RHEL系)或 /etc/grub.d/00_header(部分 Debian/Ubuntu 变体),在文件末尾添加:
set superusers="admin" password_pbkdf2 admin grub.pbkdf2.sha512.10000.xxxxx...
-
admin是你自定义的用户名,可改为任意名称(如sysop) - 确保密文完整粘贴,不能截断或换行
- 保存后立即执行更新命令:
→ RHEL系:sudo grub2-mkconfig -o /boot/grub2/grub.cfg
→ Debian/Ubuntu:sudo update-grub
清除危险内核参数并屏蔽应急目标
仅加 GRUB 密码不够,还需从源头移除可被利用的启动选项:
- 检查并清理
/etc/default/grub中的GRUB_CMDLINE_LINUX,确保不含:rd.break、init=/bin/bash、systemd.unit=emergency.target - 强制设为安全默认:
GRUB_CMDLINE_LINUX="rd.shell=0 rd.break=0 systemd.unit=multi-user.target" - 屏蔽 systemd 的两个高危 target:
sudo systemctl mask emergency.target rescue.target - 验证是否生效:
systemctl list-unit-files | grep -E "(emergency|rescue)"应显示masked
确认登录服务与默认运行目标正常
单用户防护最终要落到实际登录环节,避免因配置错误退回到无认证环境:
- 设标准启动目标:
服务器用sudo systemctl set-default multi-user.target
桌面环境用sudo systemctl set-default graphical.target - 检查 getty 是否启用:
sudo systemctl is-enabled getty@tty1.service,应返回enabled - 图形界面需确认 GDM/SDDM 正在运行,而非停留在未认证的 tty 控制台











