关键是把零散命令聚合成可复用、易审计、路径明确的别名,再绑定到用户或组——不是“放开权限”,而是“只开指定动作”;必须用绝对路径,禁用通配符和shell展开,通过cmnd_alias定义如svc_mgr、log_read等别名,结合%webadmin等系统组授权,并存放于/etc/sudoers.d/中严格校验。

用 Cmnd_Alias 实现常用指令授权,关键是把零散命令聚合成可复用、易审计、路径明确的别名,再绑定到用户或组——不是“放开权限”,而是“只开指定动作”。
定义命令别名:必须用绝对路径,禁用通配符
所有命令必须写全路径(如 /bin/systemctl 而非 systemctl),否则可能被绕过。不能使用 * 或 ?,也不支持 shell 展开。
-
服务控制类:适合运维人员管理 Nginx、MySQL 等服务
Cmnd_Alias SVC_MGR = /bin/systemctl start, /bin/systemctl stop, /bin/systemctl reload, /bin/systemctl status -
日志查看类:限定只读特定日志,避免遍历敏感目录
Cmnd_Alias LOG_READ = /usr/bin/tail -n 100 /var/log/auth.log, /usr/bin/journalctl -u sshd --since "2 hours ago" -
备份操作类:允许执行 tar 打包但禁止解压到根目录等高危动作
Cmnd_Alias BACKUP_CMD = /bin/tar -cf /backup/web-$(date +\%F).tar /var/www/html
绑定别名到用户组,不直接写个人账号
用系统组(如 %webadmin)统一管理比逐个配置用户更可靠,增减人员只需改组成员,权限自动同步。
- 给 webadmin 组授予服务管理权限:
%webadmin ALL=(root) SVC_MGR - 若需免密执行,加
NOPASSWD:前缀:%webadmin ALL=(root) NOPASSWD: SVC_MGR - 可叠加多个别名:
%dbadmin ALL=(root) SVC_MGR, LOG_READ, /usr/bin/mysqladmin ping
验证与安全加固要点
配置完别名和授权后,不能跳过验证;同时要堵住常见逃逸路径。
- 始终用
sudo visudo编辑,语法错误会直接导致 sudo 失效 - 执行
sudo -l -U username查看该用户实际可用的命令,确认无多余权限 - 禁止授予含 shell 功能的命令(如
/bin/bash、/usr/bin/find ... -exec sh、/usr/bin/vi),防止提权逃逸 - 建议把自定义规则单独存为
/etc/sudoers.d/webadmin,并确保文件权限为440,避免被覆盖或误删
典型错误要避开
这些写法看似方便,实则破坏最小权限原则,容易引发越权或审计盲区:
- 错:用
/usr/bin/*或/bin/*ctl—— 通配符绕过检测,风险极高 - 错:写成
systemctl(没路径)—— 可能被 PATH 污染或替换为恶意二进制 - 错:直接授权
%webadmin ALL=(ALL) ALL后再用!rm排除 —— 黑名单机制不可靠,漏掉一个就全盘失效 - 错:把别名定义和授权混在一行又不加注释 —— 后期维护困难,易误删关键项










