MODULE 10 Virtual Networking · 15–20% ~3 giờ

Network Security Groups

Kiểm soát lưu lượng mạng vào/ra Azure resources bằng NSG rules. Tìm hiểu cách Azure đánh giá rule theo priority, cách dùng Application Security Groups để đơn giản hóa quản lý bảo mật nhóm VM.

Lý Thuyết Cốt Lõi

1. Tổng Quan NSG và Cách Hoạt Động

Network Security Group (NSG) là tường lửa lớp 4 (Transport Layer) cho phép hoặc từ chối lưu lượng TCP/UDP dựa trên rules. NSG gán được vào subnet hoặc Network Interface Card (NIC) của VM.

Gán NSG vào Subnet
  • • Áp dụng cho tất cả tài nguyên trong subnet
  • • Lọc traffic đi vào và đi ra subnet
  • • Thay đổi 1 NSG ảnh hưởng tất cả VM trong subnet
  • • Best practice: gán NSG vào subnet (không phải NIC riêng lẻ)
Gán NSG vào NIC
  • • Chỉ áp dụng cho VM cụ thể có NIC đó
  • • Cho phép rule riêng biệt theo từng VM
  • • Nếu cả subnet-NSG và NIC-NSG đều có: cả 2 đều được đánh giá
  • • Inbound: subnet NSG → NIC NSG; Outbound: NIC NSG → subnet NSG
Quan trọng: NSG là stateful — nếu cho phép inbound traffic, outbound response tự động được cho phép. Không cần tạo rule outbound cho established connections. Mặc định NSG mới chặn tất cả inbound từ Internet, cho phép tất cả outbound.

2. Cấu Trúc NSG Rule và Default Rules

Mỗi NSG rule gồm 5 thành phần chính. Azure đánh giá rule theo priority số nhỏ hơn = ưu tiên cao hơn. Rule đầu tiên match sẽ được áp dụng, các rule sau bị bỏ qua.

Trường Giá trị hợp lệ Mô tả
Priority 100 – 4096 Số nhỏ = ưu tiên cao, đánh giá trước
Source / Destination IP, CIDR, Service Tag, ASG Nguồn/đích của packet
Protocol TCP, UDP, ICMP, ESP, AH, Any Giao thức mạng
Port Range 80, 443, 8080-8090, * Port đơn, range hoặc wildcard
Action Allow / Deny Cho phép hoặc từ chối packet
Default Rules (không thể xóa, priority 65000–65500):
Inbound defaults:
  • • 65000: Allow VirtualNetwork → VirtualNetwork (Any)
  • • 65001: Allow AzureLoadBalancer → Any
  • • 65500: Deny * → * (catch-all block)
Outbound defaults:
  • • 65000: Allow VirtualNetwork → VirtualNetwork (Any)
  • • 65001: Allow Any → Internet (Any)
  • • 65500: Deny * → * (catch-all block)

3. Effective Security Rules — Chẩn Đoán NSG

Khi VM có cả NSG trên subnet và NIC, Effective Security Rules hiển thị rule tổng hợp thực tế đang áp dụng — giúp troubleshoot tại sao traffic bị block hoặc allowed.

Network Watcher

Portal → Network Watcher → NSG Diagnostics → chọn VM → xem effective rules inbound/outbound

NIC View

Portal → VM → Networking → Effective security rules → tất cả rules đang áp dụng cho NIC này

IP Flow Verify

Network Watcher → IP flow verify → test cụ thể: IP nguồn/đích + port → Azure trả lời Allow/Deny + rule nào quyết định

Quy trình troubleshoot: (1) Xác nhận NSG đã gán đúng subnet/NIC → (2) Dùng Effective Rules xem rule tổng hợp → (3) Dùng IP Flow Verify test kết nối cụ thể → (4) Kiểm tra cả inbound lẫn outbound — thường dev quên rule outbound khi NSG chặn all outbound.

4. Application Security Groups (ASG)

ASG cho phép nhóm VM theo vai trò ứng dụng (web servers, app servers, db servers) và dùng nhóm đó làm source/destination trong NSG rules — thay vì phải nhớ và liệt kê IP của từng VM.

Không dùng ASG (khó quản lý)
Source: 10.0.1.4, 10.0.1.5, 10.0.1.6
Destination: 10.0.2.10, 10.0.2.11
Port: 1433 → Allow
Thêm VM mới → phải cập nhật rule thủ công
Dùng ASG (đơn giản, linh hoạt)
Source: asg-appservers
Destination: asg-dbservers
Port: 1433 → Allow
Thêm VM mới → chỉ gán NIC vào ASG
Giới hạn ASG
  • • NIC chỉ có thể thuộc các ASG trong cùng 1 VNet
  • • Không thể dùng ASG làm source và destination trong cùng rule
  • • Tối đa 3.000 ASG mỗi subscription
Workflow ASG
  1. Tạo ASG resource (asg-web, asg-app, asg-db)
  2. Gán NIC của từng VM vào ASG tương ứng
  3. Dùng ASG làm source/destination trong NSG rules
  4. Scale out: thêm VM mới, gán NIC vào ASG — rule tự áp dụng

Bài Tập Thực Hành (Lab)

Lab 10-A: NSG cơ bản Lab 10-B: ASG theo tier Lab 10-C: Effective Rules Lab 10-D: Cleanup
1

Tạo VNet, Subnet và NSG với rules cơ bản

Azure CLI— Chạy được trên PowerShell, CMD, Bash hoặc Azure Cloud Shell
# Tạo Resource Group
az group create \
  --name rg-az104-m10 \
  --location southeastasia \
  --tags Course=AZ-104 Module=10

# Tạo VNet
az network vnet create \
  --resource-group rg-az104-m10 \
  --name vnet-az104-m10 \
  --address-prefix 10.10.0.0/16 \
  --location southeastasia

# Tạo subnet web và app
az network vnet subnet create \
  --resource-group rg-az104-m10 \
  --vnet-name vnet-az104-m10 \
  --name snet-web \
  --address-prefix 10.10.1.0/24

az network vnet subnet create \
  --resource-group rg-az104-m10 \
  --vnet-name vnet-az104-m10 \
  --name snet-app \
  --address-prefix 10.10.2.0/24

# Tạo NSG cho web tier
az network nsg create \
  --resource-group rg-az104-m10 \
  --name nsg-web-m10

# Rule: Allow HTTP inbound từ Internet (priority 100)
az network nsg rule create \
  --resource-group rg-az104-m10 \
  --nsg-name nsg-web-m10 \
  --name Allow-HTTP-Inbound \
  --priority 100 \
  --direction Inbound \
  --source-address-prefix Internet \
  --source-port-range "*" \
  --destination-address-prefix "*" \
  --destination-port-range 80 \
  --protocol Tcp \
  --access Allow

# Rule: Allow HTTPS inbound từ Internet (priority 110)
az network nsg rule create \
  --resource-group rg-az104-m10 \
  --nsg-name nsg-web-m10 \
  --name Allow-HTTPS-Inbound \
  --priority 110 \
  --direction Inbound \
  --source-address-prefix Internet \
  --source-port-range "*" \
  --destination-address-prefix "*" \
  --destination-port-range 443 \
  --protocol Tcp \
  --access Allow

# Rule: Deny tất cả traffic khác từ Internet (priority 200)
az network nsg rule create \
  --resource-group rg-az104-m10 \
  --nsg-name nsg-web-m10 \
  --name Deny-All-Inbound \
  --priority 200 \
  --direction Inbound \
  --source-address-prefix Internet \
  --source-port-range "*" \
  --destination-address-prefix "*" \
  --destination-port-range "*" \
  --protocol "*" \
  --access Deny

# Gán NSG vào subnet web
az network vnet subnet update \
  --resource-group rg-az104-m10 \
  --vnet-name vnet-az104-m10 \
  --name snet-web \
  --network-security-group nsg-web-m10

echo "NSG web tier đã tạo và gán vào snet-web"
Verify Portal: Portal → Virtual Networks → vnet-az104-m10 → Subnets → snet-web → Network security group = nsg-web-m10. Vào nsg-web-m10 → Inbound security rules → xác nhận 3 rules tạo + 3 default rules.
2

Tạo Application Security Groups và NSG rules dùng ASG

Azure CLI— Chạy được trên PowerShell, CMD, Bash hoặc Azure Cloud Shell
# Tạo ASG cho từng tier
az network asg create \
  --resource-group rg-az104-m10 \
  --name asg-web-servers \
  --location southeastasia

az network asg create \
  --resource-group rg-az104-m10 \
  --name asg-app-servers \
  --location southeastasia

az network asg create \
  --resource-group rg-az104-m10 \
  --name asg-db-servers \
  --location southeastasia

# Tạo NSG cho app tier
az network nsg create \
  --resource-group rg-az104-m10 \
  --name nsg-app-m10

# Rule: Allow web → app (port 8080) dùng ASG
az network nsg rule create \
  --resource-group rg-az104-m10 \
  --nsg-name nsg-app-m10 \
  --name Allow-Web-To-App \
  --priority 100 \
  --direction Inbound \
  --source-asgs asg-web-servers \
  --source-port-range "*" \
  --destination-asgs asg-app-servers \
  --destination-port-range 8080 \
  --protocol Tcp \
  --access Allow

# Rule: Allow app → db (port 1433) dùng ASG
az network nsg rule create \
  --resource-group rg-az104-m10 \
  --nsg-name nsg-app-m10 \
  --name Allow-App-To-DB \
  --priority 110 \
  --direction Inbound \
  --source-asgs asg-app-servers \
  --source-port-range "*" \
  --destination-asgs asg-db-servers \
  --destination-port-range 1433 \
  --protocol Tcp \
  --access Allow

# Gán NSG vào subnet app
az network vnet subnet update \
  --resource-group rg-az104-m10 \
  --vnet-name vnet-az104-m10 \
  --name snet-app \
  --network-security-group nsg-app-m10

echo "ASG và NSG app tier đã tạo thành công"
Verify Portal: Portal → Application security groups → xác nhận 3 ASG tạo thành công. Vào nsg-app-m10 → Inbound security rules → Rule Allow-Web-To-App → Source = asg-web-servers, Destination = asg-app-servers.
3

Tạo VM, gán vào ASG và kiểm tra Effective Security Rules

Bash— Linux/macOS/Cloud Shell, KHÔNG chạy CMD
# Lấy ID của ASG web-servers
ASG_WEB_ID=$(az network asg show \
  --resource-group rg-az104-m10 \
  --name asg-web-servers \
  --query id -o tsv)

# Tạo NIC cho web VM và gán ngay vào ASG
az network nic create \
  --resource-group rg-az104-m10 \
  --name nic-webvm-m10 \
  --vnet-name vnet-az104-m10 \
  --subnet snet-web \
  --application-security-groups asg-web-servers \
  --network-security-group nsg-web-m10

# Tạo VM web với NIC đã gán ASG
az vm create \
  --resource-group rg-az104-m10 \
  --name vm-web-m10 \
  --nics nic-webvm-m10 \
  --image Ubuntu2204 \
  --size Standard_B1s \
  --admin-username azureadmin \
  --generate-ssh-keys \
  --no-wait

# Tạo NIC cho app VM và gán vào ASG app-servers
az network nic create \
  --resource-group rg-az104-m10 \
  --name nic-appvm-m10 \
  --vnet-name vnet-az104-m10 \
  --subnet snet-app \
  --application-security-groups asg-app-servers \
  --network-security-group nsg-app-m10

echo "Chờ VM tạo xong (3-5 phút)..."
az vm wait \
  --resource-group rg-az104-m10 \
  --name vm-web-m10 \
  --created

# Xem Effective Security Rules của NIC web VM
az network nic list-effective-nsg \
  --resource-group rg-az104-m10 \
  --name nic-webvm-m10 \
  --query "effectiveNetworkSecurityGroups[].securityRules[].{name:name,priority:priority,access:access,direction:direction,destPort:destinationPortRange}" \
  -o table
Verify Portal: Portal → vm-web-m10 → Networking → Effective security rules → xác nhận rule Allow-HTTP-Inbound (priority 100) và Allow-HTTPS-Inbound (priority 110) đang active. Vào Application security groups của NIC → xác nhận NIC thuộc asg-web-servers.
4

Kiểm tra IP Flow Verify để xác nhận NSG hoạt động đúng

Azure CLI— Chạy được trên PowerShell, CMD, Bash hoặc Azure Cloud Shell
# Lấy thông tin VM (cần VM ID)
VM_ID=$(az vm show \
  --resource-group rg-az104-m10 \
  --name vm-web-m10 \
  --query id -o tsv)

# Test: port 80 từ Internet đến VM → kỳ vọng Allow
az network watcher test-ip-flow \
  --resource-group rg-az104-m10 \
  --vm vm-web-m10 \
  --direction Inbound \
  --local 10.10.1.4:80 \
  --remote 1.2.3.4:12345 \
  --protocol TCP

# Test: port 3389 (RDP) từ Internet → kỳ vọng Deny
az network watcher test-ip-flow \
  --resource-group rg-az104-m10 \
  --vm vm-web-m10 \
  --direction Inbound \
  --local 10.10.1.4:3389 \
  --remote 1.2.3.4:12345 \
  --protocol TCP

# Liệt kê tất cả NSG trong resource group
az network nsg list \
  --resource-group rg-az104-m10 \
  --query "[].{name:name,location:location,subnets:subnets[].id}" \
  -o table
Verify: Kết quả test port 80 phải trả về access: Allow và tên rule Allow-HTTP-Inbound. Test port 3389 phải trả về access: Deny và rule Deny-All-Inbound. Nếu Network Watcher chưa enable trong region, chạy: az network watcher configure --resource-group NetworkWatcherRG --locations southeastasia --enabled true
5

Cleanup — Dọn dẹp tài nguyên tránh phát sinh chi phí

Azure CLI— Chạy được trên PowerShell, CMD, Bash hoặc Azure Cloud Shell
# Xóa toàn bộ Resource Group (VM, NSG, ASG, VNet, NIC đều bị xóa theo)
az group delete --name rg-az104-m10 --yes --no-wait

echo "Đang xóa rg-az104-m10... Quá trình mất 3-5 phút."

Kết Quả Đầu Ra

Triển khai NSG đúng vị trí

Tạo NSG, thêm rules với priority đúng, gán vào subnet và NIC, hiểu thứ tự đánh giá subnet-NSG → NIC-NSG

NSG rules chính xác

Viết rules với 5 thành phần đúng cú pháp, sử dụng Service Tags (Internet, VirtualNetwork, AzureLoadBalancer)

Đọc Default Rules

Hiểu 3 default inbound + 3 default outbound rules, biết rule 65500 DenyAllInbound là catch-all không xóa được

Effective Rules troubleshoot

Dùng Effective Security Rules và IP Flow Verify để xác định tại sao traffic bị block, rule nào quyết định

Application Security Groups

Tạo ASG theo vai trò (web/app/db), gán NIC vào ASG, viết NSG rules dùng ASG thay IP range

Stateful behavior nắm vững

Hiểu NSG stateful: allow inbound tự động cho phép outbound response, không cần rule outbound riêng cho established connections

Ứng Dụng Thực Tế

Tình huống 1: Fintech — Zero-Trust Network Segmentation

Công ty thanh toán điện tử cần đảm bảo không có lateral movement nếu 1 VM bị compromise.

Giải pháp

3 NSG riêng: nsg-web chỉ allow 443 inbound từ Internet; nsg-api chỉ allow 8443 từ asg-web-servers; nsg-db chỉ allow 5432 từ asg-api-servers. Rule Deny-All ở priority cuối mỗi NSG.

Triển khai

ASG: asg-web, asg-api, asg-db. Khi scale out thêm API server mới chỉ cần gán NIC vào asg-api — tự nhận rule cho phép từ web và tới db. IP Flow Verify kiểm tra hàng tuần.

Lợi ích

Blast radius của security incident giới hạn trong 1 tier. Tuân thủ PCI-DSS requirement về network segmentation. Zero cấu hình thủ công khi scale — ASG tự động áp rule.

Tình huống 2: Tập đoàn đa quốc gia — Quản lý NSG tập trung

100+ VM trải rộng nhiều subscription, team IT trung tâm cần enforce security policy đồng nhất.

Giải pháp

Azure Firewall Policy + NSG kết hợp: NSG ở subnet level lọc traffic East-West; Azure Firewall lọc traffic North-South (Internet). NSG baseline chuẩn hóa qua Azure Policy "require-nsg-on-subnet".

Triển khai

Azure Policy DeployIfNotExists tự động tạo NSG khi subnet không có. Flow logs bật trên mọi NSG, gửi về Log Analytics Workspace trung tâm. Alert khi có Deny traffic bất thường.

Lợi ích

Visibility toàn bộ network traffic. Compliance report tự động. Team local không thể deploy VM không có NSG. Incident response nhanh hơn nhờ NSG Flow Logs.

Tình huống 3: EdTech — Bảo vệ môi trường học tập online

Nền tảng học trực tuyến 50.000 học viên cần bảo vệ hệ thống chấm bài tự động không bị lạm dụng.

Giải pháp

Grading server trong subnet riêng, NSG chỉ allow inbound từ asg-api-servers (service tag cụ thể), block hoàn toàn inbound từ Internet. Outbound chỉ allow tới pip-nuget (Nuget registry) và pip-pypi.

Triển khai

NSG outbound deny default, chỉ whitelist IP cụ thể dùng Service Tag. ASG grading-servers tách biệt với app-servers. Effective Rules review mỗi sprint bởi security team.

Lợi ích

Code submission của học viên không thể exfiltrate data. Grading sandbox không thể bị dùng làm C2 server. NSG Flow Logs phát hiện attempt bất thường ngay lập tức.

Zalo