【Azure Policy】使用Azure Policy来检查Azure资源名称是否满足正确要求(不满足就拒绝创建或标记为不合规non-compliance)

简介: 【Azure Policy】使用Azure Policy来检查Azure资源名称是否满足正确要求(不满足就拒绝创建或标记为不合规non-compliance)

问题描述

使用Azure Policy来检查Azure资源名称是否满足正确要求,如果不满足就拒绝创建或标记为不合规non-compliance

在创建Azure上资源的时候,有如下需求:

1)资源的名称必须以一个前缀开头, 如prod , test等。

2)资源的名称结尾处必须是一个数字,如 0,1,2,3,4,5,6,7,8,9。

3)如果不合规,则拒绝新建操作。

 

问题解答

Azure Policy可以实现以上需求。

 

下面的实验以存储账号(Storage Account) 资源为例,需要使用Policy 的Deny Effect操作 ( Deny:在活动日志中生成事件,并根据请求的资源配置使请求失败)

 

对于需求一

因为前缀为变动,所以把它设计为一个输入参数:prefixname

"parameters": {
    "prefixname": {
      "type": "String",
      "metadata": {
        "displayName": "Prefix Name",
        "description": "Prefix Name of the resource, such as 'prod'"
      },
      "defaultValue":"prod"
    }
  }

 

在判断条件中,首先需要使用length()长度函数,判断prefixname的长度,然后使用substring()函数截取资源名开始的前几位字符进行比对。

{

"value": "[substring(field('name'), 0, length(parameters('prefixname')))]",

"notEquals": "[parameters('prefixname')]"

}

  • field('name') : 用于获取Azure资源名称
  • length(parameters('prefixname')): 计算所要求前缀字符的长度,有prefixname参数决定
  • substring(‘name’,0,lenght): 从首字母开始解决length长度的字符串
  • notEquals:不相等的情况下,才会触发deny 效果

:为什么使用这么复杂的比对语句呢?因为Policy Rule中不支持使用正则表达式(Regex), 也没有StartWith的内置条件。策略定义结构的详细信息 - Azure Policy | Azure Docs

 

对于需求二

通过last() 函数可以获取最后一个字符,而在判断是否是数字时,这里使用了最笨的办法,直接检查最后一个字符是否包含在[“0”,“1”,“2”,“3”,“4”,“5”,“6”,“7”,“8”,”9”] 中。

{
"value": "[last(field('name'))]",
"notIn": [
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9"
]
}

 

 

对于需求三

使用 deny来拒绝创建情况,综合以上三个需求,#1,#2 只有有一个不满足就deny,所以使用了anyOf 包含需求一和二。

因本文中使用存储账号(Storage Account)为例,所以添加了 type == Microsoft.Storage/storageAccounts 的条件。

 

最后完整的Policy Rule如下:

{
  "mode": "All",
  "policyRule": {
    "if": {
      "allOf": [
        {
          "field": "type",
          "equals": "Microsoft.Storage/storageAccounts"
        },
        {
          "anyOf": [
            {
              "value": "[substring(field('name'), 0,length(parameters('prefixname')))]",
              "notEquals": "[parameters('prefixname')]"
            },
            {
              "value": "[last(field('name'))]",
              "notIn": [
                "0",
                "1",
                "2",
                "3",
                "4",
                "5",
                "6",
                "7",
                "8",
                "9"
              ]
            }
          ]
        }
      ]
    },
    "then": {
      "effect": "deny"
    }
  },
  "parameters": {
    "prefixname": {
      "type": "String",
      "metadata": {
        "displayName": "Prefix Name",
        "description": "Prefix Name of the resource, such as 'prod'"
      },
      "defaultValue": "prod"
    }
  }
}

 

在Azure上测试效果如下

 

 

参考资料

Azure Policy Substring函数 & Last 函数: https://docs.azure.cn/zh-cn/azure-resource-manager/templates/template-functions-string#substring

Azure Policy 定义条件: https://docs.azure.cn/zh-cn/governance/policy/concepts/definition-structure#conditions

Substring示例: https://docs.azure.cn/zh-cn/governance/policy/concepts/definition-structure#avoiding-template-failures

allOf & anyOf 示例:https://learn.microsoft.com/en-us/azure/governance/policy/samples/pattern-logical-operators

 

相关文章
|
26天前
|
存储 安全 BI
【Azure Storage Account】使用Azure Policy来检查Storage Account中是否有开启匿名访问的Container
【Azure Storage Account】使用Azure Policy来检查Storage Account中是否有开启匿名访问的Container
【Azure Storage Account】使用Azure Policy来检查Storage Account中是否有开启匿名访问的Container
|
26天前
|
数据库
【Azure 环境】在Azure中为数据启用强制保留期 mandatoryRetentionPeriodEnabled
【Azure 环境】在Azure中为数据启用强制保留期 mandatoryRetentionPeriodEnabled
|
26天前
|
存储 网络安全 数据中心
【Azure 存储服务】App Service 访问开启防火墙的存储账号时遇见 403 (This request is not authorized to perform this operation.)
【Azure 存储服务】App Service 访问开启防火墙的存储账号时遇见 403 (This request is not authorized to perform this operation.)
【Azure 存储服务】App Service 访问开启防火墙的存储账号时遇见 403 (This request is not authorized to perform this operation.)
|
21天前
|
JSON 安全 网络协议
【Azure Policy】添加策略用于审计Azure 网络安全组(NSG)规则 -- 只能特定的IP地址允许3389/22端口访问
为了确保Azure虚拟机资源的安全管理,只有指定IP地址才能通过RDP/SSH远程访问。解决方案包括使用Azure Policy服务扫描所有网络安全组(NSG),检查入站规则中的3389和22端口,并验证源地址是否在允许的IP列表中。不符合条件的NSG规则将被标记为非合规。通过编写特定的Policy Rule并定义允许的IP地址参数,实现集中管控和合规性检查。
|
26天前
【Azure 环境】如果Azure中的某一个资源被删除后是否可以查看到删除的记录呢?如Resource Group
【Azure 环境】如果Azure中的某一个资源被删除后是否可以查看到删除的记录呢?如Resource Group
|
26天前
|
存储 安全 API
【Azure 存储服务】关于对Azure Storage Account 的 Folder 权限管理和设定
【Azure 存储服务】关于对Azure Storage Account 的 Folder 权限管理和设定
|
26天前
|
C#
【Azure Developer】使用 Azure VM 上的用户分配托管标识访问 Azure Key Vault 中国区代码示例
【Azure Developer】使用 Azure VM 上的用户分配托管标识访问 Azure Key Vault 中国区代码示例
|
26天前
|
存储 安全 API
【Azure API Management】实现在API Management服务中使用MI(管理标识 Managed Identity)访问启用防火墙的Storage Account
【Azure API Management】实现在API Management服务中使用MI(管理标识 Managed Identity)访问启用防火墙的Storage Account
|
27天前
|
网络协议
【Azure 应用服务】添加自定义域时,Domain ownership 验证无法通过 
【Azure 应用服务】添加自定义域时,Domain ownership 验证无法通过 
|
26天前
|
存储 安全 Shell
【Azure 存储服务】关于Azure Storage Account(存储服务) 基于AAD用户的权限设定以及SAS key的管理问题
【Azure 存储服务】关于Azure Storage Account(存储服务) 基于AAD用户的权限设定以及SAS key的管理问题