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

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

时间:2024-03-21 20:33:07浏览次数:32  
标签:non name parameters Policy prefixname Azure cn

问题描述

使用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

 

标签:non,name,parameters,Policy,prefixname,Azure,cn
From: https://www.cnblogs.com/lulight/p/18088198

相关文章

  • 050_Microsoft Azure平台实验
    目录Azure平台简介Azure机器学习实验观察数据集导入数据总结数据集数据上传至Azure机器学习实验创建新的Azure机器学习实验分割数据集模型训练选择预测项模型评分模型计算结果的可视化模型评估Azure平台简介Azure机器学习实验观察数据集导入数据总结数据集数据上......
  • 【APIM】Azure API Management Self-Host Gateway是否可以把请求的日志发送到Applicat
    问题描述AzureAPIManagementSelf-HostGateway是否可以把请求的日志发送到ApplicationInsights呢?让它和使用Azure上托管的Gateway一样呢?这是在APIM门户上配置API,设置的DiagnosticsLogs,当选择ApplicationInsights时,就可以把对接口请求时候所携带的Header/Body等信息发送......
  • 通过nginx来验证k8s中externalTrafficPolicy策略
    过nginx来验证k8s中externalTrafficPolicy策略域名--->172.16.80.32(域名解析反向代理)----->nginx-pod1(Local模式,模拟前端代理到nginx2-pod2)----->nginx2-pod2(Cluster模式,实际后端服务)nginx的日志格式log_formatmain'"$remote_addr""$remote_user""......
  • 【App Service】在Azure App Service中分析.NET应用程序的性能的好帮手(Review Stack
    AzureAppService.NETProfiler在AppService服务中,如果部署了.NET应用,平台有一个非常好的工具可以查看请求的性能分布及异常时的StackTraces。进入路径:AppServiceAzureOverview-->  Networking(网络)-->Troubleshoot(排除故障)--> Collect.NETProfilerTrace......
  • Azure REST API (5) Azure创建Service Principal设置Client Secret过期时间100年
    《WindowsAzurePlatform系列文章目录》 我们在使用AzureServicePrinciple,通过应用程序开发API方式部署或修改Azure资源的时候,默认的ClientSecret过期时间为2年。很多客户希望ClientSecret过期时间大于2年。我们可以通过使用应用管理策略(AppManagem......
  • imagepolicywebhook
    imagePolicyWebhookimagePolicyWebhook是一个评估image的准入控制器。需要启动一个https的服务来执行该动作【功能实践】为webhook生成ssl证书生成server.csr和server-key.pemcat<<EOF|cfsslgenkey-|cfssljson-bareserver{"hosts":["image-bouncer-......
  • Druid连接池问题:discard long time none received connection.
    啊啊啊啊啊啊啊~~~我真的服了找bug找到发疯百度也找不到,gpt也问不到,最后就是我重新打开视频看着敲了一遍,最后发现......我**忘记加注解了(......
  • RunOnWeb - 创建新协议,支持html调用本地可执行文件,支持浏览器互相调用
     浏览器调用exe?  Yes! 谷歌Chrome启动微软Edge?   Yes!RunOnWeb协议 创建新协议,支持html调用本地可执行文件,支持浏览器互相调用 【最新版本】:Ver1.0.0【更新日期】:2024.3.15【作者】:阿色【下载】点击下载RunOnWeb协议安装程序及源文件:https://......
  • 《Distributed_Storage_Codes_With_Repair-by-Transfer_and_Nonachievability_of_Inte
    论文5个部分,本篇主要是针对3-14日组会中,懂和不懂的地方进行记录。论文部分:①RAID(待补充)②DC(datacollector)数据收集器+重建节点所有的这些系统,最基本的是要保证“DC”功能,也就是数据收集;在这个基础上,再保证,假如某节点出问题,能否修复;再研究,怎么修复代价最小,代价又分很多,有修......
  • 【Azure Redis】部署在AKS中的应用连接Redis时候出现Unable to connect to Redis serv
    问题描述在AKSPod中连接AzureRedis服务,大概率出现连接不上的问题。大多数的错误为 RedisConnectionException:UnabletoconnecttoRedisserver:xxxxxxxxx.redis.cache.chinacloudapi.cn/52.xxx.xxx.xxx:6380,但是有时候的错误信息为: RedisConnectionException:Unable......