你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

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

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

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

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

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

如果没有Azure订阅,请创建一个 free 帐户

先决条件

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

创建虚拟机

使用以下方法之一创建名为 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 角色分配创建为“用户主体名称”(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)。

登录到 VM

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

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

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.net"
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