共用方式為

教程:在 Python 中将Azure Key Vault与虚拟机配合使用

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

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

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

在开始之前,请阅读 Key Vault 基本概念

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

先决条件

对于 Windows、Mac 和 Linux:

  • Git
  • 本教程要求在本地运行Azure CLI。 必须安装 Azure CLI 2.0.4 或更高版本。 运行 az --version 即可查找版本。 如果需要安装或升级 CLI,请参阅 Install Azure CLI 2.0

登录到Azure

若要使用Azure CLI登录到Azure,请输入:

az login

创建资源组和密钥库

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

或者,可以运行这些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 connection string或任何其他信息,需要确保应用程序的安全和可用。

若要将机密添加到新创建的密钥保管库,请使用以下命令:

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 分配标识

使用 Azure CLI az vm identity assign 命令为虚拟机创建系统分配的标识:

az vm identity assign --name "myVM" --resource-group "<resource-group>"

记下以下代码中显示的系统分配的标识。 以上命令的输出为:

{
  "systemAssignedIdentity": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "userAssignedIdentities": {}
}

为 VM 标识分配权限

若要通过 Role-Based Access Control (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

若要登录到虚拟机,请按照 Connect 中的说明登录到运行 Linux 的Azure虚拟机Connect 并登录到运行 Windows

若要登录到 Linux VM,可以在<public-ip-address>”步骤中将 ssh 命令与给定项配合使用:

ssh azureuser@<public-ip-address>

在 VM 上安装Python库

在虚拟机上安装将在Python脚本中使用的两个Python库:azure-keyvault-secretsazure-identity

例如在 Linux VM 上,可以使用 pip3 安装这些库:

pip3 install azure-keyvault-secrets

pip3 install azure-identity

创建和编辑示例Python脚本

在虚拟机上,创建名为 sample.py 的Python文件。 编辑文件以包含以下代码,将<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!'

清理资源

当不再需要它们时,请删除虚拟机和你的密钥保管库。 可通过删除它们所属的资源组快速完成此操作:

az group delete -g "myResourceGroup"

后续步骤

Azure Key Vault REST API