LAB 13 ~60 phút Chương 3 AZ-500 Entra ID P2

PIM Approval Workflow

Thêm bước phê duyệt vào quy trình kích hoạt PIM role — user gửi yêu cầu, approver nhận thông báo và duyệt/từ chối. Mọi hành động ghi vào audit log. Kiểm soát quyền cao theo chuẩn Zero Trust 2026.

🎯 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.

User request
az500-admin01
Pending
PIM queue
Approver
az500-secops01

📋 Chuẩn Bị

Yêu cầu:
  • 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
Lưu ý:
  • 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

1

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.

Cách 1 — Portal
  1. 1.1PIM → Azure resources → rg-az500-rbacSettings
  2. 1.2Click vào role Contributor → click Edit
  3. 1.3Tab Approval → bật Require approval to activate
  4. 1.4Select approver(s): click + Add approvers → tìm az500-secops01 → Select
  5. 1.5Tab Notification: đảm bảo Send email to approver đang bật
  6. 1.6Click Update
Cách 2 — Azure CLI
Azure CLI— Lấy ID approver để dùng trong role policy
# 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
Lưu ý: Sau khi bật approval, user hiện có eligible assignment sẽ phải qua approval mỗi lần activate — không thể tự activate như Lab 12.
2

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.

Cách 1 — Portal (dùng az500-admin01)
  1. 2.1Incognito → đăng nhập az500-admin01 → PIM → My roles
  2. 2.2Tab Azure resource roles → Contributor → click Activate
  3. 2.3Duration: 2 hours
  4. 2.4Reason: "Cần deploy infrastructure mới cho dự án Lab AZ-500"
  5. 2.5Click Activate → xác thực MFA
  6. 2.6Quan sát: status chuyển sang Pending approval (không phải Active)
  7. 2.7PIM → My requests → xem request đang Pending
Cách 2 — Azure CLI
Azure CLI— Gửi activation request (dùng az500-admin01)
# Đă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
3

Approver Duyệt Yêu Cầu

Đăng nhập bằng az500-secops01 (approver) và duyệt yêu cầu từ admin01.

Cách 1 — Portal (dùng az500-secops01)
  1. 3.1Incognito khác → đăng nhập az500-secops01
  2. 3.2PIM → Approve requests (menu trái)
  3. 3.3Tab Azure resource roles → thấy request từ az500-admin01 với reason đã nhập
  4. 3.4Tick checkbox → click Approve
  5. 3.5Justification for approval: "Approved — verified with requestor via Teams"
  6. 3.6Click Confirm
  7. 3.7Quay lại tab az500-admin01 → My roles → Active assignments → thấy Contributor đã active
Cách 2 — Azure CLI
Azure CLI— Xem pending requests (dùng az500-secops01)
# Đă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\"
  }"
4

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.

Cách 1 — Portal
  1. 4.1az500-admin01: Deactivate Contributor hiện tại (My roles → Active → Deactivate)
  2. 4.2az500-admin01: Gửi request mới với reason ngắn: "test"
  3. 4.3az500-secops01: PIM → Approve requests → chọn request mới
  4. 4.4Click Deny → Justification: "Reason insufficient — vague justification"
  5. 4.5Quan sát: az500-admin01 My requests → trạng thái = Denied
  6. 4.6Kiểm tra email thông báo deny gửi về admin01
5

Xem Audit Log — Toàn bộ lịch sử

Cách 1 — Portal
  1. 5.1PIM (admin account) → Azure resources → rg-az500-rbacAudit resource
  2. 5.2Thấy các events: "Member submitted request", "Approver approved request", "Member activated role", "Approver denied request"
  3. 5.3Mỗi event có: requestor, approver, timestamp, justification — đầy đủ để compliance audit
  4. 5.4Export audit log: click Download → CSV để lưu hồ sơ
Cách 2 — Azure CLI
Azure CLI— Xem lịch sử requests tại scope RG
# 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
Kết quả (Output)— audit log mẫu
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

Cách 1 — Portal
  1. 1PIM → Settings → Contributor → Edit → Approval → tắt Require approval → Update (để trả về trạng thái ban đầu)
  2. 2PIM → Assignments → Eligible → xóa eligible assignment của az500-admin01
  3. 3Nếu không dùng Lab 14: xóa rg-az500-rbac

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

Approval workflow cấu hình đúng

Role settings hiển thị "Require approval: Yes", approver = az500-secops01

Request được phê duyệt thành công

My requests → status Approved, role active trong Active assignments

Request bị từ chối thành công

My requests → status Denied, user không có active role

Audit log đầy đủ

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".

Lab 12: PIM Eligible Thư viện Labs Lab 14: Access Review
Zalo