Linux

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。

流程:

  1. root 编辑 /etc/sudoers(或 drop-in)
  2. 普通用户执行 sudo 命令
  3. 按授权范围以(通常是)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(在虚拟机控制台)

  1. 打快照
  2. 按上文改 GRUB,重置 root
  3. 重启后登录,ls -Z /etc/shadow 观察标签已恢复

速查表

目标做法
安全编辑 sudoersvisudo
查看自己的 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 当生产标准——考试可以,生产要收紧。 练习环境:课堂密码环境与本文命令一致,仅新密码取值不同。

小结

  1. 授权用 sudoers:用户 主机=(身份) 命令;编辑用 visudo。
  2. 验证用 sudo -l;命令写绝对路径。
  3. 忘 root 密码:GRUB 加 rw rd.break → chroot /sysroot → passwd → /.autorelabel → 重启。
  4. 重启后第一次会因重新打 SELinux 标签而偏慢,属预期。

下一篇 find/grep 与最小脚本——为后面 Ansible 与排障铺路。


系列导航:总目录 · 上一篇:ACL 与特殊权限 · 下一篇:find、grep 与脚本入门

相关阅读

全部文章 →
← 返回列表更多「Linux」