azure - 如何通过 Azure 策略审核诊断设置中的日志记录类别?
问题描述
当具有特定 Azure 服务的特定配置的诊断设置不存在时,我有一个审核策略。这将应用于多个服务(事件中心、Key Vault、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: {"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"
解决方案
如果我理解正确,您想检查logs
数组的每个值并测试是否.enabled
是true
when .category
is 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"
对于其他类别值,您需要在外部内部使用类似的计数块。
推荐阅读
- python - 从网络链接中删除字符然后下载
- angular - 从包含Angular中的文本和标签的字符串中显示滑块中的图像
- python - 在 Python 中将输入函数参数放入字典的最佳方法是什么?
- javascript - 设置秒和毫秒的计时器
- appium - 在 Android 应用程序的情况下如何选择所有文本?webdriver 有什么可以全选的吗?
- go - 多次使用时 TCP 连接返回 'broken pipe' 错误
- php - 我有一个数组
- android - 将 POJO 类与 GSON 一起使用
- java - 出现 ArrayIndexOutOfBoundsException 的运行时错误:97
- python - Keras 损失函数取决于批量大小