首页 > 解决方案 > 在 Azure 中存储服务主体凭据以使用 Python 对 Key Vault 进行身份验证

问题描述

我目前正在使用 Python 从 Azure blob 存储中读取文件并将其存储在数据框中。为了对 blob 存储进行身份验证,我使用服务主体凭据从 Azure 密钥保管库中提取存储帐户密钥。

我的代码如下:

from azure.keyvault import KeyVaultClient, KeyVaultAuthentication
from azure.common.credentials import ServicePrincipalCredentials

def auth_callback(server, resource, scope):
    credentials = ServicePrincipalCredentials(
        client_id = '',
        client_secret='',
        tenant = '',
        resource = "https://samplename.vault.azure.net/"
    )
    token = credentials.token
    return token['token_type'], token['access_token']

client = KeyVaultClient(KeyVaultAuthentication(auth_callback))

key_bundle = client.get_key('https://samplename.vault.azure.net/', '','')
json_key = key_bundle.key 

但是,我必须将服务主体密钥保存在代码中,我觉得这不是最佳做法。

我怎样才能避免这种情况?

我还考虑将服务主体凭据存储在存储在 blob 存储中的单独配置文件中,然后从 Python 中读取它。但这也涉及最终将 tee 服务主体的凭据存储在文本文件中。

我正在从 Azure Batch 运行 Python。

标签: pythonazureazure-keyvaultservice-principal

解决方案


我还尝试在批处理服务中运行 Python,并希望在门户或 python 脚本中不显示任何凭据的情况下访问 Key Vault,因此我需要使用证书而不是密钥。我认为这必须是批处理服务的一个非常常见的用例。

我可以使用 Powershell 脚本中的证书指纹访问 Key Vault,但我可以找到从 python 访问它的唯一方法是将 AZURE_CLIENT_CERTIFICATE_PATH 环境变量设置为指向不受密码保护的 pem 证书并使用 DefaultAzureCredential 类。批处理服务需要受密码保护的 cer 或 pfx 证书,因此任何解决方案都会非常繁琐——我唯一能想到的是将 pfx 转换为 pem,然后设置环境变量,其中 pfx 密码可见代码或门户网站上。

如果有更简单的方法请告诉我。否则我认为这是批处理服务中的一个重大差距,这在其他方面非常有用。


推荐阅读