在云的使用过程中,大多数情况下管理云和使用资源的是两拨拨通的人员。在这种情况下,管理员除了使用RBAC的访问控制来限制不同的用户创建资源的权限外,也希望所有的用户在创建资源的时候都遵循相应的标准,从而满足企业IT运维的合规性。
一般情况下,很多企业当面临这种问题的时候可能会通过以下方式强制实施标准:不允许团队直接创建 Azure 资源,而是让 IT 团队定义和部署所有基于云的资产。 这通常是众多本地解决方案中的一种,但这会降低团队的灵活性和创新能力。 而 Azure 会提供几个可用于强制实施和验证标准的工具,同时仍允许云的使用人员在云中创建和拥有自己的资源。
Azure Policy 是 Azure 中的一项服务,用于定义、分配和管理环境中的资源标准。 它可以防止创建不允许使用的资源,确保新资源应用特定设置,并对现有资源运行评估以扫描不合规的情况。
Azure Policy 附带了许多内置的策略和计划定义,用户可以在存储、网络、计算、安全中心和监视等类别下使用这些定义。
假设我们允许组织中的任何人创建虚拟机 (VM)。 我们希望控制成本,因此 Azure 租户的管理员定义了一个策略,禁止创建任何具有 4 个以上 CPU 的 VM。 一旦实施该策略,Azure Policy 就会阻止任何人在允许的SKU 列表之外创建新的 VM。 此外,如果你尝试更新现有 VM,该服务会根据策略对其进行检查。 最后,Azure Policy 将审核组织中的所有现有 VM,确保策略得到实施。 它可以审核不合规的资源、更改资源属性或停止创建资源。
若要创建并实施 Azure Policy,需要先创建策略定义。 每种策略定义在其特定的条件下将被强制执行。 并且,在满足条件时将出现随附效果。 若要应用策略我们需要完成如下步骤:
· 创建策略定义
· 将定义分配给资源作用域
· 查看策略执行结果
创建策略定义:
策略定义是一个用于描述要评估的内容以及要采取的操作的JSON文件。例如,可以限制整个订阅内不允许创建ASM类型的Azure资源、在资源的创建过程中强制对资源添加tag等。管理员可以使用门户中的某个预定义策略,也可以创建自己的策略(修改现有策略或从头开始创建新策略)
如下是一个限制订阅中创建ASM资源的策略:
代码语言:javascript复制{
"if": {
"field": "type",
"like": "Microsoft.Classic*"
},
"then": {
"effect": "Deny"
}
}
将定义分配给资源作用域
一旦完成了策略的定义以后,就需要分配它们。策略分配是指在特定的作用域内分配策略定义以供执行。此作用域的范围是从完整订阅到资源组。 策略分配由所有子资源继承。 这意味着,如果将策略应用到资源组,则会将其应用到该资源组内的所有资源。 但是,可以从策略分配中排除子作用域。 例如,可以为整个订阅强制实施策略,然后排除几个选定的资源组。
可通过 Azure 门户、PowerShell 或 Azure CLI 来分配上述任意策略。 分配策略定义时,需要提供所有已定义的参数。
查看策略执行结果
Azure Policy 首先评估通过 Azure 资源管理器创建或更新资源的请求。 Policy 为应用于该资源的所有分配创建一个列表,然后根据每个定义评估该资源。 如果该资源违反策略,Policy 会处理多个结果,然后将请求转交给相应的资源提供程序,以免进行任何不必要的处理。
Azure Policy 中的每个策略定义都有单一效果。 该效果决定了在匹配关联的策略规则时发生的情况。 发生该情况时,Azure Policy 会根据分配的效果采取特定操作。
策略效果 | 解释 |
---|---|
Deny | 资源创建/更新因策略而失败。 |
Disabled | 忽略(禁用)该策略规则。 通常用于测试。 |
Append | 在创建或更新期间向请求的资源添加其他参数/字段。 一个常见示例是在成本中心等资源上添加标记,或者为存储资源指定允许的 IP。 |
AuditAuditIfNotExists | 评估不合规资源时在活动日志中创建警告事件,但不会停止请求。 |
DeployIfNotExists | 在满足特定条件时执行模板部署。 例如,如果对数据库启用了 SQL 加密,它可以在创建 DB 之后运行模板,以特定方式对其进行设置。 |
在进行了策略分配以后,最简单的方法是在门户中查看,因为它提供了一个很好的图形概览供你浏览。
聊了这么多,下面就通过两个示例来看下如何使用Azure Policy来限制Azure资源:
使用Policy限制创建ASM资源:
定义策略:
代码语言:javascript复制{
"if": {
"field": "type",
"like": "Microsoft.Classic*"
},
"then": {
"effect": "Deny"
}
}
$definition = New-AzureRmPolicyDefinition -Name "restrict-all-asm-resources" -DisplayName "Restrict All ASM Resources" -description "This policy enables you to restrict ALL Azure Service
Manager (ASM, aka Classic) resources." -Policy '.Restrict-ALL-ASM-Resources.json' -Mode All
应用策略:
代码语言:javascript复制$assignment =
New-AzureRMPolicyAssignment -Name 'Restrict All ASM Resources'
-PolicyDefinition $definition -Scope "/subscriptions/$subscriptionId"
查看策略执行效果:
策略应用以后,当我试图创建一个经典的VNet时,无法通过验证:
使用Policy来审核Azure资源的Tag设定:
定义策略
代码语言:javascript复制 {
"if": {
"not" : {
"field" : "tags",
"containsKey" : "Owner"
}
},
"then" : {
"effect" : "deny"
}
}
$policy = New-AzureRmPolicyDefinition -Name resourceOwnerTagPolicyDefinition -Description "Policy
to deny resource creation if no resourceOwner tag is provided" -Policy "c:policiesResourceOwnerTagPolicy.json"
应用策略
代码语言:javascript复制New-AzureRmResourceGroup -Name PolicyRG -Location "southeastasia"
代码语言:javascript复制New-AzureRmPolicyAssignment -Name resourceOwnerTagPolicyAssignment -PolicyDefinition $policy -Scope /subscriptions/SubscriptionID
/resourceGroups/PolicyRG
查看策略的执行结果
策略应用以后,当我试图去创建一个没有添加resourceOwner Tag的虚拟机时,无法通过验证: