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.
- • Á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ẻ)
- • 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
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 |
- • 65000: Allow VirtualNetwork → VirtualNetwork (Any)
- • 65001: Allow AzureLoadBalancer → Any
- • 65500: Deny * → * (catch-all block)
- • 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.
Portal → Network Watcher → NSG Diagnostics → chọn VM → xem effective rules inbound/outbound
Portal → VM → Networking → Effective security rules → tất cả rules đang áp dụng cho NIC này
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
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.
- • 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
- Tạo ASG resource (asg-web, asg-app, asg-db)
- Gán NIC của từng VM vào ASG tương ứng
- Dùng ASG làm source/destination trong NSG rules
- 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)
Tạo VNet, Subnet và NSG với rules cơ bản
# 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"
Tạo Application Security Groups và NSG rules dùng ASG
# 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"
Tạo VM, gán vào ASG và kiểm tra Effective Security Rules
# 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
Kiểm tra IP Flow Verify để xác nhận NSG hoạt động đúng
# 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
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
Cleanup — Dọn dẹp tài nguyên tránh phát sinh chi phí
# 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
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
Viết rules với 5 thành phần đúng cú pháp, sử dụng Service Tags (Internet, VirtualNetwork, AzureLoadBalancer)
Hiểu 3 default inbound + 3 default outbound rules, biết rule 65500 DenyAllInbound là catch-all không xóa được
Dùng Effective Security Rules và IP Flow Verify để xác định tại sao traffic bị block, rule nào quyết định
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
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.
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.
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.
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.
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".
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.
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.
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.
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.
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.