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 evaluerenindexed
: 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:
Microsoft.Kubernetes.Data
voor het beheren van uw Kubernetes-clusters in of uit Azure. Definities die deze resourceprovidermodus gebruiken, gebruiken effectencontrole, weigeren en uitgeschakeld. Deze modus ondersteunt aangepaste definities als openbare preview. Zie Beleidsdefinitie maken op basis van een beperkingssjabloon om een aangepaste definitie te maken op basis van een bestaande OPA-beperkingssjabloon (Open Policy Agent) GateKeeper v3. Het gebruik van het effect EnforceOPAConstraint is afgeschaft.Microsoft.KeyVault.Data
voor het beheren van kluizen en certificaten in Azure Key Vault. Zie Azure Key Vault integreren met Azure Policy voor meer informatie over deze beleidsdefinities.
De volgende resourceprovidermodus wordt momenteel ondersteund als preview:
Microsoft.ContainerService.Data
voor 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
, preview
en 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 deparameters
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 aaneastus2
. - Gebruik globaal voor resources die locatieneutraal zijn.
- Locatievelden worden genormaliseerd om verschillende indelingen te ondersteunen. Wordt bijvoorbeeld
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
- Retourneert het type beheerde identiteit dat is ingeschakeld voor de resource.
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>)
. Bijvoorbeeldcurrent('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>)
. Bijvoorbeeldcurrent('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
.
- Retourneert een tekenreeks die is ingesteld op de huidige datum en tijd in universele ISO 8601 DateTime-indeling
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.
- Retourneert de API-versie van de aanvraag die beleidsevaluatie heeft geactiveerd (bijvoorbeeld:
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)
- Speciale functie die alleen kan worden gebruikt in count-expressies.
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.
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
- Zie de structuur van de initiatiefdefinitie
- Bekijk voorbeelden op Azure Policy voorbeelden.
- Lees Informatie over de effecten van het beleid.
- Informatie over het programmatisch maken van beleidsregels.
- Meer informatie over het ophalen van nalevingsgegevens.
- Ontdek hoe u niet-compatibele resources kunt herstellen.
- Bekijk wat een beheergroep is met Uw resources organiseren met Azure-beheergroepen.