Zum Inhalt

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_groups sucht das Modul die Definition als Microsoft.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

  1. Stelle sicher, dass die Definition existiert:
  2. Built-in: Suche ihre ID im portal (Policy → Definitions).
  3. Custom: Füge sie unter policies/policy_definitions/ oder policies/policy_set_definitions/ hinzu (siehe Managed Initiative auf einer Management Group). Sie wird vom foundation-Layer deployt, der im selben hub-Lauf vor postdeployment läuft.
  4. Erstelle das Zuweisungs-JSON im Ordner für den passenden Scope.
  5. Validiere das JSON und öffne einen pull request.
  6. Führe hub aus. Erwarteter Plan:
  7. postdeployment (primäre Region): + Zuweisung, plus Rollenzuweisungen (mit Identity) und remediations (Management-Group-Scope);
  8. foundation: nur, wenn du eine Definition hinzugefügt hast.
  9. 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 oder policy_definition_id ersetzt 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_id oder resource_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 nicht null: Das Modul iteriert über die Liste, und der Plan schlägt bei null fehl.
  • 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 verwenden policy_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, Standard true). Siehe docs/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.