Structuur van Azure-beleidsdefinities

Azure Policy stelt conventies op voor resources. Beleidsdefinities beschrijven de nalevingsvoorwaarden van resources en het effect dat moet worden toegepast als aan een voorwaarde wordt voldaan. Een voorwaarde vergelijkt een resource-eigenschapsveld of een waarde met een vereiste waarde. Resourceeigenschapsvelden worden geopend met behulp van aliassen. Wanneer een resourceeigenschapsveld een matrix is, kan een speciale matrixalias worden gebruikt om waarden te selecteren uit alle matrixleden en een voorwaarde toe te passen op elk veld. Meer informatie over voorwaarden.

Door conventies te definiëren, kunt u de kosten beheren en uw resources eenvoudiger beheren. U kunt bijvoorbeeld opgeven dat alleen bepaalde typen virtuele machines zijn toegestaan. U kunt ook vereisen dat resources een bepaalde tag hebben. Beleidstoewijzingen worden overgenomen door onderliggende resources. Als een beleidstoewijzing wordt toegepast op een resourcegroep, is deze van toepassing op alle resources in die resourcegroep.

Het policyRule-schema voor beleidsdefinities vindt u hier: https://schema.management.azure.com/schemas/2020-10-01/policyDefinition.json

U gebruikt JSON om een beleidsdefinitie te maken. De beleidsdefinitie bevat elementen voor:

  • weergavenaam
  • beschrijving
  • mode
  • metagegevens
  • parameters
  • beleidsregel
    • logische evaluatie
    • effect

In de volgende JSON ziet u bijvoorbeeld een beleid waarmee wordt beperkt waar resources worden geïmplementeerd:

{
    "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 ingebouwde en patronen bevinden zich in Azure Policy voorbeelden.

Weergavenaam en beschrijving

U gebruikt displayName en beschrijving om de beleidsdefinitie te identificeren en context te bieden voor wanneer deze wordt gebruikt. displayName heeft een maximale lengte van 128 tekens en een beschrijving van maximaal 512 tekens.

Notitie

Tijdens het maken of bijwerken van een beleidsdefinitie, id, type en naam worden gedefinieerd door eigenschappen buiten de JSON en zijn ze niet nodig in het JSON-bestand. Het ophalen van de beleidsdefinitie via SDK retourneert de id, het type en de naameigenschappen als onderdeel van de JSON, maar elk zijn alleen-lezeninformatie met betrekking tot de beleidsdefinitie.

Type

Hoewel de typeeigenschap niet kan worden ingesteld, zijn er drie waarden die worden geretourneerd door de SDK en zichtbaar zijn in de portal:

  • Builtin: Deze beleidsdefinities worden geleverd en onderhouden door Microsoft.
  • Custom: Alle beleidsdefinities die door klanten zijn gemaakt, hebben deze waarde.
  • Static: Geeft een beleidsdefinitie voor naleving van regelgeving aan met Microsoft-eigendom. De nalevingsresultaten voor deze beleidsdefinities zijn de resultaten van controles van derden op de Microsoft-infrastructuur. In de Azure Portal wordt deze waarde soms weergegeven als Door Microsoft beheerd. Zie Gedeelde verantwoordelijkheid in de cloud voor meer informatie.

Modus

De modus wordt geconfigureerd, afhankelijk van of het beleid is gericht op een Azure Resource Manager-eigenschap of een resourceprovidereigenschap.

Resource Manager modi

De modus bepaalt welke resourcetypen worden geëvalueerd voor een beleidsdefinitie. De ondersteunde modi zijn:

  • all: resourcegroepen, abonnementen en alle resourcetypen evalueren
  • indexed: alleen resourcetypen evalueren die tags en locatie ondersteunen

Resource Microsoft.Network/routeTables ondersteunt bijvoorbeeld tags en locatie en wordt geëvalueerd in beide modi. De resource Microsoft.Network/routeTables/routes kan echter niet worden getagd en wordt niet geëvalueerd in Indexed de modus.

We raden u aan om in de meeste gevallen de modus in te all stellen op. Alle beleidsdefinities die via de portal zijn gemaakt, gebruiken de all modus. Als u PowerShell of Azure CLI gebruikt, kunt u de modusparameter handmatig opgeven. Als de beleidsdefinitie geen moduswaarde bevat, wordt deze standaard ingesteld all op Azure PowerShell en in null Azure CLI. Een null modus is hetzelfde als het gebruik ter ondersteuning van indexed achterwaartse compatibiliteit.

indexed moet worden gebruikt bij het maken van beleid waarmee tags of locaties worden afgedwongen. Hoewel dit niet vereist is, voorkomt u dat resources die geen ondersteuning bieden voor tags en locaties, worden weergegeven als niet-compatibel in de nalevingsresultaten. De uitzondering is resourcegroepen en abonnementen. Beleidsdefinities die locatie of tags afdwingen voor een resourcegroep of abonnement, moeten de modusall instellen op en specifiek gericht zijn op het Microsoft.Resources/subscriptions/resourceGroups of Microsoft.Resources/subscriptions type. Zie Voorbeeld: Tags - Voorbeeld 1 voor een voorbeeld. Zie Tagondersteuning voor Azure-resources voor een lijst met resources die tags ondersteunen.

Resourceprovidermodi

De volgende resourceprovidermodi worden volledig ondersteund:

De volgende resourceprovidermodus wordt momenteel ondersteund als preview:

  • Microsoft.ContainerService.Datavoor het beheren van toegangscontrollerregels op Azure Kubernetes Service. Definities die deze resourceprovidermodus gebruiken , moeten het effect EnforceRegoPolicy gebruiken. Deze modus is afgeschaft.

Notitie

Tenzij expliciet wordt vermeld, bieden resourceprovidermodi alleen ondersteuning voor ingebouwde beleidsdefinities en worden uitzonderingen niet ondersteund op onderdeelniveau.

Metagegevens

Met de optionele metadata eigenschap wordt informatie over de beleidsdefinitie opgeslagen. Klanten kunnen eigenschappen en waarden definiëren die nuttig zijn voor hun organisatie in metadata. Er zijn echter enkele algemene eigenschappen die worden gebruikt door Azure Policy en ingebouwde eigenschappen. Elke metadata eigenschap heeft een limiet van 1024 tekens.

Algemene eigenschappen van metagegevens

  • version (tekenreeks): Houdt details bij over de versie van de inhoud van een beleidsdefinitie.
  • category(tekenreeks): Bepaalt onder welke categorie in de Azure Portal de beleidsdefinitie wordt weergegeven.
  • preview (Booleaanse waarde): De vlag Waar of onwaar voor als de beleidsdefinitie preview is.
  • deprecated (Booleaanse waarde): Waar of onwaar voor als de beleidsdefinitie is gemarkeerd als afgeschaft.
  • portalReview (tekenreeks): bepaalt of parameters moeten worden gecontroleerd in de portal, ongeacht de vereiste invoer.

Notitie

De Azure Policy-service gebruiktversion, previewen deprecated eigenschappen om het wijzigingsniveau over te brengen naar een ingebouwde beleidsdefinitie of initiatief en status. De indeling version is: {Major}.{Minor}.{Patch}. Specifieke statussen, zoals afgeschaft of preview, worden toegevoegd aan de version eigenschap of in een andere eigenschap als een Booleaanse waarde. Zie Ingebouwde versiebeheer voor meer informatie over de manier waarop Azure Policy versies zijn ingebouwd. Zie Preview- en afgeschafte beleidsregels voor meer informatie over wat het betekent voor een beleid dat wordt afgeschaft of in de preview-versie.

Parameters

Parameters helpen uw beleidsbeheer te vereenvoudigen door het aantal beleidsdefinities te verminderen. Denk aan parameters zoals de velden in een formulier - name, address, city, . state Deze parameters blijven altijd hetzelfde, maar hun waarden veranderen op basis van het invullen van het formulier. Parameters werken op dezelfde manier bij het bouwen van beleid. Door parameters in een beleidsdefinitie op te slaan, kunt u dat beleid opnieuw gebruiken voor verschillende scenario's met behulp van verschillende waarden.

Notitie

Parameters kunnen worden toegevoegd aan een bestaande en toegewezen definitie. De nieuwe parameter moet de eigenschap defaultValue bevatten. Hiermee voorkomt u dat bestaande toewijzingen van het beleid of initiatief indirect ongeldig worden gemaakt.

Parametereigenschappen

Een parameter heeft de volgende eigenschappen die worden gebruikt in de beleidsdefinitie:

  • name: De naam van de parameter. Wordt gebruikt door de parameters implementatiefunctie binnen de beleidsregel. Zie voor meer informatie het gebruik van een parameterwaarde.
  • type: Bepaalt of de parameter een tekenreeks, matrix, object, booleaanse waarde, geheel getal, float of datum/tijd is.
  • metadata: Definieert subeigenheden die voornamelijk door de Azure Portal worden gebruikt om gebruiksvriendelijke informatie weer te geven:
    • description: De uitleg van waarvoor de parameter wordt gebruikt. Kan worden gebruikt om voorbeelden van acceptabele waarden te bieden.
    • displayName: De beschrijvende naam die wordt weergegeven in de portal voor de parameter.
    • strongType: (Optioneel) Wordt gebruikt bij het toewijzen van de beleidsdefinitie via de portal. Biedt een contextbewuste lijst. Zie strongType voor meer informatie.
    • assignPermissions: (Optioneel) Als waar instellen dat Azure Portal roltoewijzingen wilt maken tijdens beleidstoewijzing. Deze eigenschap is handig als u machtigingen wilt toewijzen buiten het toewijzingsbereik. Er is één roltoewijzing per roldefinitie in het beleid (of per roldefinitie in alle beleidsregels in het initiatief). De parameterwaarde moet een geldige resource of een geldig bereik zijn.
  • defaultValue: (Optioneel) Hiermee stelt u de waarde van de parameter in een toewijzing in als er geen waarde wordt gegeven. Vereist bij het bijwerken van een bestaande beleidsdefinitie die is toegewezen.
  • allowedValues: (Optioneel) Biedt een matrix met waarden die de parameter accepteert tijdens de toewijzing. Toegestane waardevergelijkingen zijn hoofdlettergevoelig.

U kunt bijvoorbeeld een beleidsdefinitie definiëren om de locaties te beperken waar resources kunnen worden geïmplementeerd. Een parameter voor die beleidsdefinitie kan worden toegestaanLocations. Deze parameter wordt gebruikt door elke toewijzing van de beleidsdefinitie om de geaccepteerde waarden te beperken. Het gebruik van strongType biedt een verbeterde ervaring bij het voltooien van de toewijzing via de portal:

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

Een parameterwaarde gebruiken

In de beleidsregel verwijst u naar parameters met de volgende parameters functiesyntaxis:

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

Dit voorbeeld verwijst naar de parameter allowedLocations die is gedemonstreerd in parametereigenschappen.

strongType

Binnen de metadata eigenschap kunt u strongType gebruiken om een lijst met opties met meerdere selecties in de Azure Portal te bieden. strongType kan een ondersteund resourcetype of een toegestane waarde zijn. Gebruik Get-AzResourceProvider om te bepalen of een resourcetype geldig is voor strongType. De indeling voor een resourcetypestrongType is<Resource Provider>/<Resource Type>. Bijvoorbeeld Microsoft.Network/virtualNetworks/subnets.

Sommige resourcetypen die niet worden geretourneerd door Get-AzResourceProvider , worden ondersteund. Deze typen zijn:

  • Microsoft.RecoveryServices/vaults/backupPolicies

De toegestane waarden voor het niet-resourcetype voor strongType zijn:

  • location
  • resourceTypes
  • storageSkus
  • vmSKUs
  • existingResourceGroups

Definitielocatie

Tijdens het maken van een initiatief of beleid moet u de definitielocatie opgeven. De definitielocatie moet een beheergroep of een abonnement zijn. Deze locatie bepaalt het bereik waaraan het initiatief of beleid kan worden toegewezen. Resources moeten directe leden van of onderliggende items binnen de hiërarchie van de definitielocatie zijn die moeten worden gericht op toewijzing.

Als de definitielocatie een:

  • Abonnement : alleen resources binnen dat abonnement kunnen worden toegewezen aan de beleidsdefinitie.
  • Beheergroep : alleen resources binnen onderliggende beheergroepen en onderliggende abonnementen kunnen worden toegewezen aan de beleidsdefinitie. Als u van plan bent om de beleidsdefinitie toe te passen op verschillende abonnementen, moet de locatie een beheergroep zijn die elk abonnement bevat.

Zie Bereik begrijpen in Azure Policy voor meer informatie.

Beleidsregel

De beleidsregel bestaat uit If - en Then-blokken . In het if-blok definieert u een of meer voorwaarden die aangeven wanneer het beleid wordt afgedwongen. U kunt logische operators toepassen op deze voorwaarden om het scenario voor een beleid nauwkeurig te definiëren.

In het blok Vervolgens definieert u het effect dat zich voordoet wanneer aan de Voorwaarden Als wordt voldaan.

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

Logische operators

Ondersteunde logische operators zijn:

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

De niet-syntaxis keert het resultaat van de voorwaarde om. Voor de allOf-syntaxis (vergelijkbaar met de logische bewerking) moeten alle voorwaarden waar zijn. Voor de anyOf-syntaxis (vergelijkbaar met de logische bewerking) moeten een of meer voorwaarden waar zijn.

U kunt logische operators nesten. In het volgende voorbeeld ziet u een not-bewerking die is genest binnen een allOf-bewerking .

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

Voorwaarden

Een voorwaarde evalueert of een waarde voldoet aan bepaalde criteria. De ondersteunde voorwaarden zijn:

  • "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"

Voor minder, lessOrEquals, greater en greaterOrEquals, als het eigenschapstype niet overeenkomt met het voorwaardetype, wordt er een fout gegenereerd. Tekenreeksvergelijkingen worden gemaakt met behulp van InvariantCultureIgnoreCase.

Wanneer u de voorwaarden like en notLike gebruikt, geeft u een jokerteken * op in de waarde. De waarde mag niet meer dan één jokerteken *bevatten.

Wanneer u de voorwaarden overeenkomst en notMatch gebruikt, geeft u # op dat een cijfer, ? voor een letter, . aan een willekeurig teken en een ander teken dat overeenkomt met dat werkelijke teken. Hoewel overeenkomst en notMatch hoofdlettergevoelig zijn, zijn alle andere voorwaarden die een stringValue evalueren niet hoofdlettergevoelig. Hoofdlettergevoelige alternatieven zijn beschikbaar in matchInsensitive ennotMatchInsensitively.

Velden

Voorwaarden die evalueren of de waarden van eigenschappen in de nettolading van de resourceaanvraag voldoen aan bepaalde criteria, kunnen worden gevormd met behulp van een veldexpressie . De volgende velden worden ondersteund:

  • name
  • fullName
    • Retourneert de volledige naam van de resource. De volledige naam van een resource is de resourcenaam die wordt voorafgegaan door bovenliggende resourcenamen (bijvoorbeeld 'myServer/myDatabase').
  • kind
  • type
  • location
    • Locatievelden worden genormaliseerd om verschillende indelingen te ondersteunen. Wordt bijvoorbeeld East US 2 beschouwd als gelijk aan eastus2.
    • Gebruik globaal voor resources die locatieneutraal zijn.
  • id
    • Retourneert de resource-id van de resource die wordt geëvalueerd.
    • Voorbeeld: /subscriptions/06be863d-0996-4d56-be22-384767287aa2/resourceGroups/myRG/providers/Microsoft.KeyVault/vaults/myVault
  • identity.type
  • tags
  • tags['<tagName>']
    • Deze syntaxis van haak ondersteunt tagnamen die leestekens hebben, zoals een afbreekstreepje, punt of spatie.
    • Waar <tagName> de naam is van de tag om de voorwaarde te valideren.
    • Voorbeelden: tags['Acct.CostCenter'] waarbij Acct.CostCenter de naam van de tag is.
  • tags['''<tagName>''']
    • Deze syntaxis van haakjes ondersteunt tagnamen die er apostrofs in hebben door te ontsnappen met dubbele apostrophes.
    • Waar '<tagName>' de naam is van de tag om de voorwaarde te valideren.
    • Voorbeeld: tags['''My.Apostrophe.Tag'''] waarbij 'My.Apostrophe.Tag' de naam van de tag is.
  • eigenschapsaliassen: zie Aliassen voor een lijst.

Notitie

tags.<tagName>, tags[tagName]en tags[tag.with.dots] zijn nog steeds acceptabele manieren om een tagsveld te declareren. De voorkeursexpressies zijn echter de expressies die hierboven worden vermeld.

Notitie

In veldexpressies die verwijzen naar de alias [*] wordt elk element in de matrix afzonderlijk geëvalueerd met logische en tussen elementen. Zie De eigenschappen van matrixresources raadplegen voor meer informatie.

Tags gebruiken met parameters

Een parameterwaarde kan worden doorgegeven aan een tagveld. Het doorgeven van een parameter aan een tagveld verhoogt de flexibiliteit van de beleidsdefinitie tijdens de beleidstoewijzing.

In het volgende voorbeeld concat wordt gebruikt om een tagsveldzoekactie te maken voor de tag met de naam van de parameter tagName . Als deze tag niet bestaat, wordt het wijzigingseffect gebruikt om de tag toe te voegen met behulp van de waarde van dezelfde benoemde tag die is ingesteld op de bovenliggende resourcegroep voor gecontroleerde resources met behulp van de resourcegroup() opzoekfunctie.

{
    "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"
            ]
        }
    }
}

Waarde

Voorwaarden die evalueren of een waarde aan bepaalde criteria voldoet, kunnen worden gevormd met behulp van een waardeexpressie . Waarden kunnen letterlijke waarden, de waarden van parameters of de geretourneerde waarden van ondersteunde sjabloonfuncties zijn.

Waarschuwing

Als het resultaat van een sjabloonfunctie een fout is, mislukt de beleidsevaluatie. Een mislukte evaluatie is een impliciete weigering. Zie sjabloonfouten vermijden voor meer informatie. Gebruik enforcementMode van DoNotEnforce om de impact van een mislukte evaluatie op nieuwe of bijgewerkte resources te voorkomen tijdens het testen en valideren van een nieuwe beleidsdefinitie.

Waardevoorbeelden

In dit voorbeeld van een beleidsregel wordt waarde gebruikt om het resultaat van de resourceGroup() functie en de geretourneerde naameigenschap te vergelijken met een achtige voorwaarde van *netrg. De regel weigert een resource van het type in een resourcegroep waarvan de Microsoft.Network/* naam eindigt op .*netrg

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

In dit voorbeeld van een beleidsregel wordt waarde gebruikt om te controleren of het resultaat van meerdere geneste functies gelijk istrue aan. Met de regel wordt een resource geweigerd die niet ten minste drie tags heeft.

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

Sjabloonfouten voorkomen

Door het gebruik van sjabloonfuncties in waarde kunnen veel complexe geneste functies worden gebruikt. Als het resultaat van een sjabloonfunctie een fout is, mislukt de beleidsevaluatie. Een mislukte evaluatie is een impliciete weigering. Een voorbeeld van een waarde die mislukt in bepaalde scenario's:

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

In de bovenstaande voorbeeldbeleidsregel wordt gebruikgemaakt van subtekenreeks() om de eerste drie tekens van de naam te vergelijken met abc. Als de naam korter is dan drie tekens, resulteert de substring() functie in een fout. Deze fout zorgt ervoor dat het beleid een weigeringseffect wordt.

Gebruik in plaats daarvan de functie if() om te controleren of de eerste drie tekens van de naam gelijk aan abc zijn zonder dat een naam korter is dan drie tekens een fout veroorzaakt:

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

Met de herziene beleidsregel if() controleert u de lengte van de naam voordat u een substring() waarde met minder dan drie tekens probeert op te halen. Als de naam te kort is, wordt in plaats daarvan de waarde 'niet beginnend met abc' geretourneerd en vergeleken met abc. Een resource met een korte naam die niet begint met abc mislukt nog steeds de beleidsregel, maar veroorzaakt geen fout meer tijdens de evaluatie.

Count

Voorwaarden waarmee wordt geteld hoeveel leden van een matrix aan bepaalde criteria voldoen, kunnen worden gevormd met behulp van een tellingsexpressie. Veelvoorkomende scenario's controleren of 'ten minste één van', 'exact één van', 'alle' of 'geen van' de matrixleden aan een voorwaarde voldoen. Count evalueert elk matrixlid voor een voorwaardeexpressie en telt de werkelijke resultaten op, die vervolgens wordt vergeleken met de expressieoperator.

Aantal velden

Tellen hoeveel leden van een matrix in de nettolading van de aanvraag voldoen aan een voorwaardeexpressie. De structuur van expressies voor het aantal velden is:

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

De volgende eigenschappen worden gebruikt met het aantal velden:

  • count.field (vereist): bevat het pad naar de matrix en moet een matrixalias zijn.
  • count.where (optioneel): de voorwaardeexpressie die afzonderlijk moet worden geëvalueerd voor elk lid van de aliasmatrix van count.field. Als deze eigenschap niet is opgegeven, worden alle matrixleden met het pad van 'veld' geëvalueerd op waar. Elke voorwaarde kan in deze eigenschap worden gebruikt. Logische operators kunnen in deze eigenschap worden gebruikt om complexe evaluatievereisten te maken.
  • <voorwaarde> (vereist): De waarde wordt vergeleken met het aantal items dat voldoet aan het aantal.where-voorwaardeexpressie . Er moet een numerieke voorwaarde worden gebruikt.

Zie Voor meer informatie over het werken met matrixeigenschappen in Azure Policy, inclusief gedetailleerde uitleg over hoe de expressie voor het aantal velden wordt geëvalueerd, verwijzen naar de eigenschappen van matrixresources.

Aantal waarden

Tellen hoeveel leden van een matrix voldoen aan een voorwaarde. De matrix kan een letterlijke matrix of een verwijzing naar de matrixparameter zijn. De structuur van expressies voor het tellen van waarden is:

{
    "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>"
}

De volgende eigenschappen worden gebruikt met het aantal waarden:

  • count.value (vereist): de matrix die moet worden geëvalueerd.
  • count.name (vereist): de indexnaam, samengesteld uit Engelse letters en cijfers. Definieert een naam voor de waarde van het matrixlid dat wordt geëvalueerd in de huidige iteratie. De naam wordt gebruikt voor het verwijzen naar de huidige waarde in de count.where voorwaarde. Optioneel wanneer de count-expressie zich niet in een onderliggend item van een andere count-expressie bevindt. Wanneer deze niet is opgegeven, wordt de indexnaam impliciet ingesteld op "default".
  • count.where (optioneel): de voorwaardeexpressie die afzonderlijk moet worden geëvalueerd voor elk matrixlid van count.value. Als deze eigenschap niet is opgegeven, worden alle matrixleden geëvalueerd op waar. Elke voorwaarde kan in deze eigenschap worden gebruikt. Logische operators kunnen in deze eigenschap worden gebruikt om complexe evaluatievereisten te maken. De waarde van het momenteel geïnventareerde matrixlid kan worden geopend door de huidige functie aan te roepen.
  • <voorwaarde> (vereist): De waarde wordt vergeleken met het aantal items dat voldoet aan de count.where voorwaarde-expressie. Er moet een numerieke voorwaarde worden gebruikt.

De huidige functie

De current() functie is alleen beschikbaar in de count.where voorwaarde. Hiermee wordt de waarde geretourneerd van het matrixlid dat momenteel is geïnventariseerd door de evaluatie van de tellingsexpressie.

Gebruik van het aantal waarden

  • current(<index name defined in count.name>). Bijvoorbeeld: current('arrayMember').
  • current(). Alleen toegestaan wanneer de expressie voor het tellen van waarden geen onderliggend element is van een andere tellingsexpressie . Retourneert dezelfde waarde als hierboven.

Als de waarde die door de aanroep wordt geretourneerd een object is, worden eigenschapstoegangsors ondersteund. Bijvoorbeeld: current('objectArrayMember').property.

Gebruik van het aantal velden

  • current(<the array alias defined in count.field>). Bijvoorbeeld current('Microsoft.Test/resource/enumeratedArray[*]').
  • current(). Alleen toegestaan wanneer de expressie voor het aantal velden geen onderliggend element is van een andere tellingsexpressie . Retourneert dezelfde waarde als hierboven.
  • current(<alias of a property of the array member>). Bijvoorbeeld current('Microsoft.Test/resource/enumeratedArray[*].property').

Voorbeelden van het aantal velden

Voorbeeld 1: Controleren of een matrix leeg is

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

Voorbeeld 2: Controleer of slechts één matrixlid voldoet aan de voorwaardeexpressie

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

Voorbeeld 3: Controleren of ten minste één matrixlid voldoet aan de voorwaardeexpressie

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

Voorbeeld 4: Controleer of alle objectmatrixleden voldoen aan de voorwaardeexpressie

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

Voorbeeld 5: Controleer of ten minste één matrixlid overeenkomt met meerdere eigenschappen in de voorwaardeexpressie

{
    "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
}

Voorbeeld 6: Gebruik current() de functie in de where voorwaarden voor toegang tot de waarde van het momenteel geïnventareerde matrixlid in een sjabloonfunctie. Met deze voorwaarde wordt gecontroleerd of een virtueel netwerk een adresvoorvoegsel bevat dat zich niet onder het CIDR-bereik 10.0.0.0/24 bevindt.

{
    "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
}

Voorbeeld 7: Gebruik field() de functie in de where voorwaarden voor toegang tot de waarde van het momenteel geïnventareerde matrixlid. Met deze voorwaarde wordt gecontroleerd of een virtueel netwerk een adresvoorvoegsel bevat dat zich niet onder het CIDR-bereik 10.0.0.0/24 bevindt.

{
    "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
}

Voorbeelden van het aantal waarden

Voorbeeld 1: Controleer of de resourcenaam overeenkomt met een van de opgegeven naampatronen.

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

Voorbeeld 2: Controleer of de resourcenaam overeenkomt met een van de opgegeven naampatronen. De current() functie geeft geen indexnaam op. Het resultaat is hetzelfde als in het vorige voorbeeld.

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

Voorbeeld 3: Controleer of de resourcenaam overeenkomt met een van de opgegeven naampatronen van een matrixparameter.

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

Voorbeeld 4: Controleer of een van de adresvoorvoegsels van het virtuele netwerk zich niet onder de lijst met goedgekeurde voorvoegsels bevindt.

{
    "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
}

Voorbeeld 5: Controleer of alle gereserveerde NSG-regels zijn gedefinieerd in een NSG. De eigenschappen van de gereserveerde NSG-regels worden gedefinieerd in een matrixparameter met objecten.

Parameterwaarde:

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

Beleid:

{
    "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'))]"
}

Effect

Azure Policy ondersteunt de volgende typen effecten:

  • Toevoegen: voegt de gedefinieerde set velden toe aan de aanvraag
  • Controle: genereert een waarschuwingsgebeurtenis in het activiteitenlogboek, maar mislukt de aanvraag niet
  • AuditIfNotExists: genereert een waarschuwingsgebeurtenis in het activiteitenlogboek als er geen gerelateerde resource bestaat
  • Weigeren: genereert een gebeurtenis in het activiteitenlogboek en mislukt de aanvraag
  • DeployIfNotExists: implementeert een gerelateerde resource als deze nog niet bestaat
  • Uitgeschakeld: evalueert geen resources voor naleving van de beleidsregel
  • Wijzigen: de gedefinieerde tags toevoegen, bijwerken of verwijderen uit een resource of abonnement
  • EnforceOPAConstraint (afgeschaft): configureert de toegangscontroller Open Policy Agent met Gatekeeper v3 voor zelfbeheerde Kubernetes-clusters in Azure
  • EnforceRegoPolicy (afgeschaft): configureert de toegangscontroller Open Policy Agent met Gatekeeper v2 in Azure Kubernetes Service

Zie Understanding Azure Policy Effects voor meer informatie over elk effect, de volgorde van evaluatie, eigenschappen en voorbeelden.

Beleidsfuncties

Functies kunnen worden gebruikt om aanvullende logica in een beleidsregel te introduceren. Ze worden opgelost binnen de beleidsregel van een beleidsdefinitie en binnen parameterwaarden die zijn toegewezen aan beleidsdefinities in een initiatief.

Alle Resource Manager sjabloonfuncties zijn beschikbaar voor gebruik binnen een beleidsregel, met uitzondering van de volgende functies en door de gebruiker gedefinieerde functies:

  • copyIndex()
  • dateTimeAdd()
  • deployment()
  • environment()
  • extensionResourceId()
  • listAccountSas()
  • listKeys()
  • listSecrets()
  • lijst*
  • managementGroup()
  • newGuid()
  • pickZones()
  • providers()
  • reference()
  • resourceId()
  • subscriptionResourceId()
  • tenantResourceId()
  • tenant()
  • utcNow(format)
  • variabelen()

Notitie

Deze functies zijn nog steeds beschikbaar in het details.deployment.properties.template gedeelte van de sjabloonimplementatie in een deployIfNotExists-beleidsdefinitie .

De volgende functie is beschikbaar voor gebruik in een beleidsregel, maar verschilt van het gebruik in een Azure Resource Manager-sjabloon (ARM-sjabloon):

  • utcNow() - In tegenstelling tot een ARM-sjabloon kan deze eigenschap buiten defaultValue worden gebruikt.
    • Retourneert een tekenreeks die is ingesteld op de huidige datum en tijd in universele ISO 8601 DateTime-indeling yyyy-MM-ddTHH:mm:ss.fffffffZ.

De volgende functies zijn alleen beschikbaar in beleidsregels:

  • addDays(dateTime, numberOfDaysToAdd)

    • dateTime: [Vereist] tekenreeks - Tekenreeks in de Universal ISO 8601 DateTime-notatie 'jjjj-MM-ddTHH:mm:ss. FFFFFFFZ'
    • numberOfDaysToAdd: [Vereist] geheel getal - Aantal dagen dat moet worden toegevoegd
  • field(fieldName)

    • fieldName: [Vereist] tekenreeks - Naam van het veld dat moet worden opgehaald
    • Retourneert de waarde van dat veld van de resource die wordt geëvalueerd door de if-voorwaarde.
    • field wordt voornamelijk gebruikt met AuditIfNotExists en DeployIfNotExists om te verwijzen naar velden in de resource die worden geëvalueerd. Een voorbeeld van dit gebruik is te zien in het voorbeeld DeployIfNotExists.
  • requestContext().apiVersion

    • Retourneert de API-versie van de aanvraag die beleidsevaluatie heeft geactiveerd (bijvoorbeeld: 2021-09-01). Deze waarde is de API-versie die is gebruikt in de PUT/PATCH-aanvraag voor evaluaties van het maken/bijwerken van resources. De nieuwste API-versie wordt altijd gebruikt tijdens de evaluatie van naleving op bestaande resources.
  • policy()

    • Retourneert de volgende informatie over het beleid dat wordt geëvalueerd. Eigenschappen kunnen worden geopend vanuit het geretourneerde object (bijvoorbeeld: [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)

    • bereik: [Vereist] tekenreeks - Tekenreeks die een bereik van IP-adressen opgeeft om te controleren of de targetRange zich binnen bevindt.
    • targetRange: [Vereist]: tekenreeks die een bereik van IP-adressen opgeeft dat moet worden gevalideerd zoals opgenomen in het bereik.
    • Retourneert een Booleaanse waarde voor het bereik van het IP-adresbereik dat het IP-adresbereik targetRange bevat. Lege bereiken of het combineren tussen IP-families is niet toegestaan en resulteert in een evaluatiefout.

    Ondersteunde indelingen:

    • Eén IP-adres (voorbeelden: 10.0.0.0, 2001:0DB8::3:FFFE)
    • CIDR-bereik (voorbeelden: 10.0.0.0/24, 2001:0DB8::/110)
    • Bereik gedefinieerd door begin- en eind-IP-adressen (voorbeelden: 192.168.0.1-192.168.0.9, 2001:0DB8::-2001:0DB8::3:FFFF)
  • current(indexName)

Voorbeeld van beleidsfunctie

In dit voorbeeld van een beleidsregel wordt de resourceGroup resourcefunctie gebruikt om de naameigenschap op te halen, gecombineerd met de concat matrix- en objectfunctie om een like voorwaarde te maken waarmee de resourcenaam wordt afgedwongen om te beginnen met de naam van de resourcegroep.

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

Limieten voor beleidsregels

Limieten die worden afgedwongen tijdens het ontwerpen

Limieten voor de structuur van beleidsregels worden afgedwongen tijdens het ontwerpen of toewijzen van een beleid. Pogingen om beleidsdefinities te maken of toe te wijzen die deze limieten overschrijden, mislukken.

Limiet Waarde Aanvullende details
Voorwaarde-expressies in de if-voorwaarde 4096
Voorwaarde-expressies in het ene blok 128 Van toepassing op de existenceCondition van het beleid AuditIfNotExists en DeployIfNotExists
Beleidsfuncties per beleidsregel 2048
Het aantal parameters van de beleidsfunctie 128 Voorbeeld: [function('parameter1', 'parameter2', ...)]
Diepte van geneste beleidsfuncties 64 Voorbeeld: [function(nested1(nested2(...)))]
Tekenreekslengte van beleidsfuncties 81920 Voorbeeld: de lengte van "[function(....)]"
Expressies voor het aantal velden per matrix 5
Expressies voor het aantal waarden per beleidsregel 10
Aantal iteraties voor waardeaantal expressies 100 Voor geneste waardetellingexpressies omvat dit ook het iteratieaantal van de bovenliggende expressie

Limieten die tijdens de evaluatie worden afgedwongen

Limieten voor de grootte van objecten die tijdens de beleidsevaluatie worden verwerkt door beleidsfuncties. Deze limieten kunnen niet altijd worden afgedwongen tijdens het ontwerpen, omdat ze afhankelijk zijn van de geëvalueerde inhoud. Bijvoorbeeld:

{
    "field": "name",
    "equals": "[concat(field('stringPropertyA'), field('stringPropertyB'))]"
}

De lengte van de tekenreeks die door de concat() functie is gemaakt, is afhankelijk van de waarde van eigenschappen in de geëvalueerde resource.

Limiet Waarde Voorbeeld
Lengte van tekenreeks die wordt geretourneerd door een functie 131072 [concat(field('longString1'), field('longString2'))]
Diepte van complexe objecten die zijn opgegeven als parameter aan of geretourneerd door een functie 128 [union(field('largeObject1'), field('largeObject2'))]
Aantal knooppunten van complexe objecten die zijn opgegeven als parameter aan of geretourneerd door een functie 32768 [concat(field('largeArray1'), field('largeArray2'))]

Waarschuwing

Beleid dat de bovenstaande limieten tijdens de evaluatie overschrijdt, wordt effectief een beleid voor weigeren en kan binnenkomende aanvragen blokkeren. Wanneer u beleidsregels schrijft met complexe functies, moet u rekening houden met deze limieten en uw beleid testen op resources die de mogelijkheden hebben om deze te overschrijden.

Aliassen

U gebruikt eigenschapsaliassen voor toegang tot specifieke eigenschappen voor een resourcetype. Met aliassen kunt u beperken welke waarden of voorwaarden zijn toegestaan voor een eigenschap in een resource. Elke alias wordt toegewezen aan paden in verschillende API-versies voor een bepaald resourcetype. Tijdens de beleidsevaluatie haalt de beleidsengine het eigenschapspad voor die API-versie op.

De lijst met aliassen groeit altijd. Gebruik een van de volgende methoden om te vinden welke aliassen momenteel worden ondersteund door Azure Policy:

  • Azure Policy-extensie voor Visual Studio Code (aanbevolen)

    Gebruik de Azure Policy-extensie voor Visual Studio Code om aliassen voor resource-eigenschappen weer te geven en te detecteren.

    Screenshot of the Azure Policy extension for Visual Studio Code hovering a property to display the alias names.

  • 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
    

    Notitie

    Als u aliassen wilt zoeken die met het wijzigingseffect kunnen worden gebruikt, gebruikt u de volgende opdracht in Azure PowerShell 4.6.0 of hoger:

    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
    

Informatie over de alias [*]

Verschillende aliassen die beschikbaar zijn, hebben een versie die wordt weergegeven als een 'normale' naam en een andere die [*] eraan is gekoppeld. Bijvoorbeeld:

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

De alias 'normaal' vertegenwoordigt het veld als één waarde. Dit veld is bedoeld voor exacte vergelijkingsscenario's voor overeenkomsten wanneer de volledige set waarden precies zoals gedefinieerd moet zijn, niet meer en niet minder.

De alias [*] vertegenwoordigt een verzameling waarden die zijn geselecteerd uit de elementen van een matrixresource-eigenschap. Bijvoorbeeld:

Alias Geselecteerde waarden
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*] De elementen van de ipRules matrix.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*].action De waarden van de action eigenschap van elk element van de ipRules matrix.

Bij gebruik in een veldvoorwaarde maken matrixaliassen het mogelijk om elk afzonderlijk matrixelement te vergelijken met een doelwaarde. Wanneer u met de expressie count gebruikt, kunt u het volgende doen:

  • De grootte van een matrix controleren
  • Controleer of alle\\neen van de matrixelementen aan een complexe voorwaarde voldoen
  • Controleer of exact n matrixelementen voldoen aan een complexe voorwaarde

Zie Verwijzen naar eigenschappen van matrixresources voor meer informatie en voorbeelden.

Volgende stappen