【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

 

相关文章
|
3月前
|
API 网络架构 开发者
【Azure API 管理】APIM服务资源删除后,为什么不能马上创建相同名称的APIM服务呢?
【Azure API 管理】APIM服务资源删除后,为什么不能马上创建相同名称的APIM服务呢?
|
1月前
|
内存技术
【Azure Cloud Service】创建Azure云服务时遇见分配VM资源错误: VM(s) with the following constraints cannot be allocated, because the condition is too restrictive
Allocation failed. VM(s) with the following constraints cannot be allocated, because the condition is too restrictive. Please remove some constraints and try again. Constraints applied are:\n - VM Size
|
2月前
|
网络安全
【Azure Policy】在Azure Policy的规则中实现数组对数组的规则校验
本文介绍了如何使用 Azure Policy 对网络安全组(NSG)的 IP 地址和端口进行审计。具体包括两个要求:一是输入的 IP 地址只能是 192.168.1.1 和 167.220.0.0/16;二是端口输入中只要包含 22 或 3389 需要进行判断。
|
3月前
|
存储 安全 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
|
3月前
|
数据库
【Azure 环境】在Azure中为数据启用强制保留期 mandatoryRetentionPeriodEnabled
【Azure 环境】在Azure中为数据启用强制保留期 mandatoryRetentionPeriodEnabled
|
3月前
|
API 网络架构
【Azure API 管理】如何修改Azure APIM的管理员邮箱和组织名称
【Azure API 管理】如何修改Azure APIM的管理员邮箱和组织名称
|
3月前
|
JSON 安全 网络协议
【Azure Policy】添加策略用于审计Azure 网络安全组(NSG)规则 -- 只能特定的IP地址允许3389/22端口访问
为了确保Azure虚拟机资源的安全管理,只有指定IP地址才能通过RDP/SSH远程访问。解决方案包括使用Azure Policy服务扫描所有网络安全组(NSG),检查入站规则中的3389和22端口,并验证源地址是否在允许的IP列表中。不符合条件的NSG规则将被标记为非合规。通过编写特定的Policy Rule并定义允许的IP地址参数,实现集中管控和合规性检查。
|
3月前
【Azure 环境】如果Azure中的某一个资源被删除后是否可以查看到删除的记录呢?如Resource Group
【Azure 环境】如果Azure中的某一个资源被删除后是否可以查看到删除的记录呢?如Resource Group
|
3月前
|
存储 安全 API
【Azure API Management】实现在API Management服务中使用MI(管理标识 Managed Identity)访问启用防火墙的Storage Account
【Azure API Management】实现在API Management服务中使用MI(管理标识 Managed Identity)访问启用防火墙的Storage Account
|
3月前
|
API
【Azure Developer】调用Microsoft Graph API获取Authorization Token,使用的认证主体为 Azure中的Managed Identity(托管标识)
【Azure Developer】调用Microsoft Graph API获取Authorization Token,使用的认证主体为 Azure中的Managed Identity(托管标识)