AZ-500 LAB 43 ~50 phút Chương 10 Governance

Azure Policy + Remediation Task

Gán built-in Azure Policy yêu cầu tag và giới hạn location, phát hiện tài nguyên non-compliant, tạo Remediation Task để tự động sửa, gộp nhiều policy thành Initiative và theo dõi Compliance Dashboard.

🎯 Mục Tiêu Lab

Gán built-in policy "Require a tag on resources" và kiểm tra compliance

Gán built-in policy "Allowed locations" giới hạn region triển khai

Tạo Remediation Task tự động thêm tag cho tài nguyên non-compliant

Tạo Policy Initiative gộp nhiều policy thành một bộ kiểm soát

Phân tích Compliance Dashboard và hiểu vòng đời policy

Hiểu sự khác biệt giữa effect: Audit, Deny, DeployIfNotExists, Modify

📋 Chuẩn Bị

Yêu cầu:
  • Quyền Owner hoặc Policy Contributor trên subscription
  • Azure CLI đã cài và az login thành công
  • Có ít nhất 1 resource group với resources thiếu tag
Lưu ý về Policy effect:
  • Audit— Ghi nhận non-compliant, không chặn tạo resource
  • Deny— Chặn tạo resource không tuân thủ
  • DeployIfNotExists— Tự deploy resource bổ sung nếu thiếu
  • Modify— Tự thêm/sửa properties (dùng cho tag)

🏗️ Kịch Bản

Security team yêu cầu mọi Azure resource phải có tag env và chỉ được triển khai tại Southeast Asia. Hiện tại nhiều resource thiếu tag, một số đã tạo tại region không cho phép. Bạn cần dùng Azure Policy để tự động phát hiện, báo cáo compliance, và tạo Remediation Task để tự động sửa các resource thiếu tag mà không cần can thiệp thủ công.

🧪 Các Bước Thực Hiện

1

Gán Policy "Require a tag on resources"

Cách 1 — Portal
  1. 1.1Portal → Policy → Authoring → Assignments → + Assign policy
  2. 1.2Scope: chọn subscription hoặc resource group lab → Policy definition: tìm "Require a tag on resources"
  3. 1.3Parameters → Tag Name: env → Effect: Audit
  4. 1.4Remediation: check "Create a remediation task" nếu policy hỗ trợ → Review + Create
Cách 2 — Azure CLI
Azure CLI— Bash / Cloud Shell
SUBSCRIPTION_ID=$(az account show --query id -o tsv)
RG="rg-az500-lab43-policy"

# Tạo resource group lab
az group create --name $RG --location southeastasia

# Lấy Policy Definition ID của "Require a tag on resources"
POLICY_DEF_ID=$(az policy definition list \
  --query "[?displayName=='Require a tag on resources'].id" \
  -o tsv)

# Gán policy ở cấp resource group với effect Audit
az policy assignment create \
  --name "require-env-tag" \
  --display-name "Yêu cầu tag env trên mọi resource" \
  --policy "$POLICY_DEF_ID" \
  --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RG" \
  --params '{"tagName":{"value":"env"}}' \
  --enforcement-mode Default

# Xem assignment vừa tạo
az policy assignment show \
  --name "require-env-tag" \
  --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RG"
2

Gán Policy "Allowed locations" (Deny effect)

Cách 1 — Portal
  1. 2.1Policy → Assignments → + Assign policy → Definition: "Allowed locations"
  2. 2.2Parameters → Allowed locations: chọn Southeast AsiaEast Asia
  3. 2.3Effect mặc định: Deny → lưu ý policy này sẽ chặn tạo resource ở region khác
  4. 2.4Test: thử tạo resource ở East US → quan sát thông báo lỗi Deny
Cách 2 — Azure CLI
Azure CLI— Bash / Cloud Shell
# Lấy Policy Definition ID "Allowed locations"
LOCATION_POLICY_ID=$(az policy definition list \
  --query "[?displayName=='Allowed locations'].id" \
  -o tsv)

# Gán policy chỉ cho phép southeastasia và eastasia
az policy assignment create \
  --name "allowed-locations-sea" \
  --display-name "Chỉ cho phép SEA và EA" \
  --policy "$LOCATION_POLICY_ID" \
  --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RG" \
  --params '{"listOfAllowedLocations":{"value":["southeastasia","eastasia"]}}'

# Test: thử tạo resource ở vị trí bị chặn (sẽ bị Deny)
az group create --name rg-test-deny --location eastus 2>&1 | head -5
# Output: RequestDisallowedByPolicy
Output khi Deny
(RequestDisallowedByPolicy) Resource 'rg-test-deny' was disallowed by policy.
PolicyDefinitionId: /providers/Microsoft.Authorization/policyDefinitions/xxxx
PolicyAssignmentName: allowed-locations-sea
3

Kiểm tra Non-Compliant Resources và tạo Remediation Task

Cách 1 — Portal
  1. 3.1Policy → Compliance → xem assignment "require-env-tag" → click để xem resource non-compliant
  2. 3.2Click assignment → tab Remediation → + Create remediation task
  3. 3.3Policy: chọn policy "Inherit a tag from the resource group" (effect: Modify) → scope → Create
  4. 3.4Remediation Tasks → theo dõi trạng thái: Evaluating → Deploying → Succeeded
Cách 2 — Azure CLI
Azure CLI— Bash / Cloud Shell
# Xem trạng thái compliance của assignment
az policy state list \
  --resource-group $RG \
  --query "[?complianceState=='NonCompliant'].{resource:resourceId,policy:policyDefinitionName}" \
  --output table

# Lấy Assignment ID của policy "require-env-tag"
ASSIGNMENT_ID=$(az policy assignment show \
  --name "require-env-tag" \
  --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RG" \
  --query id -o tsv)

# Tạo remediation task (cần policy hỗ trợ Modify/DeployIfNotExists)
# Trước tiên gán policy "Inherit a tag from the resource group" với effect Modify
INHERIT_POLICY_ID=$(az policy definition list \
  --query "[?displayName=='Inherit a tag from the resource group'].id" \
  -o tsv)

az policy assignment create \
  --name "inherit-env-tag" \
  --policy "$INHERIT_POLICY_ID" \
  --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RG" \
  --params '{"tagName":{"value":"env"},"tagValue":{"value":"lab"}}' \
  --identity-scope "/subscriptions/$SUBSCRIPTION_ID" \
  --role Contributor \
  --location southeastasia

# Tạo remediation task
INHERIT_ASSIGNMENT_ID=$(az policy assignment show \
  --name "inherit-env-tag" \
  --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RG" \
  --query id -o tsv)

az policy remediation create \
  --name "remediate-env-tag" \
  --policy-assignment "$INHERIT_ASSIGNMENT_ID" \
  --resource-group $RG

# Theo dõi tiến trình
az policy remediation show \
  --name "remediate-env-tag" \
  --resource-group $RG \
  --query "{status:provisioningState,deployments:deploymentStatus}"
4

Tạo Policy Initiative (gộp nhiều policy)

Cách 1 — Portal
  1. 4.1Policy → Authoring → Definitions → + Initiative definition
  2. 4.2Name: AZ500-Baseline-Governance → Category: Security
  3. 4.3Thêm policies: "Require a tag", "Allowed locations", "Audit VMs without backup" → Save
  4. 4.4Assignments → Assign initiative → gán vào subscription scope → Review + Create
Cách 2 — Azure CLI (JSON file)
Azure CLI— Bash / Cloud Shell
# Tạo file initiative definition
cat > /tmp/initiative-policies.json << 'EOF'
[
  {
    "policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/871b6d14-10aa-478d-b590-94f262ecfa99",
    "parameters": {
      "tagName": {"value": "env"}
    }
  },
  {
    "policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/e56962a6-4747-49cd-b67b-bf8b01975c4c",
    "parameters": {
      "listOfAllowedLocations": {"value": ["southeastasia","eastasia"]}
    }
  }
]
EOF

# Tạo initiative definition
az policy set-definition create \
  --name "az500-baseline-governance" \
  --display-name "AZ500 Baseline Governance" \
  --description "Bộ policy cơ bản cho governance AZ-500 lab" \
  --definitions @/tmp/initiative-policies.json \
  --subscription $SUBSCRIPTION_ID

# Gán initiative vào resource group
INITIATIVE_ID="/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/policySetDefinitions/az500-baseline-governance"

az policy assignment create \
  --name "az500-governance-assignment" \
  --policy-set-definition "$INITIATIVE_ID" \
  --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RG"

# Xem Compliance Dashboard cho initiative
az policy state summarize \
  --resource-group $RG \
  --query "{compliant:results.resourceDetails[?complianceState=='Compliant'].count,noncompliant:results.resourceDetails[?complianceState=='NonCompliant'].count}"

🧹 Dọn Dẹp Tài Nguyên

Azure CLI
# Xóa policy assignments trước (quan trọng — xóa trước khi xóa RG)
az policy assignment delete --name "require-env-tag" \
  --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RG"
az policy assignment delete --name "allowed-locations-sea" \
  --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RG"
az policy assignment delete --name "az500-governance-assignment" \
  --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RG"

# Xóa initiative definition
az policy set-definition delete --name "az500-baseline-governance"

# Xóa resource group
az group delete --name rg-az500-lab43-policy --yes --no-wait

📊 Kết Quả Đầu Ra Lab 43

Policy Audit hoạt động

Compliance Dashboard hiển thị resource thiếu tag là NonCompliant

Policy Deny chặn thành công

Tạo resource ở East US → lỗi RequestDisallowedByPolicy

Remediation Task thành công

Tag env=lab được tự động thêm vào resource thiếu tag

Initiative được gán

Compliance Dashboard hiển thị tổng hợp compliance cho nhiều policy

❓ Câu Hỏi Ôn Tập

1. Sự khác nhau giữa Policy effect Audit và Deny? Khi nào dùng cái nào?

Gợi ý: Audit chỉ ghi nhận, Deny chặn ngay lập tức. Dùng Audit khi muốn assess impact trước, Deny khi đã chắc chắn muốn enforce cứng.

2. Policy nào hỗ trợ Remediation Task? Tại sao không phải policy nào cũng tạo được remediation?

Gợi ý: Chỉ policy có effect DeployIfNotExists hoặc Modify mới hỗ trợ remediation. Audit/Deny chỉ kiểm tra/chặn, không sửa.

3. Managed Identity nào được tạo khi gán policy Modify? Tại sao cần?

Gợi ý: System-assigned managed identity được tạo cho policy assignment. Cần để policy engine có quyền ghi tag vào resource khi chạy remediation.

4. Initiative khác Policy thông thường thế nào? Lợi ích khi gộp nhiều policy thành initiative?

Gợi ý: Initiative là bộ policy gộp lại, quản lý một lần, compliance đo tổng thể. Dễ áp theo framework như NIST, CIS, PCI-DSS.

Lab 42: Azure SQL Security Thư viện Labs Lab 44: Resource Lock + Backup Vault
Zalo