我目前正在使用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。
最佳答案取决于您执行代码的位置。
如果您在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工作)
使用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-)将证书添加到Batch。然后,在创建池时,可以指定“certificate_references”以将这些证书安装到池中的每个节点(https://docs.microsoft.com/en-us/python/api/azure-batch/azure.batch.models.pooladdparameter?view=azure-python)。
如果您更喜欢使用基于密钥的身份验证,则还可以将密钥指定为池中的环境变量,这些变量将在REST中加密
我们收到了很多添加MSI支持的请求,但目前我不知道计划添加的时间表。
(披露:我在Azure Batch团队的MS工作)