在Azure中存储服务主体凭据以使用Python验证密钥库

时间:2019-04-05 16:44:06

标签: python azure service-principal

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

3 个答案:

答案 0 :(得分:1)

我还试图在批处理服务中运行Python,并且想访问Key Vault,而无需在门户网站或python脚本中看到任何凭据,因此我需要使用证书而不是密钥。 我认为对于批处理服务,这一定是一个非常普遍的用例。

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

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

答案 1 :(得分:0)

最佳答案将取决于您在哪里执行代码。

如果您在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上工作)

答案 2 :(得分: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支持的请求,但是目前我不知道计划何时添加MSI。

(披露:我在Azure Batch团队的MS上工作)