Azure Key Vault 幫助你保護應用程式、服務和資源所需的秘密,例如 API 金鑰和資料庫連線字串。
在這個教學中,你會設定一個主控台應用程式來讀取 Azure Key Vault 的資訊。 該應用程式會利用虛擬機的管理身份來驗證 金鑰保存庫。
本教學課程說明如何:
- 建立資源群組。
- 建立金鑰保存庫。
- 將秘密新增至金鑰保存庫。
- 從金鑰保存庫擷取祕密。
- 建立一個 Azure 虛擬機。
- 啟用虛擬機的 受控識別 。
- 對 VM 身分識別指派權限。
開始前,先讀 金鑰保存庫基本概念。
如果你沒有Azure訂閱,請建立一個free帳號。
先決條件
針對 Windows、Mac 和 Linux:
建立資源並指派權限
在您開始編碼之前,您必須建立一些資源,將祕密放入您的金鑰保存庫,以及指派權限。
登入 Azure
用 Azure CLI 或 Azure PowerShell 登入 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 身分識別指派權限
要透過
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,請前往 .NET 下載頁面。
建立並執行一個範例 .NET 應用程式
開啟命令提示字元並執行:
dotnet new console -n keyvault-console-app
cd keyvault-console-app
dotnet run
應用程式會把「Hello World」印在控制台上。
安裝套件
從主控台視窗安裝 Azure Key Vault Secrets 用戶端函式庫和 Azure Identity 函式庫:
dotnet add package Azure.Security.KeyVault.Secrets
dotnet add package Azure.Identity
編輯主控台應用程式
打開 Program.cs 並新增以下 using 指令:
using System;
using Azure.Core;
using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
用以下代碼替換此 Main 方法,更新 <vault-name> 為你的金鑰保險庫名稱。 這段程式碼使用 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.");
}
}
清理資源
當你不再需要它們時,刪除虛擬機和金鑰庫。