你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
教程:将 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 login
创建资源组和 Key Vault
本快速入门使用预先创建的 Azure 密钥保管库。 可以遵循 Azure CLI 快速入门、Azure PowerShell 快速入门或 Azure 门户快速入门中的步骤创建 Key Vault。
或者,也可运行这些 Azure CLI 或 Azure PowerShell 命令。
重要
每个密钥保管库必须具有唯一的名称。 在以下示例中,将 <your-unique-keyvault-name> 替换为密钥保管库的名称。
az group create --name "myResourceGroup" -l "EastUS"
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 标识分配权限
若要通过基于角色的访问控制 (RBAC) 授予应用程序对密钥保管库的权限,请使用 Azure CLI 命令 az role assignment create 分配角色。
az role assignment create --role "Key Vault Secrets User" --assignee "<app-id>" --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.KeyVault/vaults/<your-unique-keyvault-name>"
将 <app-id>
、<subscription-id>
、<resource-group-name>
和 <your-unique-keyvault-name>
替换为实际值。 <app-id>
是你在 Microsoft Entra 中注册的应用程序的“应用程序(客户端) ID”。
登录 VM
若要登录到虚拟机,请按照连接并登录到运行 Linux 的 Azure 虚拟机或连接并登录到运行 Windows 的 Azure 虚拟机中的说明操作。
若要登录到 Linux VM,可以将 ssh 命令与在创建虚拟机步骤中提供的 <publicIpAddress> 配合使用:
ssh azureuser@<PublicIpAddress>
在 VM 上安装 Python 库
在虚拟机上,安装将在 Python 脚本中使用的两个 Python 库:azure-keyvault-secrets
和 azure.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.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 '<your-unique-keyvault-name>' is: 'Success!'
清理资源
不再需要本教程中创建的虚拟机和 Key Vault 时,请将其删除。 可通过删除它们所属的资源组快速完成此操作:
az group delete -g myResourceGroup