Zuletzt überprüft: Mai 2026
Erstellen Sie die AWS-Dienste der AZ-500-Prüfung mit reinem Terraform — ein Block nach dem anderen, jeweils abgestimmt auf eine Prüfungsdomäne. Derselbe Code funktioniert auch mit OpenTofu.
Am Ende dieses Labs haben Sie mit einfachem Terraform die Azure-Sicherheitsingenieur-Baseline bereitgestellt — einen Key Vault, der einen kundenseitig verwalteten Verschlüsselungsschlüssel hostet, ein Speicherkonto, das mit diesem Schlüssel verschlüsselt ist, eine Netzwerksicherheitsgruppe mit Fluss-Logs in Log Analytics und den Cloud Security Posture Management-Plan von Microsoft Defender for Cloud, der auf Abonnementebene aktiviert ist. Fünf Blöcke; die AZ-500-Referenzhaltung.
Fügen Sie die Snippets in eine einzige main.tf ein, führen Sie terraform init aus, dann terraform apply Schritt für Schritt.
>= 1.5 oder OpenTofu >= 1.6.az login).Größtenteils kostenlos oder nahezu kostenlos:
Ca. 1 $/Monat im Leerlauf. Erweiterte Defender for Cloud-Pläne kosten extra, wenn Sie diese aktivieren.
Standard Azure-Einstieg.
terraform {
required_version = ">= 1.5"
required_providers {
azurerm = { source = "hashicorp/azurerm", version = "~> 4.0" }
random = { source = "hashicorp/random", version = "~> 3.6" }
}
}
provider "azurerm" {
features {
key_vault {
purge_soft_delete_on_destroy = true
}
}
}
resource "random_id" "suffix" {
byte_length = 3
}
data "azurerm_client_config" "current" {}
data "azurerm_subscription" "current" {}
locals {
tags = {
Project = "certlabpro-az-500"
ManagedBy = "terraform"
}
}
resource "azurerm_resource_group" "main" {
name = "certlabpro-az-500-rg"
location = "eastus"
tags = local.tags
}Kundenseitig verwaltete Schlüssel (CMK) sind das AZ-500 Datensicherheits-Primitiv: Sie stellen den Verschlüsselungsschlüssel bereit und rotieren ihn, Azure Storage/SQL usw. verwendet ihn für die Umschlagverschlüsselung. Vergleichen Sie dies mit von Microsoft verwalteten Schlüsseln (MMK) – einfacher, aber Microsoft besitzt den Schlüssel.
Wir erstellen einen Key Vault mit RBAC-Autorisierung und anschließend einen 2048-Bit-RSA-Schlüssel darin. Das Speicherkonto in Schritt 3 wird diesen Schlüssel für die Ruhezustandsverschlüsselung referenzieren. Die AZ-500-Domänen Plattformschutz implementieren und Sicherheitsvorgänge verwalten stützen sich beide auf dieses CMK-Muster als Antwort für die Ruhezustandsverschlüsselung, wenn die Frage „Organisation kontrolliert Schlüssel“ erwähnt.
resource "azurerm_key_vault" "main" {
name = "kv-az500-${random_id.suffix.hex}"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
tenant_id = data.azurerm_client_config.current.tenant_id
sku_name = "standard"
enable_rbac_authorization = true
soft_delete_retention_days = 7
purge_protection_enabled = false # set true in production
tags = local.tags
}
resource "azurerm_role_assignment" "kv_admin_self" {
scope = azurerm_key_vault.main.id
role_definition_name = "Key Vault Administrator"
principal_id = data.azurerm_client_config.current.object_id
}
resource "azurerm_key_vault_key" "cmk" {
name = "storage-cmk"
key_vault_id = azurerm_key_vault.main.id
key_type = "RSA"
key_size = 2048
key_opts = ["unwrapKey", "wrapKey"]
depends_on = [azurerm_role_assignment.kv_admin_self]
rotation_policy {
automatic {
time_before_expiry = "P30D"
}
expire_after = "P365D"
notify_before_expiry = "P30D"
}
}Speicherkonten, die kundenseitig verwaltete Schlüssel verwenden, benötigen eine benutzerseitig zugewiesene Identität, um den Schlüssel aus dem Key Vault zu lesen. Wir erstellen diese Identität, weisen ihr Key Vault Crypto Service Encryption User im Key Vault zu und binden sie dann über den customer_managed_key-Block an das Speicherkonto.
Der key_versionless-Modus (unter Verwendung von customer_managed_key.key_vault_key_id = key_vault_key.cmk.versionless_id) ist die AZ-500-Best-Practice-Antwort für die automatische Schlüsselrotation: Wenn der Schlüssel rotiert wird, übernimmt der Speicher automatisch die neue Version ohne manuelle Neukonfiguration.
resource "azurerm_user_assigned_identity" "storage_cmk" {
name = "uami-az500-storage"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
tags = local.tags
}
resource "azurerm_role_assignment" "storage_kv_user" {
scope = azurerm_key_vault.main.id
role_definition_name = "Key Vault Crypto Service Encryption User"
principal_id = azurerm_user_assigned_identity.storage_cmk.principal_id
}
resource "azurerm_storage_account" "data" {
name = "az500data${random_id.suffix.hex}"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
account_tier = "Standard"
account_replication_type = "LRS"
account_kind = "StorageV2"
https_traffic_only_enabled = true
min_tls_version = "TLS1_2"
allow_nested_items_to_be_public = false
identity {
type = "UserAssigned"
identity_ids = [azurerm_user_assigned_identity.storage_cmk.id]
}
customer_managed_key {
key_vault_key_id = azurerm_key_vault_key.cmk.versionless_id
user_assigned_identity_id = azurerm_user_assigned_identity.storage_cmk.id
}
tags = local.tags
depends_on = [azurerm_role_assignment.storage_kv_user]
}NSG-Fluss-Logs sind das AZ-500 Sicherheitsvorgänge verwalten-Primitiv für die Sichtbarkeit des Netzwerkverkehrs — sie zeichnen jeden von einer NSG-Regel akzeptierten oder verweigerten Fluss auf (5-Tupel + Bytes + Pakete + Ergebnis), werden in einem Speicherkonto persistiert und können über Traffic Analytics in Log Analytics abgefragt werden.
Wir stellen die NSG, einen Network Watcher (der regionale von Azure verwaltete Dienst, der den Fluss-Log-Endpunkt besitzt) und eine Fluss-Log-Ressource mit aktivierter Traffic Analytics bereit. Die Fluss-Logs landen in einem Speicherkonto (getrennt von unserem Datenspeicher) und werden für KQL-Abfragen in Log Analytics verarbeitet.
resource "azurerm_network_security_group" "main" {
name = "nsg-az500"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
tags = local.tags
}
resource "azurerm_network_watcher" "main" {
name = "nw-az500"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
tags = local.tags
}
resource "azurerm_storage_account" "flow_logs" {
name = "az500flow${random_id.suffix.hex}"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
account_tier = "Standard"
account_replication_type = "LRS"
account_kind = "StorageV2"
https_traffic_only_enabled = true
min_tls_version = "TLS1_2"
allow_nested_items_to_be_public = false
tags = local.tags
}
resource "azurerm_log_analytics_workspace" "main" {
name = "log-az500"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
sku = "PerGB2018"
retention_in_days = 30
tags = local.tags
}
resource "azurerm_network_watcher_flow_log" "main" {
name = "nsg-az500-flow"
network_watcher_name = azurerm_network_watcher.main.name
resource_group_name = azurerm_resource_group.main.name
target_resource_id = azurerm_network_security_group.main.id
storage_account_id = azurerm_storage_account.flow_logs.id
enabled = true
version = 2
retention_policy {
enabled = true
days = 30
}
traffic_analytics {
enabled = true
workspace_id = azurerm_log_analytics_workspace.main.workspace_id
workspace_region = azurerm_log_analytics_workspace.main.location
workspace_resource_id = azurerm_log_analytics_workspace.main.id
interval_in_minutes = 10
}
}Defender for Cloud ist Azure's CSPM (Cloud Security Posture Management) und CWP (Cloud Workload Protection) Dienst. Die Foundational CSPM-Stufe ist kostenlos und beinhaltet die Microsoft Cloud Security Benchmark-Bewertung — Azure's Umsetzung von CIS-/NIST-Kontrollen in automatisierte Prüfungen. Die AZ-500-Domäne Sicherheitsvorgänge verwalten testet diese Baseline als das primitive Sicherheitssichtbarkeitswerkzeug für den ersten Tag.
Wir aktivieren den grundlegenden Preisplan auf Abonnementebene (kostenlos) und eine auto_provisioning_setting, die den Log Analytics-Agenten auf neuen VMs automatisch einbindet — das bedeutet, dass neue Rechenressourcen in diesem Abonnement ohne manuelle Installation beobachtbar werden. Kostenpflichtige Defender-Pläne (Defender for Servers, Defender for Storage, Defender for SQL, Defender for Containers, Defender for Kubernetes) ermöglichen jeweils die Erkennung pro Ressourcentyp; wir lassen sie hier aus Kostengründen deaktiviert, erwähnen sie aber als Folgefrage.
Mit diesem letzten Baustein ist die AZ-500-Baseline geformt: CMK-Verschlüsselung im Ruhezustand, Netzfluss-Sichtbarkeit, Haltungsmanagement. Jedes zusätzliche AZ-500-Muster (Sentinel, Conditional Access, Private Endpoints, Azure Firewall) baut auf dieser Basis auf.
resource "azurerm_security_center_subscription_pricing" "cspm" {
tier = "Free" # Foundational CSPM
resource_type = "CloudPosture"
}
# Optional uncomment to enable paid Defender plans (each charges per resource).
# resource "azurerm_security_center_subscription_pricing" "servers" {
# tier = "Standard"
# resource_type = "VirtualMachines"
# subplan = "P2"
# }terraform destroy reißt alles ab. Hinweise:
purge_soft_delete_on_destroy = true in den Provider-Features bewirkt, dass destroy tatsächlich gelöscht wird.AZ-500 deckt ein breites Sicherheitsspektrum ab, das dieses Lab nicht abdecken kann — Microsoft Sentinel (das vollständige SIEM, behandelt in SC-200), Microsoft Entra Conditional Access-Richtlinien, Privileged Identity Management (PIM), Identity Protection, Azure Firewall + Firewall Policy + Premium IDPS, Azure Bastion, DDoS Protection Standard, Web Application Firewall auf Front Door / App Gateway, Application Security Groups, Private Endpoints + Private Link Service, Customer-Lockbox, Azure Disk Encryption mit KEK, Azure Policy-Initiativen für Compliance und die Defender for Cloud Workload Protection-Pläne (Defender for Servers / Storage / SQL / Containers / Kubernetes).
Wir konzentrieren uns auf die CMK + Netzwerkfluss-Logs + CSPM-Triade, da sie das Substrat ist, auf dem jedes fortgeschrittenere AZ-500-Muster aufbaut. Sentinel liest aus Log Analytics-Arbeitsbereichen wie unserem. Conditional Access schützt Identitäten, die auf CMK-verschlüsselten Speicher zugreifen. Private Endpoints ersetzen den öffentlichen Netzwerkzugriff auf dem Speicherkonto.
Für die oben genannten Bereiche siehe die Abschnitte Durchsuchen, Handbuch und Editorial dieser Zertifizierungsseite.