🎯 Mục Tiêu Lab
Tạo 2 Application Security Group: asg-web và asg-db
Tạo 2 VM: vm-web (Ubuntu) và vm-db (Ubuntu) trong cùng subnet
Gán NIC của từng VM vào ASG tương ứng
Tạo NSG rule: asg-web → asg-db port 3306 Allow; mọi nguồn khác Deny
Kiểm tra effective security rules trên từng NIC
Hiểu lợi ích của ASG: scale mà không cần cập nhật rule IP tĩnh
📋 Chuẩn Bị
- Azure subscription với quyền Contributor
- Hoàn thành Lab 19 (hiểu NSG cơ bản)
- Azure CLI 2.50+ hoặc Azure Portal
- RG:
rg-az500-asg-lab20 - VNet:
vnet-az500-lab20(10.20.0.0/16) - ASG:
asg-webvàasg-db - VM:
vm-az500-webvàvm-az500-db
🏗️ Kịch Bản
HoaTranLab triển khai ứng dụng 2 tầng: tầng Web (port 80/443) và tầng DB (MySQL port 3306). Yêu cầu bảo mật: chỉ Web server được kết nối DB; DB không expose ra internet. Dùng ASG để rule NSG tự động apply khi thêm VM mới vào nhóm mà không cần sửa rule IP tĩnh.
🧪 Các Bước Thực Hiện
Tạo RG, VNet và 2 Application Security Group
- 1.1Tạo Resource Group
rg-az500-asg-lab20, region Southeast Asia - 1.2Tạo VNet
vnet-az500-lab20(10.20.0.0/16), subnetsnet-app(10.20.1.0/24) - 1.3Portal → search "Application security groups" → + Create → Name:
asg-web, RG:rg-az500-asg-lab20→ Create - 1.4Lặp lại tạo ASG thứ hai:
asg-db
# Resource group + VNet
az group create --name rg-az500-asg-lab20 --location southeastasia \
--tags "owner=hoatranlab" "env=lab" "module=az500-ch05"
az network vnet create \
--resource-group rg-az500-asg-lab20 \
--name vnet-az500-lab20 \
--address-prefix 10.20.0.0/16 \
--subnet-name snet-app \
--subnet-prefix 10.20.1.0/24
# Tạo 2 Application Security Group
az network asg create \
--resource-group rg-az500-asg-lab20 \
--name asg-web \
--location southeastasia
az network asg create \
--resource-group rg-az500-asg-lab20 \
--name asg-db \
--location southeastasia
# Xác nhận
az network asg list --resource-group rg-az500-asg-lab20 --output table
Tạo NSG với Rules Dùng ASG làm Source/Destination
- 2.1Tạo NSG
nsg-az500-lab20trong RG, region Southeast Asia - 2.2Inbound rule 1: Source = Application security group →
asg-web; Dest =asg-db; Port: 3306; Protocol: TCP; Action: Allow; Priority: 100; Name:Allow-Web-To-DB - 2.3Inbound rule 2: Source = Any; Dest =
asg-db; Port: 3306; Protocol: TCP; Action: Deny; Priority: 200; Name:Deny-DB-From-Others - 2.4Inbound rule 3: Allow HTTP/HTTPS (80, 443) từ Internet đến
asg-web; Priority: 110; Name:Allow-Internet-To-Web - 2.5Associate NSG với subnet
snet-app
RG="rg-az500-asg-lab20"
# Tạo NSG
az network nsg create \
--resource-group $RG \
--name nsg-az500-lab20 \
--location southeastasia
# Rule: cho phép Internet → Web (port 80, 443)
az network nsg rule create \
--resource-group $RG \
--nsg-name nsg-az500-lab20 \
--name Allow-Internet-To-Web \
--priority 110 \
--direction Inbound \
--access Allow \
--protocol Tcp \
--source-address-prefixes Internet \
--destination-asgs asg-web \
--destination-port-ranges 80 443
# Rule: cho phép Web → DB (port 3306)
az network nsg rule create \
--resource-group $RG \
--nsg-name nsg-az500-lab20 \
--name Allow-Web-To-DB \
--priority 100 \
--direction Inbound \
--access Allow \
--protocol Tcp \
--source-asgs asg-web \
--destination-asgs asg-db \
--destination-port-ranges 3306
# Rule: chặn mọi nguồn khác vào DB port 3306
az network nsg rule create \
--resource-group $RG \
--nsg-name nsg-az500-lab20 \
--name Deny-DB-From-Others \
--priority 200 \
--direction Inbound \
--access Deny \
--protocol Tcp \
--source-address-prefixes "*" \
--destination-asgs asg-db \
--destination-port-ranges 3306
# Gán NSG vào subnet
az network vnet subnet update \
--resource-group $RG \
--vnet-name vnet-az500-lab20 \
--name snet-app \
--network-security-group nsg-az500-lab20
Tạo VM Web và VM DB, Gán NIC vào ASG
- 3.1Tạo VM
vm-az500-web: Ubuntu 22.04, Standard_B1s, subnet snet-app, Public IP Standard SKU - 3.2Sau khi VM web tạo xong: VM → Networking → click NIC → Application security groups → Configure → chọn
asg-web→ Save - 3.3Tạo VM
vm-az500-db: Ubuntu 22.04, Standard_B1s, subnet snet-app, không cần Public IP - 3.4Gán NIC vm-db vào
asg-dbtương tự bước 3.2
RG="rg-az500-asg-lab20"
# Public IP cho VM web (Standard SKU)
az network public-ip create \
--resource-group $RG --name pip-vm-web \
--sku Standard --allocation-method Static
# NIC web - gán vào asg-web
az network nic create \
--resource-group $RG --name nic-vm-web \
--vnet-name vnet-az500-lab20 --subnet snet-app \
--public-ip-address pip-vm-web \
--application-security-groups asg-web
# NIC db - không public IP, gán vào asg-db
az network nic create \
--resource-group $RG --name nic-vm-db \
--vnet-name vnet-az500-lab20 --subnet snet-app \
--application-security-groups asg-db
# Tạo VM web
az vm create \
--resource-group $RG --name vm-az500-web \
--nics nic-vm-web \
--image Ubuntu2204 --size Standard_B1s \
--admin-username azureadmin --generate-ssh-keys \
--no-wait
# Tạo VM db
az vm create \
--resource-group $RG --name vm-az500-db \
--nics nic-vm-db \
--image Ubuntu2204 --size Standard_B1s \
--admin-username azureadmin --generate-ssh-keys \
--no-wait
# Kiểm tra ASG assignment
az network nic show \
--resource-group $RG --name nic-vm-web \
--query "applicationSecurityGroups[].id" -o tsv
Xác Minh Effective Security Rules và Kiểm Tra Kết Nối
- 4.1Vào NIC của
vm-az500-db→ Effective security rules → Xác nhận ruleAllow-Web-To-DBvàDeny-DB-From-Othersđều hiện - 4.2SSH vào
vm-az500-web→ thửnc -zv <DB_PRIVATE_IP> 3306→ Kết quả: succeeded - 4.3Network Watcher → IP Flow Verify: Source = IP vm-web, Dest port = 3306 trên vm-db → Access: Allow
RG="rg-az500-asg-lab20"
# Lấy private IP của vm-db
DB_IP=$(az vm list-ip-addresses \
--resource-group $RG --name vm-az500-db \
--query "[0].virtualMachine.network.privateIpAddresses[0]" -o tsv)
echo "DB Private IP: $DB_IP"
# Xem effective security rules trên NIC của vm-db
az network nic show-effective-nsg \
--resource-group $RG \
--name nic-vm-db \
--query "effectiveNetworkSecurityGroups[0].effectiveSecurityRules[].{Name:name,Access:access,Direction:direction,DestPort:destinationPortRange}" \
--output table
# Test IP flow: web → db:3306 (expect Allow)
WEB_IP=$(az vm list-ip-addresses \
--resource-group $RG --name vm-az500-web \
--query "[0].virtualMachine.network.privateIpAddresses[0]" -o tsv)
az network watcher test-ip-flow \
--resource-group $RG \
--vm vm-az500-db \
--direction Inbound \
--protocol TCP \
--local "$DB_IP:3306" \
--remote "$WEB_IP:*"
📊 Kết Quả Đầu Ra
asg-web và asg-db trong rg-az500-asg-lab20, region southeastasia
nic-vm-web → asg-web; nic-vm-db → asg-db
IP Flow Verify xác nhận Allow-Web-To-DB được match
Deny-DB-From-Others chặn mọi nguồn không thuộc asg-web
🧹 Dọn Dẹp Tài Nguyên
az group delete --name rg-az500-asg-lab20 --yes --no-wait
❓ Câu Hỏi Ôn Tập
1. ASG (Application Security Group) giải quyết vấn đề gì so với dùng IP address trực tiếp trong NSG rule?
Gợi ý: Không cần cập nhật rule khi IP thay đổi hoặc thêm VM mới. Chỉ cần gán NIC vào ASG đúng nhóm.
2. Một NIC có thể thuộc nhiều ASG không? Hạn chế nào cần lưu ý?
Gợi ý: Có, một NIC có thể thuộc nhiều ASG. Tuy nhiên tất cả ASG đó phải cùng region và cùng VNet.
3. Nếu thêm một VM web thứ 3 vào hệ thống, bạn cần làm gì để rule Allow-Web-To-DB áp dụng cho VM mới?
Gợi ý: Chỉ cần gán NIC của VM mới vào asg-web. Rule NSG tự động áp dụng, không cần sửa bất kỳ rule nào.
4. Effective Security Rules khác gì với danh sách rules trong NSG?
Gợi ý: Effective rules là tổng hợp của cả subnet NSG và NIC NSG (nếu có), bao gồm default rules của Azure. Cho thấy rule nào thực sự được apply.