Cmnd_Alias通过绝对路径和固定参数定义可复用的命令标签,实现细粒度sudo权限控制;必须全大写命名、禁用shell特性,结合User_Alias/Host_Alias/Runas_Alias及NOPASSWD/PASSWD策略统一授权。

通过 Cmnd_Alias,你可以把一组常用、安全边界明确的运维命令打包命名,在 sudoers 文件中统一授权,既避免逐条写权限,又防止过度开放 root 权限。
定义清晰的命令别名
Cmnd_Alias 的本质是为命令路径(含参数)创建可复用的标签。必须使用绝对路径,参数若固定也建议写死,防止绕过限制。
- 基本语法:
Cmnd_Alias NAME = /path/to/cmd, /path/to/other cmd arg1 arg2 - 示例:允许重启服务但禁止停止或启动任意服务
Cmnd_Alias SERVICE_RESTART = /bin/systemctl restart httpd, /bin/systemctl restart nginx - 支持通配符(谨慎使用):
/usr/bin/apt-get update, /usr/bin/apt-get install *—— 允许安装任意包,但不能卸载或升级
结合用户与主机做细粒度绑定
别名本身不生效,需在用户规则中引用。可按角色、环境、主机分组授权,提升可控性。
- 给运维组授予特定命令集:
%ops ALL = (root) SERVICE_RESTART, LOG_VIEW - 限制只能在某几台服务器执行:
%dba db-server-01,db-server-02 = (oracle) DB_BACKUP - 要求输入密码仅对高危操作:
%sec ALL = NOPASSWD: /usr/sbin/tcpdump, PASSWD: /usr/bin/reboot
避免常见陷阱
Cmnd_Alias 看似简单,但配置不当易引发越权或失效。
- 别用 shell 内建命令或别名(如
ll、sudo su),sudo不解析 shell 别名,也不运行交互式 shell - 带参数的命令必须严格匹配:写
/bin/ls /var/log就不能执行sudo ls /var/log/*.log,除非用通配符并确认安全性 - 别名中不要包含
sudo自身(如/usr/bin/sudo /bin/bash),这等于开放 shell 提权 - 修改后务必用
sudo visudo -c检查语法,避免锁死 sudo 访问
配合 Runas_Alias 和 Host_Alias 提升表达力
单靠 Cmnd_Alias 不足以覆盖复杂场景,常需组合其他别名类型。
-
Runas_Alias DBA = oracle, postgres:定义可切换的目标用户 -
Host_Alias PROD = web-prod-01, web-prod-02:定义生产主机范围 - 组合使用:
%dev PROD = (DBA) NOPASSWD: DB_BACKUP—— 开发组仅能在生产 Web 机以 oracle/postgres 身份执行备份命令

















