最終確認: 2026年5月
AZ-500 試験の対象となる AWS サービスを、プレーンな Terraform を使用して構築します。1 ブロックずつ、それぞれ試験ドメインに関連付けられています。同じコードが OpenTofu でも動作します。
このラボの終わりまでに、プレーンなTerraformを使用して、Azureセキュリティエンジニアのベースラインをプロビジョニングします。これには、顧客管理の暗号化キーをホストするKey Vault、そのキーで暗号化されたストレージアカウント、Log Analyticsへのフローログを持つネットワークセキュリティグループ、およびサブスクリプションスコープで有効化されたMicrosoft Defender for Cloudのクラウドセキュリティポスチャ管理プランが含まれます。5つのブロックでAZ-500のリファレンスポスチャです。
これらのスニペットを単一の main.tf に配置し、terraform init を実行してから、terraform apply をステップバイステップで実行してください。
>= 1.5 または OpenTofu >= 1.6。az login)。ほとんどが無料またはほぼ無料です:
アイドル状態で月額約1ドル。Defender for Cloudの高度なプランを有効にした場合、追加費用がかかります。
標準的なAzureの導入部分です。
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
}顧客管理キー (CMK) は、AZ-500の「データセキュリティ」の基本的な要素です。暗号化キーを提供し、それをローテーションします。Azureストレージ/SQLなどは、これをエンベロープ暗号化に使用します。Microsoft管理キー (MMK) と比較すると、MMKはより簡単ですが、キーはMicrosoftが保持します。
ここでは、RBAC認証を持つKey Vaultを作成し、その中に2048ビットのRSAキーを作成します。ステップ3のストレージアカウントは、保存時の暗号化のためにこのキーを参照します。AZ-500の「プラットフォーム保護の実装」と「セキュリティ運用の管理」のドメインは、質問が「組織がキーを制御する」と述べている場合に、保存時の暗号化の解決策としてこのCMKパターンに依存しています。
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"
}
}顧客管理キーを使用するストレージアカウントは、Key Vaultからキーを読み取るためにユーザー割り当てマネージドIDを必要とします。そのIDを作成し、Key Vault上で Key Vault Crypto Service Encryption User ロールを付与した後、customer_managed_key ブロックを介してストレージアカウントにバインドします。
key_versionless モード(customer_managed_key.key_vault_key_id = key_vault_key.cmk.versionless_id を使用)は、AZ-500の自動キーローテーションに関するベストプラクティスです。キーがローテーションされると、手動での再構成なしにストレージが自動的に新しいバージョンを認識します。
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フローログは、AZ-500の「セキュリティ運用の管理」におけるネットワークトラフィック可視化の基本的な要素です。NSGルールによって許可または拒否されたすべてのフロー(5タプル + バイト数 + パケット数 + 結果)を記録し、ストレージアカウントに永続化され、Log Analytics上のTraffic Analyticsを介してクエリ可能です。
ここでは、NSG、Network Watcher(フローログエンドポイントを所有するリージョンごとのAzure管理サービス)、およびTraffic Analyticsが有効なフローログリソースをプロビジョニングします。フローログはストレージアカウント(データストレージとは別)に保存され、KQLクエリのためにLog Analyticsに処理されます。
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は、AzureのCSPM (Cloud Security Posture Management) およびCWP (Cloud Workload Protection) サービスです。Foundational CSPMティアは無料で、Microsoft Cloud Security Benchmark評価が含まれています。これは、CIS/NISTのコントロールをAzureに移植し、自動化されたチェックとして提供するものです。AZ-500の「セキュリティ運用の管理」ドメインでは、このベースラインが初期のセキュリティ可視化の基本的な要素としてテストされます。
ここでは、基本的なサブスクリプションスコープの価格プラン(無料)と、新しいVMにLog Analyticsエージェントを自動的に接続する auto_provisioning_setting を有効にします。これにより、このサブスクリプション内の新しいコンピューティングは、手動インストールなしで監視が可能になります。有料のDefenderプラン(Defender for Servers、Defender for Storage、Defender for SQLなど)は、それぞれリソースタイプごとの検出を可能にします。ここではコストを考慮して無効にしますが、その後の質問として言及します。
この最後の要素が整うことで、AZ-500のベースラインが形成されます。具体的には、保存時のCMK暗号化、ネットワークフローの可視化、ポスチャ管理です。追加のAZ-500パターン(Sentinel、条件付きアクセス、プライベートエンドポイント、Azure Firewall)はすべてこのベースに接続されます。
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 はすべてを破棄します。注意点:
purge_soft_delete_on_destroy = true により、destroy時に実際に完全にパージされます。AZ-500は、このラボでは扱いきれない幅広いセキュリティ領域をカバーしています。具体的には、Microsoft Sentinel(SC-200でカバーされる完全なSIEM)、Microsoft Entra条件付きアクセスポリシー、Privileged Identity Management (PIM)、ID保護、Azure Firewall + Firewall Policy + Premium IDPS、Azure Bastion、DDoS Protection Standard、Front Door / App Gateway上のWeb Application Firewall、アプリケーションセキュリティグループ、プライベートエンドポイント + Private Link Service、カスタマーロックボックス、KEKを使用したAzure Disk Encryption、コンプライアンスのためのAzure Policyイニシアティブ、およびDefender for Cloudワークロード保護プラン(Defender for Servers / Storage / SQL / Containers / Kubernetes)などです。
ここでは、CMK + ネットワークフローログ + CSPM の三つ組に限定します。なぜなら、これらがより高度なAZ-500パターンすべてが構築される基盤となるからです。Sentinelは当社のLog Analyticsワークスペースからデータを読み取ります。条件付きアクセスは、CMKで暗号化されたストレージにアクセスするIDを保護します。プライベートエンドポイントは、ストレージアカウントのパブリックネットワークアクセスを置き換えます。
上記の領域については、この認定ページにある閲覧、プレイブック、およびEditorialセクションを参照してください。