sudo 与找回 root
RHEL 9 用 /etc/sudoers 给普通用户精确提权,以及 rd.break 进救援环境重置 root 密码(含 SELinux autorelabel)。
本页目录
两件考试里几乎必考、生产里也常做的事:给运维同事 sudo 最小授权;以及 root 密码未知时 重置密码。本篇按「先授权、后救援」走通。
系列:从 RHCSA 到 RHCE · 第 8 / 17 篇 上一篇:ACL 与特殊权限 下一篇:find、grep 与脚本入门 总目录:系列索引
环境说明
- 系统:RHEL 9
- 场景 A(sudo):已有 root,要给普通用户授权
- 场景 B(找回 root):不知道 root 密码,有虚拟机/物理机控制台
- 前置:用户与基础权限篇
授权声明:仅在你拥有或获准管理的实验机、考试环境、自有服务器上重置密码。
为什么需要 sudo
默认普通用户不能 useradd、不能改 /etc。运维新人上班通常拿到的是普通账号,而不是 root。
流程:
- root 编辑
/etc/sudoers(或 drop-in) - 普通用户执行
sudo 命令 - 按授权范围以(通常是)root 身份执行
# 普通用户
useradd test10
# Permission denied
sudo useradd test10
# 若已授权则成功;否则报不在 sudoers
/etc/sudoers 语法
不要用普通 :wq 乱改;推荐:
visudo
# 或编辑 /etc/sudoers.d/ 下文件
核心一行:
用户或%组 主机=(提权身份) 命令列表
示例:
tammy ALL=(root) /usr/sbin/useradd,/usr/bin/passwd
| 字段 | 含义 |
|---|---|
| tammy | 被授权的用户(%组名 表示组) |
| ALL | 在哪些主机上(单机考试几乎总是 ALL) |
| (root) | 以谁的身份执行 |
| /usr/sbin/useradd,... | 允许的命令绝对路径,逗号分隔 |
常用形态
只给两条命令:
tammy ALL=(root) /usr/sbin/useradd,/usr/bin/passwd
免密(考试常见,风险高):
tammy ALL=(ALL) NOPASSWD: ALL
整组授权:
%wheel ALL=(ALL) ALL
把用户加进 wheel:
usermod -aG wheel tammy
id tammy
命令路径
sudoers 里写的是绝对路径。不知道路径:
which useradd
which passwd
RHEL 9 上管理命令常在 /usr/sbin/。
编辑与保存
visudo
VIM 里 :wq 保存;只读打开失败时确认是 root。也可编辑 drop-in(更稳妥用 visudo -f):
visudo -f /etc/sudoers.d/tammy
# 或:
echo 'tammy ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/tammy
chmod 440 /etc/sudoers.d/tammy
visudo -c
考点:
visudo -c检查语法;语法错可能导致所有人无法 sudo。
验证 sudo
# 普通用户登录
sudo -l # 看自己被允许什么
sudo useradd user10
sudo passwd user10
id user10
无授权时典型报错:
tammy is not in the sudoers file. This incident will be reported.
易错:授权了命令却没写对绝对路径,
sudo xxx仍失败。 易错:用su -切到 root 和sudo混为一谈——考试题面写 sudo 就用 sudo。
找回 root:rd.break
适用:控制台可进(虚拟机窗口 / KVM / 云 VNC),root 密码未知或遗忘。
流程总览
重启 → GRUB 菜单按 e → 改内核行:ro→rw,并加 rd.break
→ Ctrl+x → chroot /sysroot → 改 root 密码
→ touch /.autorelabel → exit → reboot
详细步骤
1. 重启,在 GRUB 倒计时界面
快速按 上下方向键 停住菜单(大约只有几秒)。
2. 选中默认启动项,按 e 编辑
3. 找到以 linux 开头的行
修改前常见:
linux ($root)/vmlinuz-... ro ...
改成:
linux ($root)/vmlinuz-... rw ... rd.break
要点:
ro→rw(以可写方式挂根,便于改 shadow)- 行末追加
rd.break(在进入完整系统前停在 switch_root)
4. Ctrl + x 启动
耐心等待,进入:
switch_root:/#
5. 切到真实系统根,并改密码
chroot /sysroot
echo 'YourPass123' | passwd --stdin root
或交互:
passwd root
6. 处理 SELinux(必做)
touch /.autorelabel
exit
reboot
含义:密码文件被在「正常系统外」改过,SELinux 标签可能不对;创建 /.autorelabel 后,下次启动会重新打标签。首次重启会明显变慢,属正常。
易错:只
rw没rd.break,或只rd.break没改rw,改密码可能失败。 易错:漏/.autorelabel(或拼成.autorelable),SELinux 拦截导致看起来「改了却登不进」。 易错:GRUB 倒计时过了直接进了登录界面,要再重启一次。
完整命令序列(chroot 之后)
chroot /sysroot
echo 'YourPass123' | passwd --stdin root
touch /.autorelabel
exit
reboot
重启完成后,用新密码登录验证:
whoami
练习环境与考场
- 课堂虚拟机若用
rht-vmctl reset blue之类重置,可恢复出厂再练 rd.break。 - 考场题面常写明「把 root 密码改为 xxx」——按上文步骤即可,主机名/IP 与本篇无关。
- 云主机可能没有真 GRUB 控制台,需用厂商 VNC/救援盘,步骤原理相同。
推荐实验
A. sudo 最小授权
useradd tammy
echo 'YourPass123' | passwd --stdin tammy
visudo
# 追加:
# tammy ALL=(root) /usr/sbin/useradd,/usr/bin/passwd
su - tammy
sudo -l
sudo useradd user10
# 第一次 sudo 可能要输入 tammy 自己的密码
id user10
exit
再改成免密并验证:
visudo
# tammy ALL=(ALL) NOPASSWD: ALL
su - tammy
sudo useradd user11
exit
B. rd.break(在虚拟机控制台)
- 打快照
- 按上文改 GRUB,重置 root
- 重启后登录,
ls -Z /etc/shadow观察标签已恢复
速查表
| 目标 | 做法 |
|---|---|
| 安全编辑 sudoers | visudo |
| 查看自己的 sudo 权限 | sudo -l |
| 最小授权示例 | user ALL=(root) /usr/sbin/useradd |
| 免密全部 | user ALL=(ALL) NOPASSWD: ALL |
| 检查 sudoers 语法 | visudo -c |
| 救援改 root 密码 | GRUB:rw + rd.break → chroot /sysroot |
| 让 SELinux 重新打标 | touch /.autorelabel 后重启 |
考点与易错
考点:sudoers 三段语法;
sudo -l;rd.break 序列里rw、rd.break、chroot、autorelabel四要素。 易错:sudoers 里命令路径写相对路径或写错。 易错:rd.break 后忘记touch /.autorelabel。 易错:把NOPASSWD: ALL当生产标准——考试可以,生产要收紧。 练习环境:课堂密码环境与本文命令一致,仅新密码取值不同。
小结
- 授权用 sudoers:
用户 主机=(身份) 命令;编辑用visudo。 - 验证用
sudo -l;命令写绝对路径。 - 忘 root 密码:GRUB 加
rw rd.break→chroot /sysroot→passwd→/.autorelabel→ 重启。 - 重启后第一次会因重新打 SELinux 标签而偏慢,属预期。
下一篇 find/grep 与最小脚本——为后面 Ansible 与排障铺路。
系列导航:总目录 · 上一篇:ACL 与特殊权限 · 下一篇:find、grep 与脚本入门