普通用户 sudo 权限应遵循最小化原则:只授权绝对路径的必要命令,禁用 shell 逃逸与通配符;限定目标用户、环境变量及工作目录;启用日志审计、超时控制与二次验证;定期审查并自动化清理宽泛规则。

为普通用户分配 sudo 权限,核心不是“给不给”,而是“给什么、怎么给、怎么管”。权限最小化不是拒绝授权,而是精准控制命令范围、执行上下文和操作约束。
只授权必要命令,禁用 shell 逃逸
直接把用户加进 sudoers 的 %wheel 或 %sudo 组(如 %sudo ALL=(ALL:ALL) ALL)等于开放 root 全权,违背最小化原则。应明确列出允许的命令路径,并禁用通配符和 shell 功能:
- 使用绝对路径定义命令,例如
/usr/bin/systemctl restart nginx,而非systemctl - 禁止使用
sudo su、sudo -i、sudo /bin/bash等提权入口,在sudoers中显式拒绝:Defaults:user1 !shell_noopuser1 ALL=(root) !/bin/sh, !/bin/bash, !/bin/zsh, !/usr/bin/su, !/usr/bin/sudo - 如需重启服务,可写成:
user1 ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/systemctl reload nginx
限定运行身份与环境,避免越权执行
同一命令在不同用户或环境下可能产生不同效果。应显式指定目标用户、组和环境变量限制:
- 只允许以特定用户身份运行,例如日志清理只需以
www-data身份执行:user1 ALL=(www-data) /usr/bin/find /var/log/app -name "*.log" -mtime +7 -delete - 禁用危险环境变量传递,添加
env_reset和白名单:Defaults:user1 env_reset<br>Defaults:user1 env_keep += "LANG LC_* PATH"
- 禁止保留当前目录(防止利用相对路径执行恶意脚本):
Defaults:user1 always_set_home
启用日志审计与行为约束
授权之后必须可观测、可追溯、可干预:
- 确保
sudo日志开启:检查/etc/sudoers是否含Defaults logfile="/var/log/sudo.log",并确认 rsyslog 或 journald 正常采集 - 对高危操作强制二次确认或密码验证,例如备份数据库操作:
user1 ALL=(root) PASSWD: /usr/bin/mysqldump --single-transaction myapp > /backup/myapp_$(date +\%F).sql - 设置超时时间,避免会话长期有效:
Defaults:user1 timestamp_timeout=5(单位分钟)
定期审查与自动化清理机制
权限不是一次配置终身有效。需建立运维闭环:
- 每月运行
sudo -l -U username核对实际生效权限,比对/etc/sudoers和 included 文件(如/etc/sudoers.d/*) - 禁用已离职或调岗用户的 sudo 权限,推荐统一通过组管理(如创建
%ops-web组),而非直接编辑用户条目 - 用 Ansible 或 shell 脚本自动扫描
sudoers中的宽泛规则(如含ALL、!/bin/*、无路径限定的命令),生成告警清单










