应使用sudoers配置命令级白名单,通过绝对路径+固定参数精准授权,配合Cmnd_Alias统一管理与BLOCKED显式禁止高危命令,并经sudo -l验证、日志审计及权限检查确保安全。

限制特定用户只能执行指定的系统管理命令,核心是“只开一条缝”——不靠禁用,而靠精准授权。重点不是阻止什么,而是明确允许什么,且必须限定到绝对路径+固定参数,杜绝绕过可能。
用 sudoers 做命令级白名单
这是最常用、最可靠的方式。所有规则必须通过 visudo 编辑,避免语法错误导致 sudo 失效。
- 写完整路径:例如允许重启 Nginx,必须写
/usr/bin/systemctl restart nginx,不能简写为systemctl或漏掉/usr/bin/ - 参数不可通配:
restart *或restart nginx*是禁止的,只接受完全匹配的字符串 - 示例配置(添加到
/etc/sudoers或/etc/sudoers.d/下的文件):deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/systemctl reload nginx
用 Cmnd_Alias 统一管理多条命令
当授权命令较多时,定义别名让配置清晰、易维护、不易出错。
- 在
/etc/sudoers中添加:Cmnd_Alias DEPLOY_CMDS = /usr/bin/systemctl restart nginx, /usr/bin/systemctl reload nginx, /usr/bin/journalctl -u nginx -n 50 - 再绑定给用户或组:
%deployers ALL=(root) NOPASSWD: DEPLOY_CMDS - 这样整个 deployers 组成员,仅能无密码执行这三条命令,其余任何操作都会被拒绝
显式排除高危命令防绕过
光授权还不够,必须主动屏蔽常见绕过路径,比如直接调用 reboot、shutdown 或带任意参数的 systemctl。
- 定义禁止列表:
Cmnd_Alias BLOCKED = /sbin/reboot, /sbin/shutdown, /bin/systemctl reboot, /bin/systemctl poweroff, /bin/systemctl halt - 对目标用户显式拒绝:
deploy ALL=(ALL) ALL, !BLOCKED
该写法表示“允许全部命令,但明确禁止 BLOCKED 中列出的命令”,比不写更安全
验证与加固建议
配置完不等于生效,必须验证并留痕。
- 查看用户实际权限:
sudo -l -U deploy,确认输出中只含你期望的命令 - 手动测试:
sudo systemctl restart nginx(应成功),sudo systemctl reboot(应拒绝) - 启用日志审计:确保
/etc/sudoers中有Defaults logfile="/var/log/sudo.log",便于追溯谁、何时、执行了哪条命令 - 检查子配置是否加载:确认主
/etc/sudoers文件末尾有#includedir /etc/sudoers.d,且子文件权限为0440、文件名不含.或~










