Azure:Python SDK 和 KeyVault -- 服务主体

Azure: Python SDK and KeyVault -- Service Principal

我不清楚应该如何按照此处列出的指南建立服务主体:https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/keyvault/azure-keyvault-secrets/README.md#create-a-service-principal-optional

我有一个加载了 docker 图像的 Azure 应用程序服务(Web 应用程序)。此应用服务还绑定了一个应用注册以进行身份​​验证。

我可以针对三个潜在目标执行代码:az ad sp create-for-rbac --name http://my-application --skip-assignment

我要做什么 select 为什么?

稍后在指南中,它要求设置三个环境变量,如下所示:

export AZURE_CLIENT_ID="generated app id"
export AZURE_CLIENT_SECRET="random password"
export AZURE_TENANT_ID="tenant id"

可以在我的 Azure App Service Web 应用程序 Configuration -> Application Settings 中设置这些吗?还是必须在我的 Dockerfile 中设置它们?

如果要从 Python 中容器的 Azure Web 应用程序访问 Azure Key Vault,推荐的方法是使用 Managed Identity 而不是创建和管理您自己的服务委托人。 Web App for Containers 支持托管标识。

在 Python 容器中,您可以通过以下代码行使用托管身份访问 Azure Key Vault 机密

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

credentials = DefaultAzureCredential()
client = SecretClient("https://yourkeyvault.vault.azure.net/", credentials)
secret = client.get_secret("yoursecretname").value

这样您就不必存储任何服务主体机密,无论是在容器中还是作为环境变量。 DefaultAzureCredential() 将尝试调用 Microsoft 提供的托管身份服务,该服务在您的应用程序服务中可用,可用于创建令牌,该令牌反过来用于针对 Key Vault 进行身份验证。

之后,构建您的 Python 映像并将其上传到容器注册表。然后在创建您的应用服务时引用图像。

az webapp create --resource-group <resoure group name> --plan <app service plan name> --name <app name> --deployment-container-image-name <container registry name>.azurecr.io/<image name>

接下来转到您创建的应用程序服务 > 身份并打开系统分配的托管身份

您将获得创建的服务主体的对象 ID。在您的 Key Vault 中,转到“访问策略”并使用您需要的权限添加此对象 ID(假设您需要在此示例中从保管库中获取秘密)

您现在应该能够从 Azure Key Vault 中检索机密。