我目前正在使用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。
答案 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上工作)