如何在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
相关产品推荐
相关产品推荐

