教學:在 .NET 中使用 Azure Key Vault 搭配虛擬機

Azure Key Vault 幫助你保護像是 API 金鑰、存取應用程式、服務所需的資料庫連線字串,以及 IT 資源等秘密。

在這個教學中,你會學習如何讓主控台應用程式讀取 Azure Key Vault 的資訊。 應用程式會使用虛擬機管理身份來驗證 金鑰保存庫。

本教學課程說明如何:

  • 建立資源群組。
  • 建立金鑰保存庫。
  • 將秘密新增至金鑰保存庫。
  • 從金鑰保存庫擷取祕密。
  • 建立一個 Azure 虛擬機。
  • 啟用虛擬機的 受控識別
  • 對 VM 身分識別指派權限。

開始前,先讀 金鑰保存庫基本概念

如果你沒有Azure訂閱,請建立一個free帳號

先決條件

針對 Windows、Mac 和 Linux:

建立資源並指派權限

在您開始編碼之前,您必須建立一些資源,將祕密放入您的金鑰保存庫,以及指派權限。

登入 Azure

要使用以下指令登入 Azure:

az login

建立資源群組和金鑰保存庫

這個快速入門使用預先建立的 Azure 金鑰庫。 您可以遵循下列快速入門中的步驟來建立金鑰保存庫:

或者,你也可以執行這些 Azure CLI 或 Azure PowerShell 指令。

這很重要

每個金鑰保存庫必須有唯一的名稱。 在以下範例中,請用你的金鑰保險庫名稱替換 <vault-name>

az group create --name "myResourceGroup" -l "EastUS"

az keyvault create --name "<vault-name>" -g "myResourceGroup" --enable-rbac-authorization true

將祕密填入金鑰保存庫

讓我們建立名為 mySecret 的秘密,其值為 Success!。 秘密可能是密碼、SQL 連接字串,或任何其他你需要保持安全且對應用程式可存取的資訊。

若要將祕密新增至新建立的金鑰保存庫,請使用下列命令:

az keyvault secret set --vault-name "<vault-name>" --name "mySecret" --value "Success!"

建立虛擬機

使用以下方法之一建立 Windows 或 Linux 虛擬機器:

Windows Linux
Azure CLI Azure CLI
PowerShell PowerShell
Azure portal Azure portal

將身分識別指派給 VM

使用下列範例,為虛擬機器建立系統指派的身分識別:

az vm identity assign --name <vm-name> --resource-group <resource-group>

請注意下列程式碼中所顯示的系統指派身分識別。 上述命令的輸出會是:

{
  "systemAssignedIdentity": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "userAssignedIdentities": {}
}

對 VM 身分識別指派權限

要透過 Role-Based 存取控制(RBAC) 取得你的金鑰保險庫權限,請使用 Azure CLI 指令 az role assignment create 指派一個角色給你的「使用者主體名稱」(UPN)。

az role assignment create --role "Key Vault Secrets User" --assignee "<upn>" --scope "/subscriptions/<subscription-id>/resourceGroups/myResourceGroup/providers/Microsoft.KeyVault/vaults/<vault-name>"

<upn><subscription-id><vault-name>取代為您的實際值。 如果你用了不同的資源群組名稱,也請把「myResourceGroup」替換掉。 您的 UPN 格式通常是電子郵件地址 (例如,username@domain.com)。

登入虛擬機器

要登入虛擬機,請依照 Connect 中的指示登入,登入Azure Windows虛擬機Connect 並登入 Azure Linux 虛擬機

設定主控台應用程式

使用 dotnet 命令來建立主控台應用程式並安裝必要的套件。

安裝 .NET 核心

要安裝 .NET Core,請前往 .NET downloads 頁面。

建立並執行一個範例 .NET 應用程式

開啟命令提示字元。

你可以透過執行以下指令,將「Hello World」列印到主控台:

dotnet new console -n keyvault-console-app
cd keyvault-console-app
dotnet run

安裝套件

從主控台視窗安裝 Azure Key Vault Secrets 用戶端函式庫用於 .NET:

dotnet add package Azure.Security.KeyVault.Secrets

在此快速入門時,您需要安裝以下身份套件以驗證 Azure Key Vault:

dotnet add package Azure.Identity

編輯主控台應用程式

開啟 Program.cs 檔案並新增這些套件:

using System;
using Azure.Core;
using Azure.Identity;
using Azure.Security.KeyVault.Secrets;

新增以下幾行,更新 URI 以反映金鑰保存庫的 vaultUri。 下列程式代碼使用 『DefaultAzureCredential()』 進行金鑰保存庫的驗證,其使用來自應用程式受控識別的令牌進行驗證。 如果金鑰保存庫遭到節流,其也會使用指數輪詢來進行重試。

  class Program
    {
        static void Main(string[] args)
        {
            string secretName = "mySecret";
            string keyVaultName = "<vault-name>";
            var kvUri = "https://<vault-name>.vault.azure.net";
            SecretClientOptions options = new SecretClientOptions()
            {
                Retry =
                {
                    Delay= TimeSpan.FromSeconds(2),
                    MaxDelay = TimeSpan.FromSeconds(16),
                    MaxRetries = 5,
                    Mode = RetryMode.Exponential
                 }
            };

            var client = new SecretClient(new Uri(kvUri), new DefaultAzureCredential(),options);

            Console.Write("Input the value of your secret > ");
            string secretValue = Console.ReadLine();

            Console.Write("Creating a secret in " + keyVaultName + " called '" + secretName + "' with the value '" + secretValue + "' ...");

            client.SetSecret(secretName, secretValue);

            Console.WriteLine(" done.");

            Console.WriteLine("Forgetting your secret.");
            secretValue = "";
            Console.WriteLine("Your secret is '" + secretValue + "'.");

            Console.WriteLine("Retrieving your secret from " + keyVaultName + ".");

            KeyVaultSecret secret = client.GetSecret(secretName);

            Console.WriteLine("Your secret is '" + secret.Value + "'.");

            Console.Write("Deleting your secret from " + keyVaultName + " ...");

            client.StartDeleteSecret(secretName);

            System.Threading.Thread.Sleep(5000);
            Console.WriteLine(" done.");

        }
    }

清理資源

不再需要時,請刪除虛擬機器和金鑰保存庫。

後續步驟