Rocky 10:用 /etc/sudoers.d 授权(实测)
在 Rocky Linux 10.2 虚拟机(内核 6.12.0-211.16.1.el10_2)中实测:创建测试用户、写 /etc/sudoers.d/lab、visudo -c 校验、sudo -l -U 查看、以该用户执行允许/未允许的命令。日志:plans/content-expansion/evidence/logs/rocky-sudoers-basics.log。
为什么不直接改 /etc/sudoers
Section titled “为什么不直接改 /etc/sudoers”/etc/sudoers 是主文件,/etc/sudoers.d/ 是 drop-in 目录:每个文件独立、便于配置管理、出问题只影响单个文件。主文件里通常有一行 @includedir /etc/sudoers.d,drop-in 才生效。
一条最小授权
Section titled “一条最小授权”sudo useradd -m labusersudo passwd labusersudo printf 'labuser ALL=(root) NOPASSWD: /usr/bin/systemctl status sshd\n' | sudo tee /etc/sudoers.d/labsudo chmod 440 /etc/sudoers.d/labsudo ls -l /etc/sudoers.d/-r--r----- 1 root root 62 ... /etc/sudoers.d/lab-r--r----- 1 root root 84 ... /etc/sudoers.d/90-cloud-init-users两个要点:权限必须 440(组/其他人可写会被 sudo 拒绝),文件名不能带 . 或以 ~ 结尾(被 sudo 忽略)。
先校验再生效
Section titled “先校验再生效”sudo visudo -c/etc/sudoers: parsed OK/etc/sudoers.d/90-cloud-init-users: parsed OK/etc/sudoers.d/lab: parsed OK写错语法时:
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=1visudo -c 返回 1 就是有语法错误;此时应立刻删掉坏文件——带语法错误的 drop-in 会让 sudo 整体不可用。
验证谁能做什么
Section titled “验证谁能做什么”sudo -l -U labuserUser labuser may run the following commands on rocky10-lab: (root) NOPASSWD: /usr/bin/systemctl status sshdsudo -l -U 是不改密码、不切换用户就能审计授权的方式,比逐个试命令安全。
实测:允许的能跑,未允许的被拒
Section titled “实测:允许的能跑,未允许的被拒”su - labuser -c 'sudo -n /usr/bin/systemctl status sshd | head -2'su - labuser -c 'sudo -n /usr/bin/id'● sshd.service - OpenSSH server daemon Loaded: loaded (...)sudo: a password is required允许的命令直接执行;未列出的命令回落到「需要密码」,因为该用户没有密码(或没配 NOPASSWD),所以失败。这就是最小权限生效的样子。

- 权限不是 440:sudo 忽略该文件,授权不生效;
- 文件名带
.:lab.conf这类会被跳过,用lab或90-lab; - 语法错误没校验:
visudo -c返回 1 时必须修,否则 sudo 全坏; - NOPASSWD 给整条
systemctl:等于给了改服务的能力,要精确到子命令。
练习:只允许重启一个服务
Section titled “练习:只允许重启一个服务”sudo useradd -m labuser && sudo passwd labusersudo printf 'labuser ALL=(root) NOPASSWD: /usr/bin/systemctl restart chronyd\n' | sudo tee /etc/sudoers.d/labsudo chmod 440 /etc/sudoers.d/labsudo visudo -csudo -l -U labusersu - labuser -c 'sudo -n /usr/bin/systemctl restart chronyd'su - labuser -c 'sudo -n /usr/bin/systemctl restart sshd'检查:
visudo -c三个文件都 parsed OKsudo -l -U只列出 restart chronyd- 第一条
su命令成功 - 第二条失败(
a password is required)
常见问题
为什么 sudoers.d 里的文件不生效?
常见三个原因:权限不是 440、文件名带点号、主文件缺少 @includedir /etc/sudoers.d。用 visudo -c 先确认语法与加载。
NOPASSWD 写整条 systemctl 有什么风险?
等于允许该用户启停任意服务(含修改服务定义),应精确到子命令与具体 unit,例如 systemctl restart chronyd。
改坏了 sudoers 怎么救?
用 root 直接删掉坏的 drop-in 或执行 visudo 修正;不要依赖 sudo 本身,必要时用单用户/救援模式。
- SELinux 基础:SELinux 基础
- 网络排查:按症状分诊网络问题
- 安装后核对:安装后 7 项核对