sudoers 为什么重要
Linux 上的 sudo 权限完全由 /etc/sudoers 与 /etc/sudoers.d/ 目录下的片段文件决定,谁能以 root 身份运行什么命令都写在里面。提权持久化的常见落点就是往这里加一条规则:NOPASSWD 让攻击者不需要口令即可提权,ALL=(ALL) ALL 直接给全部权限。检查 sudoers 既要看内容,也要看文件时间与校验结果,才能区分“本来就有的运维规则”和“事件窗口内被加上的规则”。
基本信息
| 适用平台 | 安装 sudo 的 Linux/Unix(RHEL、CentOS、Ubuntu、Debian 等) |
|---|---|
| 文件 | /etc/sudoers 与 /etc/sudoers.d/* 片段文件 |
| 危险模式 | NOPASSWD、ALL=(ALL) ALL、指向可写目录下的脚本、免密通配命令 |
| 语法检查 | visudo -c(只检查不修改),也可用 visudo -cf 指定单个文件 |
| 加载规则 | 片段文件按文件名字典序加载;文件名含点或以 ~ 结尾的文件会被忽略 |
典型使用场景
- 核查事件窗口内是否新增提权规则,定位持久化落点
- 确认服务账号是否被赋予了超出业务需要的 sudo 权限
- 排查“命令能免密执行”的异常现象,确认是否来自 sudoers 变更
- 在清理前固定证据:保存文件内容、时间戳、哈希与所属包校验结果
- 交接与合规检查:定期比对 sudoers 与基线版本的差异
核查步骤
核查步骤
# 1) 语法有效性检查(不修改文件,安全)
visudo -c
# 2) 列出所有危险模式:免密、全权限、通配命令
grep -Rn -E 'NOPASSWD|ALL=\(ALL\)|ALL:ALL' /etc/sudoers /etc/sudoers.d/ 2>/dev/null
# 3) 看片段文件的时间与属性(新增文件通常会暴露)
ls -l --time-style=full-iso /etc/sudoers /etc/sudoers.d/
# 4) 用包管理器校验配置文件是否被改动(以发行版工具输出为准)
rpm -Vf /etc/sudoers 2>/dev/null || debsums sudo 2>/dev/null
# 5) 固定证据
md5sum /etc/sudoers /etc/sudoers.d/* > /case/sudoers-hashes.txt可疑规则对照
| 规则形态 | 含义 | 风险 |
|---|---|---|
| user ALL=(ALL) NOPASSWD: ALL | 该用户免密获得全部权限 | 凭据泄露即等于 root |
| %group ALL=(root) /bin/bash | 整组用户可获得 root shell | 范围远超实际需要 |
| user ALL=(ALL) ALL | 需要口令但无命令限制 | 口令一旦泄露无第二道防线 |
| (root) NOPASSWD: /tmp/* | 免密执行可写目录下的任意程序 | 路径可控等于任意命令执行 |
| Defaults env_keep+=LD_PRELOAD | 保留提权时的环境变量 | 可被用于动态库劫持 |
sudoers.d 里文件名含点或以波浪号结尾的文件会被 sudo 跳过(避免编辑器临时文件生效);如果发现了规则文件却“不生效”,先确认命名规则,再判断文件是否被实际加载。
检查时不要用文本编辑器打开 /etc/sudoers:直接编辑或在保存时产生临时文件都可能破坏配置,导致所有 sudo 权限失效。查看用 cat/grep,修改必须走 visudo。