1

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

4

3 回答 3

1

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

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

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

于 2020-03-04T06:02:52.413 回答
0

当前使用 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 团队的 MS 工作)

于 2019-04-08T17:54:23.603 回答
0

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

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

Python SDK 完全支持这一点。

如果您在自己的外部环境中执行,那么问题并不是 Azure 特定的,您可以使用像“keyring”这样的库来处理存储这种秘密:

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

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

于 2019-04-05T22:24:55.663 回答