教程:在 Python 中将Azure 密钥保管库与虚拟机配合使用

Azure 密钥保管库有助于保护密钥、机密和证书,例如 API 密钥和数据库连接字符串。

在本教程中,你将设置一个Python应用程序,以便使用Azure资源的托管标识从Azure 密钥保管库读取信息。 你将学习如何执行以下操作:

  • 创建密钥保管库
  • 将机密存储在密钥保管库
  • 创建 Azure Linux 虚拟机
  • 为虚拟机启用托管标识
  • 授予控制台应用程序从密钥保管库读取数据所需的权限
  • 从密钥保管库检索机密

在开始之前,请阅读 密钥保管库 基本概念

如果您没有 Azure 订阅,请创建一个试用订阅。

先决条件

对于 Windows、Mac 和 Linux:

  • Git
  • Azure CLI的当前版本。 运行 az --version 以检查已安装的版本。

登录到 Azure

使用Azure CLI登录到Azure:

az login

创建资源组和密钥库

本快速入门使用预先创建的Azure密钥保管库。 可以按照以下快速入门中的步骤创建密钥保管库:

或者,可以运行这些Azure CLI或Azure PowerShell命令。

重要

每个密钥保管库必须具有唯一的名称。 在以下示例中,将 <vault-name> 替换为您的密钥保管库的名称。

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

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!"

创建虚拟机

使用以下方法之一创建名为 myVM 的 VM:

Linux Windows
Azure CLI Azure CLI
PowerShell PowerShell
Azure 门户 Azure 门户

若要使用 Azure CLI 创建 Linux VM,请使用 az vm create 命令。 以下示例添加一个名为 azureuser 的用户帐户。 --generate-ssh-keys 参数用来自动生成一个 SSH 密钥,并将其放置在默认密钥位置 ( ~/.ssh) 中。

az vm create \
  --resource-group <resource-group> \
  --name myVM \
  --image Ubuntu2204 \
  --admin-username azureuser \
  --generate-ssh-keys

请记录输出中 publicIpAddress 的值。

为 VM 分配标识

使用 az vm identity assign 命令为 VM 创建系统分配的托管标识:

az vm identity assign --name "myVM" --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/<resource-group-name>/providers/Microsoft.KeyVault/vaults/<your-unique-keyvault-name>"

将 <upn>、<subscription-id>、<resource-group-name> 和 <your-unique-keyvault-name> 替换为你的实际值。 你的 UPN 通常采用电子邮件地址格式(例如 username@domain.com)。

登录到 VM

若要登录到虚拟机,请按照 连接并登录到运行 Linux 的 Azure 虚拟机连接并登录到运行 Windows 的 Azure 虚拟机中的说明操作。

若要登录 Linux VM,请使用 ssh 步骤中的 <public-ip-address>

ssh azureuser@<public-ip-address>

在 VM 上安装Python库

在 VM 上,安装示例脚本使用的两个Python库:azure-keyvault-secretsazure-identity

在 Linux VM 上,使用 pip3 安装它们:

pip3 install azure-keyvault-secrets azure-identity

创建和编辑示例Python脚本

在 VM 上,创建一个名为sample.pyPython文件。 将以下代码粘贴到文件中,用你的密钥保管库名称替换 <vault-name>

from azure.keyvault.secrets import SecretClient
from azure.identity import DefaultAzureCredential

key_vault_name = "<vault-name>"
key_vault_uri = f"https://{key_vault_name}.vault.azure.cn"
secret_name = "mySecret"

credential = DefaultAzureCredential()
client = SecretClient(vault_url=key_vault_uri, credential=credential)
retrieved_secret = client.get_secret(secret_name)

print(f"The value of secret '{secret_name}' in '{key_vault_name}' is: '{retrieved_secret.value}'")

运行示例Python应用

运行 sample.py。 如果一切配置正确,应用将输出机密值:

python3 sample.py

The value of secret 'mySecret' in '<vault-name>' is: 'Success!'

清理资源

不再需要它们时,请删除 VM 和密钥保管库。 最快的方法是删除它们所属的资源组:

az group delete -g "myResourceGroup"

后续步骤

Azure 密钥保管库 REST API