如何创建Azure Policy并阻止用户通过Azure门户手动创建虚拟机?
用Azure Policy阻止通过Azure门户创建虚拟机的方案
核心逻辑
Azure Policy可以通过校验请求的客户端应用ID区分发起来源:Azure门户有固定的官方客户端ID,而你的az命令行自动化程序如果是依托服务主体运行的,会对应唯一的服务主体ID。我们可以创建一条拒绝策略,仅拦截来自Azure门户的虚拟机创建请求,允许其他合法身份(比如你的自动化服务主体)的操作。
步骤1:确认Azure门户的客户端ID
Azure门户对应的固定客户端ID为:04b07795-8ddb-461a-bbee-02f9e1bf7b46(该ID由微软官方固定,不会随意变更)
步骤2:创建自定义Azure Policy定义
创建**拒绝(Deny)**类型的策略,目标资源为虚拟机的创建操作(Microsoft.Compute/virtualMachines/write),添加条件判断请求的客户端ID是否为Azure门户的ID。如果你的自动化程序使用特定服务主体,可额外添加例外规则,避免误拦截。
基础版策略规则(仅拦截门户请求)
{ "mode": "All", "policyRule": { "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Compute/virtualMachines" }, { "field": "requestContext.clientApplicationId", "equals": "04b07795-8ddb-461a-bbee-02f9e1bf7b46" } ] }, "then": { "effect": "Deny" } }, "parameters": {} }
扩展版策略规则(允许指定服务主体)
如果你的自动化程序是通过服务主体身份运行的,可修改策略添加例外,允许该服务主体的请求:
{ "mode": "All", "policyRule": { "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Compute/virtualMachines" }, { "field": "requestContext.clientApplicationId", "equals": "04b07795-8ddb-461a-bbee-02f9e1bf7b46" }, { "not": { "field": "requestContext.clientApplicationId", "in": [ "你的自动化服务主体ID", "其他需要放行的客户端ID" ] } } ] }, "then": { "effect": "Deny" } }, "parameters": {} }
步骤3:分配策略到目标订阅
- 登录Azure门户,进入Policy服务
- 左侧菜单选择定义,点击**+ 自定义定义**,粘贴上述JSON内容,填写策略名称(如“拒绝从Azure门户创建虚拟机”)和描述
- 定义完成后,进入分配页面,选择要应用的订阅,可按需设置范围排除(比如特定资源组无需拦截)
- 完成分配后,策略会在数分钟内生效,此后用户通过门户创建虚拟机将被拒绝,而你的az命令行自动化程序可正常执行创建操作
验证策略效果
- 测试通过Azure门户创建虚拟机,会收到“请求被策略拒绝”的提示
- 运行你的自动化程序,确认虚拟机可正常创建
内容的提问来源于stack exchange,提问作者souser
相关产品推荐
相关产品推荐

