sudoers 文件权限必须为440,否则 sudo 拒绝加载;应使用 sudo visudo 编辑并验证语法,权限配置需遵循最小权限原则,优先通过 /etc/sudoers.d/ 管理且文件权限同为440。

sudoers 文件权限必须是 440,否则 sudo 直接拒绝加载
改完 /etc/sudoers 后执行 sudo 报错 sudo: /etc/sudoers is mode 0644, should be 0440?不是漏了保存,是权限错了。Linux 对这个文件极其敏感,任何非 440 权限(比如你用 vim 直接保存、或复制覆盖过)都会导致整个 sudo 失效。
- 修复命令:
sudo chmod 440 /etc/sudoers(必须用 root 权限改) - 永远别用普通编辑器直接打开改,必须用
sudo visudo—— 它会在保存前自动语法检查 + 强制设对权限 - 如果已经锁死(
sudo用不了),只能进 recovery mode 或用 root 用户登录改
给用户加 sudo 权限,别直接写 user ALL=(ALL) ALL
这是最常见也最危险的写法。它让该用户能以任意身份执行任意命令,等同于开放 root shell。生产环境里几乎不需要这种配置,尤其当用户账号可能被弱口令、SSH 密钥泄露波及时。
- 最小权限原则:比如只允许重启 nginx:
alice ALL=(root) /bin/systemctl restart nginx - 想免密但限制命令范围:
bob ALL=(root) NOPASSWD: /usr/bin/apt update, /usr/bin/apt upgrade - 避免写路径通配符(如
/usr/bin/*),攻击者可能利用软链接绕过 - 新增行务必在
#includedir /etc/sudoers.d下方,否则会被忽略
用 sudoers.d 目录管理权限,比直接改主文件更安全
直接改 /etc/sudoers 容易误操作、难回滚、升级时还可能被包管理器覆盖。所有主流发行版(Ubuntu、CentOS、Debian)都默认启用 /etc/sudoers.d/,且按字母顺序加载其中的文件。
- 新建配置:
sudo visudo -f /etc/sudoers.d/myteam(visudo会自动处理权限和语法) - 文件名不能带点(如
myteam.conf)或波浪号(~),否则被忽略 - 每个文件权限也必须是
440,内容格式和主文件一致 - 删配置时,直接删文件比注释掉更干净,避免未来被遗忘的残留规则
sudo -l 显示“no matches”但实际有权限?检查别名和 Host_Alias
运行 sudo -l 却看不到刚加的规则,不一定是没生效,可能是规则绑定了特定主机名或用户组,而当前环境不匹配。
-
sudo -l只显示适用于当前用户 + 当前主机的规则,Host_Alias 不匹配就藏起来 - 查当前主机名:
hostname,再对比/etc/sudoers里Host_Alias定义是否包含它 - 用户别名(User_Alias)也要注意:规则写的是
%webadmin,但用户没加进webadmin组,sudo -l就不显示 - 调试用:
sudo -U alice -l模拟其他用户视角,确认规则是否真对得上
sudoers 不是改普通配置文件,它没容错机制,错一个字符、少一个空格、权限不对、主机名不匹配,都可能导致权限失效或意外提权。每次改完,立刻用目标用户跑一遍 sudo -l 和预期命令验证,别等出事了才想起来。










