LAB 15 ~60 phút Module 16 Network Security

VNet Service Endpoints — Bảo Vệ Storage & SQL

Cấu hình Virtual Network Service Endpoints để giới hạn truy cập Azure Storage chỉ từ subnet chỉ định, so sánh với Private Endpoint, kiểm tra access control từ PublicSubnet vs PrivateSubnet.

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

Yêu cầu:
  • 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
Topology lab:
  • 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 addressPublic IP của Azure service (qua backbone)Private IP trong VNet của bạn
DNSGiữ nguyên public DNSDNS trỏ về private IP (privatelink)
Chi phíMiễn phí~$7/tháng + ingress/egress
Từ on-premisesKhông hỗ trợHỗ trợ (qua VPN/ExpressRoute)
Cách ly mạngVẫn qua public endpoint của serviceHoàn toàn private, không qua internet
Cấu hìnhĐơn giản, bật trên subnetPhức tạp hơn, cần DNS zone
Khi nào dùngDev/test, workload Azure-only, quick winProduction, hybrid, compliance cao

🧪 Các Bước Thực Hiện

1

Tạo VNet, Subnet & Service Endpoint

Cách 1 — Azure Portal
  1. 1.1Virtual Networks → Create → Name: vnet-lab15 → Address space: 172.16.0.0/16 → Southeast Asia
  2. 1.2Subnets tab → Rename default → PublicSubnet172.16.1.0/24 → Service endpoints: (để trống)
  3. 1.3+ Add subnet → Name: PrivateSubnet172.16.2.0/24 → Service endpoints: chọn Microsoft.Storage → Add → Review + Create
Cách 2 — Azure CLI
Azure CLI
# 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
2

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.

Cách 1 — Azure Portal
  1. 2.1Network security groups → Create → Name: nsg-private → rg-lab15-endpoints → Southeast Asia
  2. 2.2Outbound rules → Add → Priority 100 → Name: Allow-Storage → Destination service tag: Storage → Port: 445 → Action: Allow
  3. 2.3Outbound rules → Add → Priority 200 → Name: Deny-Internet → Destination: Internet → Port: * → Action: Deny
  4. 2.4Inbound rules → Add → Priority 100 → Name: Allow-RDP → Source: Any → Port: 3389 → Action: Allow
  5. 2.5NSG → Subnets → Associate → VNet: vnet-lab15 → Subnet: PrivateSubnet
Cách 2 — Azure CLI
Azure CLI
# 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
3

Tạo Storage Account & Giới Hạn Network Access

Cách 1 — Azure Portal
  1. 3.1Storage Account → Create → Name: stlab15secure → LRS → Advanced: min TLS 1.2
  2. 3.2Networking tab → Public network access: Enabled from selected virtual networks and IP addresses
  3. 3.3Virtual networks → Add existing: vnet-lab15 → Subnet: PrivateSubnet → Add (portal sẽ confirm service endpoint đã bật)
  4. 3.4Review + Create → sau đó tạo File share: lab15-share → upload 1 file test
Cách 2 — Azure CLI
Azure CLI
# 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
4

Triển Khai VM & Kiểm Tra Truy Cập

Cách 1 — Azure Portal
  1. 4.1Tạo vm-private: Windows Server 2022 → PrivateSubnet → Standard_B2s → Public IP: Standard SKU
  2. 4.2Tạo vm-public: cùng image → PublicSubnet → Standard_B2s → Public IP: Standard SKU
  3. 4.3RDP vào vm-private → chạy PowerShell test mount (bước tiếp theo) → phải thành công
  4. 4.4RDP vào vm-public → chạy cùng script → phải bị từ chối (Access Denied / Connection refused)
Cách 2 — Azure CLI
Azure CLI
# 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:

PowerShell-CMD (Windows)— Chạy trong VM qua RDP
$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
}
Kết quả (Output)
--- 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

PrivateSubnet có Service Endpoint

vnet-lab15 → PrivateSubnet → serviceEndpoints: [{service: "Microsoft.Storage"}]

NSG rules đúng

nsg-private: Outbound Allow Storage (100) trước Deny Internet (200)

vm-private: mount thành công

Port 445: True, net use T: thành công, thấy files trong share

vm-public: bị chặn đúng

Port 445: False, storage không thể reach từ PublicSubnet

🧹 Dọn Dẹp Tài Nguyên

Azure CLI
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

Lab 14: Migrate Physical Servers Thư viện Labs Lab 16: Azure Firewall
Zalo