首页 > 解决方案 > 如何通过 Azure 策略审核诊断设置中的日志记录类别?

问题描述

当具有特定 Azure 服务的特定配置的诊断设置不存在时,我有一个审核策略。这将应用于多个服务(事件中心、Key Vault、Postgres 单服务器),以确保预定义的日志记录配置到位。

我面临的问题是审核在每个诊断设置中选择了特定的日志记录类别。以 Postgres 为例,它具有以下日志类别:

并说我只想强制在我的 DS 中选择“PostgreSQLLogs”。使用策略别名“Microsoft.Insights/diagnosticSettings/logs[*].enabled”这将暗示如下配置:[true, false, false]。因此,这是我应该在我的策略中设置的值,以审核它的合规性。但是,无论我在策略中尝试的哪个值都不会被 Azure 接受或无法实现我的目标。

以下是我的策略规则代码:

"policyRule": {
  "if": {
    "equals": "Microsoft.DBforPostgreSQL/servers",
    "field": "type"
  },
  "then": {
    "details": {
      "type": "Microsoft.Insights/diagnosticSettings",
      "existenceCondition": {
        "allOf": [
          {
            "field": "Microsoft.Insights/diagnosticSettings/logs[*].enabled",
            "equals": "[ true, false, false ]"
          },
          {
            "field": "Microsoft.Insights/diagnosticSettings/logs[*].category",
            "equals": "['PostgreSQLLogs']"
          },
          {
            "field": "Microsoft.Insights/diagnosticSettings/workspaceId",
            "matchInsensitively": "[parameters('my_logAnalytics')]"
          }
        ]
      }
    },
    "effect": "AuditIfNotExists"
  }

保存在门户中时会生成此错误:

readyState: 4 responseText: {"error":{"code":"InvalidPolicyParameters","message":"策略 'e8b95433-42c5-4ed4-8a0c-1e7ad5ac2572' 中的函数或参数无法验证。如果使用模板函数,请尝试按照以下提示操作:https ://aka.ms/policy-avoiding-template-failures 内部异常“无法解析语言表达式”真、假、假:预期标记“LeftParenthesis”和实际“逗号” .'."}} 状态:400 statusText:错误

引用数组的元素将引发相同的错误:

        {
          "field": "Microsoft.Insights/diagnosticSettings/logs[*].enabled",
          "equals": "[ 'true','false','false' ]"
        },

当我尝试这样的事情时,它将被接受:

        {
          "field": "Microsoft.Insights/diagnosticSettings/logs[*].enabled",
          "equals": "[ 'true' ]"
        },

但这不是我要找的,因为它将我的资源标记为不符合以下消息(请参见屏幕截图):

Reason for non-compliance: Current value must be equal to the target value
Field: Microsoft.Insights/diagnosticSettings/logs[*].enabled
Path: properties.logs[*].enabled
Current value: [true,false,false]
Target value: "true"

标签: azurecategoriespolicyazure-diagnostics

解决方案


如果我理解正确,您想检查logs数组的每个值并测试是否.enabledtruewhen .categoryis PostgresSQLLogs。你真的需要在这里使用一个计数- “这会评估每个[*]别名数组成员的条件表达式并对真实结果求和”。您可以在条件中使用复杂的表达式:

      "existenceCondition": {
        "allOf": [
          {
            "count": {
              "field": "Microsoft.Insights/diagnosticSettings/logs[*]",
              "where": {
                "allOf": [
                  {
                    "field": "Microsoft.Insights/diagnosticSettings/logs[*].enabled",
                    "equals": "True"
                  },
                  {
                    "field": "Microsoft.Insights/diagnosticSettings/logs[*].category",
                    "equals": "PostgresSQLLogs"
                  }
                ]
              }
            },
            "greater": 0
          },
          {
            "field": "Microsoft.Insights/diagnosticSettings/workspaceId",
            "matchInsensitively": "[parameters('my_logAnalytics')]"
          }
        ]
      }

"allOf"对于其他类别值,您需要在外部内部使用类似的计数块。


推荐阅读