🎯 Mục Tiêu Lab
Tạo VNet với 2 subnet: PublicSubnet và PrivateSubnet
Bật Service Endpoint Microsoft.Storage trên PrivateSubnet
Tạo NSG với outbound rules: Allow Storage, Deny Internet cho PrivateSubnet
Giới hạn Storage Account chỉ cho phép PrivateSubnet, block mọi thứ khác
Kiểm tra: PrivateVM truy cập file share thành công, PublicVM bị từ chối
So sánh Service Endpoint vs Private Endpoint — biết khi nào dùng loại nào
📋 Chuẩn Bị
- Azure subscription với quyền Contributor
- Azure CLI hoặc Cloud Shell
- 2 VM Windows Server 2022 (tạo trong lab)
- Hiểu cơ bản VNet, Subnet, NSG
- VNet: 172.16.0.0/16 (Southeast Asia)
- PublicSubnet: 172.16.1.0/24 — không có service endpoint
- PrivateSubnet: 172.16.2.0/24 — có Microsoft.Storage endpoint
- NSG gắn vào PrivateSubnet: deny internet, allow storage
🏗️ Service Endpoint vs Private Endpoint
| Tiêu chí | Service Endpoint | Private Endpoint |
|---|---|---|
| IP address | Public IP của Azure service (qua backbone) | Private IP trong VNet của bạn |
| DNS | Giữ nguyên public DNS | DNS trỏ về private IP (privatelink) |
| Chi phí | Miễn phí | ~$7/tháng + ingress/egress |
| Từ on-premises | Không hỗ trợ | Hỗ trợ (qua VPN/ExpressRoute) |
| Cách ly mạng | Vẫn qua public endpoint của service | Hoàn toàn private, không qua internet |
| Cấu hình | Đơn giản, bật trên subnet | Phức tạp hơn, cần DNS zone |
| Khi nào dùng | Dev/test, workload Azure-only, quick win | Production, hybrid, compliance cao |
🧪 Các Bước Thực Hiện
Tạo VNet, Subnet & Service Endpoint
- 1.1Virtual Networks → Create → Name:
vnet-lab15→ Address space:172.16.0.0/16→ Southeast Asia - 1.2Subnets tab → Rename default →
PublicSubnet→172.16.1.0/24→ Service endpoints: (để trống) - 1.3+ Add subnet → Name:
PrivateSubnet→172.16.2.0/24→ Service endpoints: chọn Microsoft.Storage → Add → Review + Create
# Tạo resource group
az group create \
--name rg-lab15-endpoints \
--location southeastasia
# Tạo VNet với PublicSubnet
az network vnet create \
--resource-group rg-lab15-endpoints \
--name vnet-lab15 \
--address-prefix 172.16.0.0/16 \
--subnet-name PublicSubnet \
--subnet-prefix 172.16.1.0/24
# Tạo PrivateSubnet với Microsoft.Storage service endpoint
az network vnet subnet create \
--resource-group rg-lab15-endpoints \
--vnet-name vnet-lab15 \
--name PrivateSubnet \
--address-prefix 172.16.2.0/24 \
--service-endpoints Microsoft.Storage
# Xác nhận endpoint đã bật
az network vnet subnet show \
--resource-group rg-lab15-endpoints \
--vnet-name vnet-lab15 \
--name PrivateSubnet \
--query serviceEndpoints
Tạo NSG cho PrivateSubnet
NSG cho PrivateSubnet: cho phép traffic đến Storage (port 445 SMB), chặn mọi traffic Internet outbound khác. Inbound: cho phép RDP để test.
- 2.1Network security groups → Create → Name:
nsg-private→ rg-lab15-endpoints → Southeast Asia - 2.2Outbound rules → Add → Priority 100 → Name: Allow-Storage → Destination service tag: Storage → Port: 445 → Action: Allow
- 2.3Outbound rules → Add → Priority 200 → Name: Deny-Internet → Destination: Internet → Port: * → Action: Deny
- 2.4Inbound rules → Add → Priority 100 → Name: Allow-RDP → Source: Any → Port: 3389 → Action: Allow
- 2.5NSG → Subnets → Associate → VNet: vnet-lab15 → Subnet: PrivateSubnet
# Tạo NSG
az network nsg create \
--resource-group rg-lab15-endpoints \
--name nsg-private
# Inbound: Allow RDP
az network nsg rule create \
--resource-group rg-lab15-endpoints \
--nsg-name nsg-private \
--name Allow-RDP \
--priority 100 \
--direction Inbound \
--access Allow \
--protocol Tcp \
--destination-port-ranges 3389
# Outbound: Allow Storage (port 445 SMB)
az network nsg rule create \
--resource-group rg-lab15-endpoints \
--nsg-name nsg-private \
--name Allow-Storage \
--priority 100 \
--direction Outbound \
--access Allow \
--protocol Tcp \
--destination-address-prefixes Storage \
--destination-port-ranges 445
# Outbound: Deny Internet
az network nsg rule create \
--resource-group rg-lab15-endpoints \
--nsg-name nsg-private \
--name Deny-Internet \
--priority 200 \
--direction Outbound \
--access Deny \
--protocol '*' \
--destination-address-prefixes Internet \
--destination-port-ranges '*'
# Gắn NSG vào PrivateSubnet
az network vnet subnet update \
--resource-group rg-lab15-endpoints \
--vnet-name vnet-lab15 \
--name PrivateSubnet \
--network-security-group nsg-private
Tạo Storage Account & Giới Hạn Network Access
- 3.1Storage Account → Create → Name:
stlab15secure→ LRS → Advanced: min TLS 1.2 - 3.2Networking tab → Public network access: Enabled from selected virtual networks and IP addresses
- 3.3Virtual networks → Add existing: vnet-lab15 → Subnet: PrivateSubnet → Add (portal sẽ confirm service endpoint đã bật)
- 3.4Review + Create → sau đó tạo File share:
lab15-share→ upload 1 file test
# Tạo Storage Account (TLS 1.2, default deny)
az storage account create \
--resource-group rg-lab15-endpoints \
--name stlab15secure \
--location southeastasia \
--sku Standard_LRS \
--kind StorageV2 \
--min-tls-version TLS1_2 \
--default-action Deny
# Cho phép truy cập từ PrivateSubnet qua service endpoint
az storage account network-rule add \
--resource-group rg-lab15-endpoints \
--account-name stlab15secure \
--vnet-name vnet-lab15 \
--subnet PrivateSubnet
# Tạo file share
az storage share create \
--account-name stlab15secure \
--name lab15-share \
--quota 5 \
--auth-mode login
# Xem network rules
az storage account network-rule list \
--resource-group rg-lab15-endpoints \
--account-name stlab15secure \
--output table
Triển Khai VM & Kiểm Tra Truy Cập
- 4.1Tạo
vm-private: Windows Server 2022 → PrivateSubnet → Standard_B2s → Public IP: Standard SKU - 4.2Tạo
vm-public: cùng image → PublicSubnet → Standard_B2s → Public IP: Standard SKU - 4.3RDP vào vm-private → chạy PowerShell test mount (bước tiếp theo) → phải thành công
- 4.4RDP vào vm-public → chạy cùng script → phải bị từ chối (Access Denied / Connection refused)
# Tạo PrivateVM trong PrivateSubnet
az vm create \
--resource-group rg-lab15-endpoints \
--name vm-private \
--image Win2022AzureEditionCore \
--size Standard_B2s \
--vnet-name vnet-lab15 \
--subnet PrivateSubnet \
--admin-username azureadmin \
--admin-password "P@ssw0rd2026!" \
--public-ip-sku Standard \
--nsg nsg-private
# Tạo PublicVM trong PublicSubnet
az vm create \
--resource-group rg-lab15-endpoints \
--name vm-public \
--image Win2022AzureEditionCore \
--size Standard_B2s \
--vnet-name vnet-lab15 \
--subnet PublicSubnet \
--admin-username azureadmin \
--admin-password "P@ssw0rd2026!" \
--public-ip-sku Standard
Script kiểm tra — chạy trên cả 2 VM:
$storageAccount = "stlab15secure"
$storageKey = "YOUR_STORAGE_KEY" # Portal → stlab15secure → Access keys → key1
# Kiểm tra port 445 có mở không
$test = Test-NetConnection `
-ComputerName "$storageAccount.file.core.windows.net" `
-Port 445
Write-Host "Port 445 reachable: $($test.TcpTestSucceeded)"
if ($test.TcpTestSucceeded) {
# Thử mount file share
net use T: "\\$storageAccount.file.core.windows.net\lab15-share" `
/u:"localhost\$storageAccount" $storageKey
Write-Host "Mount result: $LASTEXITCODE"
if ($LASTEXITCODE -eq 0) {
Write-Host "SUCCESS: File share mounted as T:" -ForegroundColor Green
dir T:\
}
} else {
Write-Host "BLOCKED: Cannot reach storage (expected for PublicVM)" -ForegroundColor Red
}
--- vm-private (PrivateSubnet với Service Endpoint) ---
Port 445 reachable: True
Mount result: 0
SUCCESS: File share mounted as T:
Directory: T:\
(files from stlab15secure/lab15-share hiển thị)
--- vm-public (PublicSubnet KHÔNG có Service Endpoint) ---
Port 445 reachable: False
BLOCKED: Cannot reach storage (expected for PublicVM)
📊 Kết Quả Đầu Ra Lab 15
vnet-lab15 → PrivateSubnet → serviceEndpoints: [{service: "Microsoft.Storage"}]
nsg-private: Outbound Allow Storage (100) trước Deny Internet (200)
Port 445: True, net use T: thành công, thấy files trong share
Port 445: False, storage không thể reach từ PublicSubnet
🧹 Dọn Dẹp Tài Nguyên
az group delete \
--name rg-lab15-endpoints \
--yes \
--no-wait
❓ Câu Hỏi Ôn Tập
1. Service Endpoint được bật ở cấp độ nào? VNet hay Subnet?
Gợi ý: Subnet — mỗi subnet độc lập, cho phép granular control. Một VNet có thể có subnet với endpoint và subnet không có endpoint
2. Khi bật Service Endpoint, traffic từ subnet đến Storage Account đi qua đường nào?
Gợi ý: Vẫn dùng public IP của Storage nhưng đi qua Microsoft backbone network (không qua public internet) — nhanh hơn, an toàn hơn
3. Tại sao NSG rule Allow Storage phải có priority thấp hơn (ưu tiên cao hơn) Deny Internet?
Gợi ý: NSG xử lý theo priority tăng dần (100 trước 200); nếu Deny Internet priority = 100 sẽ block cả Storage; Allow Storage cần được xử lý trước
4. Service Endpoint có cho phép VM on-premises (qua VPN) truy cập Storage không? Giải pháp thay thế?
Gợi ý: Không — Service Endpoint chỉ hoạt động cho resources trong VNet Azure; dùng Private Endpoint nếu cần on-premises access qua VPN/ExpressRoute
5. Storage Account firewall có "Allow trusted Microsoft services" — tính năng này dùng để làm gì?
Gợi ý: Cho phép các Azure services như Azure Backup, Azure Monitor, Azure Site Recovery bypass firewall rule — cần bật khi storage có network restriction nhưng vẫn cần backup/monitoring