使用 Azure Policy 定义Azure资源合规性

2022-05-07 19:24:10 浏览数 (1)

在云的使用过程中,大多数情况下管理云和使用资源的是两拨拨通的人员。在这种情况下,管理员除了使用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的虚拟机时,无法通过验证:

0 人点赞