sudoers 配置排查
sudo 让普通用户按规则以其他身份执行命令,配置存放在 /etc/sudoers 与 /etc/sudoers.d/ 目录。攻击者提权后常在这里加一条免密规则:既能随时回到 root,又不像新增 UID 0 账号那样容易在台账里被发现。排查要做三件事:把全部生效条目读出来、识别危险模式、与基线比对确认哪些行是新增的。改这个文件本身也有风险,语法错误会导致所有人都用不了 sudo。
基本信息
| 配置文件 | /etc/sudoers 主文件;/etc/sudoers.d/ 下的独立片段(常见 @includedir 引入) |
|---|---|
| 校验方式 | visudo -c 检查语法,-f 指定文件 |
| 查看实际权限 | sudo -l -U 用户名 列出该用户真正可用的命令 |
| 危险模式 | NOPASSWD、ALL=(ALL)、把可逃逸程序(编辑器、解释器、打包工具)直接授权 |
| 文件命名规则 | 文件名含点号或波浪号的片段会被忽略,多用于规避快速检查 |
| 留痕 | sudo 命令会记录到 /var/log/auth.log 或 secure,处置时同步核对 |
典型使用场景
- 确认是否有人给自己加了免密提权规则
- 核对运维账号的授权范围是否超出必要
- 排查「某账号突然能执行所有命令」这类异常
- 做合规检查时列出所有免密条目
- 清理后验证授权是否恢复为既定基线
扫描免密与全权配置
扫描免密与全权配置
sudo visudo -c # 先做语法检查
sudo grep -rEn 'NOPASSWD|ALL[[:space:]]*=|!authenticate' /etc/sudoers /etc/sudoers.d/ | head -n 40
sudo ls -la /etc/sudoers.d/ # 看文件名与时间戳
sudo ls -lt --time-style=full-iso /etc/sudoers /etc/sudoers.d/ | head
sudo -l -U www-data 2>/dev/null | head -n 20 # 某个用户的真实权限
sudo grep -rEn 'LD_PRELOAD|env_keep' /etc/sudoers /etc/sudoers.d/ | head危险模式读法
| 模式 | 含义 | 风险 |
|---|---|---|
| NOPASSWD: ALL | 免密执行任何命令 | 等同于直接给出 root 权限 |
| ALL=(ALL) NOPASSWD: /usr/bin/vi | 授权一个可逃逸的程序 | 编辑器可起 shell,实际等于放开 root |
| 通配符命令 | 如 /bin/cp * 或 /usr/bin/find * | 参数可控即可变相执行任意命令 |
| %wheel 或 %sudo 组授权 | 整组用户获得权限 | 组内任意成员变化都会扩大攻击面 |
| Defaults !authenticate | 全局关闭口令校验 | 任何能用 sudo 的账号都可免密提权 |
| env_keep 含 LD_PRELOAD 之类 | 保留可注入的环境变量 | 可借环境变量实现在提权过程中注入代码 |
改动 sudoers 必须用 visudo:它会在保存前做语法检查并使用锁机制,手工编辑一旦写错,所有依赖 sudo 的自动化与运维操作会立刻失效,恢复往往需要单用户模式。
排查要覆盖被忽略的文件:文件名含点号或波浪号的片段不会被 sudo 读取,所以既要看真实生效条目,也要看目录里有没有这类残留文件——它们可能是攻击者留下的手法痕迹,也可能是误操作产物。