Azure Policy-Muster: Logische Operatoren

Eine Richtliniendefinition kann mehrere Bedingungsanweisungen enthalten. In manchen Szenarien müssen alle Anweisungen „true“ sein, in anderen nur einige. Zur Unterstützung dieser Anforderungen verfügt die Sprache über logische Operatoren für not (nicht), allOf (alle) und anyOf (beliebige). Sie sind optional und können geschachtelt werden, um komplexe Szenarien zu erstellen.

Beispiel 1: Einzelner logischer Operator

Mit der folgenden Richtliniendefinition werden Azure Cosmos DB-Konten ausgewertet, um zu ermitteln, ob automatische Failover und mehrere Schreibstandorte konfiguriert sind. Falls nicht, wird audit ausgelöst und ein Protokolleintrag erstellt, wenn die nicht konforme Ressource erstellt oder aktualisiert wird.

{
  "properties": {
    "mode": "all",
    "displayName": "Audit Automatic Failover for CosmosDB accounts",
    "description": "This policy audits Automatic Failover for CosmosDB accounts",
    "policyRule": {
      "if": {
        "allOf": [{
            "field": "type",
            "equals": "Microsoft.DocumentDB/databaseAccounts"
          },
          {
            "field": "Microsoft.DocumentDB/databaseAccounts/enableAutomaticFailover",
            "equals": "false"
          },
          {
            "field": "Microsoft.DocumentDB/databaseAccounts/enableMultipleWriteLocations",
            "equals": "false"
          }
        ]
      },
      "then": {
        "effect": "audit"
      }
    },
    "parameters": {},
    "metadata": {}
  }
}

Beispiel 1: Erklärung

"policyRule": {
  "if": {
    "allOf": [{
        "field": "type",
        "equals": "Microsoft.DocumentDB/databaseAccounts"
      },
      {
        "field": "Microsoft.DocumentDB/databaseAccounts/enableAutomaticFailover",
        "equals": "false"
      },
      {
        "field": "Microsoft.DocumentDB/databaseAccounts/enableMultipleWriteLocations",
        "equals": "false"
      }
    ]
  },
  "then": {

Im Block policyRule.if wird ein einzelner logischer Operator vom Typ allOf verwendet, um sicherzustellen, dass alle drei Bedingungen erfüllt sind. Die Auswirkung audit wird nur ausgelöst, wenn alle diese Bedingungen als „true“ ausgewertet werden.

Beispiel 2: Mehrere logische Operatoren

Mit der folgenden Richtliniendefinition wird das Benennungsmuster von Ressourcen ausgewertet. Entspricht eine Ressource nicht dem Muster, wird Sie abgelehnt.

{
    "properties": {
        "displayName": "Match multiple name patterns.",
        "description": "Allows one of multiple naming patterns for resources.",
        "mode": "Indexed",
        "policyRule": {
            "if": {
                "allOf": [{
                        "not": {
                            "field": "name",
                            "match": "contoso??????"
                        }
                    },
                    {
                        "not": {
                            "field": "name",
                            "match": "contoso-???-##"
                        }
                    }
                ]
            },
            "then": {
                "effect": "deny"
            }
        }
    }
}

Beispiel 2: Erklärung

"if": {
    "allOf": [{
            "not": {
                "field": "name",
                "match": "contoso??????"
            }
        },
        {
            "not": {
                "field": "name",
                "match": "contoso-???-##"
            }
        }
    ]
},

Der Block policyRule.if in diesem Beispiel enthält ebenfalls einen einzelnen logischen Operator vom Typ allOf, die Bedingungen sind jedoch jeweils von dem logischen Operator not umschlossen. Die Bedingung innerhalb des logischen Operators not wird zuerst ausgewertet. Danach wird der logische Operator not ausgewertet, um zu ermitteln, ob die gesamte Klausel „true“ oder „false“ ist. Werden beide logischen Operatoren vom Typ not als „true“ ausgewertet, wird die Richtlinienauswirkung ausgelöst.

Beispiel 3: Kombinieren logischer Operatoren

Diese Richtliniendefinition wertet Konten vom Typ Spring in Azure aus, um festzustellen, ob die Ablaufverfolgung nicht aktiviert ist oder sich nicht in einem erfolgreichen Status befindet.

{
    "properties": {
        "displayName": "Audit Azure Spring Cloud instances where distributed tracing is not enabled",
        "description": "Distributed tracing tools in Azure Spring Cloud allow debugging and monitoring the complex interconnections between microservices in an application. Distributed tracing tools should be enabled and in a healthy state.",
        "mode": "Indexed",
        "policyRule": {
            "if": {
                "allOf": [{
                        "field": "type",
                        "equals": "Microsoft.AppPlatform/Spring"
                    },
                    {
                        "anyOf": [{
                                "field": "Microsoft.AppPlatform/Spring/trace.enabled",
                                "notEquals": "true"
                            },
                            {
                                "field": "Microsoft.AppPlatform/Spring/trace.state",
                                "notEquals": "Succeeded"
                            }
                        ]
                    }
                ]
            },
            "then": {
                "effect": "audit"
            }
        }
    }
}

Beispiel 3: Erklärung

"policyRule": {
    "if": {
        "allOf": [{
                "field": "type",
                "equals": "Microsoft.AppPlatform/Spring"
            },
            {
                "anyOf": [{
                        "field": "Microsoft.AppPlatform/Spring/trace.enabled",
                        "notEquals": "true"
                    },
                    {
                        "field": "Microsoft.AppPlatform/Spring/trace.state",
                        "notEquals": "Succeeded"
                    }
                ]
            }
        ]
    },
    "then": {
        "effect": "audit"
    }
}

Dieser policyRule.if-Block enthält die logischen Operatoren allOf und anyOf. Der logische Operator anyOf wird mit „true“ ausgewertet, solange eine enthaltene Bedingung „true“ ist. Da der Typ sich im Kern von allOf befindet, muss er immer mit „true“ ausgewertet werden. Wenn der Typ und eine der Bedingungen in anyOf „true“ sind, wird der Richtlinieneffekt ausgelöst.

Nächste Schritte