Policy-Zuweisungen (neu, aktualisieren)¶
Standardänderungen: Neue Azure-Policy-Zuweisung (eine bestehende Definition oder Initiative einem neuen Scope zuweisen) und Verwaltete Azure-Policy-Zuweisung aktualisieren.
Auswirkung: Eine Azure-Policy-Zuweisung wird auf einer Management Group, subscription, resource group oder
Ressource erstellt oder aktualisiert. Hat die Zuweisung eine Managed Identity, werden auch die erforderlichen Rollenzuweisungen erstellt. Nur der
postdeployment-Layer ändert sich, in der primären Region.
Für die verwandte Änderung eine verwaltete Initiative einer Management Group zuweisen siehe Managed Initiative auf einer Management Group.
Anfragefelder¶
| Feld | Wo es hingehört |
|---|---|
| Policy definition/initiative Name | policy_definition_id (vollständige Ressourcen-ID) |
| Begründung | pull request; auch properties.description |
| Scope | Ordner plus Scope-Key: managementGroupId, subscriptionId, resourceGroupId oder resourceId |
| Kommentare | z. B. Parameter, Ausschlüsse (notScopes), Enforcement-Modus |
Wo die Dateien liegen¶
Festgelegt in <env-folder>/<primary region>/postdeployment.auto.tfvars:
policy_assignment_mg_json_file_relative_path = "policies/policy_assignments/01_management_groups"
policy_assignment_mg_json_file_pattern = "/**/*.json"
policy_assignment_sub_json_file_relative_path = "policies/policy_assignments/02_subscriptions"
policy_assignment_sub_json_file_pattern = "/**/*.json"
policy_assignment_rg_json_file_relative_path = "policies/policy_assignments/03_resource_groups"
policy_assignment_rg_json_file_pattern = "/**/*.json"
policy_assignment_res_json_file_relative_path = "policies/policy_assignments/04_resources"
policy_assignment_res_json_file_pattern = "/**/*.json"
Diese Pfade werden nur in der primären Region gelesen (infra/deploy/postdeployment/locals.tf).
| Ordner | Scope-Key im JSON | Beispielwert | Terraform-Ressource |
|---|---|---|---|
01_management_groups |
managementGroupId |
/providers/Microsoft.Management/managementGroups/cloudplatform-landingzones |
azurerm_management_group_policy_assignment |
02_subscriptions |
subscriptionId |
/subscriptions/<guid> |
azurerm_subscription_policy_assignment |
03_resource_groups |
resourceGroupId |
/subscriptions/<guid>/resourceGroups/<rg> |
azurerm_resource_group_policy_assignment |
04_resources |
resourceId |
vollständige Ressourcen-ID | azurerm_resource_policy_assignment |
Zuweisungen auf Management Groups müssen auf eine Initiative (policy set) zeigen. Für
01_management_groupssucht das Modul die Definition alsMicrosoft.Authorization/policySetDefinitions-Ressource (infra/modules/policy_definition_references). Die ID einer einzelnen Policy-Definition schlägt dort fehl. Um eine einzelne Policy auf einer Management Group zuzuweisen, verpacke sie zuerst in eine Initiative. Die anderen Scopes akzeptieren sowohl Definitionen als auch Initiativen.
Assignment JSON¶
Aus infra/modules/policy/main.tf. Alle gezeigten Keys werden gelesen. Verwende null, wo du keinen Wert hast.
{
"name": "lz-require-tags",
"policy_definition_id": "/providers/Microsoft.Management/managementGroups/cloudplatform/providers/Microsoft.Authorization/policySetDefinitions/lz-polset-require-tags",
"enforce": true,
"identityType": null,
"location": "westeurope",
"notScopes": null,
"managementGroupId": "/providers/Microsoft.Management/managementGroups/cloudplatform-landingzones",
"non_compliance_message": {
"content": "Resources in landing zones must carry the required tags.",
"policy_definition_reference_id": null
},
"properties": {
"displayName": "Require tags on landing zone resources",
"description": "Change <ticket>: enforce costcentre and owner tags.",
"metadata": { "assignedBy": "Infrastructure as Code (IaC)" },
"parameters": {
"tagName": { "value": "costcentre" }
}
}
}
| Key | Hinweise |
|---|---|
name |
Der Azure-Zuweisungsname und der Terraform-Key. Maximal 24 Zeichen für Management-Group-Scope (Azure-Limit). Eine Änderung ersetzt die Zuweisung. |
policy_definition_id |
Built-in: /providers/Microsoft.Authorization/policySetDefinitions/<guid> oder /policyDefinitions/<guid>. Custom (von dieser Plattform deployt): /providers/Microsoft.Management/managementGroups/<cloudplatform id>/providers/Microsoft.Authorization/policySetDefinitions/<name>. |
enforce |
true = Default (deny/deploy-Effekte greifen), false = DoNotEnforce (nur auswerten). Das Beispiel verwendet den String "true"; ein Boolean ist klarer. |
identityType |
"SystemAssigned" für Policies mit den Effekten deployIfNotExists / modify, sonst null. |
location |
Erforderlich, wenn eine Identity verwendet wird. Verwende den Namen der primären Region. |
notScopes |
Liste ausgeschlossener untergeordneter Scopes (Key auf oberster Ebene; properties.notScopes wird nicht gelesen). |
non_compliance_message |
Optionale Meldung, die bei einer Ablehnung angezeigt wird; null, um sie wegzulassen. |
properties.parameters |
{ "<param>": { "value": … } }, genau wie im Azure-portal-JSON. |
Rollenzuweisungen für die Identity werden automatisch erstellt (ADR-0008). Mit identityType: "SystemAssigned"
liest das Modul roleDefinitionIds aus der Definition oder aus jeder Definition der Initiative und weist diese
Rollen am Scope der Zuweisung zu (infra/modules/policy/main_role_assignments_auto.tf).
remediation tasks werden nur für Zuweisungen auf Management Groups erstellt, und nur wenn
automatically_start_policy_remediation = true in postdeployment.auto.tfvars gilt (die Variable ist standardmäßig true). Sie
werden jedes Mal neu erstellt, wenn sich die Zuweisung ändert (ADR-0010). Für andere Scopes startest du die remediation im portal.
Neue Zuweisung: Schritte¶
- Stelle sicher, dass die Definition existiert:
- Built-in: Suche ihre ID im portal (Policy → Definitions).
- Custom: Füge sie unter
policies/policy_definitions/oderpolicies/policy_set_definitions/hinzu (siehe Managed Initiative auf einer Management Group). Sie wird vomfoundation-Layer deployt, der im selbenhub-Lauf vorpostdeploymentläuft. - Erstelle das Zuweisungs-JSON im Ordner für den passenden Scope.
- Validiere das JSON und öffne einen pull request.
- Führe
hubaus. Erwarteter Plan: postdeployment(primäre Region):+Zuweisung, plus Rollenzuweisungen (mit Identity) und remediations (Management-Group-Scope);foundation: nur, wenn du eine Definition hinzugefügt hast.- Apply.
Eine bestehende Zuweisung aktualisieren¶
Bearbeite das JSON (Parameter, enforce, notScopes, Non-Compliance-Meldung) und führe dann hub aus.
- Ein In-place-Update wird als
~angezeigt. - Das Ändern von
name, Scope-Key oderpolicy_definition_idersetzt die Zuweisung (-/+). Eine Zeit lang ist die Policy nicht zugewiesen, und Ausnahmen, die auf die alte Zuweisungs-ID verweisen, brechen.
Eine Zuweisung entfernen¶
Lösche die Datei (oder benenne sie in .json.ignore um) und führe hub aus. Der Plan zeigt, dass die Zuweisung samt ihren Rollenzuweisungen
und remediations zerstört wird. Entferne Ausnahmen, die darauf zeigen, in derselben Änderung.
Ausnahmen¶
Der Prozess (Anfrage, Genehmigung, Review, Spiegelung in den Secure Score) steht unter Policy-Ausnahmen. Dieser Abschnitt beschreibt das Dateiformat.
Ausnahmen sind JSON-Dateien in policies/policy_exemptions/01_management_groups … 04_resources (Pfade in
postdeployment.auto.tfvars, policy_exemption_*_json_file_relative_path):
{
"name": "exempt-app1-public-ip",
"policy_assignment_id": "/providers/Microsoft.Management/managementGroups/cloudplatform-landingzones/providers/Microsoft.Authorization/policyAssignments/lz-deny-public-ip",
"subscription_id": "/subscriptions/<guid>",
"exemption_category": "Waiver",
"description": "Change <ticket>: approved public IP for app1 until 2026-12-31.",
"display_name": "app1 public IP waiver",
"expires_on": "2026-12-31T00:00:00Z",
"policy_definition_ids": [],
"metadata": null
}
- Der Scope-Key hängt vom Ordner ab:
management_group_id,subscription_id,resource_group_idoderresource_id. policy_definition_ids: Um nur einige Policies einer Initiative auszunehmen, liste ihre Definitions-IDs auf. Sie werden automatisch in Referenz-IDs umgewandelt (infra/modules/policy_reference_ids). Verwende[](leere Liste) für die gesamte Zuweisung. Verwende nichtnull: Das Modul iteriert über die Liste, und der Plan schlägt beinullfehl.- Ausnahmen funktionieren nur bei Zuweisungen einer Initiative. Die Suche nach Referenz-IDs liest die zugewiesene
Definition immer als
policySetDefinitions-Ressource (infra/modules/policy_reference_ids/main.tf). Um von einer Zuweisung einer einzelnen Policy auszunehmen, erstelle die Ausnahme außerhalb dieses Mechanismus oder weise die Policy über eine Initiative zu. - Verwende den Key
policy_definition_ids. Die.jason-Beispieldateien verwendenpolicy_definition_reference_ids, was das Modul nicht liest. - Ausnahmen auf subscription-, resource-group- und Ressourcenebene werden außerdem auf die Zuweisung des Microsoft cloud security benchmark gespiegelt
(
mirror_exemptions_to_mcsb, Standardtrue). Siehedocs/policy_exemptions/README.md.
Ausnahmen dokumentieren, die für die Plattform gelten¶
Manche Ausnahmen gehören zur Funktionsweise der Plattform und gelten für den hub selbst. Führe eine Liste dieser Ausnahmen, mit Policy, Scope und Begründung je Ausnahme, und prüfe sie regelmäßig. Die Gründe sind meist von dieser Art:
| Grund | Beispiel |
|---|---|
| Die Engineers des Managed-Service-Anbieters sind Gastkonten, die Zugriff brauchen | Policies, die Gastkonten mit Lese-, Schreib- oder Owner-Rechten markieren. Der Zugriff bleibt mit PIM nach dem Least-Privilege-Prinzip. |
| Eine bewusste Kosten- oder Risikoentscheidung | DDoS Protection nicht aktiviert, weil die Kosten für diesen Kunden den Nutzen übersteigen. Halte fest, wer entschieden hat und wann sie überprüft wird. |
| Der Deployment-Mechanismus braucht es | Eine Policy gegen administrative Rollen für Service Principals, weil Infrastructure as Code mit einem Service Principal deployt. |
Eine Ausnahme ohne Begründung und ohne Enddatum oder Review-Datum ist bei einem Audit schwer zu verteidigen.
In Nicht-Produktion auditieren, in Produktion erzwingen¶
Ein gängiger Ansatz ist, die Baseline-Initiatives in Nicht-Produktion zu auditieren und in produktionsnahen Umgebungen zu erzwingen (Deny-Effekte).
Teams sehen Verstöße dann in dev und tst, ohne blockiert zu werden, und beheben sie, bevor sie acc und prd erreichen. Mit dem obigen JSON: Weise die Initiative
auf der management group für Nicht-Produktion mit enforce auf false (DoNotEnforce) zu und auf der management group für Produktion mit enforce auf true. Stelle
sicher, dass Workload-Teams wissen, welches Verhalten wo gilt (siehe
Policy und Ausnahmen).
Prüfen¶
- Azure portal → Policy → Assignments, gefiltert auf den Scope: Die Zuweisung ist mit den richtigen Parametern vorhanden.
- Compliance: Die erste Auswertung kann nach der Zuweisung bis zu etwa 30 Minuten dauern (Azure-Verhalten).
- Für
deployIfNotExists/modify: Prüfe den remediation task oder starte einen.
Rollback¶
Mache den pull request rückgängig und führe hub aus.