sudoers 配置允许无密码提权但 sudo -l 显示 nothing 的隐藏规则

11次阅读

sudo -l 不显示授权的主因是配置顺序、别名未匹配、隐式拒绝或包含文件失效;需检查 sudoers 加载路径、Host/User 别名匹配、! 否定规则位置,并用 sudo -n true 等命令实测提权有效性。

sudoers 配置允许无密码提权但 sudo -l 显示 nothing 的隐藏规则

这通常不是“隐藏规则”,而是 sudoers 文件中存在针对当前用户(或其所属组)的明确授权条目,但该条目**未匹配 sudo -l 的默认查询逻辑**,或被更高优先级的拒绝规则覆盖。根本原因在于 sudo -l 的行为受配置顺序、别名展开、主机匹配及隐式拒绝机制影响。

sudo -l 不显示授权的常见原因

sudo -l 仅列出当前用户在当前主机上**显式允许执行的命令**(且未被后续规则否定)。它不会显示:

  • 通过 Runas_Spec(如 (ALL) NOPASSWD: ALL)授予的、但未在 sudo -l 输出中展开的通配权限;
  • 被前面的 !COMMANDDefaults env_reset 类指令间接抑制的条目;
  • 定义在包含文件(如 /etc/sudoers.d/ 下)中、但因语法错误或加载顺序未生效的规则;
  • 依赖于未满足的 Host_AliasUser_Alias 条件(例如当前主机名不匹配别名定义)。

检查 sudoers 配置的实际生效路径

运行以下命令确认完整加载链:

sudo -V | grep -A 1 "sudoers sources"

然后逐个检查主文件和所有 .d 目录下的文件(按字母序加载),特别注意:

  • 是否存在 include#includedir 指令;
  • 是否有以 ! 开头的禁止规则出现在允许规则之后(后出现的规则优先);
  • 是否使用了 Host_Alias,并用 hostname 命令比对当前主机名是否匹配。

验证无密码提权是否真实有效

绕过 sudo -l 的限制,直接测试:

  • sudo -n true —— 若静默返回 0,说明无需密码即可执行命令;
  • sudo -n whoami —— 看是否输出 root
  • sudo -l -U $USER —— 显式指定用户,排除环境变量干扰;
  • sudo -l -S —— 强制读取密码(即使配置为 NOPASSWD),可辅助判断是否真跳过认证。

排查别名与通配符陷阱

例如以下配置看似允许全部命令,但 sudo -l 可能不显示具体命令:

User_Alias ADMINS = %admin
NOPASSWD: ADMINS ALL

此时 sudo -l 可能只显示 (ALL) NOPASSWD: ALL 或完全空白(取决于 sudo 版本和解析逻辑)。更可靠写法是:

%admin ALL=(ALL:ALL) NOPASSWD: ALL

并确保该行未被后续的 %admin ALL=!/bin/bash 等否定规则覆盖。

text=ZqhQzanResources