必须用visudo安全编辑sudoers,因其保存前语法检查可防sudo失效;直接vim编辑易致parse error,需su切换root后用visudo修复;添加权限格式为“用户名 主机=(目标用户) 标签: 命令路径”,如youruser ALL=(ALL) ALL。

要让普通运维人员安全执行特定操作,又不给 root 全权,关键不是开放 sudo su 或 sudo -i,而是用 sudoers 把“能做什么”精确到命令路径、参数、目标用户,甚至编辑器行为。配置本身不难,但错一个空格或路径就可能锁死 sudo,所以必须讲清边界和验证方式。
用 visudo 安全编辑,别碰 /etc/sudoers 本体
永远不要用 vim /etc/sudoers 或 nano /etc/sudoers 直接改。错误语法会导致所有用户无法使用 sudo,连修复都困难。
- 用
sudo visudo -f /etc/sudoers.d/10-nginx-ops创建独立规则文件(推荐以数字开头,按字母序加载) - 保存前 visudo 会自动校验语法;报错就必须修正,否则拒绝写入
- 设权限为
0440:sudo chmod 0440 /etc/sudoers.d/10-nginx-ops,否则 sudo 会忽略该文件
只授权具体命令,禁用通配符和 shell 逃逸
允许执行 /usr/bin/systemctl restart nginx 是安全的;允许 /usr/bin/systemctl * 或 /bin/bash 就等于送钥匙进保险库。
- 命令必须写绝对路径,用
which systemctl确认真实位置 - 带参数的命令需完整写出,例如
/usr/bin/journalctl -u nginx.service -n 50,不能只写/usr/bin/journalctl - 全局禁用解释器启动:在 sudoers 文件顶部加
Defaults !shell_noisy和Defaults noexec(确认业务无影响后再启用) - 避免
EDITOR=xxx crontab -e类绕过,sudoers 中只列明允许的编辑器二进制路径,如/usr/bin/vi、/usr/bin/nano
用 Cmnd_Alias 归类命令,再按组授权
把功能一致、风险可控的操作打包成别名,后续增减权限只需改一处,也方便审计。
- 定义服务控制别名:
Cmnd_Alias NGINX_CTRL = /usr/bin/systemctl start nginx, /usr/bin/systemctl stop nginx, /usr/bin/systemctl reload nginx - 定义日志查看别名:
Cmnd_Alias NGINX_LOG = /usr/bin/tail -n 100 /var/log/nginx/error.log, /usr/bin/journalctl -u nginx.service --since "2 hours ago" - 绑定到系统组:
%webops ALL=(root) NGINX_CTRL, NGINX_LOG - 若需以服务用户身份运行(如 www-data),写成:
%webops ALL=(www-data:www-data) NGINX_LOG
验证是否生效,别信“看起来可以”
配置完不验证,等于没配。免密规则尤其容易因参数不匹配而静默失败。
- 切换到目标用户:
su - deployer - 用
sudo -n -l查看当前被授予的 NOPASSWD 命令列表,确认路径与参数完全一致 - 测试免密执行:
sudo -n systemctl reload nginx—— 成功则静默返回;失败立刻报a password is required - 检查日志:
sudo grep 'sudo' /var/log/auth.log,确认每次调用都有记录,含用户、命令、时间、IP(若开启)


















