LAB 40 AZ-500 ~55 phút Chương 09 Chi phí thấp–trung

Key Vault — Secret, Key & Certificate

Tạo Key Vault chuẩn 2026: bật soft delete + purge protection + RBAC permission model. Tạo và quản lý secret, RSA key, self-signed certificate. Gán Key Vault Secrets User cho user/managed identity và xem audit log trong Key Vault.

🎯 Mục Tiêu Lab

Tạo Key Vault với soft delete (90 ngày) và purge protection bật

Chuyển permission model sang Azure RBAC (thay vault access policy cũ)

Tạo secret, đọc secret bằng CLI với role Key Vault Secrets User

Tạo RSA 2048 key, wrap/unwrap key operation để mã hóa dữ liệu

Tạo self-signed certificate với policy (CN, validity, key type)

Xem Key Vault audit log (AuditEvent) trong Azure Monitor / Diagnostic settings

📋 Chuẩn Bị

Yêu cầu:
  • Azure subscription với quyền Contributor + User Access Administrator
  • Azure CLI 2.50+
  • Hiểu cơ bản về PKI và certificate
  • Key Vault name phải globally unique, 3–24 ký tự
Naming convention:
  • RG: rg-az500-lab40
  • Key Vault: kv-az500-lab40-[suffix]
  • Secret: db-connection-string
  • Key: app-encryption-key
  • Certificate: app-tls-cert
  • Region: southeastasia

🏗️ Kịch Bản

Ứng dụng web cần lưu database connection string, encryption key và TLS certificate một cách an toàn — không hardcode trong code hay config file. Chuẩn 2026: Key Vault với RBAC model (không dùng access policy cũ), purge protection để chống xóa nhầm, managed identity để app đọc secret không cần credential.

Secret

Connection strings, API keys, passwords — plain text nhạy cảm, có versioning

Key

Cryptographic keys (RSA, EC) — dùng để encrypt/decrypt, sign/verify. Private key không bao giờ rời vault

Certificate

X.509 certificates — tự tạo hoặc import từ CA. Auto-renewal, policy, lifecycle management

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

1

Tạo Key Vault — Soft Delete + Purge Protection + RBAC

Cách 1 — Portal
  1. 1.1Portal → Key vaults → + Create → RG: rg-az500-lab40 → Name: kv-az500-lab40-[suffix] → Region: Southeast Asia → Pricing tier: Standard
  2. 1.2Tab Access configuration: Permission model → Azure role-based access control (không dùng Vault access policy)
  3. 1.3Recovery options: Days to retain deleted vaults: 90 → Enable purge protection: Yes → Review + create
  4. 1.4Key vault → Access control (IAM) → Add role assignment → Key Vault Administrator → chọn user bạn → Assign
Cách 2 — Azure CLI
Azure CLI— Tạo Key Vault chuẩn 2026
# Tạo resource group
az group create --name rg-az500-lab40 --location southeastasia

# Key Vault name phải globally unique
KV_NAME="kv-az500-lab40-$(shuf -i 100-999 -n 1)"
echo "Key Vault: $KV_NAME"

# Tạo Key Vault:
# --enable-rbac-authorization true = dùng RBAC thay vault access policy
# --enable-soft-delete true + --soft-delete-retention-days 90
# --enable-purge-protection true = không ai có thể purge vault trong retention period
az keyvault create \
  --resource-group rg-az500-lab40 \
  --name $KV_NAME \
  --location southeastasia \
  --sku standard \
  --enable-rbac-authorization true \
  --enable-soft-delete true \
  --soft-delete-retention-days 90 \
  --enable-purge-protection true \
  --retention-days 90

# Lấy Key Vault resource ID
KV_ID=$(az keyvault show --name $KV_NAME --query id --output tsv)
echo "KV ID: $KV_ID"

# Gán Key Vault Administrator cho user hiện tại
USER_OID=$(az ad signed-in-user show --query id --output tsv)
az role assignment create \
  --assignee $USER_OID \
  --role "Key Vault Administrator" \
  --scope $KV_ID

# Xác nhận cấu hình
az keyvault show --name $KV_NAME \
  --query "{rbac:properties.enableRbacAuthorization, softDelete:properties.enableSoftDelete, purgeProtection:properties.enablePurgeProtection}" \
  --output json
2

Tạo và Đọc Secret — Key Vault Secrets User Role

Cách 1 — Portal
  1. 2.1Key vault → Secrets+ Generate/Import → Name: db-connection-string → Value: Server=sql01;Database=appdb;User=admin;Password=P@ss2026! → Create
  2. 2.2Tạo thêm secret api-key-external → Set Activation date và Expiration date (1 tháng)
  3. 2.3Gán role Key Vault Secrets User (read-only) cho user thứ hai để test least privilege
  4. 2.4Xem Versions của secret → thấy version ID → update secret → xem version mới
Cách 2 — Azure CLI
Azure CLI— Tạo secret với expiry, đọc bằng Secrets User role
# Tạo secret — db connection string
az keyvault secret set \
  --vault-name $KV_NAME \
  --name db-connection-string \
  --value "Server=sql01.southeastasia.cloudapp.azure.com;Database=appdb;User=sqladmin;Password=P@ss2026!" \
  --description "Production DB connection string"

# Tạo secret với expiry date (30 ngày)
EXPIRY_DATE=$(date -u -d '+30 days' '+%Y-%m-%dT%H:%MZ' 2>/dev/null || \
              date -u -v+30d '+%Y-%m-%dT%H:%MZ')
az keyvault secret set \
  --vault-name $KV_NAME \
  --name api-key-external \
  --value "sk-ext-$(openssl rand -hex 16)" \
  --expires "$EXPIRY_DATE"

# Đọc secret (cần Key Vault Secrets User hoặc Administrator)
az keyvault secret show \
  --vault-name $KV_NAME \
  --name db-connection-string \
  --query "value" \
  --output tsv

# Liệt kê tất cả secrets (chỉ tên, không hiển thị value)
az keyvault secret list \
  --vault-name $KV_NAME \
  --query "[].{Name:name, Enabled:attributes.enabled, Expires:attributes.expires}" \
  --output table

# Update secret → tạo version mới
az keyvault secret set \
  --vault-name $KV_NAME \
  --name db-connection-string \
  --value "Server=sql01.southeastasia.cloudapp.azure.com;Database=appdb;User=sqladmin;Password=NewP@ss2026!"

# Xem tất cả versions
az keyvault secret list-versions \
  --vault-name $KV_NAME \
  --name db-connection-string \
  --query "[].{Version:id, Created:attributes.created, Enabled:attributes.enabled}" \
  --output table
3

Tạo RSA Key và Self-Signed Certificate

Cách 1 — Portal
  1. 3.1Key vault → Keys+ Generate/Import → Method: Generate → Name: app-encryption-key → Key type: RSA → RSA key size: 2048 → Create
  2. 3.2Key vault → Certificates+ Generate/Import → Method: Generate → Name: app-tls-cert
  3. 3.3Subject: CN=app.hoatranlab.io.vn → Validity: 12 months → Content type: PKCS #12 → Create
  4. 3.4Download certificate (.pfx) → xem thông tin certificate trong Portal
Cách 2 — Azure CLI
Azure CLI— Tạo RSA key, self-signed cert và test key operations
# Tạo RSA 2048 key
az keyvault key create \
  --vault-name $KV_NAME \
  --name app-encryption-key \
  --kty RSA \
  --size 2048 \
  --ops encrypt decrypt wrapKey unwrapKey sign verify

# Xem thông tin key
az keyvault key show \
  --vault-name $KV_NAME \
  --name app-encryption-key \
  --query "{keyId:key.kid, keyType:key.kty, keyOps:key.key_ops, enabled:attributes.enabled}" \
  --output json

# Tạo self-signed certificate với policy
# Cần tạo policy file JSON trước
cat > /tmp/cert-policy.json << 'EOF'
{
  "issuerParameters": { "name": "Self" },
  "keyProperties": {
    "exportable": true,
    "keySize": 2048,
    "keyType": "RSA",
    "reuseKey": false
  },
  "lifetimeActions": [{
    "action": { "actionType": "AutoRenew" },
    "trigger": { "daysBeforeExpiry": 30 }
  }],
  "secretProperties": { "contentType": "application/x-pkcs12" },
  "x509CertificateProperties": {
    "subject": "CN=app.hoatranlab.io.vn",
    "validityInMonths": 12,
    "keyUsage": ["digitalSignature", "keyEncipherment"],
    "ekus": ["1.3.6.1.5.5.7.3.1", "1.3.6.1.5.5.7.3.2"]
  }
}
EOF

az keyvault certificate create \
  --vault-name $KV_NAME \
  --name app-tls-cert \
  --policy @/tmp/cert-policy.json

# Đợi certificate được tạo (15–30 giây)
sleep 20

# Xem certificate info
az keyvault certificate show \
  --vault-name $KV_NAME \
  --name app-tls-cert \
  --query "{subject:policy.x509CertificateProperties.subject, expires:attributes.expires, thumbprint:x509Thumbprint}" \
  --output json

# Download certificate (PEM format)
az keyvault certificate download \
  --vault-name $KV_NAME \
  --name app-tls-cert \
  --file /tmp/app-tls-cert.pem \
  --encoding PEM
openssl x509 -in /tmp/app-tls-cert.pem -text -noout | grep -E "Subject:|Not After"
4

Bật Diagnostic Settings và Xem Audit Log

Cách 1 — Portal
  1. 4.1Key vault → Monitoring → Diagnostic settings+ Add diagnostic setting
  2. 4.2Chọn log category: Audit → Destination: Archive to storage account hoặc Send to Log Analytics workspace
  3. 4.3Thực hiện vài thao tác (đọc secret, tạo key) → Key vault → Insights → xem operations chart
Cách 2 — Azure CLI
Azure CLI— Bật diagnostic log và gán Secrets User role
# Tạo storage account để lưu diagnostic logs
DIAG_STORAGE="staz500kvlog$(shuf -i 100-999 -n 1)"
az storage account create \
  --resource-group rg-az500-lab40 \
  --name $DIAG_STORAGE \
  --location southeastasia \
  --sku Standard_LRS \
  --kind StorageV2

DIAG_STORAGE_ID=$(az storage account show \
  --resource-group rg-az500-lab40 \
  --name $DIAG_STORAGE --query id --output tsv)

# Bật diagnostic settings cho Key Vault (AuditEvent logs)
az monitor diagnostic-settings create \
  --resource $KV_ID \
  --name kv-audit-logs \
  --storage-account $DIAG_STORAGE_ID \
  --logs '[{"category":"AuditEvent","enabled":true,"retentionPolicy":{"days":90,"enabled":true}}]'

# Gán Key Vault Secrets User (read-only secrets) cho user/MI
# Role ID: 4633458b-17de-408a-b874-0445c86b69e6
az role assignment create \
  --assignee $USER_OID \
  --role "Key Vault Secrets User" \
  --scope "$KV_ID/secrets/db-connection-string"

# Test: đọc secret với Secrets User role (chỉ read, không set/delete)
az keyvault secret show \
  --vault-name $KV_NAME \
  --name db-connection-string \
  --query "value" --output tsv

# Xem tất cả role assignments trên Key Vault
az role assignment list \
  --scope $KV_ID \
  --query "[].{Principal:principalName, Role:roleDefinitionName, Scope:scope}" \
  --output table

📊 Kết Quả Mong Đợi

Key Vault chuẩn 2026

enableRbacAuthorization: true, enablePurgeProtection: true, softDeleteRetentionInDays: 90

Secret có versioning

list-versions hiển thị 2+ versions, version cũ vẫn accessible qua version ID

Certificate tạo thành công

CN=app.hoatranlab.io.vn, validity 12 tháng, auto-renew 30 ngày trước hết hạn

RBAC hoạt động đúng

Secrets User chỉ đọc được secrets, không tạo/xóa được (403 Forbidden)

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

Azure CLI— Xóa RG (Key Vault vào soft-deleted state, purge sau 90 ngày hoặc thủ công)
# Xóa resource group
az group delete --name rg-az500-lab40 --yes --no-wait

# Key Vault với purge protection bật sẽ vào soft-deleted state 90 ngày
# Để purge ngay (chỉ khi purge protection TẮT hoặc hết retention):
# az keyvault purge --name $KV_NAME --location southeastasia

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

1. Sự khác biệt giữa Vault Access Policy và Azure RBAC permission model trong Key Vault?

Gợi ý: Access Policy là vault-level, không có inheritance, không audit trail tốt. RBAC chuẩn Azure: có thể scope đến từng secret/key/cert, dùng chung với Azure Monitor, audit qua Activity Log

2. Tại sao cần bật purge protection khi đã có soft delete?

Gợi ý: Soft delete ngăn xóa nhầm nhưng admin vẫn có thể purge (xóa vĩnh viễn) vault đã soft-deleted. Purge protection ngăn hoàn toàn thao tác purge trong retention period — bảo vệ khỏi insider threat

3. Role nào cho phép đọc secret value nhưng không thể tạo hoặc xóa secret?

Gợi ý: Key Vault Secrets User — chỉ có quyền Get và List secrets. Key Vault Secrets Officer có thêm Set và Delete. Key Vault Administrator có toàn quyền

4. Khi dùng Key Vault RSA key để encrypt data, private key có rời khỏi vault không?

Gợi ý: Không — private key luôn nằm trong vault. Operations encrypt/decrypt/sign/verify được thực hiện trong vault thông qua API. App chỉ nhận kết quả, không bao giờ thấy private key

5. Certificate trong Key Vault có gì khác so với lưu certificate trong Storage hay VM?

Gợi ý: Key Vault tự động renew, quản lý vòng đời, private key không exportable (tùy policy), audit mọi access, tích hợp với App Service/AKS/VM để inject certificate tự động không cần đặt trong code

Lab 39: Soft Delete & Immutable Thư viện Labs Lab 41: KV Private Endpoint & RBAC
Zalo