繁体   English   中英

在 Azure 中存储服务主体凭据以使用 Python 对 Key Vault 进行身份验证

[英]Storing Service Principal Credentials in Azure to Authenticate Key Vault using Python

我目前正在使用 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。

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

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

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

最佳答案将取决于您执行代码的位置。

如果你在 Azure VM、Azure 容器或 Azure 内部的任何东西上执行它,那么你的场景正是 MSI(托管系统身份)存在的原因:)。 我强烈建议您查看 MSI 文档: https : //docs.microsoft.com/azure/active-directory/managed-identities-azure-resources/overview

Python SDK 完全支持这一点。

如果您在自己的外部环境中执行,那么问题并不是真正特定于 Azure,您可以使用“密钥环”之类的库来处理存储此类机密:

https://pypi.org/project/keyring/#what-is-python-keyring-lib

(披露:我在 Python SDK 团队的 MS 工作)

当前使用 Azure Batch 的最佳做法是对服务主体使用基于证书的身份验证。 为此,请使用“证书 API”( https://docs.microsoft.com/en-us/python/api/azure-batch/azure.batch.operations.certificate_operations.certificateoperations?view=azure -python#add-certificate--certificate-add-options-none--custom-headers-none--raw-false----operation-config- )。 然后,当您创建池时,您可以指定“certificate_references”以将这些证书安装到池中的每个节点 ( https://docs.microsoft.com/en-us/python/api/azure-batch/azure.batch。 models.pooladdparameter?view=azure-python )。

如果您更喜欢使用基于密钥的身份验证,您可以另外将密钥指定为池中的环境变量,这将在 REST 中加密

我们收到了很多添加 MSI 支持的请求,但目前我不知道计划添加的时间表。

(披露:我在微软的 Azure Batch 团队工作)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM