Struktura definic Azure Policy

Azure Policy stanoví konvence pro prostředky. Definice zásad popisují podmínky dodržování předpisů prostředků a efekt, který se má provést, pokud je splněna podmínka. Podmínka porovnává pole vlastností prostředku nebo hodnotu s požadovanou hodnotou. K polím vlastností prostředku se dostanete pomocí aliasů. Pokud je pole vlastnosti prostředku pole, lze použít speciální alias pole , který umožňuje vybrat hodnoty ze všech členů pole a použít podmínku na každou z nich. Přečtěte si další informace o podmínkách.

Definováním konvencí můžete řídit náklady a snadněji spravovat prostředky. Můžete například určit, že jsou povoleny pouze určité typy virtuálních počítačů. Nebo můžete vyžadovat, aby prostředky měly konkrétní značku. Přiřazení zásad se dědí prostřednictvím podřízených prostředků. Pokud se pro skupinu prostředků použije přiřazení zásady, vztahuje se na všechny prostředky v této skupině prostředků.

PolicyRule schéma definice zásad najdete tady:https://schema.management.azure.com/schemas/2020-10-01/policyDefinition.json

K vytvoření definice zásady použijete JSON. Definice zásad obsahuje prvky pro:

  • zobrazované jméno
  • description
  • režim
  • zprostředkovatele identity
  • parameters
  • pravidlo zásad
    • logické vyhodnocení
    • Účinek

Například následující JSON zobrazuje zásadu, která omezuje, kde jsou prostředky nasazeny:

{
    "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 předdefinované a vzory jsou v Azure Policy Samples.

Zobrazované jméno a popis

K identifikaci definice zásad a zadání kontextu, kdy se má použít, můžete použít DisplayName a Description . hodnota DisplayName má maximální délku 128 znaků a popis nesmí být delší než 512 znaků.

Poznámka

Během vytváření nebo aktualizace definice zásady, ID, typu a název jsou definovány vlastnostmi, které jsou externí pro JSON a nejsou nezbytné v souboru JSON. Načtení definice zásady prostřednictvím sady SDK vrátí vlastnosti ID, typu a názvu jako součást formátu JSON, ale každá z nich je informace jen pro čtení, které se týkají definice zásady.

Typ

I když nelze nastavit vlastnost typu , existují tři hodnoty, které jsou vráceny sadou SDK a viditelné na portálu:

  • Builtin: Tyto definice zásad poskytuje a udržuje společnost Microsoft.
  • Custom: Tato hodnota obsahuje všechny definice zásad vytvořené zákazníky.
  • Static: Označuje definici zásady dodržování předpisů pro zákonné vlastnictví s vlastnictvím Microsoftu. Výsledky dodržování předpisů pro tyto definice zásad jsou výsledky auditů třetích stran v infrastruktuře Microsoftu. V Azure Portal se tato hodnota někdy zobrazuje jako spravovaná Microsoftem. Další informace najdete v tématu sdílená odpovědnost v cloudu.

Režim

Režim je nakonfigurován v závislosti na tom, zda je zásada cílena na vlastnost Azure Resource Manager nebo vlastnost poskytovatele prostředků.

Správce prostředků režimy

Režim určuje, které typy prostředků se vyhodnotí pro definici zásady. Podporované režimy:

  • all: vyhodnotit skupiny prostředků, předplatná a všechny typy prostředků
  • indexed: vyhodnotit jenom typy prostředků, které podporují značky a umístění.

Například prostředek Microsoft.Network/routeTables podporuje značky a umístění a je vyhodnocován v obou režimech. Prostředek ale Microsoft.Network/routeTables/routes nemůže být tagovaný a není vyhodnocený v Indexed režimu.

Ve většině případů doporučujeme nastavit režim na all . Všechny definice zásad vytvořené prostřednictvím portálu používají all režim. Pokud používáte PowerShell nebo Azure CLI, můžete zadat parametr Mode ručně. pokud definice zásady neobsahuje hodnotu režimu , použije se výchozí hodnota all v Azure PowerShell a v rozhraní příkazového null řádku Azure CLI. nullRežim je stejný jako při použití indexed k podpoře zpětné kompatibility.

indexed by měla být použita při vytváření zásad, které vysazují značky nebo umístění. I když to není nutné, zabrání prostředkům, které nepodporují značky a umístění, z hlediska výsledků dodržování předpisů v nedodržení předpisů. Výjimkou jsou skupiny prostředků a předplatná. Definice zásad, které vynutily umístění nebo značky v rámci skupiny prostředků nebo předplatného, by měly nastavit režim na all a konkrétně cílit na Microsoft.Resources/subscriptions/resourceGroups Microsoft.Resources/subscriptions typ nebo. Příklad naleznete v tématu Pattern: Tags-Sample #1. Seznam prostředků, které podporují značky, najdete v tématu Podpora značek pro prostředky Azure.

Režimy poskytovatele prostředků

Následující režim poskytovatele prostředků je plně podporovaný:

  • Microsoft.Kubernetes.Data pro správu clusterů Kubernetes v systému Azure nebo mimo něj. Definice používající tento režim poskytovatele prostředků používají účinky audit, Deny a disabled. Tento režim podporuje vlastní definice ve verzi Public Preview. Pokud chcete vytvořit vlastní definici z existující šablony omezení Open Policy agent (neprů) gatekeeper v3, přečtěte si téma Vytvoření definice zásad ze šablony omezení . Použití efektu EnforceOPAConstraint je zastaralé.

V současné době jsou podporovány následující režimy poskytovatele prostředků ve verzi Preview:

Poznámka

Režimy poskytovatele prostředků podporují jenom integrované definice zásad a nepodporují výjimky , pokud nejsou výslovně uvedené.

Metadata

Volitelná metadata vlastnost ukládá informace o definici zásady. Zákazníci mohou definovat libovolné vlastnosti a hodnoty, které jsou užitečné pro jejich organizaci v metadata . Existují však některé běžné vlastnosti, které používá Azure Policy a v integrovaných modulech. Každá metadata vlastnost má limit 1024 znaků.

Vlastnosti běžných metadat

  • version (String): sleduje podrobnosti o verzi obsahu definice zásady.
  • category (String): Určuje, pod kterou kategorií v Azure Portal se má definice zásady zobrazit.
  • preview (Boolean): příznak True nebo false pro, pokud je definice zásady ve verzi Preview.
  • deprecated (Boolean): příznak True nebo false pro, pokud byla definice zásad označena jako zastaralá.
  • portalReview (String): Určuje, zda mají být parametry na portálu přezkoumány bez ohledu na požadované zadání.

Poznámka

Služba Azure Policy používá version vlastnosti, preview a deprecated k vyjádření úrovně změny předdefinované definice nebo iniciativy a stavu zásad. Formát version je: {Major}.{Minor}.{Patch} . Konkrétní stavy, například zastaralé nebo ve verzi Preview, jsou připojeny k version vlastnosti nebo v jiné vlastnosti jako logická hodnota. Další informace o způsobu, jakým jsou předdefinované verze Azure Policy, najdete v tématu Vestavěná správa verzí.

Parametry

Parametry vám pomůžou zjednodušit správu zásad tím, že se sníží počet definic zásad. Představte si parametry jako pole ve formuláři – name , address , city , state . Tyto parametry vždy zůstávají stejné, ale jejich hodnoty se změní na základě jednotlivých vyplňování formuláře. Parametry fungují stejným způsobem při vytváření zásad. Zahrnutím parametrů do definice zásady můžete tuto zásadu použít pro různé scénáře pomocí různých hodnot.

Poznámka

Parametry mohou být přidány do existující a přiřazené definice. Nový parametr musí zahrnovat vlastnost DefaultValue . To brání tomu, aby se stávající přiřazení zásady nebo iniciativy od nepřímo neplatně vytvořila.

Vlastnosti parametru

Parametr má následující vlastnosti, které se používají v definici zásady:

  • name: Název vašeho parametru. Používá se funkcí parameters nasazení v rámci pravidla zásad. Další informace najdete v tématu o použití hodnoty parametru.
  • type: Určuje, jestli je parametr řetězec , pole, objekt, logická hodnota , celé číslo, float nebo datetime.
  • metadata: Definuje podvlastnosti primárně používané Azure Portal k zobrazení uživatelsky přívětivých informací:
    • description: Vysvětlení, k čemu se parametr používá. Lze použít k poskytnutí příkladů přijatelných hodnot.
    • displayName: Popisný název parametru zobrazený na portálu.
    • strongType: (Volitelné) Používá se při přiřazování definice zásady prostřednictvím portálu. Poskytuje seznam s kontextem. Další informace najdete v tématu strongType.
    • assignPermissions: (Volitelné) Nastavte na true, pokud Azure Portal přiřazení rolí během přiřazení zásad. Tato vlastnost je užitečná v případě, že chcete přiřadit oprávnění mimo rozsah přiřazení. V zásadách je jedno přiřazení role pro každou definici role (nebo pro definici role ve všech zásadách v iniciativě). Hodnota parametru musí být platným zdrojem nebo oborem.
  • defaultValue: (Volitelné) Nastaví hodnotu parametru v přiřazení, pokud není zadána žádná hodnota. Vyžaduje se při aktualizaci existující přiřazené definice zásady.
  • allowedValues: (Volitelné) Poskytuje pole hodnot, které parametr přijímá během přiřazení. Při porovnávání povolených hodnot se rozlišují malá a velká písmena.

Můžete například definovat definici zásady, která omezí umístění, kde je možné nasadit prostředky. Parametr pro definici této zásady může být allowedLocations. Tento parametr by se použil při každém přiřazení definice zásady k omezení přijatých hodnot. Použití strongType poskytuje vylepšené prostředí při dokončování přiřazení prostřednictvím portálu:

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

Použití hodnoty parametru

V pravidle zásad odkazujete na parametry s následující parameters syntaxí funkce:

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

Tato ukázka odkazuje na parametr allowedLocations, který byl předveden ve vlastnostech parametru.

strongType (typ silného písma)

V rámci metadata vlastnosti můžete pomocí strongType poskytnout vícenásobný výběr seznamu možností v rámci Azure Portal. strongType může být podporovaný typ prostředku nebo povolená hodnota. Pokud chcete zjistit, jestli je typ prostředku platný pro strongType, použijte Get-AzResourceProvider. Formát pro typ prostředku strongType je <Resource Provider>/<Resource Type> . Například, Microsoft.Network/virtualNetworks/subnets.

Některé typy prostředků, které get-AzResourceProvider nevrátil, jsou podporované. Jsou to tyto typy:

  • Microsoft.RecoveryServices/vaults/backupPolicies

Povolené hodnoty typu prostředku pro strongType jsou:

  • location
  • resourceTypes
  • storageSkus
  • vmSKUs
  • existingResourceGroups

Umístění definice

Při vytváření iniciativy nebo zásad je potřeba zadat umístění definice. Umístěním definice musí být skupina pro správu nebo předplatné. Toto umístění určuje rozsah, ke kterému lze iniciativu nebo zásadu přiřadit. Prostředky musí být přímými členy nebo podřízenými členy v hierarchii umístění definice, na které se má cílit přiřazení.

Pokud je umístění definice:

  • Předplatné – Definici zásady je možné přiřadit pouze k prostředkům v rámci tohoto předplatného.
  • Skupina pro správu – Definici zásady je možné přiřadit pouze prostředkům v podřízených skupinách pro správu a podřízených předplatných. Pokud plánujete použít definici zásady pro několik předplatných, umístěním musí být skupina pro správu, která obsahuje jednotlivá předplatná.

Další informace najdete v tématu Principy oboru v Azure Policy.

Pravidlo zásad

Pravidlo zásad se skládá z bloků If a Then. V bloku Pokud definujete jednu nebo více podmínek, které určují, kdy se zásada vynucuje. Na tyto podmínky můžete použít logické operátory a přesně tak definovat scénář pro zásadu.

V bloku Pak definujete účinek, který nastane při splnění podmínek If.

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

Logické operátory

Podporované logické operátory jsou:

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

Syntaxe not vrátí výsledek podmínky. Syntaxe allOf (podobná logické operaci And) vyžaduje, aby všechny podmínky byly pravdivé. Syntaxe anyOf (podobná logické operaci Or) vyžaduje, aby jedna nebo více podmínek byla pravdivá.

Logické operátory můžete vnořit. Následující příklad ukazuje operaci not, která je vnořená v rámci operace allOf.

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

Podmínky

Podmínka vyhodnocuje, jestli hodnota splňuje určitá kritéria. Podporované podmínky:

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

Pro méně, lessOrEquals, greater a greaterOrEquals, pokud typ vlastnosti neodpovídá typu podmínky, je vyvolána chyba. Porovnání řetězců se provádí pomocí InvariantCultureIgnoreCase .

Při použití podmínek like a notLike zadáte do hodnoty * zástupný znak. Hodnota by neměla mít více než jeden zástupný znak * .

Při použití podmínek match a notMatch zadejte , aby odpovídaly číslici pro písmeno, aby odpovídaly libovolnému znaku a libovolnému jinému znaku, který odpovídá # ? . skutečnému znaku. Zatímco match a notMatch rozlišují velká a malá písmena, všechny ostatní podmínky, které vyhodnotí stringValue, rozlišují malá a velká písmena. Alternativy bez rozlišení velkých a malých písmen jsou k dispozici v metodě matchInsensitively a notMatchInsensitively.

Pole

Podmínky, které vyhodnocují, jestli hodnoty vlastností v datové části žádosti o prostředek splňují určitá kritéria, lze vytvořit pomocí výrazu pole. Podporují se následující pole:

  • name
  • fullName
    • Vrátí úplný název prostředku. Úplný název prostředku je název prostředku předřazený názvy nadřazených prostředků (například "myServer/myDatabase").
  • kind
  • type
  • location
    • Pole umístění jsou normalizována tak, aby podporovala různé formáty. Například se East US 2 považuje za shodné s eastus2 .
    • Pro prostředky, které jsou na umístění agnostické, použijte global.
  • id
    • Vrátí ID prostředku, který se vyhodnocuje.
    • Příklad: /subscriptions/06be863d-0996-4d56-be22-384767287aa2/resourceGroups/myRG/providers/Microsoft.KeyVault/vaults/myVault
  • identity.type
  • tags
  • tags['<tagName>']
    • Tato syntaxe závorek podporuje názvy značek, které mají interpunkci, jako je spojovník, tečka nebo mezera.
    • Kde <tagName> je název značky, pro který se má podmínka ověřit.
    • Příklady: tags['Acct.CostCenter'] kde Acct.CostCenter je název značky.
  • tags['''<tagName>''']
    • Tato syntaxe závorek podporuje názvy značek, které v ní mají apostrofy, pomocí uvozování dvojitými apostrofy.
    • Kde <tagName> ' je název značky, pro který se má podmínka ověřit.
    • Příklad: tags['''My.Apostrophe.Tag'''] kde My.Apostrophe.Tag je název značky.
  • Aliasy vlastností – seznam najdete v tématu Aliasy.

Poznámka

tags.<tagName>, tags[tagName] a jsou stále přijatelné způsoby tags[tag.with.dots] deklarování pole značek. Upřednostňovanými výrazy jsou však výrazy uvedené výše.

Poznámka

Ve výrazech polí odkazující [ * ] na alias se každý prvek v poli vyhodnocuje jednotlivě pomocí logických prvků a mezi prvky. Další informace najdete v tématu Odkazování na vlastnosti prostředku pole.

Použití značek s parametry

Hodnotu parametru lze předat do pole značky. Předání parametru do pole značky zvyšuje flexibilitu definice zásady během přiřazování zásad.

V následujícím příkladu se používá k vytvoření vyhledávání pole značek pro značku s concat názvem hodnota parametru tagName. Pokud tato značka neexistuje, použije se účinek modify k přidání značky pomocí hodnoty stejné pojmenované značky nastavené v nadřazené skupině prostředků auditovaných prostředků pomocí funkce resourcegroup() lookup.

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

Hodnota

Podmínky, které vyhodnocují, zda hodnota splňuje určitá kritéria, lze vytvořit pomocí výrazu hodnoty. Hodnoty mohou být literály, hodnoty parametrůnebo vrácené hodnoty všech podporovaných funkcí šablony.

Upozornění

Pokud je výsledkem funkce šablony chyba, vyhodnocení zásad selže. Neúspěšné vyhodnocení je implicitní zamítnutí. Další informace najdete v tématu, které se vyhnout selháním šablony. Pokud chcete zabránit dopadu neúspěšného vyhodnocení na nové nebo aktualizované prostředky při testování a ověřování nové definice zásady, použijte enforcementMode pro DoNotEnforce.

Příklady hodnot

Toto pravidlo zásad používá hodnotu k porovnání výsledku funkce a vrácené vlastnosti resourceGroup() name s podmínkou typu *netrg . Toto pravidlo odepře všechny prostředky, které nejsou typu Microsoft.Network/* v žádné skupině prostředků, jejíž název končí na *netrg .

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

V tomto příkladu pravidla zásad se pomocí hodnoty zkontroluje, jestli se výsledek více vnořených funkcí rovná true . Toto pravidlo odepře všechny prostředky, které nemají alespoň tři značky.

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

Předcházení selháním šablon

Použití funkcí šablony v hodnotě umožňuje mnoho složitých vnořených funkcí. Pokud je výsledkem funkce šablony chyba, vyhodnocení zásad selže. Neúspěšné vyhodnocení je implicitní zamítnutí. Příklad hodnoty, která v určitých scénářích selže:

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

Výše uvedené pravidlo zásad používá k porovnání prvních tří znaků názvu s abc funkci substring(). Pokud je název kratší než tři znaky, substring() výsledkem funkce bude chyba. Tato chyba způsobí, že se zásady stanou efektem zamítnutí.

Místo toho pomocí funkce if() zkontrolujte, jestli se první tři znaky názvu rovnají abc, aniž by bylo možné, aby název kratší než tři znaky způsobil chybu:

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

S upraveným pravidlem zásad zkontroluje délku názvu před pokusem o získání hodnoty s méně než if() substring() třemi znaky. Pokud je název příliš krátký, vrátí se místo toho hodnota "nezahajuje na abc" a porovná se s abc. Prostředek s krátkým názvem, který nezačíná na abc, přesto pravidlo zásad selže, ale už při vyhodnocování nezískaje chybu.

Počet

Podmínky, které spočítá, kolik členů pole splňuje určitá kritéria, lze vytvořit pomocí výrazu count. Běžné scénáře jsou kontrola, jestli alespoň jeden z, "přesně jeden z", "vše z" nebo "žádný z" členů pole splňují podmínku. Funkce Count vyhodnotí každý člen pole výrazu podmínky a sečte pravdivé výsledky, které se pak porovná s operátorem výrazu.

Počet polí

Spočítá, kolik členů pole v datové části požadavku splňuje výraz podmínky. Struktura výrazů počtu polí je:

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

S count (Počet polí) se používají následující vlastnosti:

  • count.field (povinné): Obsahuje cestu k poli a musí být aliasem pole.
  • count.where (volitelné): Výraz podmínky, který se má jednotlivě vyhodnotit pro každého [ * ] člena pole aliasů count.field . Pokud tuto vlastnost nezadáte, vyhodnotí se u všech členů pole s cestou pole hodnota true. Uvnitř této vlastnosti lze použít jakoukoli podmínku. Logické operátory lze uvnitř této vlastnosti použít k vytvoření složitých požadavků na vyhodnocení.
  • <condition>(povinné): Hodnota se porovnává s počtem položek, které splnily výraz podmínky count.where. Měla by se použít číselná podmínka.

Výrazy počtu polí mohou vytvořit výčet stejného pole až třikrát v jedné definici policyRule.

Další podrobnosti o tom, jak pracovat s vlastnostmi pole v Azure Policy, včetně podrobného vysvětlení, jak se vyhodnocuje výraz počtu polí, najdete v tématu Odkazovánína vlastnosti prostředku pole .

Počet hodnot

Spočítá, kolik členů pole splňuje podmínku. Pole může být pole literálu nebo odkaz na parametr pole. Struktura výrazů počtu hodnot je:

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

S hodnotou count se používají následující vlastnosti:

  • count.value (required): Pole, které se má vyhodnotit.
  • count.name (povinné): Název indexu složený z anglických písmen a číslic. Definuje název pro hodnotu člena pole vyhodnocené v aktuální iteraci. Název slouží k odkazování na aktuální hodnotu uvnitř count.where podmínky. Volitelné, pokud výraz count není podřízeným výrazem jiného výrazu count. Pokud není zadaný, název indexu se implicitně nastaví na "default" .
  • count.where (volitelné): Výraz podmínky, který se má jednotlivě vyhodnotit pro každého člena pole count.value . Pokud tato vlastnost není k dispozici, vyhodnotí se u všech členů pole hodnota true. Uvnitř této vlastnosti lze použít jakoukoli podmínku. Logické operátory lze uvnitř této vlastnosti použít k vytvoření složitých požadavků na vyhodnocení. K hodnotě aktuálně výčtového členu pole lze získat přístup voláním aktuální funkce.
  • <condition> (povinné): Hodnota se porovnává s počtem položek, které splnily count.where výraz podmínky. Měla by se použít číselná podmínka.

Vynucuje se následující omezení:

  • V jedné definici policyRule je možné použít až 10 výrazů počtu hodnot.
  • Každý výraz počtu hodnot může provádět až 100 iterací. Toto číslo zahrnuje počet iterací provedených libovolnými výrazy počtu nadřazených hodnot.

Aktuální funkce

Funkce current() je dostupná jenom uvnitř count.where podmínky. Vrátí hodnotu člena pole, který je aktuálně uveden vyhodnocením výrazu count.

Využití počtu hodnot

  • current(<index name defined in count.name>). Příklad: current('arrayMember').
  • current(). Povoleno pouze v případě, že výraz počtu hodnot není podřízeným výrazem jiného výrazu count. Vrátí stejnou hodnotu jako výše.

Pokud je hodnota vrácená voláním objekt, jsou podporovány přístupové objekty vlastností. Příklad: current('objectArrayMember').property.

Využití počtu polí

  • current(<the array alias defined in count.field>). Například, current('Microsoft.Test/resource/enumeratedArray[*]').
  • current(). Povoleno pouze v případě, že výraz počtu polí není podřízeným výrazem jiného výrazu count. Vrátí stejnou hodnotu jako výše.
  • current(<alias of a property of the array member>). Například, current('Microsoft.Test/resource/enumeratedArray[*].property').

Příklady počtu polí

Příklad 1: Kontrola, jestli je pole prázdné

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

Příklad 2: Kontrola pouze jednoho člena pole pro splnění výrazu podmínky

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

Příklad 3: Kontrola alespoň jednoho člena pole pro splnění výrazu podmínky

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

Příklad 4: Kontrola, že všichni členové pole objektů splňují výraz podmínky

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

Příklad 5: Kontrola, že alespoň jeden člen pole odpovídá více vlastnostem ve výrazu podmínky

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

Příklad 6: Použití funkce uvnitř podmínek pro přístup k hodnotě aktuálně výčtového člena pole current() where ve funkci šablony Tato podmínka zkontroluje, jestli virtuální síť obsahuje předponu adresy, která není v rozsahu CIDR 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
}

Příklad 7: Použití funkce uvnitř podmínek pro přístup k hodnotě aktuálně field() where výčtového člena pole. Tato podmínka zkontroluje, jestli virtuální síť obsahuje předponu adresy, která není v rozsahu CIDR 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
}

Příklady počtu hodnot

Příklad 1: Kontrola, jestli název prostředku odpovídá žádnému ze vzorů daného názvu

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

Příklad 2: Kontrola, jestli název prostředku odpovídá žádnému ze vzorů daného názvu Funkce current() nezadá název indexu. Výsledek je stejný jako v předchozím příkladu.

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

Příklad 3: Kontrola, jestli název prostředku odpovídá žádnému ze vzorů daného názvu poskytovaných parametrem pole

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

Příklad 4: Zkontrolujte, jestli kterákoli z předpon adres virtuální sítě není v seznamu schválených předpon.

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

Příklad 5: Zkontrolujte, že jsou v NSG definovaná všechna vyhrazená pravidla NSG. Vlastnosti vyhrazených pravidel NSG jsou definovány v parametru pole obsahujícím objekty.

Hodnota parametru:

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

Zásad:

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

Účinek

Azure Policy podporuje následující typy účinku:

  • Připojit: Přidá do požadavku definovanou sadu polí.
  • Audit: Vygeneruje událost upozornění v protokolu aktivit, ale nezískaje požadavek.
  • AuditIfNotExists: Vygeneruje událost upozornění v protokolu aktivit, pokud související prostředek neexistuje.
  • Odepřít: vygeneruje událost v protokolu aktivit a požadavek selže.
  • DeployIfNotExists: Nasadí související prostředek, pokud ještě neexistuje.
  • Zakázáno: Nevyhodnocuje prostředky pro dodržování předpisů pravidlem zásad.
  • Úprava: přidá, aktualizuje nebo odebere definované značky z prostředku nebo předplatného.
  • EnforceOPAConstraint (zastaralé): konfiguruje Open Controller agent admissioning Controller s gatekeeper v3 pro samoobslužně spravované clustery Kubernetes v Azure.
  • EnforceRegoPolicy (zastaralé): konfiguruje správce otevřeného agenta zásad přístupu s gatekeeper v2 ve službě Azure Kubernetes.

Podrobné informace o každém z efektů, pořadí vyhodnocení, vlastností a příkladů najdete v tématu principy Azure Policych efektů.

Funkce zásad

Funkce se dají použít k zavedení další logiky do pravidla zásad. Jsou řešeny v rámci pravidla zásad definice zásady a v hodnotách parametrů přiřazených k definicím zásad v iniciativě.

Pro použití v rámci pravidla zásad jsou k dispozici všechny funkce šablon Správce prostředků , s výjimkou následujících funkcí a uživatelsky definovaných funkcí:

  • copyIndex()
  • nasazení ()
  • seznamu
  • newGuid()
  • pickZones()
  • Zprostředkovatelé ()
  • Reference ()
  • resourceId ()
  • proměnné ()

Poznámka

Tyto funkce jsou stále k dispozici v rámci details.deployment.properties.template nasazení šablony v definici zásady deployIfNotExists .

Tato funkce je k dispozici pro použití v pravidle zásad, ale liší se od použití v šabloně Azure Resource Manager (šablona ARM):

  • utcNow() -Na rozdíl od šablony ARM lze tuto vlastnost použít mimo vlastnost DefaultValue.
    • Vrátí řetězec, který je nastaven na aktuální datum a čas ve formátu Universal ISO 8601 DateTime yyyy-MM-ddTHH:mm:ss.fffffffZ .

Následující funkce jsou dostupné jenom v pravidlech zásad:

  • addDays(dateTime, numberOfDaysToAdd)

    • DateTime: [required] řetězec řetězce ve formátu Universal ISO 8601 DateTime "rrrr-MM-DDThh: mm: ss. FFFFFFFZ'
    • numberOfDaysToAdd: [povinné] celé číslo-počet dnů k přidání
  • field(fieldName)

    • FieldName: [required] řetězec-název pole , které se má načíst
    • Vrátí hodnotu tohoto pole z prostředku, který je vyhodnocován podmínkou if.
    • field se primárně používá s AuditIfNotExists a DeployIfNotExists pro odkazování na pole v prostředku, který je vyhodnocován. Příklad tohoto použití lze zobrazit v DeployIfNotExists příkladu.
  • requestContext().apiVersion

    • Vrátí verzi rozhraní API žádosti, která aktivovala vyhodnocování zásad (například: 2021-09-01 ). Tato hodnota je verze rozhraní API, která se použila v požadavku PUT/PATCH k vyhodnocení při vytváření nebo aktualizaci prostředku. Nejnovější verze rozhraní API se vždycky používá během hodnocení dodržování předpisů u stávajících prostředků.
  • policy()

    • Vrátí následující informace o vyhodnocené zásadě. K vlastnostem lze přistup z vráceného objektu (například: [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] řetězec-řetězec určující rozsah IP adres, abyste zkontrolovali, jestli je targetRange v.
    • targetRange: [povinný] řetězec – řetězec určující rozsah IP adres, které se mají ověřit, jak je zahrnuto v rozsahu.
    • Vrátí logickou hodnotu pro to, jestli rozsah IP adres rozsahu obsahuje targetRange rozsah IP adres. Prázdné rozsahy nebo kombinování mezi rodinami IP adres není povoleno a vede k selhání vyhodnocení.

    Podporované formáty:

    • Jedna IP adresa (příklady: 10.0.0.0 , 2001:0DB8::3:FFFE )
    • Rozsah CIDR (příklady: 10.0.0.0/24 , 2001:0DB8::/110 )
    • Rozsah definovaný počátečními a koncovými IP adresami (příklady: 192.168.0.1-192.168.0.9 , 2001:0DB8::-2001:0DB8::3:FFFF )
  • current(indexName)

Příklad funkce zásad

Tato ukázka pravidla zásad používá resourceGroup funkci prostředků k získání vlastnosti názvu v kombinaci s concat funkcí Array a Object k sestavení like podmínky, která vynutila název prostředku, aby začínal názvem skupiny prostředků.

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

Aliasy

Aliasy vlastností se používají pro přístup ke specifickým vlastnostem pro typ prostředku. Aliasy umožňují omezit, jaké hodnoty nebo podmínky jsou povoleny pro vlastnost v prostředku. Každý alias se mapuje na cesty v různých verzích rozhraní API pro daný typ prostředku. Během hodnocení zásad získá modul zásad cestu k vlastnosti pro tuto verzi rozhraní API.

Seznam aliasů se vždycky zvětšuje. Chcete-li zjistit, které aliasy jsou aktuálně podporovány nástrojem Azure Policy, použijte jednu z následujících metod:

  • Azure Policy rozšíření pro Visual Studio Code (doporučeno)

    pomocí rozšíření Azure Policy pro Visual Studio Code můžete zobrazit a vyhledat aliasy pro vlastnosti prostředku.

    snímek obrazovky s příponou Azure Policy pro Visual Studio Code najetí myší na vlastnost, která zobrazuje názvy aliasů.

  • 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
    

    Poznámka

    chcete-li najít aliasy, které lze použít s efektem úprav , použijte následující příkaz v Azure PowerShell 4.6.0 nebo vyšší:

    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
    

Princip aliasu [*]

Několik dostupných aliasů má verzi, která se zobrazí jako název Normal (normální) a další, která je [*] k ní připojená. Příklad:

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

Alias ' Normal ' představuje pole jako jedinou hodnotu. Toto pole je určeno pro přesné scénáře porovnání shody, pokud celá sada hodnot musí být přesně definovaná, a ne více a méně.

[*] Alias představuje kolekci hodnot vybraných z prvků vlastnosti prostředku pole. Příklad:

Alias Vybrané hodnoty
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*] Prvky ipRules pole.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*].action Hodnoty action vlastnosti z každého elementu ipRules pole.

Při použití v podmínce pole umožňují aliasy pole porovnat jednotlivé prvky pole s cílovou hodnotou. Při použití s výrazem Count je možné:

  • Ověřte velikost pole.
  • Zkontroluje, jestli all\any\njeden z elementů Array, který splňuje složitou podmínku.
  • Zkontroluje, jestli přesně n prvků pole neodpovídají složitou podmínku.

Další informace a příklady naleznete v tématu odkazující na vlastnosti prostředku pole.

Další kroky