Azure自定义RBAC的assignableScopes是否支持通配符?
解决Azure Custom RBAC角色assignableScopes无法使用通配符的问题
没错,Azure RBAC的assignableScopes字段确实不支持通配符匹配——不管是订阅层级还是资源组层级的范围,都没法用ABCDXYZ-*这类模糊规则来指定。这是RBAC本身的设计限制,它的范围体系是基于明确的资源路径,而非模式匹配。
不过针对你想要给所有符合ABCDXYZ-*命名规范的资源组限制权限的需求,有几个实用的替代方案可以达到同样的效果:
方案1:用Azure Policy自动绑定角色(推荐长期管理)
如果需要自动处理新创建的符合规则的资源组,Azure Policy的deployIfNotExists效果是最佳选择。它可以在资源组创建时自动为指定主体分配你的自定义角色:
- 先创建好你的自定义RBAC角色,注意把
assignableScopes设为订阅或管理组级别(这样角色才能被分配到下属的资源组) - 编写Policy规则,触发条件设为资源组名称匹配
ABCDXYZ-* - 在Policy效果中配置自动部署角色分配的逻辑
这里给你一个Policy规则的核心片段参考:
{ "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Resources/resourceGroups" }, { "field": "name", "like": "ABCDXYZ-*" } ] }, "then": { "effect": "deployIfNotExists", "details": { "type": "Microsoft.Authorization/roleAssignments", "roleDefinitionIds": ["/subscriptions/{你的订阅ID}/providers/Microsoft.Authorization/roleDefinitions/{自定义角色ID}"], "existenceCondition": { "field": "Microsoft.Authorization/roleAssignments/principalId", "equals": "{需要分配权限的主体ID}" }, "deployment": { "properties": { "mode": "Incremental", "template": { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "resources": [ { "type": "Microsoft.Authorization/roleAssignments", "apiVersion": "2022-04-01", "name": "[guid(resourceGroup().id, '{自定义角色ID}', '{主体ID}')]", "properties": { "roleDefinitionId": "[concat(subscription().id, '/providers/Microsoft.Authorization/roleDefinitions/{自定义角色ID}')]", "principalId": "{主体ID}", "scope": "[resourceGroup().id]" } } ] } } } } } }
方案2:批量脚本分配(适合已存在的资源组)
如果已经有一批符合命名规则的资源组,用Azure CLI或PowerShell批量查询并分配角色会很高效:
Azure CLI 示例
# 筛选出所有名称以ABCDXYZ-开头的资源组ID target_rgs=$(az group list --query "[?starts_with(name, 'ABCDXYZ-')].id" -o tsv) # 遍历每个资源组,给指定主体分配自定义角色 for rg in $target_rgs; do az role assignment create --assignee "user@example.com" --role "MySampleCustomRole" --scope $rg done
PowerShell 示例
# 获取符合命名规则的资源组 $targetRgs = Get-AzResourceGroup | Where-Object { $_.ResourceGroupName -like "ABCDXYZ-*" } # 批量分配角色 foreach ($rg in $targetRgs) { New-AzRoleAssignment -SignInName "user@example.com" -RoleDefinitionName "MySampleCustomRole" -ResourceGroupName $rg.ResourceGroupName }
方案3:结合管理组(跨多订阅场景)
如果你的目标资源组分布在多个订阅下,可以先把这些订阅加入同一个管理组,然后将自定义角色的assignableScopes设为该管理组。之后配合Azure Policy,确保只有符合命名规则的资源组能获得该角色的权限,避免权限过度分配。
调整后的自定义角色示例
你原来的角色定义需要把assignableScopes改成明确的范围(比如订阅ID或管理组ID),示例如下:
{ "properties": { "roleName": "MySampleCustomRole", "description": "My Sample Custom Role", "assignableScopes": [ "/subscriptions/your-subscription-uuid" // 替换为你的订阅ID或管理组ID ], "permissions": [ { "actions": [], "notActions": [ "Microsoft.Compute/snapshots/delete", "Microsoft.Compute/snapshots/write", "Microsoft.Compute/snapshots/beginGetAccess/action", "Microsoft.Compute/snapshots/endGetAccess/action", "Microsoft.Compute/disks/beginGetAccess/action" ], "dataActions": [], "notDataActions": [] } ] } }
总的来说,虽然assignableScopes不支持通配符,但通过上述几种方法,完全可以实现你想要的“仅给特定命名规范的资源组限制权限”的目标。
内容的提问来源于stack exchange,提问作者Prodip
相关产品推荐
相关产品推荐

