教程:使用 Windows VM 系统分配的托管标识访问 Azure Key Vault

Azure 资源的托管标识是 Microsoft Entra ID 的一项功能。 支持 Azure 资源的托管标识的每个 Azure 服务都受其自己的时间线限制。 在开始之前,请务必查看资源的托管标识的可用性状态以及已知问题

本教程介绍 Windows 虚拟机 (VM) 如何使用系统分配的托管标识来访问 Azure Key Vault。 Key Vault 使客户端应用程序能够使用机密来访问不受 Microsoft Entra ID 保护的资源。 托管标识由 Azure 自动管理。 它们使你可以向支持 Microsoft Entra 身份验证的服务进行身份验证,而无需在代码中加入身份验证信息。

学习如何:

  • 授予 VM 对 Key Vault 中存储的密钥的访问权限
  • 使用 VM 标识获取访问令牌,并使用它来检索 Key Vault 中的密钥

先决条件

创建密钥保管库

提示

本文中的步骤可能因开始使用的门户而略有不同。

本部分说明如何授予 VM 访问密钥保管库中存储的密钥的权限。 使用 Azure 资源托管标识时,代码可以获取访问令牌,以向支持 Microsoft Entra 身份验证的资源进行身份验证。 但是,并非所有 Azure 服务都支持 Microsoft Entra 身份验证。 若要将 Azure 资源的托管标识用于这些服务,请将服务凭据存储在 Azure Key Vault 中,然后使用 VM 的托管标识访问 Key Vault 以检索凭据。

首先,我们需要创建一个 Key Vault 并授予 VM 的系统分配托管标识对 Key Vault 的访问权限。

  1. 登录到 Azure 门户

  2. 在左侧导航栏的顶部,选择“创建资源”

  3. 在“搜索市场”框中,键入“Key Vault”,然后按 Enter 。  

  4. 从结果中选择“Key Vault”。

  5. 选择“创建”

  6. 为新 Key Vault 提供一个名称

    Create a Key vault screen

  7. 填写所有必要信息。 请确保选择用于本教程的订阅和资源组。

  8. 选择“查看 + 创建”

  9. 选择“创建”

创建机密

接下来,将机密添加到 Key Vault,以便稍后可以使用在 VM 中运行的代码检索此机密。 在本教程中,我们将使用 PowerShell,但相同的概念适用于在此虚拟机中执行的任何代码。

  1. 导航到新创建的密钥保管库。

  2. 选择“密钥”,然后单击“添加”。

  3. 选择“生成/导入”

  4. 在“创建密钥”屏幕的“上传选项”中,将“手动”保留为选中状态。

  5. 输入密钥的名称和值。  该值可以是任何需要的内容。 

  6. 明确指定激活日期和到期日期,并将“已启用”设置为“是”。 

  7. 选择“创建”以创建机密。

    Create a secret

授予访问权限

需要向虚拟机使用的托管标识授予访问权限,方便其读取我们将存储在虚拟机中的密钥。

  1. 导航到新创建的密钥保管库

  2. 在左侧菜单中选择“访问策略”。

  3. 选择“添加访问策略”

    Key vault create access policy screen

  4. 在“从模板配置(可选)”下的“添加访问策略”部分的下拉菜单中选择“密钥管理”。

  5. 选择“选择主体”,并在搜索字段中输入之前创建的 VM 的名称。  选择结果列表中的 VM,然后选择“选择”。

  6. 选择“添加”

  7. 选择“保存”。

访问数据

本部分介绍如何使用 VM 标识获取访问令牌并使用它从密钥保管库中检索机密。 如果未安装 PowerShell 4.3.1 或更高版本,则需要下载并安装最新版本

首先,我们使用 VM 的系统分配托管标识获取访问令牌,向 Key Vault 证明身份:

  1. 在门户中,导航到“虚拟机”并转到 Windows 虚拟机,然后选择“概述”中的“连接”。
  2. 输入创建 Windows VM 时添加的用户名和密码。  
  3. 现在,已经创建了与虚拟机的远程桌面连接,请在远程会话中打开 PowerShell。  
  4. 在 PowerShell 中,调用租户上的 Web 请求,为 VM 特定端口中的本地主机获取令牌。  

PowerShell 请求:

$Response = Invoke-RestMethod -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.azure.cn' -Method GET -Headers @{Metadata="true"} 

可以看到如下响应:

Request with token response

接下来,从响应中提取访问令牌。  

   $KeyVaultToken = $Response.access_token

最后,使用 PowerShell 的 Invoke-WebRequest 命令检索之前在 Key Vault 中创建的密钥,在授权标头中传递访问令牌。  将需要 Key Vault 的 URL,该 URL 位于 Key Vault 的“概述”页的“软件包”部分。  

Invoke-RestMethod -Uri https://<your-key-vault-URL>/secrets/<secret-name>?api-version=2016-10-01 -Method GET -Headers @{Authorization="Bearer $KeyVaultToken"}

响应将如下所示:

  value       id                                                                                    attributes
  -----       --                                                                                    ----------
  'My Secret' https://mi-lab-vault.vault.azure.cn/secrets/mi-test/50644e90b13249b584c44b9f712f2e51 @{enabled=True; created=16…

在检索 Key Vault 中的密钥后,可以使用该密钥对需要名称和密码的服务进行身份验证。

清理资源

需要清理资源时,请登录 Azure 门户,选择“资源组”,找到并选择在本教程中创建的资源组(例如 mi-test),然后使用“删除资源组”命令。

或者,也可通过 PowerShell 或 CLI 清理资源

后续步骤

在本教程中,你已学习了如何使用 Windows VM 系统分配的托管标识来访问 Azure Key Vault。 要详细了解 Azure Key Vault,请参阅: