🎯 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ị
- 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
- 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
Gán Policy "Require a tag on resources"
- 1.1Portal → Policy → Authoring → Assignments → + Assign policy
- 1.2Scope: chọn subscription hoặc resource group lab → Policy definition: tìm "Require a tag on resources"
- 1.3Parameters → Tag Name:
env→ Effect: Audit - 1.4Remediation: check "Create a remediation task" nếu policy hỗ trợ → Review + Create
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"
Gán Policy "Allowed locations" (Deny effect)
- 2.1Policy → Assignments → + Assign policy → Definition: "Allowed locations"
- 2.2Parameters → Allowed locations: chọn Southeast Asia và East Asia
- 2.3Effect mặc định: Deny → lưu ý policy này sẽ chặn tạo resource ở region khác
- 2.4Test: thử tạo resource ở East US → quan sát thông báo lỗi Deny
# 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
(RequestDisallowedByPolicy) Resource 'rg-test-deny' was disallowed by policy.
PolicyDefinitionId: /providers/Microsoft.Authorization/policyDefinitions/xxxx
PolicyAssignmentName: allowed-locations-sea
Kiểm tra Non-Compliant Resources và tạo Remediation Task
- 3.1Policy → Compliance → xem assignment "require-env-tag" → click để xem resource non-compliant
- 3.2Click assignment → tab Remediation → + Create remediation task
- 3.3Policy: chọn policy "Inherit a tag from the resource group" (effect: Modify) → scope → Create
- 3.4Remediation Tasks → theo dõi trạng thái: Evaluating → Deploying → Succeeded
# 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}"
Tạo Policy Initiative (gộp nhiều policy)
- 4.1Policy → Authoring → Definitions → + Initiative definition
- 4.2Name:
AZ500-Baseline-Governance→ Category: Security - 4.3Thêm policies: "Require a tag", "Allowed locations", "Audit VMs without backup" → Save
- 4.4Assignments → Assign initiative → gán vào subscription scope → Review + Create
# 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
# 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
Compliance Dashboard hiển thị resource thiếu tag là NonCompliant
Tạo resource ở East US → lỗi RequestDisallowedByPolicy
Tag env=lab được tự động thêm vào resource thiếu tag
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.