关键一步是查出所有配置了NOPASSWD且权限过宽的账号:先用sudo grep -E 'NOPASSWD|NOEXEC|SETENV' /etc/sudoers /etc/sudoers.d/* 2>/dev/null | grep -v '^#'定位全部条目;再识别(ALL : ALL) ALL、免密启shell或find/vim等提权命令三类高危模式;最后用sudo -l -U username和sudo -n whoami实测验证。

直接查出所有配置了 NOPASSWD 且权限过宽的账号,是 sudo 权限审计中最关键的一环。重点不是“有没有 NOPASSWD”,而是“谁在什么条件下能免密执行什么命令”——尤其是能执行任意命令、启动 shell 或覆盖系统关键路径的那些条目。
一、快速定位所有 NOPASSWD 条目
运行以下命令,一次性列出全部含 NOPASSWD 的授权行(含注释中的疑似项):
sudo grep -E 'NOPASSWD|NOEXEC|SETENV' /etc/sudoers /etc/sudoers.d/* 2>/dev/null | grep -v '^#'
说明:
-
/etc/sudoers.d/下的文件必须纳入,很多运维习惯把权限拆分到独立文件中,漏掉就等于漏掉风险 - 同时匹配
NOEXEC和SETENV是因为它们常与NOPASSWD共存,而NOEXEC可被绕过、SETENV可能导致环境变量提权 - 过滤掉以
#开头的纯注释行,避免干扰
二、识别真正高危的组合模式
不是所有 NOPASSWD 都危险,但以下三类必须立即标记并人工确认:
-
(ALL : ALL) ALL或(ALL) ALL—— 表示可免密切换任意用户、执行任意命令,等同于赋予 root 权限 -
NOPASSWD: /bin/bash, /bin/sh, /usr/bin/python*, /usr/bin/perl—— 免密启交互式 shell 或解释器,可绕过命令粒度限制 -
NOPASSWD: /usr/bin/find, /usr/bin/vim, /usr/bin/less—— 常见“看似安全”的命令,实则可通过内置功能(如find ... -exec sh \;、:!sh)提权
三、按用户维度汇总实际可用权限
对每个普通用户,运行 sudo -l -U username(需有对应权限),或用以下脚本批量探测(需 root 或具有 sudo -l -U 权限的账号):
for u in $(cut -d: -f1 /etc/passwd | grep -Ev '^(root|sync|shutdown|halt|operator|nobody)'); do echo "== $u =="; sudo -l -U "$u" 2>/dev/null | grep -E '(NOPASSWD|Shells?|User|Group)' | head -5; done | grep -A1 -B1 'NOPASSWD'
说明:
- 排除系统保留账号,聚焦真实业务或运维人员账号
- 输出中若出现
shell、user、group等关键词,说明该用户具备越权上下文能力 - 配合
head -5控制长度,避免长输出淹没关键信息
四、验证是否真能免密执行(防误报)
发现可疑条目后,别只信配置,要实测:
- 用目标用户登录或
su - username,执行sudo -n whoami(-n表示不提示密码);若返回root且无报错,即确认免密生效 - 对允许执行的命令,尝试加参数触发提权路径,例如:
sudo -n find /tmp -exec sh \; -quit、sudo -n vim -c ':!/bin/sh' /dev/null - 注意:某些规则含
!requiretty或Defaults:user timestamp_timeout=0,可能影响测试结果,需结合sudo -V查全局默认值











