linux sudoers 支持 include/includedir 实现模块化管理,主流发行版默认启用 #includedir /etc/sudoers.d,按字母序加载权限为0440、无扩展名的文件;各文件应职责单一、命名规范、含注释,并纳入版本控制与定期清理。

Linux 的 /etc/sudoers 文件支持通过 include 和 includedir 指令加载外部配置,这是现代运维中推荐的管理方式——它把权限规则从主文件中解耦出来,便于按角色、服务或团队分片维护,也避免主配置被意外覆盖或污染。
用 includedir 实现模块化管理
sudoers 默认在文件末尾包含这一行(Ubuntu/Debian/CentOS 8+ 等主流发行版均启用):
只要该行未被注释,sudo 就会按字母顺序加载 /etc/sudoers.d/ 目录下所有**无扩展名**且权限为 0440 的文件(如 webadmin、backup-team),忽略 .bak、.tmp、.swp 等带后缀的文件。
- 创建新规则时,直接写入
/etc/sudoers.d/下的独立文件,例如:sudo nano /etc/sudoers.d/dba - 内容只需写规则本身,无需重复
User_Alias或Cmnd_Alias(除非该文件内自用);别名可跨文件复用,但建议集中定义在主文件或统一别名文件中 - 每个文件应聚焦单一职责:比如
monitoring只管 Zabbix 用户权限,ci-cd只管 Jenkins 执行器能跑哪些命令
手动 include 单个文件(谨慎使用)
若需加载非 /etc/sudoers.d/ 目录下的配置(如 NFS 共享的策略模板),可用显式 include 指令:
注意:
- 路径必须是绝对路径
- 被包含文件也必须满足权限要求(
0440,属主 root,不可被组或其他用户写) - 不支持通配符或变量,也不能嵌套 include(即被包含文件里再写 include 会被忽略)
- 生产环境慎用,因路径依赖强、迁移性差,优先走
includedir
文件权限与安全校验要点
/etc/sudoers.d/ 下的每个文件都必须严格满足安全条件,否则 sudo 会跳过加载并静默报错(可通过 sudo -V | grep -i sudoers 查看是否启用了 includedir):
- 权限必须是
0440(root:root,仅所有者可读,组和其他人不可写不可执行) - 执行
sudo chmod 0440 /etc/sudoers.d/dba后,再运行sudo visudo -c验证整体语法 - 若某文件加载失败,
sudo -l不会显示其规则,也不会报错提示——需主动检查sudo visudo -c输出及系统日志(journalctl _COMM=sudo | grep -i "parse\|include") - 不要在
/etc/sudoers.d/中放空文件或仅含注释的文件,某些旧版本 sudo 会因解析失败而跳过整个目录
最佳实践:命名与生命周期管理
为降低协作风险和提升可追溯性,建议遵循以下约定:
- 文件名用小写字母、数字和短横线,体现用途与责任人,如:
devops-deploy、sec-audit-readonly - 每文件开头加注释说明适用场景、生效时间、负责人,例如:
# DevOps team: deploy to staging env. Valid until 2026-12-31. @ops-lead - 定期清理过期文件(如项目下线后删除对应规则),避免权限堆积
- 将
/etc/sudoers.d/目录纳入配置管理(Ansible/Puppet)或 Git 版本库,确保变更可审计、可回滚











