🎯 Mục Tiêu Lab
Tạo Dynamic Security Group GRP-AZ500-DYN-Security với membership tự động
Viết dynamic membership rule dựa trên thuộc tính Department = "Security"
Xác nhận az500-admin01 và az500-secops01 được tự động thêm vào group
Thay đổi Department của az500-dev01 → "Security" và quan sát auto-join
Đổi lại Department → "Engineering" và quan sát auto-remove
Sử dụng Rule Builder và Advanced Rule Editor trong Portal
📋 Chuẩn Bị
- Hoàn thành Lab 02 (user az500-* đã sẵn sàng)
- Microsoft Entra ID P1 hoặc P2 license (Dynamic Group yêu cầu P1+)
- Quyền Groups Administrator hoặc Global Administrator
- User az500-admin01 và az500-secops01 có Department = "Security"
- Dynamic group membership xử lý không đồng bộ — chờ 5–10 phút sau khi thay đổi
- Dynamic group KHÔNG cho phép add member thủ công
- Rule syntax phân biệt chữ hoa/thường: "Security" ≠ "security"
- Nếu chưa có P1/P2: dùng Azure AD trial hoặc Microsoft 365 E3 trial 30 ngày
🏗️ Kịch bản & Tài Nguyên
Doanh nghiệp muốn khi một nhân viên chuyển sang phòng Security, họ tự động được cấp quyền truy cập security tools mà không cần helpdesk can thiệp. Dynamic group là cơ chế tự động hóa đó — mọi quyền gán cho group sẽ tự động áp dụng khi user join/leave.
🧪 Các Bước Thực Hiện
Tạo Dynamic Security Group với Membership Rule
1. Portal → Microsoft Entra ID → Groups → + New group 2. Group type: Security Group name: GRP-AZ500-DYN-Security Description: Dynamic group - auto membership for Security department Membership type: Dynamic User ← QUAN TRỌNG: chọn "Dynamic User" 3. Click "Add dynamic query" 4. Chọn tab "Configure rules": Property: department Operator: Equals Value: Security → Click "Add expression" 5. Xem Rule syntax (tab "Advanced rule"): (user.department -eq "Security") 6. Click "Save" → Create 7. Chờ 5–10 phút → quay lại group → Members → Xác nhận az500-admin01 và az500-secops01 xuất hiện tự động
# Tạo dynamic group qua Microsoft Graph API
az rest \
--method POST \
--url "https://graph.microsoft.com/v1.0/groups" \
--headers "Content-Type=application/json" \
--body '{
"displayName": "GRP-AZ500-DYN-Security",
"description": "Dynamic group - auto membership for Security department",
"groupTypes": ["DynamicMembership"],
"mailEnabled": false,
"mailNickname": "GRP-AZ500-DYN-Security",
"securityEnabled": true,
"membershipRule": "(user.department -eq \"Security\")",
"membershipRuleProcessingState": "On"
}'
# Lấy group ID để kiểm tra membership sau
GROUP_ID=$(az ad group show --group "GRP-AZ500-DYN-Security" --query id -o tsv)
echo "Group ID: $GROUP_ID"
Kiểm Tra Dynamic Membership Sau Khi Rule Xử Lý
Sau khi tạo group, Entra ID sẽ xử lý rule trong nền. Chờ 5–10 phút rồi kiểm tra kết quả.
1. Portal → Microsoft Entra ID → Groups → GRP-AZ500-DYN-Security 2. Overview → xem "Membership processing status" → Trạng thái: "Update complete" hoặc "Processing" 3. Members tab → xác nhận thành viên: ✓ AZ500 Admin 01 (Department: Security) ✓ AZ500 SecOps 01 (Department: Security) ✗ AZ500 Dev 01 (Department: Engineering — không khớp rule) 4. Thử click "+ Add members" → nhận thông báo: "Members cannot be added to a group with dynamic membership" → Đây là hành vi đúng — dynamic group không cho add thủ công
GROUP_ID=$(az ad group show --group "GRP-AZ500-DYN-Security" --query id -o tsv)
# Kiểm tra membership hiện tại
az ad group member list \
--group "GRP-AZ500-DYN-Security" \
--query "[].{Name:displayName, UPN:userPrincipalName, Dept:department}" \
--output table
# Kiểm tra trạng thái xử lý dynamic membership qua Graph API
az rest \
--method GET \
--url "https://graph.microsoft.com/v1.0/groups/$GROUP_ID?select=displayName,membershipRule,membershipRuleProcessingState" \
--query "{Name:displayName, Rule:membershipRule, State:membershipRuleProcessingState}"
{
"Name": "GRP-AZ500-DYN-Security",
"Rule": "(user.department -eq \"Security\")",
"State": "On"
}
Members:
Name UPN Dept
---------------- ------------------------------------- --------
AZ500 Admin 01 [email protected] Security
AZ500 SecOps 01 [email protected] Security
Kiểm Tra Auto-Join: Thay Đổi Department của az500-dev01
Thay đổi Department của az500-dev01 từ "Engineering" → "Security" và quan sát user tự động được thêm vào group sau vài phút.
1. Portal → Microsoft Entra ID → Users → az500-dev01 2. Edit Properties → Department: đổi "Engineering" → "Security" 3. Save 4. Chờ 5–10 phút 5. Quay lại GRP-AZ500-DYN-Security → Members → Xác nhận AZ500 Dev 01 đã xuất hiện trong danh sách
DOMAIN=$(az ad signed-in-user show --query userPrincipalName -o tsv | cut -d'@' -f2)
USER_ID=$(az ad user show --id "az500-dev01@$DOMAIN" --query id -o tsv)
# Cập nhật Department thông qua Microsoft Graph
az rest \
--method PATCH \
--url "https://graph.microsoft.com/v1.0/users/$USER_ID" \
--headers "Content-Type=application/json" \
--body '{"department": "Security"}'
echo "Department updated. Waiting for dynamic group processing (5-10 min)..."
# Kiểm tra membership sau khi chờ
sleep 60
az ad group member list \
--group "GRP-AZ500-DYN-Security" \
--query "[].{Name:displayName, Dept:department}" \
--output table
Kiểm Tra Auto-Remove: Hoàn Nguyên Department về "Engineering"
DOMAIN=$(az ad signed-in-user show --query userPrincipalName -o tsv | cut -d'@' -f2)
USER_ID=$(az ad user show --id "az500-dev01@$DOMAIN" --query id -o tsv)
# Hoàn nguyên Department về Engineering
az rest \
--method PATCH \
--url "https://graph.microsoft.com/v1.0/users/$USER_ID" \
--headers "Content-Type=application/json" \
--body '{"department": "Engineering"}'
echo "Department reverted. After 5-10 min, az500-dev01 should be removed from group."
# Xác minh sau khi chờ: group chỉ còn admin01 và secops01
az ad group member list \
--group "GRP-AZ500-DYN-Security" \
--query "[].{Name:displayName, Dept:department}" \
--output table
Khám Phá Advanced Rule — Kết Hợp Nhiều Điều Kiện
Thực hành viết rule phức tạp hơn: kết hợp department VÀ jobTitle để giới hạn chỉ Security Administrator mới vào group.
1. Portal → GRP-AZ500-DYN-Security → Dynamic membership rules 2. Edit rule → chuyển sang tab "Advanced rule" 3. Dán rule kết hợp: (user.department -eq "Security") and (user.jobTitle -eq "Security Administrator") 4. Click "Validate rules" → nhập UPN của az500-admin01 → xem kết quả 5. Click "Save" → quan sát membership thay đổi (chỉ còn admin01) Ví dụ rule phổ biến khác: # Tất cả user có tên chứa "az500" user.displayName -contains "AZ500" # User thuộc Security HOẶC Compliance (user.department -eq "Security") or (user.department -eq "Compliance") # User có jobTitle bất kỳ trong Security user.department -eq "Security" -and user.accountEnabled -eq true
🧹 Dọn Dẹp Tài Nguyên
Hoàn nguyên Department của az500-dev01 về "Engineering" (nếu chưa làm ở Bước 4). Giữ lại GRP-AZ500-DYN-Security cho các lab tham khảo sau.
DOMAIN=$(az ad signed-in-user show --query userPrincipalName -o tsv | cut -d'@' -f2)
USER_ID=$(az ad user show --id "az500-dev01@$DOMAIN" --query id -o tsv)
# Đảm bảo az500-dev01 trở về Engineering
az rest --method PATCH \
--url "https://graph.microsoft.com/v1.0/users/$USER_ID" \
--headers "Content-Type=application/json" \
--body '{"department": "Engineering"}'
# Xóa dynamic group khi kết thúc khóa học
# az ad group delete --group "GRP-AZ500-DYN-Security"
📊 Kết Quả Đầu Ra Lab 03
GRP-AZ500-DYN-Security với membershipRuleProcessingState = "On"
admin01 và secops01 tự động vào group sau khi rule xử lý xong
dev01 tự động join khi Department đổi sang "Security"
dev01 tự động bị loại khi Department đổi về "Engineering"
Validate rules tool trong Portal kiểm tra đúng user nào match rule trước khi Save
❓ Câu Hỏi Ôn Tập
1. Dynamic Group yêu cầu license Microsoft Entra ID tối thiểu là gì?
Gợi ý: Microsoft Entra ID P1 (bao gồm trong Microsoft 365 E3, EMS E3, Azure AD Premium P1). Free tier không hỗ trợ dynamic group.
2. Tại sao không thể add member thủ công vào Dynamic Group?
Gợi ý: Membership được kiểm soát hoàn toàn bởi rule engine. Cho phép add thủ công sẽ gây xung đột với rule và tạo security gap. Thiết kế này là cố ý.
3. Dynamic Group membership được xử lý ngay lập tức hay có độ trễ? Tại sao điều này quan trọng trong bảo mật?
Gợi ý: Có độ trễ 5–10 phút (đôi khi lên đến 24 giờ với tenant lớn). Trong tình huống offboarding nhân viên khẩn cấp, cần disable account ngay, không chỉ dựa vào dynamic group.
4. Viết dynamic rule để lọc tất cả user có Department là "Security" VÀ account đang được kích hoạt (enabled)?
Gợi ý: (user.department -eq "Security") and (user.accountEnabled -eq true)
5. Sự khác nhau giữa "Assigned" membership và "Dynamic User" membership trong context bảo mật doanh nghiệp là gì?
Gợi ý: Assigned = thủ công, dễ sai sót/bị quên cập nhật khi user chuyển bộ phận. Dynamic = tự động theo HR data, giảm rủi ro quyền thừa (over-privileged) nhưng phụ thuộc vào dữ liệu thuộc tính chính xác.