Lý Thuyết Cốt Lõi
1. Management Groups — Phân Cấp Quản Lý
Management Groups là lớp quản lý cao nhất trong Azure, cho phép nhóm nhiều subscription lại để áp dụng Policy và RBAC đồng nhất. Mọi Policy hay RBAC gán ở Management Group sẽ kế thừa xuống toàn bộ subscription và resource bên trong.
- • Root Management Group: tự động tồn tại, 1 per tenant, chứa mọi thứ
- • MG có thể lồng nhau tối đa 6 cấp (không tính root)
- • Mỗi MG/sub chỉ có 1 parent duy nhất
- • Subscription có thể di chuyển giữa các MG
- • Doanh nghiệp nhiều sub: Prod / NonProd / Sandbox
- • Bắt buộc policy data residency (chỉ deploy tại region VN)
- • Tập trung audit log, Cost Management, Security Center
- • Gán Owner-level RBAC cho CTO ở root MG
2. Policy Definition — Định Nghĩa Chính Sách
Policy Definition là một file JSON mô tả điều kiện (if) và hành động (then) khi resource không tuân thủ. Azure cung cấp hàng nghìn built-in definitions; bạn cũng có thể tạo custom.
| Effect | Mô tả | Thời điểm đánh giá |
|---|---|---|
| Deny | Từ chối tạo/cập nhật resource không tuân thủ | Lúc deploy (PUT/PATCH) |
| Audit | Tạo warning log, không chặn. Dùng cho báo cáo | Lúc deploy + scan định kỳ |
| Append | Thêm field vào request (VD: thêm tag tự động) | Lúc deploy |
| Modify | Thêm/sửa/xóa tags hoặc properties | Lúc deploy + remediation |
| DeployIfNotExists | Tự động deploy resource bổ trợ nếu chưa có | Sau deploy (async) |
| AuditIfNotExists | Audit nếu resource liên quan không tồn tại | Sau deploy (async) |
- •
policyRule.if: điều kiện (field, allOf, anyOf, not) - •
policyRule.then.effect: action khi vi phạm - •
parameters: tham số đầu vào tái sử dụng - •
mode: All (mọi resource) hoặc Indexed (chỉ resource có tag/location)
- • Policy mới assign: Azure scan toàn bộ resource trong scope (~30 phút)
- • Scan tự động mỗi 24 giờ
- • Trigger manual:
az policy state trigger-scan - • Resource vi phạm: trạng thái "Non-compliant" trong Policy Compliance dashboard
3. Initiative Definition (Policy Set) — Nhóm Chính Sách
Initiative Definition là tập hợp nhiều Policy Definitions lại để gán một lần (thay vì gán từng policy riêng lẻ). Khi tổ chức cần tuân thủ một chuẩn (ISO 27001, NIST, PCI-DSS), dùng built-in initiative tiết kiệm rất nhiều công sức.
Azure cung cấp sẵn: CIS Microsoft Azure Foundations, ISO 27001, NIST SP 800-53, PCI DSS v4, Azure Security Benchmark.
Tạo initiative riêng nhóm các policy tự viết + built-in. Ví dụ: "VN Data Residency" gồm 5 policy enforce region + tag.
Gán initiative lên Management Group, Subscription, hoặc Resource Group. Scope càng cao, phủ rộng càng nhiều.
4. Scope Initiative & Policy Assignment
- • Management Group: áp cho toàn bộ sub bên dưới
- • Subscription: áp cho toàn bộ RG trong sub đó
- • Resource Group: áp cho resource trong RG
- • Resource: áp cho 1 resource duy nhất (hiếm dùng)
- • Policy effect
ModifyvàDeployIfNotExistscần Managed Identity - • Azure tự tạo System-assigned MI khi assign policy
- • Cần gán role phù hợp (VD: Contributor) cho MI
- • Remediation Task: áp policy lên resource đang vi phạm hiện có
Parameters cho phép tái sử dụng policy definition với các giá trị khác nhau. VD: policy "allowed-locations" có parameter listOfAllowedLocations — khi assign, chỉ định danh sách region được phép.
Portal → Policy → Compliance → xem tỷ lệ tuân thủ theo policy, initiative, resource. Export report ra CSV. Drill-down từng resource để xem lý do vi phạm và gợi ý fix.
Bài Tập Thực Hành (Lab)
Tạo Management Group và Resource Group
# Lấy Tenant ID và Subscription ID
TENANT_ID=$(az account show --query tenantId -o tsv)
SUB_ID=$(az account show --query id -o tsv)
echo "Tenant: $TENANT_ID | Sub: $SUB_ID"
# Tạo Management Group "HoaTranLab-NonProd"
az account management-group create \
--name "HoaTranLab-NonProd" \
--display-name "HoaTranLab NonProd"
# Di chuyển subscription hiện tại vào Management Group
az account management-group subscription add \
--name "HoaTranLab-NonProd" \
--subscription $SUB_ID
# Tạo Resource Group cho lab
az group create \
--name rg-az104-m04 \
--location southeastasia \
--tags Course=AZ-104 Module=04 Environment=Lab
Tạo Custom Policy Definition — Bắt buộc tag "CostCenter"
SUB_ID=$(az account show --query id -o tsv)
# Tạo policy rule JSON
cat > /tmp/require-costcenter-tag.json << 'EOF'
{
"if": {
"allOf": [
{
"field": "type",
"notEquals": "Microsoft.Resources/resourceGroups"
},
{
"field": "tags['CostCenter']",
"exists": "false"
}
]
},
"then": {
"effect": "deny"
}
}
EOF
# Tạo policy definition ở subscription scope
az policy definition create \
--name "require-costcenter-tag" \
--display-name "Yêu cầu tag CostCenter trên mọi resource" \
--description "Từ chối tạo resource nếu không có tag CostCenter" \
--rules /tmp/require-costcenter-tag.json \
--mode All \
--subscription $SUB_ID
echo "Policy definition created: require-costcenter-tag"
Tạo Initiative Definition và Assign lên Resource Group
SUB_ID=$(az account show --query id -o tsv)
# Lấy ID của custom policy definition vừa tạo
POLICY_ID=$(az policy definition show \
--name "require-costcenter-tag" \
--query id -o tsv)
echo "Policy ID: $POLICY_ID"
# Tạo initiative definition JSON
cat > /tmp/hoatranlab-governance-initiative.json << EOF
[
{
"policyDefinitionId": "$POLICY_ID",
"policyDefinitionReferenceId": "requireCostCenterTag"
},
{
"policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/0a914e76-4921-4c19-b460-a2d36003525a",
"policyDefinitionReferenceId": "auditVMWithoutManagedDisk"
}
]
EOF
# Tạo initiative definition
az policy set-definition create \
--name "hoatranlab-governance" \
--display-name "HoaTranLab Governance Initiative" \
--description "Nhóm policy quản trị cơ bản cho HoaTranLab" \
--definitions /tmp/hoatranlab-governance-initiative.json \
--subscription $SUB_ID
# Assign initiative lên Resource Group
az policy assignment create \
--name "governance-rg-m04" \
--display-name "HoaTranLab Governance — rg-az104-m04" \
--policy-set-definition "hoatranlab-governance" \
--scope "/subscriptions/$SUB_ID/resourceGroups/rg-az104-m04"
echo "Initiative assigned to rg-az104-m04"
Kiểm tra Policy hoạt động và xem Compliance Report
SUB_ID=$(az account show --query id -o tsv)
# Thử tạo storage account KHÔNG có tag CostCenter — kỳ vọng bị DENY
az storage account create \
--name "stm04nodeny$(date +%s | tail -c 5)" \
--resource-group rg-az104-m04 \
--location southeastasia \
--sku Standard_LRS \
--kind StorageV2
# Kỳ vọng: RequestDisallowedByPolicy error
# Tạo storage account CÓ tag CostCenter — kỳ vọng thành công
az storage account create \
--name "stm04ok$(date +%s | tail -c 5)" \
--resource-group rg-az104-m04 \
--location southeastasia \
--sku Standard_LRS \
--kind StorageV2 \
--tags CostCenter=IT-001 Course=AZ-104 Module=04
# Trigger policy compliance scan thủ công
az policy state trigger-scan \
--resource-group rg-az104-m04
# Xem compliance summary
az policy state summarize \
--resource-group rg-az104-m04 \
--query "value[0].results" -o json
Cleanup — Dọn dẹp tài nguyên
SUB_ID=$(az account show --query id -o tsv)
# Xóa policy assignment trước
az policy assignment delete \
--name "governance-rg-m04" \
--scope "/subscriptions/$SUB_ID/resourceGroups/rg-az104-m04"
# Xóa initiative definition
az policy set-definition delete \
--name "hoatranlab-governance" \
--subscription $SUB_ID
# Xóa custom policy definition
az policy definition delete \
--name "require-costcenter-tag" \
--subscription $SUB_ID
# Gỡ subscription khỏi Management Group
az account management-group subscription remove \
--name "HoaTranLab-NonProd" \
--subscription $SUB_ID
# Xóa Management Group
az account management-group delete \
--name "HoaTranLab-NonProd"
# Xóa Resource Group (xóa toàn bộ resource bên trong)
az group delete --name rg-az104-m04 --yes --no-wait
Kết Quả Đầu Ra
Xây dựng hierarchy MG, di chuyển subscription, hiểu kế thừa policy/RBAC từ MG xuống sub
Tạo policy JSON với effect Deny, Audit, Modify; sử dụng parameters tái sử dụng
Nhóm nhiều policy thành 1 initiative, gán lên scope phù hợp để quản lý tập trung
Nắm rõ Deny, Audit, Append, Modify, DeployIfNotExists, AuditIfNotExists và khi nào dùng mỗi loại
Đọc hiểu compliance dashboard, trigger scan thủ công, drill-down non-compliant resource
Gán policy đúng scope, thêm exclusion cho resource đặc biệt, hiểu thứ tự ưu tiên
Ứng Dụng Thực Tế
Tình huống 1: Tập đoàn tài chính VN — Data Residency bắt buộc
Theo quy định Ngân hàng Nhà nước, dữ liệu khách hàng phải lưu trong lãnh thổ VN. Cần enforce toàn bộ 5 subscription chỉ deploy tại southeastasia.
Tạo Management Group "FinancialGroup-VN". Assign built-in policy "Allowed locations" với giá trị ["southeastasia"] lên MG. 5 subscription bên dưới tự động bị chặn deploy ngoài region VN.
Initiative "VN-Financial-Compliance" gồm: allowed-locations + require-tag-DataClassification + audit-storage-no-public-access. Gán lên MG, remediation task xử lý resource cũ.
100% tự động enforce. Compliance report xuất CSV nộp kiểm toán. Không cần training nhân viên về quy định — Azure Policy đảm bảo thay. Mọi vi phạm bị chặn trước khi xảy ra.
Tình huống 2: Công ty sản xuất — Tag bắt buộc cho Cost Allocation
CFO yêu cầu phân bổ chi phí Azure theo từng nhà máy (HCM, HN, DN). Không có tag thống nhất, báo cáo chi phí rất khó.
Custom policy effect "Deny" bắt buộc tag Factory (HCM/HN/DN) và CostCenter. Custom policy effect "Modify" tự động inherit tag từ Resource Group xuống resource con nếu resource thiếu tag.
Assign policy tại Subscription level. Remediation task chạy 1 lần để fix resource hiện có không có tag. Cost Management → Cost Analysis → group by tag Factory → thấy ngay chi phí từng nhà máy.
CFO có báo cáo chi phí theo nhà máy real-time. Phân bổ ngân sách IT chính xác. Phát hiện nhà máy nào đang tiêu vốn quá mức. Giảm chi phí Azure 20-30% nhờ visibility tốt hơn.
Tình huống 3: Trường đại học — Môi trường Dev/Prod tách biệt
Sinh viên cần môi trường thực hành tự do, nhưng môi trường Production phải được bảo vệ nghiêm ngặt. Một policy cho tất cả không phù hợp.
Management Group "University-VN" → 2 sub-MG: "Production" và "Education". Production: initiative ISO 27001 + allowed VM sizes (Standard_B2s trở xuống) + require-https. Education: chỉ allowed-locations, không Deny.
Policy "allowed-vm-sku" ở Education MG giới hạn VM size nhỏ để tiết kiệm chi phí. Budget alert $100/tháng/sinh viên. Sandbox subscription tự động xóa resource sau 7 ngày dùng Azure Automation.
Sinh viên thực hành tự do trong giới hạn. Production data hoàn toàn cách ly. Chi phí học tập kiểm soát được. IT Admin quản lý 2 môi trường từ 1 Management Group.