如何实战操作设置系统运行级及单用户模式下的密码保护?
- 内容介绍
- 相关推荐
本文共计1000个文字,预计阅读时间需要4分钟。
系统运行级和单用户模式若无密码保护,攻击者可轻易绕过登录界面进入root权限,造成严重安全隐患。关键在于:
配置 GRUB2 启动菜单密码(防止直接编辑内核参数)
这是防护单用户模式的第一道防线。没有它,任何人重启时按 e 键就能修改 kernel 参数(如添加 init=/bin/bash 或 rd.break)跳过密码验证。
- 生成加密密码:
sudo grub2-mkpasswd-pbkdf2
按提示输入密码,复制输出中 grub.pbkdf2.sha512... 开头的整段密文 - 编辑 GRUB 配置:
sudo vi /etc/grub.d/40_custom
在文件末尾添加:set superusers="admin" password_pbkdf2 admin grub.pbkdf2.sha512.10000.……(粘贴刚才的密文)
- 更新 GRUB 配置:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
完成后重启,启动菜单按 c 或 e 时会要求输入用户名 admin 和对应密码。
禁用无密码的单用户模式(systemd 系统重点)
传统 SysV 的 init=/bin/bash 在 systemd 下已不直接生效,但 rd.break 和 systemd.unit=emergency.target 仍可触发免密 root shell。必须限制这些入口。
- 移除内核参数中的危险选项:
检查当前启动项:
sudo grep "kernelopts" /boot/grub2/grubenv
若含 rd.break、init=/bin/bash、systemd.unit=emergency.target,需清除 - 锁定 emergency 和 rescue 模式:
执行:
sudo systemctl mask emergency.target rescue.target
这会创建符号链接阻止其被激活 - 设置 emergency/rescue 模式密码(可选但推荐):
sudo systemctl edit emergency.target
输入:
[Service] ExecStart= ExecStart=-/usr/lib/systemd/systemd-user-sessions --force ExecStart=-/usr/lib/systemd/systemd-user-sessions --mode=lock
保存后执行 sudo systemctl daemon-reload
确保多用户运行级(runlevel 3/5)启用完整认证
运行级本身不决定是否要密码,真正起作用的是显示管理器(如 gdm3、sddm)或 getty 服务。需确认登录流程未被绕过。
- 检查默认 target:
systemctl get-default
应为 graphical.target(对应 runlevel 5)或 multi-user.target(runlevel 3) - 确认 getty@.service 已启用且未禁用密码验证:
systemctl status getty@tty1.service
查看是否 Active (running),并确认其配置中无 --noclear 或 --autologin=root 类参数 - 禁用自动登录(尤其桌面环境):
GNOME:编辑 /etc/gdm3/custom.conf,确保 AutomaticLoginEnable=false
KDE:检查 /etc/sddm.conf 中 AutoLoginEnable=false
验证与测试(务必在维护窗口操作)
配置完成后,必须实地验证防护是否生效,避免锁死自己。
- 重启进入 GRUB 菜单,尝试按 e 编辑启动项 → 应弹出密码提示
- 尝试添加 rd.break 并 Ctrl+X 启动 → 应卡在 initramfs 阶段或报错“Permission denied”
- 重启后选择 “Rescue Mode” 或 “Emergency Mode” → 应无法进入,或进入后立即要求 root 密码
- 正常启动后,切换到 tty2(Ctrl+Alt+F2),确认提示 login: 且 root 不允许直接登录(除非明确配置了 root 密码且 PermitRootLogin yes)
不复杂但容易忽略。核心就三点:GRUB 加密锁住入口、systemd 屏蔽危险 target、登录服务关闭自动认证。做完这三步,单用户模式和运行级的安全基线才算真正建立。
本文共计1000个文字,预计阅读时间需要4分钟。
系统运行级和单用户模式若无密码保护,攻击者可轻易绕过登录界面进入root权限,造成严重安全隐患。关键在于:
配置 GRUB2 启动菜单密码(防止直接编辑内核参数)
这是防护单用户模式的第一道防线。没有它,任何人重启时按 e 键就能修改 kernel 参数(如添加 init=/bin/bash 或 rd.break)跳过密码验证。
- 生成加密密码:
sudo grub2-mkpasswd-pbkdf2
按提示输入密码,复制输出中 grub.pbkdf2.sha512... 开头的整段密文 - 编辑 GRUB 配置:
sudo vi /etc/grub.d/40_custom
在文件末尾添加:set superusers="admin" password_pbkdf2 admin grub.pbkdf2.sha512.10000.……(粘贴刚才的密文)
- 更新 GRUB 配置:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
完成后重启,启动菜单按 c 或 e 时会要求输入用户名 admin 和对应密码。
禁用无密码的单用户模式(systemd 系统重点)
传统 SysV 的 init=/bin/bash 在 systemd 下已不直接生效,但 rd.break 和 systemd.unit=emergency.target 仍可触发免密 root shell。必须限制这些入口。
- 移除内核参数中的危险选项:
检查当前启动项:
sudo grep "kernelopts" /boot/grub2/grubenv
若含 rd.break、init=/bin/bash、systemd.unit=emergency.target,需清除 - 锁定 emergency 和 rescue 模式:
执行:
sudo systemctl mask emergency.target rescue.target
这会创建符号链接阻止其被激活 - 设置 emergency/rescue 模式密码(可选但推荐):
sudo systemctl edit emergency.target
输入:
[Service] ExecStart= ExecStart=-/usr/lib/systemd/systemd-user-sessions --force ExecStart=-/usr/lib/systemd/systemd-user-sessions --mode=lock
保存后执行 sudo systemctl daemon-reload
确保多用户运行级(runlevel 3/5)启用完整认证
运行级本身不决定是否要密码,真正起作用的是显示管理器(如 gdm3、sddm)或 getty 服务。需确认登录流程未被绕过。
- 检查默认 target:
systemctl get-default
应为 graphical.target(对应 runlevel 5)或 multi-user.target(runlevel 3) - 确认 getty@.service 已启用且未禁用密码验证:
systemctl status getty@tty1.service
查看是否 Active (running),并确认其配置中无 --noclear 或 --autologin=root 类参数 - 禁用自动登录(尤其桌面环境):
GNOME:编辑 /etc/gdm3/custom.conf,确保 AutomaticLoginEnable=false
KDE:检查 /etc/sddm.conf 中 AutoLoginEnable=false
验证与测试(务必在维护窗口操作)
配置完成后,必须实地验证防护是否生效,避免锁死自己。
- 重启进入 GRUB 菜单,尝试按 e 编辑启动项 → 应弹出密码提示
- 尝试添加 rd.break 并 Ctrl+X 启动 → 应卡在 initramfs 阶段或报错“Permission denied”
- 重启后选择 “Rescue Mode” 或 “Emergency Mode” → 应无法进入,或进入后立即要求 root 密码
- 正常启动后,切换到 tty2(Ctrl+Alt+F2),确认提示 login: 且 root 不允许直接登录(除非明确配置了 root 密码且 PermitRootLogin yes)
不复杂但容易忽略。核心就三点:GRUB 加密锁住入口、systemd 屏蔽危险 target、登录服务关闭自动认证。做完这三步,单用户模式和运行级的安全基线才算真正建立。

