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

如何在Azure资源策略中调用Azure资源图查询用于策略评估?

解决Azure虚拟网络对等互连跨租户检查的策略方案

当前核心限制

你提到的2023 Ignite大会上微软预告的「资源策略调用Graph API」功能,截至2024年仍未正式上线,没有公开可用的文档或实现路径。

替代方案:用Azure资源图查询实现跨租户校验

虽然不能直接调用Graph API,但可以通过Azure资源图(Resource Graph)查询获取远程VNet的租户ID,再结合策略逻辑完成校验。

1. 编写资源图查询语句

针对远程VNet,用以下Kusto查询获取其所属租户ID:

Resources
| where type == "microsoft.network/virtualnetworks"
| where id == "<远程VNet的资源ID>"
| project tenantId

2. 集成到策略定义中

在自定义策略里,通过Microsoft.ResourceGraph/query执行上述查询,再将结果与当前租户ID对比。示例策略如下:

{
  "properties": {
    "displayName": "禁止跨租户虚拟网络对等互连",
    "policyType": "Custom",
    "mode": "Indexed",
    "policyRule": {
      "if": {
        "allOf": [
          {
            "field": "type",
            "equals": "Microsoft.Network/virtualNetworks/peerings"
          },
          {
            "value": "[query('Microsoft.ResourceGraph/query', 'Resources | where type == \"microsoft.network/virtualnetworks\" | where id == \"[field(\'properties.remoteVirtualNetwork.id\')]\" | project tenantId')]",
            "notEquals": "[subscription().tenantId]"
          }
        ]
      },
      "then": {
        "effect": "Deny"
      }
    }
  }
}

关键说明:

  • 用field('properties.remoteVirtualNetwork.id')自动提取对等互连指向的远程VNet资源ID
  • 资源图查询返回该VNet的tenantId,和当前订阅的tenantId做对比
  • 若两者不一致,触发Deny效果阻止跨租户对等

注意事项

  • 策略执行的账户需要拥有Microsoft.ResourceGraph/queries/run权限,否则查询会失败
  • 如果远程VNet不在当前租户的资源图可见范围(比如跨租户且无访问权限),查询会返回空值,此时策略会误判为跨租户,需要额外添加空值判断逻辑

轻量化替代方案:基于订阅ID校验

如果不想依赖资源图,也可以通过远程VNet资源ID的结构间接判断:Azure资源ID的第3段是订阅ID,提前维护当前租户的订阅ID列表,在策略中检查远程VNet的订阅ID是否在列表内。示例策略:

{
  "properties": {
    "displayName": "禁止跨租户虚拟网络对等互连(基于订阅ID)",
    "policyType": "Custom",
    "mode": "Indexed",
    "parameters": {
      "allowedSubscriptions": {
        "type": "Array",
        "metadata": {
          "description": "当前租户内允许的订阅ID列表"
        }
      }
    },
    "policyRule": {
      "if": {
        "allOf": [
          {
            "field": "type",
            "equals": "Microsoft.Network/virtualNetworks/peerings"
          },
          {
            "value": "[split(field('properties.remoteVirtualNetwork.id'), '/')[2]]",
            "notIn": "[parameters('allowedSubscriptions')]"
          }
        ]
      },
      "then": {
        "effect": "Deny"
      }
    }
  }
}

这种方法无需调用外部服务,但需要手动维护订阅ID列表,适合租户订阅数量较少的场景。

内容的提问来源于stack exchange,提问作者STW

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 13:10:15