如何通过Azure策略审核诊断设置中的日志记录类别?

时间:2020-07-30 10:15:24

标签: azure categories policy azure-diagnostics

当针对特定Azure服务的具有特定配置的诊断设置不存在时,我有一项策略可供审核。这将应用于多种服务(事件中心,密钥库,Postgres单服务器),以确保预先定义的日志记录配置到位。

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

  • PostgreSQL日志
  • QueryStoreRuntimeStatistics
  • QueryStoreWaitStatistics

并说我只想在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:{“错误”:{“代码”:“ InvalidPolicyParameters”,“消息”:“无法验证策略'e8b95433-42c5-4ed4-8a0c-1e7ad5ac2572'中的函数或参数。如果使用模板函数,请尝试以下操作https://aka.ms/policy-avoiding-template-failures中的提示。内部异常'无法解析语言表达式'true,false,false':期望的标记'LeftParenthesis'和实际的'逗号'。'“}} 状态:400 statusText:错误

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

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

当我尝试这样的操作时,它会被接受:

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

但这不是我想要的,因为它会将我的资源标记为不符合以下消息(请参见screenshot):

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"

1 个答案:

答案 0 :(得分:0)

如果我理解正确,那么您想检查logs数组的每个值,并在.enabledtrue时测试.category是否为PostgresSQLLogs。 您确实需要在这里使用count-“这将为条件表达式计算每个[*]别名数组成员并求和真实结果”。您可以在以下条件下使用复杂的表达式:

      "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"内部使用类似的计数块。