Azure Policy-definitionsstruktur

Azure Policy upprättar konventioner för resurser. Principdefinitioner beskriver resursefterlevnadsvillkor och den effekt som ska uppnås om ett villkor uppfylls. Ett villkor jämför ett resursegenskapsfält eller ett värde med ett obligatoriskt värde. Resursegenskapsfält kan nås med hjälp av alias. När ett resursegenskapsfält är en matris kan ett särskilt matrisalias användas för att välja värden från alla matrismedlemmar och tillämpa ett villkor på var och en. Läs mer om villkor.

Genom att definiera konventioner kan du kontrollera kostnader och enklare hantera dina resurser. Du kan till exempel ange att endast vissa typer av virtuella datorer tillåts. Eller så kan du kräva att resurser har en viss tagg. Principtilldelningar ärvs av underordnade resurser. Om en principtilldelning tillämpas på en resursgrupp gäller den för alla resurser i den resursgruppen.

Principdefinitionens policyRule-schema finns här: https://schema.management.azure.com/schemas/2020-10-01/policyDefinition.json

Du använder JSON för att skapa en principdefinition. Principdefinitionen innehåller element för:

  • visningsnamn
  • beskrivning
  • mode
  • metadata
  • parametrar
  • principregel
    • logisk utvärdering
    • Effekt av

Följande JSON visar till exempel en princip som begränsar var resurser distribueras:

{
    "properties": {
        "displayName": "Allowed locations",
        "description": "This policy enables you to restrict the locations your organization can specify when deploying resources.",
        "mode": "Indexed",
        "metadata": {
            "version": "1.0.0",
            "category": "Locations"
        },
        "parameters": {
            "allowedLocations": {
                "type": "array",
                "metadata": {
                    "description": "The list of locations that can be specified when deploying resources",
                    "strongType": "location",
                    "displayName": "Allowed locations"
                },
                "defaultValue": [ "westus2" ]
            }
        },
        "policyRule": {
            "if": {
                "not": {
                    "field": "location",
                    "in": "[parameters('allowedLocations')]"
                }
            },
            "then": {
                "effect": "deny"
            }
        }
    }
}

Azure Policy inbyggda och mönster finns på Azure Policy exempel.

Visningsnamn och beskrivning

Du använder displayName och description för att identifiera principdefinitionen och ange kontext för när den används. displayName har en maximal längd på 128 tecken och en beskrivning på högst 512 tecken.

Anteckning

När du skapar eller uppdaterar en principdefinition definieras id, typ och namn av egenskaper som är externa för JSON och behövs inte i JSON-filen. Hämtning av principdefinitionen via SDK returnerar id-, typ- och namnegenskaperna som en del av JSON, men var och en är skrivskyddade uppgifter relaterade till principdefinitionen.

Typ

Även om typegenskapen inte kan anges finns det tre värden som returneras av SDK och visas i portalen:

  • Builtin: Dessa principdefinitioner tillhandahålls och underhålls av Microsoft.
  • Custom: Alla principdefinitioner som skapats av kunder har det här värdet.
  • Static: Anger en principdefinition för regelefterlevnad med Microsoft-ägarskap. Efterlevnadsresultaten för dessa principdefinitioner är resultatet av granskningar från tredje part i Microsoft-infrastrukturen. I Azure Portal visas det här värdet ibland som Microsoft-hanterad. Mer information finns i Delat ansvar i molnet.

Läge

Läget konfigureras beroende på om principen är inriktad på en Azure Resource Manager eller en resursprovideregenskap.

Resource Manager lägena

Läget avgör vilka resurstyper som utvärderas för en principdefinition. Lägena som stöds är:

  • all: utvärdera resursgrupper, prenumerationer och alla resurstyper
  • indexed: utvärdera endast resurstyper som stöder taggar och plats

Till exempel har resursen Microsoft.Network/routeTables stöd för taggar och platser och utvärderas i båda lägena. Resursen kan Microsoft.Network/routeTables/routes dock inte taggas och utvärderas inte i Indexed läge.

Vi rekommenderar att du ställer in läget på i de all flesta fall. Alla principdefinitioner som skapas via portalen använder all läget . Om du använder PowerShell eller Azure CLI kan du ange lägesparametern manuellt. Om principdefinitionen inte innehåller något lägesvärde används som standard i all Azure PowerShell och i Azure null CLI. Ett null läge är detsamma som att använda för att stödja indexed bakåtkompatibilitet.

indexed ska användas när du skapar principer som framtvingar taggar eller platser. Även om det inte krävs förhindras resurser som inte stöder taggar och platser från att visas som icke-kompatibla i kompatibilitetsresultaten. Undantaget är resursgrupper och prenumerationer. Principdefinitioner som framtvingar plats eller taggar på en resursgrupp eller prenumeration ska ange läge till och specifikt rikta in sig på typen all eller Microsoft.Resources/subscriptions/resourceGroups Microsoft.Resources/subscriptions . Ett exempel finns i Pattern: Tags - Sample #1. En lista över resurser som stöder taggar finns i Tagga stöd för Azure-resurser.

Resursproviderlägen

Följande resursproviderläge stöds fullt ut:

  • Microsoft.Kubernetes.Data för att hantera Kubernetes-kluster på eller av Azure. Definitioner som använder det här resursproviderläget använder effekter granska, neka och inaktivera . Det här läget stöder anpassade definitioner som en offentlig förhandsversion. Se Skapa principdefinition från begränsningsmall för att skapa en anpassad definition från en befintlig OPA-mall för Open Policy Agent (OPA) GateKeeper v3-begränsning. Användningen av EnforceOPAConstraint-effekten är inaktuell.

Följande resursproviderlägen stöds för närvarande som förhandsversion:

Anteckning

Resursproviderlägen stöder endast inbyggda principdefinitioner och stöder inte undantag om det inte uttryckligen anges.

Metadata

Den metadata valfria egenskapen lagrar information om principdefinitionen. Kunder kan definiera egenskaper och värden som är användbara för organisationen i metadata . Det finns dock några vanliga egenskaper som Azure Policy och inbyggda. Varje metadata egenskap har en gräns på 1 024 tecken.

Vanliga metadataegenskaper

  • version (sträng): Spårar information om versionen av innehållet i en principdefinition.
  • category (sträng): Avgör under vilken kategori i Azure Portal principdefinitionen visas.
  • preview (booleskt): True- eller false-flagga för om principdefinitionen är förhandsversion.
  • deprecated (booleskt): True- eller false-flagga för om principdefinitionen har markerats som inaktuell.
  • portalReview (sträng): Avgör om parametrar ska granskas i portalen, oavsett vilka indata som krävs.

Anteckning

Tjänsten Azure Policy använder egenskaperna , och för att förmedla ändringsnivån till version preview en inbyggd deprecated principdefinition eller initiativ och tillstånd. Formatet för version är: {Major}.{Minor}.{Patch} . Specifika tillstånd, till exempel inaktuella eller förhandsversioner, läggs till i egenskapen eller i en version annan egenskap som en boolesk. Mer information om hur Azure Policy för inbyggda versioner finns i Inbyggd versionshantering.

Parametrar

Parametrar förenklar principhanteringen genom att minska antalet principdefinitioner. Tänk på parametrar som fälten i ett formulär – name , address , , city state . Dessa parametrar förblir alltid desamma, men deras värden ändras beroende på om personen fyller i formuläret. Parametrar fungerar på samma sätt när du skapar principer. Genom att inkludera parametrar i en principdefinition kan du återanvända principen för olika scenarier med hjälp av olika värden.

Anteckning

Parametrar kan läggas till i en befintlig och tilldelad definition. Den nya parametern måste innehålla egenskapen defaultValue. Detta förhindrar att befintliga tilldelningar av principen eller initiativet indirekt blir ogiltiga.

Parameteregenskaper

En parameter har följande egenskaper som används i principdefinitionen:

  • name: Namnet på parametern. Används av parameters distributionsfunktionen i principregeln. Mer information finns i använda ett parametervärde.
  • type: Anger om parametern är en sträng, matris, objekt, boolesk, heltal, flyttal eller datetime.
  • metadata: Definierar underegenskaper som främst används av Azure Portal för att visa användarvänlig information:
    • description: Förklaringen av vad parametern används för. Kan användas för att ge exempel på godkända värden.
    • displayName: Det egna namnet som visas i portalen för parametern .
    • strongType: (Valfritt) Används när du tilldelar principdefinitionen via portalen. Innehåller en sammanhangsmedveten lista. Mer information finns i strongType.
    • assignPermissions: (Valfritt) Ange som sant om du Azure Portal skapa rolltilldelningar under principtilldelningen. Den här egenskapen är användbar om du vill tilldela behörigheter utanför tilldelningsomfånget. Det finns en rolltilldelning per rolldefinition i principen (eller per rolldefinition i alla principer i initiativet). Parametervärdet måste vara en giltig resurs eller ett omfång.
  • defaultValue: (Valfritt) Anger värdet för parametern i en tilldelning om inget värde anges. Krävs när du uppdaterar en befintlig principdefinition som har tilldelats.
  • allowedValues: (Valfritt) Innehåller en matris med värden som parametern accepterar under tilldelningen. Tillåtna värdejämförelser är fallkänsliga.

Du kan till exempel definiera en principdefinition för att begränsa de platser där resurser kan distribueras. En parameter för principdefinitionen kan vara allowedLocations. Den här parametern används av varje tilldelning av principdefinitionen för att begränsa godkända värden. Användningen av strongType ger en förbättrad upplevelse när du slutför tilldelningen via portalen:

"parameters": {
    "allowedLocations": {
        "type": "array",
        "metadata": {
            "description": "The list of allowed locations for resources.",
            "displayName": "Allowed locations",
            "strongType": "location"
        },
        "defaultValue": [ "westus2" ],
        "allowedValues": [
            "eastus2",
            "westus2",
            "westus"
        ]
    }
}

Använda ett parametervärde

I principregeln refererar du till parametrar med följande parameters funktionssyntax:

{
    "field": "location",
    "in": "[parameters('allowedLocations')]"
}

Det här exemplet refererar till parametern allowedLocations som visades i parameteregenskaperna.

strongType

I egenskapen metadata kan du använda strongType för att tillhandahålla en flervalslista med alternativ i Azure Portal. strongType kan vara en resurstyp som stöds eller ett tillåtet värde. Använd Get-AzResourceProviderför att avgöra om en resurstyp är giltig för strongType. Formatet för en resurstyp strongType är <Resource Provider>/<Resource Type> . Till exempel Microsoft.Network/virtualNetworks/subnets.

Vissa resurstyper som inte returneras av Get-AzResourceProvider stöds. Dessa typer är:

  • Microsoft.RecoveryServices/vaults/backupPolicies

Värden som inte är resurstyper tillåtna för strongType är:

  • location
  • resourceTypes
  • storageSkus
  • vmSKUs
  • existingResourceGroups

Definitionsplats

När du skapar ett initiativ eller en princip måste du ange definitionens plats. Definitionens plats måste vara en hanteringsgrupp eller en prenumeration. Den här platsen avgör omfånget som initiativet eller principen kan tilldelas. Resurser måste vara direkta medlemmar i eller underordnade i hierarkin för definitionens plats som mål för tilldelningen.

Om definitionens plats är:

  • Prenumeration – Endast resurser i prenumerationen kan tilldelas principdefinitionen.
  • Hanteringsgrupp – Endast resurser i underordnade hanteringsgrupper och underordnade prenumerationer kan tilldelas principdefinitionen. Om du planerar att tillämpa principdefinitionen på flera prenumerationer måste platsen vara en hanteringsgrupp som innehåller varje prenumeration.

Mer information finns i Förstå omfånget i Azure Policy.

Principregel

Principregeln består av If- och Then-block. I blocket If definierar du ett eller flera villkor som anger när principen ska tillämpas. Du kan använda logiska operatorer för dessa villkor för att exakt definiera scenariot för en princip.

I blocket Sedan definierar du den effekt som inträffar när If-villkoren uppfylls.

{
    "if": {
        <condition> | <logical operator>
    },
    "then": {
        "effect": "deny | audit | modify | append | auditIfNotExists | deployIfNotExists | disabled"
    }
}

Logiska operatorer

Logiska operatorer som stöds är:

  • "not": {condition or operator}
  • "allOf": [{condition or operator},{condition or operator}]
  • "anyOf": [{condition or operator},{condition or operator}]

Inte-syntaxen inverterar resultatet av villkoret. AllOf-syntaxen (liknar den logiska and-åtgärden) kräver att alla villkor är sanna. Syntaxen anyOf (liknar den logiska åtgärden Eller) kräver att ett eller flera villkor är sanna.

Du kan kapsla logiska operatorer. I följande exempel visas en not-åtgärd som är kapslad i en allOf-åtgärd.

"if": {
    "allOf": [{
            "not": {
                "field": "tags",
                "containsKey": "application"
            }
        },
        {
            "field": "type",
            "equals": "Microsoft.Storage/storageAccounts"
        }
    ]
},

Villkor

Ett villkor utvärderar om ett värde uppfyller vissa villkor. De villkor som stöds är:

  • "equals": "stringValue"
  • "notEquals": "stringValue"
  • "like": "stringValue"
  • "notLike": "stringValue"
  • "match": "stringValue"
  • "matchInsensitively": "stringValue"
  • "notMatch": "stringValue"
  • "notMatchInsensitively": "stringValue"
  • "contains": "stringValue"
  • "notContains": "stringValue"
  • "in": ["stringValue1","stringValue2"]
  • "notIn": ["stringValue1","stringValue2"]
  • "containsKey": "keyName"
  • "notContainsKey": "keyName"
  • "less": "dateValue" | "less": "stringValue" | "less": intValue
  • "lessOrEquals": "dateValue" | "lessOrEquals": "stringValue" | "lessOrEquals": intValue
  • "greater": "dateValue" | "greater": "stringValue" | "greater": intValue
  • "greaterOrEquals": "dateValue" | "greaterOrEquals": "stringValue" | "greaterOrEquals": intValue
  • "exists": "bool"

Om egenskapstypen inte matchar villkorstypen uppstår ett fel för mindre , mindre än eller lika med , större och större änEllerEquals. Strängjämförelser görs med hjälp av InvariantCultureIgnoreCase .

När du använder villkoren like och notLike anger du ett * jokertecken i värdet. Värdet får inte ha fler än ett jokertecken * .

När du använder matchnings- och notMatch-villkor anger du för att matcha en siffra, för en bokstav, för att matcha alla tecken och andra tecken som matchar # det faktiska ? . tecknet. Matchning och notMatch är fallkänsliga, men alla andra villkor som utvärderar stringValue är icke-case-känsliga. Icke-känsliga alternativ är tillgängliga i matchInsensitively och notMatchInsensitively.

Fält

Villkor som utvärderar om värdena för egenskaperna i resursbegärandenyttolasten uppfyller vissa villkor kan skapas med hjälp av ett fältuttryck. Följande fält stöds:

  • name
  • fullName
    • Returnerar det fullständiga namnet på resursen. Det fullständiga namnet på en resurs är resursnamnet före eventuella överordnade resursnamn (till exempel "myServer/myDatabase").
  • kind
  • type
  • location
    • Platsfält normaliseras för att stödja olika format. anses till East US 2 exempel vara lika med eastus2 .
    • Använd globalt för resurser som är platsoberoende.
  • id
    • Returnerar resurs-ID:t för den resurs som utvärderas.
    • Exempel: /subscriptions/06be863d-0996-4d56-be22-384767287aa2/resourceGroups/myRG/providers/Microsoft.KeyVault/vaults/myVault
  • identity.type
  • tags
  • tags['<tagName>']
    • Den här syntaxen för hakparenteser stöder taggnamn som har skiljetecken, till exempel bindestreck, punkt eller blanksteg.
    • Där <tagName> är namnet på taggen som villkoret ska verifieras för.
    • Exempel: tags['Acct.CostCenter'] där Acct.CostCenter är namnet på taggen.
  • tags['''<tagName>''']
    • Den här syntaxen för hakparenteser stöder taggnamn som har apostrofer i sig genom att undantag med dubbla apostrofer.
    • Där ' <tagName> ' är namnet på taggen som villkoret ska verifieras för.
    • Exempel: tags['''My.Apostrophe.Tag'''] där "My.Apostrophe.Tag" är namnet på taggen.
  • egenskapsalias – en lista finns i Alias.

Anteckning

tags.<tagName>, tags[tagName] och är fortfarande tags[tag.with.dots] godtagbara sätt att deklarera ett taggfält. De föredragna uttrycken är dock de som anges ovan.

Anteckning

I fältuttryck som [ * ] refererar till alias utvärderas varje element i matrisen individuellt med logiskt och mellan element. Mer information finns i Referera till matrisresursegenskaper.

Använda taggar med parametrar

Ett parametervärde kan skickas till ett taggfält. Att skicka en parameter till ett taggfält ökar flexibiliteten för principdefinitionen under principtilldelningen.

I följande exempel används för concat att skapa en taggfältsuppslag för taggen med namnet värdet för parametern tagName. Om taggen inte finns används effekten ändra för att lägga till taggen med hjälp av värdet för samma namngivna tagg som angetts för den granskade resursens överordnade resursgrupp med hjälp av resourcegroup() sökningsfunktionen.

{
    "if": {
        "field": "[concat('tags[', parameters('tagName'), ']')]",
        "exists": "false"
    },
    "then": {
        "effect": "modify",
        "details": {
            "operations": [{
                "operation": "add",
                "field": "[concat('tags[', parameters('tagName'), ']')]",
                "value": "[resourcegroup().tags[parameters('tagName')]]"
            }],
            "roleDefinitionIds": [
                "/providers/microsoft.authorization/roleDefinitions/4a9ae827-6dc8-4573-8ac7-8239d42aa03f"
            ]
        }
    }
}

Värde

Villkor som utvärderar om ett värde uppfyller vissa villkor kan skapas med hjälp av ett värdeuttryck. Värdena kan vara literaler, värdena för parametrar ellerde returnerade värdena för alla mallfunktioner som stöds.

Varning

Om resultatet av en mallfunktion är ett fel misslyckas principutvärderingen. En misslyckad utvärdering är ett implicit nekande. Mer information finns i undvika mallfel. Använd enforcementMode för DoNotEnforce för att förhindra påverkan av en misslyckad utvärdering på nya eller uppdaterade resurser vid testning och validering av en ny principdefinition.

Värdeexempel

Det här principregelexempel använder värde för att jämföra resultatet av funktionen resourceGroup() och den returnerade namnegenskapen med ett like-villkor för *netrg . Regeln nekar alla resurser som inte är av Microsoft.Network/* typen i någon resursgrupp vars namn slutar på *netrg .

{
    "if": {
        "allOf": [{
                "value": "[resourceGroup().name]",
                "like": "*netrg"
            },
            {
                "field": "type",
                "notLike": "Microsoft.Network/*"
            }
        ]
    },
    "then": {
        "effect": "deny"
    }
}

Det här principregelexempel använder värdet för att kontrollera om resultatet av flera kapslade funktioner är lika med true . Regeln nekar alla resurser som inte har minst tre taggar.

{
    "mode": "indexed",
    "policyRule": {
        "if": {
            "value": "[less(length(field('tags')), 3)]",
            "equals": "true"
        },
        "then": {
            "effect": "deny"
        }
    }
}

Undvika mallfel

Användningen av mallfunktioner i värde möjliggör många komplexa kapslade funktioner. Om resultatet av en mallfunktion är ett fel misslyckas principutvärderingen. En misslyckad utvärdering är ett implicit nekande. Ett exempel på ett värde som misslyckas i vissa scenarier:

{
    "policyRule": {
        "if": {
            "value": "[substring(field('name'), 0, 3)]",
            "equals": "abc"
        },
        "then": {
            "effect": "audit"
        }
    }
}

Exempelprincipregeln ovan använder delsträng() för att jämföra de första tre tecknen i namn med abc. Om namnet är kortare än tre tecken substring() resulterar funktionen i ett fel. Det här felet gör att principen blir en neka-effekt.

Använd istället funktionen if() för att kontrollera om de första tre tecknen i namnet är lika med abc utan att ett namn som är kortare än tre tecken kan orsaka ett fel:

{
    "policyRule": {
        "if": {
            "value": "[if(greaterOrEquals(length(field('name')), 3), substring(field('name'), 0, 3), 'not starting with abc')]",
            "equals": "abc"
        },
        "then": {
            "effect": "audit"
        }
    }
}

Med den ändrade principregeln kontrollerar längden på namnet innan du försöker hämta ett värde if() med färre än tre substring() tecken. Om namnet är för kort returneras värdet "börjar inte med abc" i stället och jämförs med abc. En resurs med ett kort namn som inte börjar med abc misslyckas fortfarande med principregeln, men orsakar inte längre ett fel under utvärderingen.

Antal

Villkor som räknar hur många medlemmar i en matris som uppfyller vissa villkor kan skapas med hjälp av ett count-uttryck. Vanliga scenarier kontrollerar om "minst en av", "exakt ett av", "alla" eller "ingen av" matrismedlemmarna uppfyller ett villkor. Count utvärderar varje matrismedlem för ett villkorsuttryck och summerar det sanna resultatet, som sedan jämförs med uttrycksoperatorn.

Antal fält

Räkna hur många medlemmar i en matris i begärandenyttolasten som uppfyller ett villkorsuttryck. Strukturen för fältantalsuttryck är:

{
    "count": {
        "field": "<[*] alias>",
        "where": {
            /* condition expression */
        }
    },
    "<condition>": "<compare the count of true condition expression array members to this value>"
}

Följande egenskaper används med fältantal:

  • count.field (krävs): Innehåller sökvägen till matrisen och måste vara ett matrisalias.
  • count.where (valfritt): Villkorsuttrycket som ska utvärderas individuellt för [ * ] varje aliasmatrismedlem i count.field . Om den här egenskapen inte anges utvärderas alla matrismedlemmar med sökvägen "field" till true. Alla villkor kan användas i den här egenskapen. Logiska operatorer kan användas i den här egenskapen för att skapa komplexa utvärderingskrav.
  • <condition>(krävs): Värdet jämförs med antalet objekt som uppfyllde villkorsuttrycket count.where. Ett numeriskt villkor ska användas.

Fältantalsuttryck kan räkna upp samma fältmatris upp till tre gånger i en enda policyRule-definition.

Mer information om hur du arbetar med matrisegenskaper i Azure Policy, inklusive detaljerad förklaring av hur uttrycket för antal fält utvärderas, finns i Referera till matrisresursegenskaper.

Antal värden

Räkna hur många medlemmar i en matris som uppfyller ett villkor. Matrisen kan vara en literalmatris eller en referens till matrisparametern. Strukturen för värdeantalsuttryck är:

{
    "count": {
        "value": "<literal array | array parameter reference>",
        "name": "<index name>",
        "where": {
            /* condition expression */
        }
    },
    "<condition>": "<compare the count of true condition expression array members to this value>"
}

Följande egenskaper används med värdeantal:

  • count.value (krävs): Matrisen som ska utvärderas.
  • count.name (krävs): Indexnamnet, som består av engelska bokstäver och siffror. Definierar ett namn för värdet för matrismedlemmen som utvärderas i den aktuella iterationen. Namnet används för att referera till det aktuella värdet i count.where villkoret. Valfritt när count-uttrycket inte finns under ett annat count-uttryck. Om inget anges anges indexnamnet implicit till "default" .
  • count.where (valfritt): Villkorsuttrycket som ska utvärderas individuellt för varje matrismedlem i count.value . Om den här egenskapen inte anges utvärderas alla matrismedlemmar till true. Alla villkor kan användas i den här egenskapen. Logiska operatorer kan användas i den här egenskapen för att skapa komplexa utvärderingskrav. Du kan komma åt värdet för den uppräknade matrismedlemmen genom att anropa den aktuella funktionen.
  • <condition> (krävs): Värdet jämförs med antalet objekt som uppfyllde count.where villkorsuttrycket. Ett numeriskt villkor ska användas.

Följande begränsningar tillämpas:

  • Upp till 10 värdeantalsuttryck kan användas i en enda policyRule-definition.
  • Varje värdeantalsuttryck kan utföra upp till 100 iterationer. Det här talet innehåller antalet iterationer som utförs av ett överordnat värdeantalsuttryck.

Den aktuella funktionen

Funktionen current() är bara tillgänglig i count.where villkoret. Den returnerar värdet för matrismedlemmen som för närvarande räknas upp av utvärderingen av count-uttrycket.

Användning av antal värden

  • current(<index name defined in count.name>). Exempel: current('arrayMember').
  • current(). Tillåts endast när värdeantalsuttrycket inte är under ett annat count-uttryck. Returnerar samma värde som ovan.

Om värdet som returneras av anropet är ett objekt stöds egenskapsåtkomster. Exempel: current('objectArrayMember').property.

Användning av antal fält

  • current(<the array alias defined in count.field>). Till exempel current('Microsoft.Test/resource/enumeratedArray[*]').
  • current(). Tillåts endast när uttrycket för antal fält inte är under ett annat count-uttryck. Returnerar samma värde som ovan.
  • current(<alias of a property of the array member>). Till exempel current('Microsoft.Test/resource/enumeratedArray[*].property').

Exempel på antal fält

Exempel 1: Kontrollera om en matris är tom

{
    "count": {
        "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]"
    },
    "equals": 0
}

Exempel 2: Sök efter endast en matrismedlem för att uppfylla villkorsuttrycket

{
    "count": {
        "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
        "where": {
            "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].description",
            "equals": "My unique description"
        }
    },
    "equals": 1
}

Exempel 3: Kontrollera att minst en matrismedlem uppfyller villkorsuttrycket

{
    "count": {
        "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
        "where": {
            "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].description",
            "equals": "My common description"
        }
    },
    "greaterOrEquals": 1
}

Exempel 4: Kontrollera att alla objektmatrismedlemmar uppfyller villkorsuttrycket

{
    "count": {
        "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
        "where": {
            "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].description",
            "equals": "description"
        }
    },
    "equals": "[length(field('Microsoft.Network/networkSecurityGroups/securityRules[*]'))]"
}

Exempel 5: Kontrollera att minst en matrismedlem matchar flera egenskaper i villkorsuttrycket

{
    "count": {
        "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
        "where": {
            "allOf": [
                {
                    "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].direction",
                    "equals": "Inbound"
                },
                {
                    "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].access",
                    "equals": "Allow"
                },
                {
                    "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].destinationPortRange",
                    "equals": "3389"
                }
            ]
        }
    },
    "greater": 0
}

Exempel 6: Använd funktionen inuti villkoren för att komma åt värdet för den aktuella current() where uppräknade matrismedlemmen i en mallfunktion. Det här villkoret kontrollerar om ett virtuellt nätverk innehåller ett adressprefix som inte är under CIDR-intervallet 10.0.0.0/24.

{
    "count": {
        "field": "Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]",
        "where": {
          "value": "[ipRangeContains('10.0.0.0/24', current('Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]'))]",
          "equals": false
        }
    },
    "greater": 0
}

Exempel 7: Använd field() funktionen inuti villkoren för att komma åt värdet för den aktuella where uppräknade matrismedlemmen. Det här villkoret kontrollerar om ett virtuellt nätverk innehåller ett adressprefix som inte är under CIDR-intervallet 10.0.0.0/24.

{
    "count": {
        "field": "Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]",
        "where": {
          "value": "[ipRangeContains('10.0.0.0/24', first(field(('Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]')))]",
          "equals": false
        }
    },
    "greater": 0
}

Exempel på värdeantal

Exempel 1: Kontrollera om resursnamnet matchar något av de angivna namnmönstren.

{
    "count": {
        "value": [ "prefix1_*", "prefix2_*" ],
        "name": "pattern",
        "where": {
            "field": "name",
            "like": "[current('pattern')]"
        }
    },
    "greater": 0
}

Exempel 2: Kontrollera om resursnamnet matchar något av de angivna namnmönstren. Funktionen current() anger inget indexnamn. Resultatet är detsamma som i föregående exempel.

{
    "count": {
        "value": [ "prefix1_*", "prefix2_*" ],
        "where": {
            "field": "name",
            "like": "[current()]"
        }
    },
    "greater": 0
}

Exempel 3: Kontrollera om resursnamnet matchar något av de angivna namnmönster som tillhandahålls av en matrisparameter.

{
    "count": {
        "value": "[parameters('namePatterns')]",
        "name": "pattern",
        "where": {
            "field": "name",
            "like": "[current('pattern')]"
        }
    },
    "greater": 0
}

Exempel 4: Kontrollera om något av adressprefixen för det virtuella nätverket inte finns med i listan över godkända prefix.

{
    "count": {
        "field": "Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]",
        "where": {
            "count": {
                "value": "[parameters('approvedPrefixes')]",
                "name": "approvedPrefix",
                "where": {
                    "value": "[ipRangeContains(current('approvedPrefix'), current('Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]'))]",
                    "equals": true
                },
            },
            "equals": 0
        }
    },
    "greater": 0
}

Exempel 5: Kontrollera att alla reserverade NSG-regler har definierats i en NSG. Egenskaperna för de reserverade NSG-reglerna definieras i en matrisparameter som innehåller objekt.

Parametervärde:

[
    {
        "priority": 101,
        "access": "deny",
        "direction": "inbound",
        "destinationPortRange": 22
    },
    {
        "priority": 102,
        "access": "deny",
        "direction": "inbound",
        "destinationPortRange": 3389
    }
]

Politik:

{
    "count": {
        "value": "[parameters('reservedNsgRules')]",
        "name": "reservedNsgRule",
        "where": {
            "count": {
                "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
                "where": {
                    "allOf": [
                        {
                            "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].priority",
                            "equals": "[current('reservedNsgRule').priority]"
                        },
                        {
                            "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].access",
                            "equals": "[current('reservedNsgRule').access]"
                        },
                        {
                            "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].direction",
                            "equals": "[current('reservedNsgRule').direction]"
                        },
                        {
                            "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].destinationPortRange",
                            "equals": "[current('reservedNsgRule').destinationPortRange]"
                        }
                    ]
                }
            },
            "equals": 1
        }
    },
    "equals": "[length(parameters('reservedNsgRules'))]"
}

Effekt

Azure Policy har stöd för följande typer av effekt:

  • Lägg till: lägger till den definierade uppsättningen fält i begäran
  • Granskning: genererar en varningshändelse i aktivitetsloggen, men misslyckas inte begäran
  • AuditIfNotExists: genererar en varningshändelse i aktivitetsloggen om det inte finns någon relaterad resurs
  • Neka: genererar en händelse i aktivitetsloggen och misslyckas med begäran
  • DeployIfNotExists: distribuerar en relaterad resurs om den inte redan finns
  • Inaktiverad: utvärderar inte resurser för efterlevnad av principregeln
  • Ändra: lägger till, uppdaterar eller tar bort de definierade taggarna från en resurs eller prenumeration
  • EnforceOPAConstraint (inaktuell): konfigurerar open policy-agentens antagningskontrollant med Gatekeeper v3 för själv hanterade Kubernetes-kluster i Azure
  • EnforceRegoPolicy (inaktuell): konfigurerar open policy agent-antagningskontrollanten med Gatekeeper v2 i Azure Kubernetes Service

Fullständig information om varje effekt, utvärderingsordning, egenskaper och exempel finns i Förstå Azure Policy Effekter.

Principfunktioner

Funktioner kan användas för att införa ytterligare logik i en principregel. De löses inom principregeln för en principdefinition och inom parametervärden som tilldelats principdefinitioner i ett initiativ.

Alla Resource Manager mallfunktioner är tillgängliga för användning i en principregel, förutom följande funktioner och användardefinierade funktioner:

  • copyIndex()
  • deployment()
  • lista*
  • newGuid()
  • pickZones()
  • providers()
  • reference()
  • resourceId()
  • variables()

Anteckning

Dessa funktioner är fortfarande tillgängliga i delen details.deployment.properties.template av malldistributionen i en deployIfNotExists-principdefinition.

Följande funktion är tillgänglig för användning i en principregel, men skiljer sig från användning i en Azure Resource Manager mall (ARM-mall):

  • utcNow()- Till skillnad från en ARM-mall kan den här egenskapen användas utanför defaultValue.
    • Returnerar en sträng som är inställd på aktuellt datum och tid i Universal ISO 8601 DateTime-format yyyy-MM-ddTHH:mm:ss.fffffffZ .

Följande funktioner är bara tillgängliga i principregler:

  • addDays(dateTime, numberOfDaysToAdd)

    • dateTime:[Required] sträng – Sträng i Universal ISO 8601 DateTime-formatet 'yyyy-MM-ddTHH:mm:ss. FFFFFFFZ'
    • numberOfDaysToAdd:[Required] heltal – Antal dagar som ska läggas till
  • field(fieldName)

    • fieldName:[Required] string – Namnet på fältet som ska hämtas
    • Returnerar värdet för fältet från resursen som utvärderas av villkoret If.
    • field används främst med AuditIfNotExists och DeployIfNotExists för att referera till fält på resursen som utvärderas. Ett exempel på den här användningen finns i deployIfNotExists-exemplet.
  • requestContext().apiVersion

    • Returnerar API-versionen för begäran som utlöste principutvärderingen (exempel: 2021-09-01 ). Det här värdet är den API-version som användes i PUT/PATCH-begäran för utvärdering av resursskapande/uppdatering. Den senaste API-versionen används alltid under kompatibilitetsutvärderingen för befintliga resurser.
  • policy()

    • Returnerar följande information om den princip som utvärderas. Egenskaper kan nås från det returnerade objektet (exempel: [policy().assignmentId] ).

      {
        "assignmentId": "/subscriptions/ad404ddd-36a5-4ea8-b3e3-681e77487a63/providers/Microsoft.Authorization/policyAssignments/myAssignment",
        "definitionId": "/providers/Microsoft.Authorization/policyDefinitions/34c877ad-507e-4c82-993e-3452a6e0ad3c",
        "setDefinitionId": "/providers/Microsoft.Authorization/policySetDefinitions/42a694ed-f65e-42b2-aa9e-8052e9740a92",
        "definitionReferenceId": "StorageAccountNetworkACLs"
      }
      
  • ipRangeContains(range, targetRange)

    • range: [Required] string – Sträng som anger ett intervall med IP-adresser för att kontrollera om targetRange är inom.
    • targetRange:[Required] string – Sträng som anger ett intervall med IP-adresser som ska valideras som ingår i intervallet.
    • Returnerar ett booleskt tal för huruvida intervallets IP-adressintervall innehåller ip-adressintervallet targetRange. Tomma intervall eller blandning mellan IP-familjer tillåts inte och resulterar i utvärderingsfel.

    Format som stöds:

    • Enskild IP-adress (exempel: 10.0.0.0 , 2001:0DB8::3:FFFE )
    • CIDR-intervall (exempel: 10.0.0.0/24 , 2001:0DB8::/110 )
    • Intervall som definieras av start- och slut-IP-adresser (exempel: 192.168.0.1-192.168.0.9 , 2001:0DB8::-2001:0DB8::3:FFFF )
  • current(indexName)

Exempel på principfunktion

Det här principregelexempel använder resursfunktionen för att hämta namnegenskapen, kombinerat med matris- och objektfunktionen för att skapa ett villkor som framtvingar resursnamnet att börja med resourceGroup concat like resursgruppens namn.

{
    "if": {
        "not": {
            "field": "name",
            "like": "[concat(resourceGroup().name,'*')]"
        }
    },
    "then": {
        "effect": "deny"
    }
}

Alias

Du använder egenskapsalias för att få åtkomst till specifika egenskaper för en resurstyp. Med alias kan du begränsa vilka värden eller villkor som tillåts för en egenskap på en resurs. Varje alias mappar till sökvägar i olika API-versioner för en viss resurstyp. Under principutvärderingen hämtar principmotorn egenskapssökvägen för den API-versionen.

Listan över alias växer alltid. Använd någon av följande metoder för att ta reda på vilka alias Azure Policy stöds av:

  • Azure Policy tillägg för Visual Studio Code (rekommenderas)

    Använd tillägget Azure Policy för Visual Studio Code för att visa och identifiera alias för resursegenskaper.

    Skärmbild av Azure Policy för Visual Studio Code som hovrar över en egenskap för att visa aliasnamnen.

  • Azure PowerShell

    # Login first with Connect-AzAccount if not using Cloud Shell
    
    # Use Get-AzPolicyAlias to list available providers
    Get-AzPolicyAlias -ListAvailable
    
    # Use Get-AzPolicyAlias to list aliases for a Namespace (such as Azure Compute -- Microsoft.Compute)
    (Get-AzPolicyAlias -NamespaceMatch 'compute').Aliases
    

    Anteckning

    Om du vill hitta alias som kan användas med ändringseffekten använder du följande kommando i Azure PowerShell 4.6.0 eller senare:

    Get-AzPolicyAlias | Select-Object -ExpandProperty 'Aliases' | Where-Object { $_.DefaultMetadata.Attributes -eq 'Modifiable' }
    
  • Azure CLI

    # Login first with az login if not using Cloud Shell
    
    # List namespaces
    az provider list --query [*].namespace
    
    # Get Azure Policy aliases for a specific Namespace (such as Azure Compute -- Microsoft.Compute)
    az provider show --namespace Microsoft.Compute --expand "resourceTypes/aliases" --query "resourceTypes[].aliases[].name"
    
  • REST API/ARMClient

    GET https://management.azure.com/providers/?api-version=2019-10-01&$expand=resourceTypes/aliases
    

Förstå aliaset [*]

Flera av de tillgängliga aliasen har en version som visas som ett "normalt" namn och ett annat som har [*] kopplats till det. Ett exempel:

  • Microsoft.Storage/storageAccounts/networkAcls.ipRules
  • Microsoft.Storage/storageAccounts/networkAcls.ipRules[*]

"Normal"-aliaset representerar fältet som ett enda värde. Det här fältet är för exakta matchningsjämförelsescenarier när hela uppsättningen med värden måste vara exakt så definierad, inte mer och inte mindre.

Aliaset [*] representerar en samling värden som valts från elementen i en matrisresursegenskap. Ett exempel:

Alias Valda värden
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*] Elementen i ipRules matrisen.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*].action Värdena för egenskapen action från varje element i ipRules matrisen.

När matrisalias används i ett fältvillkor gör det möjligt att jämföra varje enskilt matriselement med ett målvärde. När det används med count-uttryck är det möjligt att:

  • Kontrollera storleken på en matris
  • Kontrollera om alla\alla\nett av matriselementen uppfyller ett komplext villkor
  • Kontrollera om exakt n matriselement uppfyller ett komplext villkor

Mer information och exempel finns i Referera till matrisresursegenskaper.

Nästa steg