场景与思路
用户执行 sudo 被拒绝时,报错基本分两类:not in sudoers 表示用户不在任何授权规则里,command not allowed 或 sorry, user X is not allowed 表示用户有 sudo 权限但不包含这条命令。排查顺序是先看用户被授权了什么,再确认策略来自哪里——主文件 /etc/sudoers、drop-in 目录 /etc/sudoers.d/,还是 LDAP/SSSD 下发的集中策略,最后用审计日志确认被拒时的实际命令与参数,避免凭猜测放宽权限。
基本信息
| 场景 | sudo 报 not in sudoers 或 command not allowed |
|---|---|
| 目标 | 定位策略缺口,做最小化补权 |
| 排查链路 | sudo -l 看授权 → visudo -c 校验语法 → 审计日志看拒绝 → sudoers.d 授权 |
| 规则要点 | 命令必须写绝对路径,参数尽量枚举;NOPASSWD 只给确实免密的命令 |
| 风险提示 | ALL=(ALL) NOPASSWD: ALL 等于把 root 权限直接发出去 |
典型使用场景
- 用户反馈没有权限执行某条管理命令
- 新同事入职,需要开通特定的运维命令权限
- 自动化脚本执行 sudo 失败,需要定位是缺规则还是路径写错
- 安全审计发现越权尝试,需要核查策略是否过宽
- 系统迁移到集中认证后,本地与 LDAP 策略冲突
第 1 步:看授权现状
第 1 步:看授权现状
sudo -l -U zhangsan # 列出该用户被允许执行的命令
sudo -ll -U zhangsan # 展开每一条规则的来源文件
sudo -l -U zhangsan | grep -i nopasswd # 检查是否需要密码
visudo -c # 校验 sudoers 语法是否正确
grep -R zhangsan /etc/sudoers /etc/sudoers.d/ 2>/dev/null第 2 步:看拒绝记录并补权
第 2 步:看拒绝记录并补权
journalctl -t sudo -n 50 # 拒绝记录:用户、命令、参数、策略来源
grep -i 'COMMAND=' /var/log/secure | tail -n 20
sudo visudo -f /etc/sudoers.d/zhangsan
# zhangsan ALL=(root) NOPASSWD: /bin/systemctl restart myapp
sudo visudo -c && sudo -l -U zhangsan # 改完立即验证报错对照表
| 报错 | 含义 | 处置方向 |
|---|---|---|
| not in sudoers | 用户不在任何授权规则中 | 在 sudoers.d 里添加最小规则,或加入授权组 |
| command not allowed | 有 sudo 权限但该命令未授权 | 核对命令绝对路径与参数是否与规则一致 |
| 提示输入密码却失败 | 口令错误或 NOPASSWD 未生效 | 核对规则、密码策略与账号状态 |
| command not found: sudo | 系统未安装 sudo | 安装 sudo 并按最小权限配置 |
| LDAP 用户被拒 | 集中策略未包含该规则 | 联系目录管理员下发,避免本地硬加绕过治理 |
sudo 拒绝时退出码为 1,日志中会写明用户、命令、参数与匹配到的策略来源。读出策略来源字段就能立刻判断该改本地文件还是集中策略,不必靠猜。
授权时命令路径要与用户实际执行的一致,/usr/bin/systemctl 与 /bin/systemctl 是两条不同规则;参数里的通配符会扩大权限范围,能用确定值就不要用 *。