必须用/etc/sudoers.d/而非直接改主文件,因直接编辑易致语法错误使sudo全局失效、多人协作易冲突、系统升级可能重置;而sudoers.d支持模块化配置、单文件隔离校验、按序加载、便于审计与回滚。

服务器 sudoers 权限管理的关键,是避免直接修改 /etc/sudoers 主文件,转而用 /etc/sudoers.d/ 目录实现模块化、按角色拆分、独立校验的权限配置。这样既安全又便于批量维护和审计。
为什么必须用 /etc/sudoers.d/ 而非直接改主文件
直接编辑 /etc/sudoers 风险极高:语法错误会导致整个 sudo 失效,连 root 都无法提权修复;多人协作时易覆盖冲突;升级系统时主文件可能被重置。而 /etc/sudoers.d/ 下的每个文件都会被 visudo 自动加载(按字典序),彼此隔离、互不影响,且支持单文件验证与回滚。
- 所有文件必须以
.conf结尾(部分发行版如 Ubuntu 强制要求) - 权限必须为
0440(root 可读,组和其他用户不可写) - 文件名建议带前缀(如
10-deploy.conf、20-monitor.conf)控制加载顺序 - 空行、以
#开头的注释行均被忽略,但不能有语法错误
/etc/sudoers.d/ 中的典型权限拆分方式
按用户职责划分配置文件,是生产环境最清晰的做法。例如:
-
/etc/sudoers.d/app-deploy.conf:只允许部署用户执行/usr/bin/systemctl restart app*和日志读取命令 -
/etc/sudoers.d/db-backup.conf:仅开放/usr/bin/pg_dump、/bin/tar(限定目录)、/usr/bin/rsync(限定源路径) -
/etc/sudoers.d/monitor-user.conf:授予/usr/bin/systemctl status、/bin/journalctl(加-n 100参数限制)等只读命令 -
/etc/sudoers.d/security-audit.conf:专供审计账号,仅允许/usr/bin/last、/usr/bin/faillog、/bin/cat /var/log/sudo.log
安全写入与语法校验的实操要点
无论手动创建还是用 Ansible 等工具分发,都必须确保每条规则通过 visudo -c -f 校验。常见陷阱包括:
- 命令路径未用绝对路径(如写
systemctl而非/usr/bin/systemctl) - 通配符使用不当(如
/bin/*过于宽泛,应限定为/bin/cat /var/log/nginx/*.log) - 遗漏
NOPASSWD:时未配Defaults:username !authenticate,导致交互式密码提示失败 - 未禁用 shell 逃逸类命令(如
/bin/bash、/usr/bin/python3 -c、/usr/bin/perl -e) - 未启用
Defaults requiretty(防非交互式提权)和Defaults logfile="/var/log/sudo.log"(强制审计)
验证与日常维护建议
配置生效后,必须切换目标用户实测,不能只依赖语法检查:
- 用
sudo -l -U username查看该用户实际可见权限列表 - 运行一条授权命令(如
sudo systemctl status nginx),确认能执行且不报错 - 尝试一条未授权命令(如
sudo rm /tmp/test),确认明确拒绝而非静默失败 - 检查
/var/log/sudo.log是否记录调用行为,输入输出是否开启(log_input,log_output) - 定期清理
/etc/sudoers.d/中已废弃的配置文件(保留备份但移出目录)

















