如何限制Azure服务主体仅访问以TEST开头的资源?
实现服务主体仅访问名称以"TEST."开头资源的方案
要给你的CI/CD服务主体设置仅对TEST.前缀资源的Contributor权限,核心是用Azure RBAC条件角色分配,通过过滤资源名称和类型来实现最小权限。具体步骤如下:
1. 获取服务主体的Object ID
先通过Azure CLI拿到目标服务主体的唯一标识:
az ad sp list --display-name "<你的服务主体名称>" --query "[].id" -o tsv
复制输出的ID,后续步骤会用到。
2. 创建带条件的角色分配
根据你的需求,分两种场景设置:
场景1:允许所有类型中名称以TEST.开头的资源
如果要覆盖所有资源类型(比如Container Apps、Container Registries等),执行以下命令:
az role assignment create \ --assignee <服务主体Object ID> \ --role "Contributor" \ --scope "/subscriptions/<你的订阅ID>" \ --condition "Microsoft.Resources/resourceNames[*] startswith 'TEST.'" \ --condition-version "2.0"
场景2:仅允许指定资源类型(Container Apps、Container Registries)且名称以TEST.开头
如果要限定仅这两类资源,细化条件表达式:
az role assignment create \ --assignee <服务主体Object ID> \ --role "Contributor" \ --scope "/subscriptions/<你的订阅ID>" \ --condition "(Microsoft.Resources/resourceType == 'Microsoft.App/containerApps' or Microsoft.Resources/resourceType == 'Microsoft.ContainerRegistry/registries') AND Microsoft.Resources/resourceNames[*] startswith 'TEST.'" \ --condition-version "2.0"
关键参数说明
--scope:这里用订阅范围表示对整个订阅内符合条件的资源生效;如果你的TEST资源都集中在某个资源组,也可以换成资源组的完整ID(比如/subscriptions/<订阅ID>/resourceGroups/<资源组名>),进一步缩小权限范围。--condition:用Azure RBAC的条件语法过滤资源,startswith匹配名称前缀,resourceType限定资源类型,确保权限只给需要的资源。--condition-version:必须指定2.0,因为1.0版本不支持资源名称过滤的完整语法。
验证权限设置
执行以下命令检查角色分配是否生效:
az role assignment list --assignee <服务主体Object ID> --query "[].{Role:roleDefinitionName, Condition:condition}" -o table
输出会显示你创建的带条件的Contributor角色分配。
注意事项
- 服务主体默认无任何权限,这个分配完成后,它只能操作符合条件的
TEST.前缀资源,访问其他资源会直接返回权限不足,完全符合你的需求。 - Terraform执行时,确保所有要操作的资源名称都以
TEST.开头,否则会因权限问题失败,这也能帮你避免误操作非测试资源。
内容的提问来源于stack exchange,提问作者Hiten Samalia
相关产品推荐
相关产品推荐

