1. 项目背景与核心需求
在Azure云环境中,资源管控一直是企业IT治理的关键环节。最近我在为一个跨国企业设计Azure治理方案时,遇到了一个典型场景:客户需要允许运维团队修改现有生产环境资源,但严格禁止新建任何资源,以防止未经授权的资源创建导致成本激增或安全风险。
这种"只读不写"的权限模型在以下场景中尤为常见:
- 生产环境稳定性维护期
- 成本控制严格的项目阶段
- 需要遵守特定合规要求的场景
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Azure Policy基础解析
2.1 Policy工作机制
Azure Policy通过JSON格式的策略定义实现资源管控,主要包含:
- 规则(rule):使用逻辑条件判断资源是否符合策略
- 效果(effect):定义不符合规则时的处理方式(如拒绝、审核等)
核心效果类型包括:
| 效果类型 | 说明 | 适用场景 |
|---|---|---|
| Deny | 直接拒绝操作 | 强管控场景 |
| Audit | 记录违规但不阻止 | 监控场景 |
| Modify | 自动修正资源配置 | 标准化场景 |
2.2 策略评估时机
策略在以下时机触发评估:
- 资源创建/更新时(实时拦截)
- 定期合规性扫描(事后审计)
- 手动触发评估
3. 拒绝新建但允许修改的实现方案
3.1 核心策略定义
json复制{
"mode": "All",
"policyRule": {
"if": {
"allOf": [
{
"field": "type",
"equals": "Microsoft.Resources/subscriptions/resourceGroups"
},
{
"field": "name",
"like": "prod-*"
}
]
},
"then": {
"effect": "deny"
}
},
"parameters": {}
}
关键设计要点:
- 使用
mode: All覆盖所有资源类型 - 通过
field条件定位目标资源 like操作符实现模式匹配
3.2 豁免机制实现
对于需要修改的场景,可通过两种方式实现豁免:
-
策略排除(Exclusion):
powershell复制New-AzPolicyExemption -Name "maintenance-window" ` -PolicyAssignment $assignment ` -Scope "/subscriptions/{sub-id}/resourceGroups/prod-rg" ` -ExemptionCategory "Waiver" -
条件例外(Conditional Exception):
在策略规则中添加not条件:json复制{ "if": { "allOf": [ {"field": "type", "equals": "Microsoft.Storage/storageAccounts"}, {"not": { "field": "tags['maintenance']", "equals": "true" }} ] } }
4. 高级配置技巧
4.1 多层级策略继承
建议采用三层策略结构:
- 管理组级:基础合规策略
- 订阅级:业务单元特殊要求
- 资源组级:具体环境控制
4.2 策略优先级管理
当多个策略冲突时,Azure按以下顺序评估:
- 拒绝(Deny)效果
- 追加(Append)/修改(Modify)
- 审核(Audit)
可通过metadata.priority字段显式设置优先级:
json复制{
"metadata": {
"priority": 100
}
}
5. 实战问题排查
5.1 常见错误场景
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 策略未生效 | 作用域错误 | 检查assignment范围是否包含目标资源 |
| 误拒绝合法操作 | 条件过于宽泛 | 使用Azure Policy Insights分析拒绝事件 |
| 豁免不生效 | 豁免范围不匹配 | 确认豁免scope与资源路径完全一致 |
5.2 诊断工具推荐
-
Azure Policy Compliance:
bash复制
az policy state list --resource-group prod-rg -
Activity Log分析:
kusto复制AzureActivity | where OperationNameValue endswith "write" | where Level == "Error" -
Resource Graph查询:
kusto复制policyresources | where type == "microsoft.policyinsights/policystates" | where complianceState == "NonCompliant"
6. 最佳实践建议
-
渐进式部署策略:
- 第一阶段:使用
Audit模式验证策略效果 - 第二阶段:对非生产环境启用
Deny - 第三阶段:全面实施
- 第一阶段:使用
-
标签策略配合:
json复制{ "if": { "anyOf": [ {"field": "tags['env']", "notEquals": "prod"}, {"field": "tags", "exists": false} ] }, "then": {"effect": "deny"} } -
变更管理流程:
- 策略变更需经过CI/CD管道
- 使用Azure Blueprint进行策略版本控制
- 建立策略变更通知机制
关键提示:生产环境实施前,务必在测试订阅中验证策略效果,建议保留至少48小时的观察期。
