AlmaLinux 10:sudoers 改坏的代价与安全做法
在 AlmaLinux 10.2 虚拟机(内核 6.12.0-211.64.1.el10_2)中实测:drop-in 授权、visudo -c(含错误用例)、sudo -l -U、以普通用户执行允许/未允许命令。日志:plans/content-expansion/evidence/logs/alma-sudoers-basics.log。
先看清代价:一条坏规则全局失效
Section titled “先看清代价:一条坏规则全局失效”echo "this is bad" | sudo tee /etc/sudoers.d/badsudo visudo -c; echo "rc=$?"/etc/sudoers.d/bad:1:9: syntax errorthis is bad ^~~rc=1只要有一个 drop-in 语法错,所有人的 sudo 都可能不可用。所以顺序永远是:写 → visudo -c → 再依赖。
drop-in 的三个硬性要求
Section titled “drop-in 的三个硬性要求”| 要求 | 原因 |
|---|---|
| 权限 440 | 组/其他人可写会被 sudo 拒绝加载 |
文件名不含 .、不以 ~ 结尾 | 这类文件被 sudo 忽略 |
主文件有 @includedir /etc/sudoers.d | 否则整个目录不生效 |
sudo printf 'labuser ALL=(root) NOPASSWD: /usr/bin/systemctl status sshd\n' | sudo tee /etc/sudoers.d/labsudo chmod 440 /etc/sudoers.d/lab云镜像自带的 90-cloud-init-users
Section titled “云镜像自带的 90-cloud-init-users”sudo ls -l /etc/sudoers.d/sudo visudo -c-r--r----- 1 root root 84 ... /etc/sudoers.d/90-cloud-init-users/etc/sudoers: parsed OK/etc/sudoers.d/90-cloud-init-users: parsed OK/etc/sudoers.d/lab: parsed OK云镜像会为 cloud-init 用户预置授权(如 alma ALL=(ALL) NOPASSWD:ALL)。审计时别漏掉它——很多「为什么这个用户能免密 sudo」就来自这里。
sudo -l -U labusersu - labuser -c 'sudo -n /usr/bin/systemctl status sshd | head -2'su - labuser -c 'sudo -n /usr/bin/id'User labuser may run the following commands on alma10-lab: (root) NOPASSWD: /usr/bin/systemctl status sshd● sshd.service - OpenSSH server daemonsudo: a password is required允许的命令执行成功;未列出的命令回落到密码校验,因用户无密码而失败——最小权限生效。

- 语法错不校验:一条坏规则让 sudo 全局不可用;
- 权限写成 644:文件被忽略,授权「看起来配了但没生效」;
- 给整条 systemctl:等于给了全部服务控制权;
- 忽略 90-cloud-init-users:审计时漏掉云镜像预置的免密规则。
练习:先写坏再修好
Section titled “练习:先写坏再修好”echo "bad line" | sudo tee /etc/sudoers.d/badsudo visudo -c; echo "rc=$?"sudo rm -f /etc/sudoers.d/badsudo visudo -c; echo "rc=$?"检查:
- 第一条
visudo -c返回 rc=1 并指出行号列号 - 删除坏文件后 rc=0
- 全过程
sudo仍可用(说明坏文件未被加载前就修掉了)
常见问题
改坏 sudoers 后还能 sudo 吗?
如果坏文件已生效,sudo 会报语法错误并拒绝执行。此时用 root 直接删除或修正该文件,不要依赖 sudo。
90-cloud-init-users 能删吗?
可以,但先确认该用户的免密授权是否还被需要;删除后对应 cloud-init 用户会失去 sudo 权限,可能影响运维入口。
权限 440 和 400 有区别吗?
440 允许 root 组读,便于审计工具读取;400 仅 root 可读。两者 sudo 都接受,常见做法是 440。
- SELinux 基础:SELinux 基础
- 网络排查:网络不通的五层排查
- 安装后核对:新装系统 7 项核对