🎯 Mục Tiêu Lab
Tạo Named Location loại Country dựa trên IP geolocation của Microsoft
Xây dựng CA policy chặn tất cả location ngoài Việt Nam
Loại trừ break-glass account và áp dụng cho nhóm user lab
Chạy Report-only mode và kiểm tra bằng What If trước khi enforce
Phân tích sign-in log để xác nhận location-based blocking hoạt động
Hiểu hạn chế của country-based blocking (VPN bypass, IP geolocation accuracy)
📋 Chuẩn Bị
- Quyền Conditional Access Administrator hoặc Global Admin
- Đã hoàn thành Lab 05-06 (có group và CA policy mẫu)
- Entra ID P1/P2 license (Named Location cần CA)
- Break-glass account đã chuẩn bị sẵn (từ Lab 05)
- LUÔN test Report-only trước — sai policy có thể khóa toàn tenant
- Country blocking dựa trên IP geolocation — VPN có thể bypass
- Nếu bạn đang ở nước ngoài khi test → dùng break-glass để thoát
- Không nên block All users — chỉ apply cho nhóm lab cụ thể
🏗️ Kịch Bản
Công ty HoaTranLab Corp có chính sách: nhân viên chỉ được truy cập tài nguyên Azure từ Việt Nam. Security audit phát hiện một số tài khoản đăng nhập bất thường từ nước ngoài. Bạn cần triển khai Conditional Access policy chặn tất cả đăng nhập ngoài lãnh thổ Việt Nam cho nhóm GRP-AZ500-SecOps, áp dụng Report-only 24h, sau đó dùng What If để mô phỏng kết quả trước khi bật thật.
🧪 Các Bước Thực Hiện
Tạo Named Location — Vietnam (Country-based)
- 1.1Entra ID → Security → Conditional Access → Named locations
- 1.2Click + Countries location (không phải IP range)
- 1.3Name:
NL-AZ500-Vietnam - 1.4Tìm và chọn Vietnam (VN) từ danh sách quốc gia
- 1.5Determine location by: IP address (IPv4 and IPv6)
- 1.6Create → Xác nhận Named Location xuất hiện trong danh sách
Connect-MgGraph -Scopes "Policy.ReadWrite.ConditionalAccess"
# Tạo Named Location — Việt Nam
$params = @{
"@odata.type" = "#microsoft.graph.countryNamedLocation"
displayName = "NL-AZ500-Vietnam"
countriesAndRegions = @("VN")
includeUnknownCountriesAndRegions = $false
}
$location = New-MgIdentityConditionalAccessNamedLocation -BodyParameter $params
Write-Host "Named Location ID: $($location.Id)"
# Xác nhận
Get-MgIdentityConditionalAccessNamedLocation |
Where-Object { $_.DisplayName -like "*Vietnam*" } |
Select-Object Id, DisplayName
NL-AZ500-Vietnam xuất hiện trong danh sách, loại Country, quốc gia: Vietnam (VN).
Tạo CA Policy — Chặn Đăng Nhập Ngoài Việt Nam
- 2.1Conditional Access → New policy
- 2.2Name:
CA-AZ500-BlockOutsideVietnam - 2.3Users: Include → Groups →
GRP-AZ500-SecOps→ Exclude break-glass account - 2.4Target resources: All cloud apps
- 2.5Conditions → Locations: Include → Any location; Exclude → Selected locations → chọn
NL-AZ500-Vietnam - 2.6Grant: Block access
- 2.7Enable policy: Report-only → Save
$groupId = (Get-MgGroup -Filter "DisplayName eq 'GRP-AZ500-SecOps'").Id
$bgId = (Get-MgUser -Filter "UserPrincipalName eq '[email protected]'").Id
$locationId = (Get-MgIdentityConditionalAccessNamedLocation `
-Filter "displayName eq 'NL-AZ500-Vietnam'").Id
$params = @{
displayName = "CA-AZ500-BlockOutsideVietnam"
state = "enabledForReportingButNotEnforced" # Report-only
conditions = @{
users = @{
includeGroups = @($groupId)
excludeUsers = @($bgId)
}
applications = @{ includeApplications = @("All") }
locations = @{
includeLocations = @("All")
excludeLocations = @($locationId) # Exclude VN = chặn ngoài VN
}
}
grantControls = @{
operator = "OR"
builtInControls = @("block")
}
}
New-MgIdentityConditionalAccessPolicy -BodyParameter $params
Write-Host "CA-AZ500-BlockOutsideVietnam created (Report-only)"
Kiểm Tra Bằng What If Tool
- 3.1Conditional Access → What If
- 3.2Test 1 — User từ nước ngoài: User = az500-secops01, Cloud app = All, IP address =
1.1.1.1(Cloudflare DNS, USA) → Run → xác nhận policy: Block - 3.3Test 2 — User từ VN: IP =
118.70.0.1(FPT Telecom VN) → Run → xác nhận policy: Not applied (user được phép) - 3.4Test 3 — Break-glass: User = az500-breakglass → Run → xác nhận Not applied (đã exclude)
Connect-MgGraph -Scopes "AuditLog.Read.All"
# Xem sign-in log và trạng thái CA policy (Report-only)
$userId = (Get-MgUser -Filter "UserPrincipalName eq '[email protected]'").Id
Get-MgAuditLogSignIn -Filter "userId eq '$userId'" -Top 10 |
Select-Object CreatedDateTime,
@{N="Location";E={"$($_.Location.City), $($_.Location.CountryOrRegion)"}},
@{N="IPAddress";E={$_.IpAddress}},
@{N="CAStatus";E={$_.ConditionalAccessStatus}} |
Format-Table -AutoSize
Bật Policy On và Xem Sign-in Log
- 4.1Sau khi Report-only log xác nhận đúng → Conditional Access → chọn policy → Enable policy: On → Save
- 4.2Kiểm tra: đăng nhập bằng az500-secops01 → quan sát bị block với thông báo "Access has been blocked"
- 4.3Sign-in logs → click vào event bị block → tab Conditional Access → xem policy: Failure, Reason: Block
Sign-in Event (bị block từ nước ngoài):
Status : Failure
Error Code : 53003
Error Description : Access has been blocked due to conditional access policies
Conditional Access : CA-AZ500-BlockOutsideVietnam → Applied → Block
IP Address : 1.1.1.1
Location : [US] — Not in NL-AZ500-Vietnam
Sign-in Event (từ VN — được phép):
Status : Success
Conditional Access : CA-AZ500-BlockOutsideVietnam → Not applied
IP Address : 118.70.x.x
Location : [VN] — Matches NL-AZ500-Vietnam exclude
📊 Kết Quả Đầu Ra
NL-AZ500-Vietnam hiển thị loại Country, quốc gia VN
Policy trạng thái On, Block location ngoài NL-AZ500-Vietnam
IP nước ngoài → Block, IP VN → Not applied, break-glass → Not applied
Error 53003 xuất hiện cho đăng nhập từ ngoài VN
🧹 Dọn Dẹp
# Tắt policy sau khi lab (giữ Named Location để tái sử dụng)
$policyId = (Get-MgIdentityConditionalAccessPolicy `
-Filter "displayName eq 'CA-AZ500-BlockOutsideVietnam'").Id
Update-MgIdentityConditionalAccessPolicy `
-ConditionalAccessPolicyId $policyId `
-State "disabled"
Write-Host "Policy disabled — Named Location preserved for reuse"
❓ Câu Hỏi Ôn Tập
1. Có 2 loại Named Location trong Entra ID — đó là gì và khi nào dùng loại nào?
Gợi ý: IP range (dùng cho office IP cố định, có thể mark as Trusted) và Countries location (dùng cho geoblocking theo quốc gia)
2. Tại sao logic của policy là Include = All locations, Exclude = Vietnam mà kết quả lại là "block ngoài VN"?
Gợi ý: CA conditions: Include All → Exclude VN = kết quả condition match = "mọi location NGOẠI TRỪ VN" → Grant = Block
3. Country-based blocking có thể bị bypass bằng phương pháp nào?
Gợi ý: VPN với exit node tại Việt Nam — IP geolocation chỉ dựa trên IP, không xác minh vị trí thật. Giải pháp tốt hơn: kết hợp với device compliance hoặc sign-in risk
4. Error code 53003 trong sign-in log có nghĩa là gì?
Gợi ý: Access has been blocked due to Conditional Access policies — đây là error code chuẩn cho CA block
5. "Trusted Location" trong Named Location có lợi ích gì thêm so với location thường?
Gợi ý: Trusted Location được dùng trong Sign-in Risk evaluation — đăng nhập từ trusted location được coi là ít rủi ro hơn, có thể dùng làm điều kiện bypass MFA