应通过/etc/sudoers.d/独立文件精细化授权具体命令路径与参数,禁用shell类命令和通配符,启用日志审计,确保最小权限原则。

给普通用户分配特定的 sudo 权限,核心是避免直接授予 ALL 权限,改用 /etc/sudoers 文件精细化控制命令范围、目标用户、主机和参数——既满足日常运维需求,又守住最小权限原则。
明确要授权的具体命令和上下文
先理清这个用户真正需要执行什么操作。比如运维助理只需重启 Nginx、查看日志、清缓存;开发测试人员可能需重启本地服务、切换到某应用用户执行部署脚本。不能笼统写 “允许管理服务”,而要落到具体二进制路径(如 /usr/bin/systemctl restart nginx)或带固定参数的命令(如 /bin/grep -i 'error' /var/log/nginx/error.log)。
建议做法:
- 用
which或command -v确认命令绝对路径,避免别名或 PATH 混淆 - 对带参数的命令,用
sudo -l -U username验证是否匹配成功 - 若需以其他用户身份运行(如
www-data),必须显式声明(www-data),不可依赖runas_default
通过 sudoers.d 独立文件配置,不直接编辑主配置
推荐在 /etc/sudoers.d/ 下新建文件(如 /etc/sudoers.d/webops),用 visudo -f /etc/sudoers.d/webops 编辑。这样便于按角色/团队拆分权限,也避免误改主文件导致系统无法提权。
典型配置示例:
# 允许 user1 以 root 身份无密码重启 nginx user1 ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx <h1>允许 user2 以 www-data 用户身份读取指定日志</h1><p>user2 ALL=(www-data) NOPASSWD: /usr/bin/tail -n 50 /var/log/app/current</p><h1>允许 group1 成员运行带固定参数的备份脚本</h1><p>%group1 ALL=(root) NOPASSWD: /usr/local/bin/backup-db.sh --target=prod</p>
注意:文件名不能含点号或波浪线(如 webops.conf 会被忽略),权限必须为 0440,且需以换行结尾。
禁止危险通配与 shell 逃逸风险
避免使用 /bin/bash、/bin/sh、/usr/bin/env 或通配符(如 /usr/bin/*、/usr/bin/*log)。这些极易被利用绕过限制,例如:
-
sudo /bin/bash -c 'cat /etc/shadow'—— 若允许/bin/bash,就等于给了完整 shell -
sudo /usr/bin/find /tmp -exec sh \;—— 若 find 可带-exec,也能起 shell
安全替代方案:
- 用
sudoedit替代直接编辑敏感文件(需配置sudoers中的editor路径) - 对日志查看类需求,封装成只读脚本并限定参数,再授权该脚本
- 启用
requiretty(默认开启)防止后台进程提权
验证与审计:确保配置生效且可追溯
配置后务必验证,而非仅凭语法检查通过就认为 OK:
- 切换目标用户,执行
sudo -l查看实际可用命令列表 - 尝试执行授权命令和非授权命令,确认行为符合预期
- 检查
/var/log/auth.log(Debian/Ubuntu)或/var/log/secure(RHEL/CentOS),确认 sudo 日志记录完整
建议开启 log_input 和 log_output(需配置 Defaults 行),对高敏操作录屏式审计(需 sudo 1.8.15+ 和 session 模块支持)。










