🎯 Mục Tiêu Lab
Cấu hình Approval trong PIM role settings — chỉ định approver cụ thể
User gửi yêu cầu kích hoạt role kèm justification — trạng thái Pending
Approver nhận email thông báo, đăng nhập PIM và duyệt yêu cầu
Thực hành từ chối (Deny) yêu cầu và quan sát trạng thái thay đổi
Kiểm tra audit log: ghi nhận đầy đủ requester, approver, quyết định, timestamp
Hiểu luồng approval: Request → Pending → Approved/Denied → Active/Cancelled
🏗️ Kịch Bản
Công ty quy định: role Owner trên subscription cần có 4 mắt — người dùng không tự kích hoạt được, phải có Security Lead phê duyệt. Mô hình này ngăn insider threat: dù account bị compromise, kẻ tấn công cũng không thể tự leo thang lên Owner mà không qua approval.
az500-admin01
PIM queue
az500-secops01
📋 Chuẩn Bị
- Microsoft Entra ID P2 license
- User
az500-admin01— sẽ request activation - User
az500-secops01— sẽ là approver - Hoàn thành Lab 12 (PIM eligible assignment đã có)
- Email notification hoạt động cho cả 2 user
- Approval request hết hạn sau 24 giờ nếu không được duyệt
- Approver nhận email — cần mailbox hợp lệ để test
- Có thể chỉ định Group làm approver thay vì individual user
- Nếu không có approver nào available sau 24h, request tự hủy
🧪 Các Bước Thực Hiện
Bật Require Approval trong Role Settings
Cập nhật role settings của Contributor tại rg-az500-rbac để bật approval requirement.
- 1.1PIM → Azure resources →
rg-az500-rbac→ Settings - 1.2Click vào role Contributor → click Edit
- 1.3Tab Approval → bật Require approval to activate ✓
- 1.4Select approver(s): click + Add approvers → tìm az500-secops01 → Select
- 1.5Tab Notification: đảm bảo Send email to approver đang bật
- 1.6Click Update
# Lấy Object ID của az500-secops01 (approver)
APPROVER_ID=$(az ad user show \
--id [email protected] \
--query id -o tsv)
echo "Approver ID: $APPROVER_ID"
# Lấy Role Definition ID của Contributor
CONTRIBUTOR_DEF_ID=$(az role definition list \
--name "Contributor" \
--query "[0].id" -o tsv)
# Xem policy hiện tại của role tại scope RG
# (Approval workflow config chủ yếu qua Portal hoặc REST API)
az rest \
--method GET \
--url "https://management.azure.com${RG_ID}/providers/Microsoft.Authorization/roleManagementPolicies?api-version=2020-10-01" \
--query "value[0].{name:name, id:id}" -o json
User Gửi Yêu Cầu Kích Hoạt (Request)
Đăng nhập bằng az500-admin01 và gửi activation request — lần này sẽ vào hàng chờ Pending thay vì active ngay.
- 2.1Incognito → đăng nhập az500-admin01 → PIM → My roles
- 2.2Tab Azure resource roles → Contributor → click Activate
- 2.3Duration: 2 hours
- 2.4Reason: "Cần deploy infrastructure mới cho dự án Lab AZ-500"
- 2.5Click Activate → xác thực MFA
- 2.6Quan sát: status chuyển sang Pending approval (không phải Active)
- 2.7PIM → My requests → xem request đang Pending
# Đăng nhập bằng az500-admin01
az login --username [email protected]
REQUEST_ID=$(uuidgen)
# Gửi activation request (sẽ tạo Pending request khi approval required)
az rest \
--method PUT \
--url "https://management.azure.com${RG_ID}/providers/Microsoft.Authorization/roleAssignmentScheduleRequests/${REQUEST_ID}?api-version=2022-04-01-preview" \
--body "{
\"properties\": {
\"principalId\": \"$USER_ID\",
\"roleDefinitionId\": \"${RG_ID}/providers/Microsoft.Authorization/roleDefinitions/$CONTRIBUTOR_ID\",
\"requestType\": \"SelfActivate\",
\"justification\": \"Cần deploy infrastructure mới cho dự án Lab AZ-500\",
\"scheduleInfo\": {
\"expiration\": {
\"type\": \"AfterDuration\",
\"duration\": \"PT2H\"
}
}
}
}"
# Kiểm tra status của request
az rest \
--method GET \
--url "https://management.azure.com${RG_ID}/providers/Microsoft.Authorization/roleAssignmentScheduleRequests/${REQUEST_ID}?api-version=2022-04-01-preview" \
--query "properties.status" -o tsv
# → Kết quả: PendingApproval
Approver Duyệt Yêu Cầu
Đăng nhập bằng az500-secops01 (approver) và duyệt yêu cầu từ admin01.
- 3.1Incognito khác → đăng nhập az500-secops01
- 3.2PIM → Approve requests (menu trái)
- 3.3Tab Azure resource roles → thấy request từ az500-admin01 với reason đã nhập
- 3.4Tick checkbox → click Approve
- 3.5Justification for approval: "Approved — verified with requestor via Teams"
- 3.6Click Confirm
- 3.7Quay lại tab az500-admin01 → My roles → Active assignments → thấy Contributor đã active
# Đăng nhập bằng az500-secops01 (approver)
az login --username [email protected]
# Xem danh sách requests đang pending approval tại scope RG
az rest \
--method GET \
--url "https://management.azure.com${RG_ID}/providers/Microsoft.Authorization/roleAssignmentScheduleRequests?api-version=2022-04-01-preview" \
--query "value[?properties.status=='PendingApproval'].{id:name, requestor:properties.principalId, role:properties.roleDefinitionId, reason:properties.justification}" \
-o json
# Approve request (thay PENDING_REQUEST_ID bằng ID thực)
az rest \
--method POST \
--url "https://management.azure.com/providers/Microsoft.Authorization/roleAssignmentApprovalSteps/STEP_ID/approve?api-version=2021-01-01-preview" \
--body "{
\"reviewResult\": \"Approve\",
\"justification\": \"Approved — verified with requestor via Teams\"
}"
Thực hành Deny Request
Tạo request thứ hai và thực hành từ chối — quan sát trạng thái và thông báo.
- 4.1az500-admin01: Deactivate Contributor hiện tại (My roles → Active → Deactivate)
- 4.2az500-admin01: Gửi request mới với reason ngắn: "test"
- 4.3az500-secops01: PIM → Approve requests → chọn request mới
- 4.4Click Deny → Justification: "Reason insufficient — vague justification"
- 4.5Quan sát: az500-admin01 My requests → trạng thái = Denied
- 4.6Kiểm tra email thông báo deny gửi về admin01
Xem Audit Log — Toàn bộ lịch sử
- 5.1PIM (admin account) → Azure resources →
rg-az500-rbac→ Audit resource - 5.2Thấy các events: "Member submitted request", "Approver approved request", "Member activated role", "Approver denied request"
- 5.3Mỗi event có: requestor, approver, timestamp, justification — đầy đủ để compliance audit
- 5.4Export audit log: click Download → CSV để lưu hồ sơ
# Xem tất cả role assignment schedule requests tại scope (admin account)
az rest \
--method GET \
--url "https://management.azure.com${RG_ID}/providers/Microsoft.Authorization/roleAssignmentScheduleRequests?api-version=2022-04-01-preview" \
--query "value[].{requestor:properties.principalId, status:properties.status, role:properties.roleDefinitionId, created:properties.createdOn, justification:properties.justification}" \
-o table
# Xem audit events từ Azure Activity Log
az monitor activity-log list \
--resource-group rg-az500-rbac \
--start-time "$(date -u -d '1 day ago' '+%Y-%m-%dT%H:%M:%SZ' 2>/dev/null || date -u -v-1d '+%Y-%m-%dT%H:%M:%SZ')" \
--query "[?contains(operationName.value,'roleAssignment')].{time:eventTimestamp, op:operationName.value, caller:caller, status:status.value}" \
-o table
requestor status justification
------------------------------------- -------- -----------------------------------------
xxxxxxxx-admin01-object-id Approved Cần deploy infrastructure mới...
xxxxxxxx-admin01-object-id Denied test
🧹 Dọn Dẹp Tài Nguyên
- 1PIM → Settings → Contributor → Edit → Approval → tắt Require approval → Update (để trả về trạng thái ban đầu)
- 2PIM → Assignments → Eligible → xóa eligible assignment của az500-admin01
- 3Nếu không dùng Lab 14: xóa
rg-az500-rbac
📊 Kết Quả Đầu Ra Lab 13
Role settings hiển thị "Require approval: Yes", approver = az500-secops01
My requests → status Approved, role active trong Active assignments
My requests → status Denied, user không có active role
Audit resource ghi nhận 4 events với requestor, approver, justification, timestamp
❓ Câu Hỏi Ôn Tập
1. Tại sao approval workflow cho PIM quan trọng trong mô hình Zero Trust?
Gợi ý: Ngay cả khi account bị compromise, kẻ tấn công không thể tự leo thang quyền — phải có người thứ hai (approver) xác nhận.
2. Điều gì xảy ra với request nếu không có approver nào duyệt trong 24 giờ?
Gợi ý: Request tự động hết hạn (Expired) — user phải gửi request mới nếu vẫn cần quyền.
3. Có thể chỉ định Group làm approver thay vì individual user không?
Gợi ý: Có — khuyến nghị dùng Security Group để tránh single point of failure khi approver nghỉ. Bất kỳ member nào trong group đều có thể approve.
4. Approver có thể thấy request từ tất cả users hay chỉ users trong scope cụ thể?
Gợi ý: Approver chỉ thấy requests trong scope mà họ được chỉ định làm approver — không phải toàn bộ tenant.
5. Audit log của PIM có thể export và tích hợp với Microsoft Sentinel không?
Gợi ý: Có — thông qua Entra ID Audit Logs connector trong Sentinel. PIM events xuất hiện trong bảng AuditLogs với category "RoleManagement".