EngineeringSolution ArchitectAzure Playbooks

Azure Key Vault – Playbook Truy Cập Bí Mật

Kịch bản

Một ứng dụng .NET 8 (Web API, Azure Function, hoặc Console) cần lấy các bí mật (chuỗi kết nối DB, khóa Service Bus, API key) mà không lưu trong mã nguồn hay file cấu hình.

Yêu cầu trước

  • Azure subscription với Key Vault đã tạo (myKeyVault).
  • Managed Identity được bật trên tài nguyên Azure mục tiêu (App Service, Function App, VM, AKS pod, …).
  • Định danh này có Key Vault Secrets User role trên vault (hoặc role tùy chỉnh có quyền get).
  • Dự án .NET nhắm tới .NET 8 (hoặc .NET 6+).

Các bước thực hiện

  1. Thêm các gói NuGet
    bash
    dotnet add package Azure.Identity
    dotnet add package Azure.Security.KeyVault.Secrets
    
  2. Cấu hình Azure SDK (Program.cs)
    csharp
    using Azure.Identity;
    using Azure.Security.KeyVault.Secrets;
    
    var builder = WebApplication.CreateBuilder(args);
    
    // Khi chạy trên Azure, DefaultAzureCredential sẽ tự động lấy Managed Identity.
    var keyVaultUrl = new Uri("https://myKeyVault.vault.azure.net/");
    var secretClient = new SecretClient(keyVaultUrl, new DefaultAzureCredential());
    builder.Services.AddSingleton(secretClient);
    
    var app = builder.Build();
    
  3. Sử dụng một bí mật
    csharp
    public class WeatherService
    {
        private readonly SecretClient _secretClient;
        public WeatherService(SecretClient secretClient) => _secretClient = secretClient;
    
        public async Task<string> GetApiKeyAsync()
        {
            KeyVaultSecret secret = await _secretClient.GetSecretAsync("WeatherApiKey");
            return secret.Value; // Dùng key để gọi API bên ngoài
        }
    }
    
  4. Phát triển cục bộ
    • Cài Azure CLI và đăng nhập: az login.
    • Đặt biến môi trường AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET cho một service principal có quyền get trên vault.
    • DefaultAzureCredential sẽ tự động lấy chúng.
  5. Chính sách truy cập Key Vault (thay cho RBAC)
    bash
    az keyvault set-policy \
        --name myKeyVault \
        --object-id <managed‑identity‑object‑id> \
        --secret-permissions get list
    
  6. Làm mới bí mật mà không khởi động lại
    • SDK lưu cache bí mật trong 5 phút. Gọi GetSecretAsync mỗi request hoặc viết wrapper tự làm mới theo timer.
  7. Quản lý phiên bản & quay vòng
    • Lưu mỗi phiên bản bí mật (mySecret/2023‑09‑01). Dùng secretClient.GetSecretAsync("mySecret", "2023‑09‑01") để lấy phiên bản cụ thể.
    • Bật purge protection và soft‑delete để tránh mất dữ liệu.

Mẹo thực hành tốt

  • Không bao giờ log giá trị bí mật – ẩn trong log (ILogger với LogLevel.Information).
  • Sử dụng Managed Identity trong môi trường production; tránh nhúng client secret.
  • Bật diagnostic logs trên vault và chuyển tới Azure Monitor.
  • Cache có chọn lọc – cho các trường hợp traffic cao, cache bí mật trong bộ nhớ với TTL ngắn.
  • Tách vault theo môi trường (dev, test, prod) để tránh rò rỉ giữa các môi trường.

File thuộc mục Azure Playbooks của senior‑dotnet‑wiki.