免密 sudo 的边界
自动发布与巡检机器人无法应答口令提示,因此需要 NOPASSWD。关键在于把免密范围压到最小:按命令粒度授权,只放行自动化真正用到的那几条,并限定执行用户。范围写宽的代价很直接——被授权的脚本一旦可被普通用户修改,免密 sudo 就等于把 root 权限交给了任何能写那个脚本的人。
基本信息
| 配置位置 | /etc/sudoers.d/ 下独立文件,用 visudo 或 visudo -f 编辑 |
|---|---|
| 写法 | 用户 主机=(目标用户) NOPASSWD: 命令绝对路径 |
| 查看授权 | sudo -l -U 用户名 |
| 语法校验 | visudo -c |
| 限制来源 | 命令写绝对路径,且尽量匹配具体子命令与参数 |
| 复核周期 | 建议随人员与系统变更同步复核,至少每季度一次 |
典型使用场景
- CI/CD 发布账户需要免密重启指定服务
- 监控探针需要免密执行特定检查命令
- 批量巡检脚本收集系统信息,逐条授权读取类命令
- 备份任务需要免密挂载或卸载指定目录
- 运维机器人执行受控的固定命令集
片段示例与复核
片段示例与复核
# /etc/sudoers.d/deploy(只放行固定命令)
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart myapp
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl status myapp
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl reload myapp
visudo -f /etc/sudoers.d/deploy # 用 visudo 编辑,保存时自动校验语法
sudo -l -U deploy # 复核该账户最终生效的授权清单
su - deploy -c 'sudo -n systemctl status myapp' # 实测免密执行是否可用范围收敛与风险核查
范围收敛与风险核查
grep -rn NOPASSWD /etc/sudoers /etc/sudoers.d/ 2>/dev/null # 全局清点免密条目
ls -l /opt/scripts/deploy.sh # 授权脚本的权限:普通用户可写即风险
find /opt/scripts -perm -o+w -type f 2>/dev/null # 找出全局可写脚本
sudo -l -U deploy | wc -l # 授权条目数量,条目越多越需复核
visudo -c # 每次改动后统一校验写法与风险
| 写法 | 授权范围 | 风险 |
|---|---|---|
| NOPASSWD: ALL | 全部命令免密 | 等价于免口令 root,最高风险 |
| NOPASSWD: /usr/bin/systemctl | 该命令的任意参数 | 可借 systemctl 间接执行任意服务操作 |
| NOPASSWD: /usr/bin/systemctl restart myapp | 单一子命令 | 收敛到具体动作,推荐 |
| NOPASSWD: /opt/scripts/deploy.sh | 单个脚本 | 脚本可写即等于提权通道 |
| 限定目标用户 (root) 或 (appuser) | 切换身份范围 | 目标用户越宽,影响面越大 |
NOPASSWD: ALL 等价于免口令 root:只在完全隔离的自动化账户上按需使用,评审通过后及时收敛,不要长期留在生产机上。
命令匹配看实际执行路径与参数模式:写 /usr/bin/systemctl 会放行该命令的大量参数组合,需要更严格控制时应把子命令甚至参数一并写入授权行。