教程:将 Azure Key Vault 与通过 Python 编写的虚拟机配合使用

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,请参阅安装 Azure CLI 2.0

登录 Azure

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

az cloud set -n AzureChinaCloud
az login
# az cloud set -n AzureCloud   //means return to Public Azure.

创建资源组和 Key Vault

本快速入门使用预先创建的 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!"

创建虚拟机

使用以下方法之一创建名为 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 myResourceGroup \
  --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 "myResourceGroup"

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

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

为 VM 标识分配权限

现在可以运行以下命令,将前面创建的标识权限分配到 Key Vault:

az keyvault set-policy --name "<your-unique-keyvault-name>" --object-id "<systemAssignedIdentity>" --secret-permissions get list

登录 VM

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

若要登录到 Linux VM,可以将 ssh 命令与在创建虚拟机步骤中提供的 <publicIpAddress> 配合使用:

ssh azureuser@<PublicIpAddress>

在 VM 上安装 Python 库

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

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

pip3 install azure-keyvault-secrets

pip3 install azure.identity

创建并编辑示例 Python 脚本

在虚拟机上,创建名为 sample.py 的 Python 文件。 编辑文件以包含以下代码,将 <your-unique-keyvault-name> 替换为密钥保管库的名称:

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

key_vault_name = "<your-unique-keyvault-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 '<your-unique-keyvault-name>' is: 'Success!'

清理资源

不再需要本教程中创建的虚拟机和 Key Vault 时,请将其删除。 可通过删除它们所属的资源组快速完成此操作:

az group delete -g myResourceGroup

后续步骤

Azure Key Vault REST API