LAB 33 AZ-500 ~30 phút Chương 08 Yêu cầu Defender for Servers

Just-in-Time VM Access — Mở Port Theo Yêu Cầu

Cấu hình JIT VM Access qua Microsoft Defender for Servers. Port RDP/SSH chỉ mở trong khoảng thời gian ngắn khi có yêu cầu từ IP cụ thể — NSG rule tự động tạo và tự xóa sau khi hết hạn.

Yêu cầu license: JIT VM Access là tính năng của Microsoft Defender for Servers Plan 1 hoặc Plan 2. Defender for Servers có phí ~$0.02/VM/giờ. Bật trong thời gian ngắn để thực hành rồi tắt ngay sau lab.

🎯 Mục Tiêu Lab

Bật Microsoft Defender for Servers trên subscription lab

Cấu hình JIT policy cho port 3389 (RDP) và 22 (SSH)

Request access với thời gian ngắn (3 giờ) từ IP cụ thể

Kiểm tra NSG rule được tạo tự động với time-bound

Xem JIT activity log và audit trail

Xác nhận NSG rule tự đóng sau khi hết thời gian

📋 Chuẩn Bị

Yêu cầu:
  • Azure subscription với quyền Security Admin hoặc Owner
  • VM đang chạy có public IP (hoặc dùng lại VM từ lab trước)
  • Biết IP công cộng của máy tính bạn đang dùng
Naming convention:
  • RG: rg-az500-lab33
  • VM: vm-az500-lab33
  • NSG: nsg-az500-lab33

🏗️ Kịch Bản

VM quản trị cần có public IP để hỗ trợ remote access trong trường hợp khẩn cấp, nhưng port 3389/22 không nên luôn mở. Với JIT VM Access, Defender for Servers quản lý NSG của VM — mặc định chặn tất cả, chỉ mở port tạm thời theo yêu cầu có audit log đầy đủ. Mỗi yêu cầu ghi rõ: ai yêu cầu, IP nguồn, thời gian, port — đáp ứng yêu cầu compliance và Zero Trust.

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

1

Tạo VM Lab và Bật Defender for Servers

Cách 1 — Portal
  1. 1.1Tạo VM Windows Server 2022 với public IP → RG: rg-az500-lab33
  2. 1.2Portal → Microsoft Defender for Cloud → Environment settings → Chọn subscription → Defender plans
  3. 1.3Bật Servers (Plan 1 hoặc Plan 2) → Save
Cách 2 — Azure CLI
Azure CLI— Tạo VM và bật Defender for Servers
# Tạo resource group và VM với public IP và NSG
az group create --name rg-az500-lab33 --location southeastasia

az vm create \
  --resource-group rg-az500-lab33 \
  --name vm-az500-lab33 \
  --image Win2022AzureEditionCore \
  --size Standard_B2s \
  --admin-username azureadmin \
  --admin-password "P@ssw0rd!Az500Lab33" \
  --location southeastasia \
  --nsg nsg-az500-lab33 \
  --nsg-rule RDP

# Bật Defender for Servers (Plan 1) trên subscription
SUBSCRIPTION_ID=$(az account show --query id -o tsv)
az security pricing create \
  --name VirtualMachines \
  --tier Standard \
  --subscription $SUBSCRIPTION_ID

# Xác nhận Defender for Servers đã bật
az security pricing show --name VirtualMachines \
  --query "{name:name, tier:pricingTier}" -o table
2

Cấu Hình JIT Policy cho VM

Cách 1 — Portal (Defender for Cloud)
  1. 2.1Defender for Cloud → Workload protectionsJust-in-time VM access
  2. 2.2Tab Not configured → tìm vm-az500-lab33Enable JIT on 1 VM
  3. 2.3Cấu hình port RDP (3389): Max request time = 3 hours, Allowed source IPs = Per request → Save
  4. 2.4Thêm port SSH (22) với cùng cấu hình nếu muốn → Save
  5. 2.5VM chuyển sang tab Configured — JIT đã được bật
Cách 2 — Azure CLI (REST API)
Azure CLI— Cấu hình JIT policy qua az security jit-policy
# Lấy VM resource ID
VM_ID=$(az vm show -g rg-az500-lab33 -n vm-az500-lab33 --query id -o tsv)
LOCATION="southeastasia"

# Tạo JIT policy cho VM (port 3389 và 22)
az security jit-policy create \
  --location $LOCATION \
  --name default \
  --resource-group rg-az500-lab33 \
  --virtual-machines "[
    {
      \"id\": \"$VM_ID\",
      \"ports\": [
        {
          \"number\": 3389,
          \"protocol\": \"TCP\",
          \"allowedSourceAddressPrefix\": \"*\",
          \"maxRequestAccessDuration\": \"PT3H\"
        },
        {
          \"number\": 22,
          \"protocol\": \"TCP\",
          \"allowedSourceAddressPrefix\": \"*\",
          \"maxRequestAccessDuration\": \"PT3H\"
        }
      ]
    }
  ]"

# Xác nhận JIT policy đã được tạo
az security jit-policy show \
  --location $LOCATION \
  --name default \
  --resource-group rg-az500-lab33 \
  --query "virtualMachines[0].ports" -o table
3

Request JIT Access và Kết Nối VM

Cách 1 — Portal
  1. 3.1VM → Connect → RDP → Hiển thị thông báo "Just-in-time policy enabled" → Request access
  2. 3.2Chọn port 3389 ON → Source IP: My IP → Time: 3 hours → Open ports
  3. 3.3Tải file RDP → kết nối → nhập credentials
Cách 2 — Azure CLI
Azure CLI— Request JIT access qua CLI
# Lấy IP công cộng của máy bạn
MY_IP=$(curl -s https://api.ipify.org)
echo "My public IP: $MY_IP"

VM_ID=$(az vm show -g rg-az500-lab33 -n vm-az500-lab33 --query id -o tsv)

# Request JIT access (mở port 3 giờ từ IP của bạn)
az security jit-policy initiate \
  --location southeastasia \
  --name default \
  --resource-group rg-az500-lab33 \
  --virtual-machines "[
    {
      \"id\": \"$VM_ID\",
      \"ports\": [
        {
          \"number\": 3389,
          \"duration\": \"PT3H\",
          \"allowedSourceAddressPrefix\": \"$MY_IP\"
        }
      ]
    }
  ]"

# Kiểm tra NSG rule được tạo tự động
NSG_NAME=$(az network nsg list -g rg-az500-lab33 --query "[0].name" -o tsv)
az network nsg rule list -g rg-az500-lab33 --nsg-name $NSG_NAME \
  --query "[?destinationPortRange=='3389'].{name:name, access:access, sourceAddr:sourceAddressPrefix}" \
  -o table
Kết quả đầu ra bước 3: NSG rule mới tên SecurityCenter-JITRule-... xuất hiện với Allow inbound port 3389 từ IP của bạn. Rule có priority cao và sẽ tự xóa sau 3 giờ.
4

Xem JIT Activity Log và Audit Trail

Azure CLI— Xem audit log JIT access
# Xem JIT access request history qua Activity Log
az monitor activity-log list \
  --resource-group rg-az500-lab33 \
  --start-time $(date -u -d "1 hour ago" '+%Y-%m-%dT%H:%M:%SZ') \
  --query "[?operationName.value=='Microsoft.Security/locations/jitNetworkAccessPolicies/initiate/action'].{time:eventTimestamp, caller:caller, status:status.value}" \
  -o table

# Xem NSG rules hiện tại — rule JIT có prefix SecurityCenter
NSG_NAME=$(az network nsg list -g rg-az500-lab33 --query "[0].name" -o tsv)
az network nsg rule list -g rg-az500-lab33 --nsg-name $NSG_NAME \
  --query "[].{name:name, priority:priority, access:access, port:destinationPortRange, source:sourceAddressPrefix}" \
  -o table
Portal verify: Defender for Cloud → Just-in-time VM access → Configured → click VM → tab Activity log → thấy record "JIT network access policy initiated" với thông tin người dùng, IP, thời gian.

📊 Kết Quả Đầu Ra

JIT policy configured

VM xuất hiện ở tab Configured trong JIT VM access của Defender for Cloud

NSG rule tự động tạo

SecurityCenter-JITRule-* xuất hiện trong NSG sau khi request, Allow port 3389 từ IP của bạn

RDP kết nối thành công

Kết nối RDP vào VM thành công trong thời gian JIT còn hiệu lực

Activity log có record

JIT initiate action ghi rõ caller, IP nguồn, port, thời gian trong Activity Log

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

Azure CLI— Tắt Defender for Servers và xóa lab
# TẮT Defender for Servers để tránh tiếp tục tính phí
SUBSCRIPTION_ID=$(az account show --query id -o tsv)
az security pricing create \
  --name VirtualMachines \
  --tier Free \
  --subscription $SUBSCRIPTION_ID

# Xóa resource group lab
az group delete --name rg-az500-lab33 --yes --no-wait

❓ Câu Hỏi Ôn Tập

1. JIT VM Access thuộc tính năng của sản phẩm nào trong Microsoft Defender for Cloud?

Gợi ý: Microsoft Defender for Servers (Plan 1 hoặc Plan 2) — không có trong Free tier của Defender for Cloud.

2. Khi JIT policy được bật, điều gì xảy ra với NSG rule cho port 3389 mặc định?

Gợi ý: Defender for Cloud thêm NSG rule Deny port 3389 với priority cao — chặn tất cả mặc định. Khi request, rule Allow tạm thời có priority cao hơn.

3. Thời gian tối đa cho một JIT request là bao nhiêu giờ? Ai có thể thay đổi giới hạn này?

Gợi ý: Tối đa 24 giờ. Security Admin có thể cấu hình max request time trong JIT policy.

4. JIT VM Access khác gì so với việc đơn giản chỉ xóa NSG rule port 3389 khi không cần dùng?

Gợi ý: JIT có audit log, IP restriction, time-bound tự động, tích hợp Defender workflow, không cần thao tác thủ công mỗi lần.

Lab 32: Azure Bastion Thư viện Labs Lab 34: Encryption at Host
Zalo