教程:将 Azure Key Vault 与通过 .NET 编写的虚拟机配合使用
Azure Key Vault 可以帮助保护机密,例如访问应用程序、服务和 IT 资源时所需的 API 密钥与数据库连接字符串。
本教程介绍如何获取控制台应用程序,以便从 Azure Key Vault 读取信息。 应用程序将使用虚拟机托管标识对 Key Vault 进行身份验证。
本教程介绍如何:
- 创建资源组。
- 创建密钥保管库。
- 将机密添加到 Key Vault。
- 从密钥保管库检索机密。
- 创建一个 Azure 虚拟机。
- 为虚拟机启用托管标识。
- 为 VM 标识分配权限。
在开始之前,请阅读 Key Vault 的基本概念。
如果没有 Azure 订阅,请创建一个试用版版订阅。
对于 Windows、Mac 和 Linux:
在开始编码之前,需要创建一些资源,将机密放入密钥保管库,并分配权限。
使用以下命令登录到 Azure:
az cloud set -n AzureChinaCloud
az login
# az cloud set -n AzureCloud //means return to Public Azure.
本快速入门使用预先创建的 Azure 密钥保管库。 可以遵循 Azure CLI 快速入门、Azure PowerShell 快速入门或 Azure 门户快速入门中的步骤创建 Key Vault。
或者,也可运行这些 Azure CLI 或 Azure PowerShell 命令。
重要
每个密钥保管库必须具有唯一的名称。 在以下示例中,将 <your-unique-keyvault-name> 替换为密钥保管库的名称。
az group create --name "myResourceGroup" -l "ChinaEast"
az keyvault create --name "<your-unique-keyvault-name>" -g "myResourceGroup" --enable-rbac-authorization
让我们创建一个名为 mySecret 的机密,其值为 Success!。 机密可以是密码、SQL 连接字符串,或者需要安全保存的、可供应用程序使用的其他任何信息。
若要将机密添加到新创建的密钥保管库,请使用以下命令:
az keyvault secret set --vault-name "<your-unique-keyvault-name>" --name "mySecret" --value "Success!"
使用以下方法之一创建 Windows 或 Linux 虚拟机:
Windows | Linux |
---|---|
Azure CLI | Azure CLI |
PowerShell | PowerShell |
Azure 门户 | Azure 门户 |
按照以下示例为虚拟机创建系统分配的标识:
az vm identity assign --name <NameOfYourVirtualMachine> --resource-group <YourResourceGroupName>
记下以下代码中显示的系统分配的标识。 以上命令的输出为:
{
"systemAssignedIdentity": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"userAssignedIdentities": {}
}
使用 az keyvault set-policy 命令将以前创建的标识权限分配给密钥保管库:
az keyvault set-policy --name '<your-unique-key-vault-name>' --object-id <VMSystemAssignedIdentity> --secret-permissions get list set delete
若要登录到虚拟机,请按照连接并登录到 Azure Windows 虚拟机或连接并登录到 Azure Linux 虚拟机中的说明操作。
创建控制台应用并使用 dotnet
命令安装所需的包。
若要安装 .NET Core,请转到 .NET 下载页。
打开命令提示符。
可以运行以下命令,将“Hello World”输出到控制台:
dotnet new console -n keyvault-console-app
cd keyvault-console-app
dotnet run
在控制台窗口中,安装适用于 .NET 的 Azure Key Vault 机密客户端库:
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 = "<your-key-vault-name>";
var kvUri = "https://<your-key-vault-name>.vault.azure.cn";
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.");
}
}
不再需要本教程中创建的虚拟机和 Key Vault 时,请将其删除。