You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure自定义RBAC的assignableScopes是否支持通配符?

解决Azure Custom RBAC角色assignableScopes无法使用通配符的问题

没错,Azure RBAC的assignableScopes字段确实不支持通配符匹配——不管是订阅层级还是资源组层级的范围,都没法用ABCDXYZ-*这类模糊规则来指定。这是RBAC本身的设计限制,它的范围体系是基于明确的资源路径,而非模式匹配。

不过针对你想要给所有符合ABCDXYZ-*命名规范的资源组限制权限的需求,有几个实用的替代方案可以达到同样的效果:

方案1:用Azure Policy自动绑定角色(推荐长期管理)

如果需要自动处理新创建的符合规则的资源组,Azure Policy的deployIfNotExists效果是最佳选择。它可以在资源组创建时自动为指定主体分配你的自定义角色:

  1. 先创建好你的自定义RBAC角色,注意把assignableScopes设为订阅或管理组级别(这样角色才能被分配到下属的资源组)
  2. 编写Policy规则,触发条件设为资源组名称匹配ABCDXYZ-*
  3. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 10:25:44