Эффект политики Azure для AuditIfExists

#azure-policy

#azure-политика

Вопрос:

Да, вы правильно прочитали, ЧТО AuditIfExists НЕТ AuditIfNotExists .

Мой вариант использования заключается в том, что я хочу провести аудит всех моих SQL-серверов Azure на наличие правил брандмауэра с определенным IP-адресом, и я хочу, чтобы все показатели панели мониторинга политики относились к серверам SQL, А НЕ к правилам брандмауэра. (т. Е. 2 сервера SQL, каждый из которых содержит 3 правила брандмауэра, должны идентифицировать 2 ресурса, а не 6 какбудет сообщено прямым Audit из Microsoft.SQL/servers/firewallRules ).

Многие другие мои пользовательские политики проверяют связанные ресурсы и сообщают об этих показателях от имени родительского элемента при использовании AuditIfNotExists или DeployIfNotExists . Однако фундаментальной основой этих проверок является то, что несуществование подтипа создает несоответствующее состояние независимо от результата оценки условия существования. Итак, в моем случае, если SQL Server имеет 0 правил брандмауэра (что для меня было бы совместимым состоянием), тогда политика оценивает его как несоответствующее. Если я попытаюсь снова проверить наличие в моем условии существования, как предложено @mentat9 в этом потоке проблем с политикой (https://github.com/Azure/azure-policy/issues/374 ) после нескольких попыток становится очевидным, что механизм политики даже не оценивает условие существования, если не существует объектов желаемого типа.

Ниже приведено мое правило политики из одной из моих последних попыток.

 "policyRule": {
                "if": {
                    "allOf": [
                        {
                            "field": "type",
                            "equals": "Microsoft.Sql/servers"
                        }
                    ]
                },
                "then": {
                    "effect": "[parameters('effect')]",
                    "details": {
                        "type": "Microsoft.Sql/servers/firewallRules",
                        "roleDefinitionIds": [
                            "/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c"
                        ],
                        "existenceCondition": {
                            "anyOf": [
                                {
                                    "field": "Microsoft.Sql/servers/firewallRules/startIpAddress",
                                    "exists": false
                                },
                                {
                                    "allOf": [
                                        {
                                            "field": "Microsoft.Sql/servers/firewallRules/startIpAddress",
                                            "notequals": "0.0.0.0"
                                        },
                                        {
                                            "field": "Microsoft.Sql/servers/firewallRules/endIpAddress",
                                            "notequals": "0.0.0.0"
                                        }
                                    ]
                                }
                            ]
                        }
                    }
                }
            }
  

Комментарии:

1. Привет, не могли бы вы найти решение для этого?

2. Нет, это все еще проблема. Из того, что я собрал, это проблема, связанная с продуктом Azure SQL Server, поскольку они создали правила брандмауэра как отдельные ресурсы вместо свойств SQL Server. (Пожалуйста, поправьте меня, если я ошибаюсь.)

Ответ №1:

Как насчет выражения Count?

 {
    "count": {
        "field": "Microsoft.Sql/servers/firewallRules[*]",
        "where": {
            "field": "Microsoft.Sql/servers/firewallRules[*].startIpAddress",
            "equals": "0.0.0.0"
        }
    },
    "equals": 0
}
  

Комментарии:

1. Microsoft.Sql/servers/firewallRules не является псевдонимом типа массива и поэтому не может использоваться в операции подсчета. «Правило определения политики ‘xxxx’ недопустимо. Значение поля: ‘Microsoft.Sql/servers/firewallRules’ используется в ‘count. поле’ не является псевдонимом или является псевдонимом для свойства, не являющегося массивом. В ‘count разрешены только псевдонимы, заканчивающиеся на ‘[*]’. поле’.»