Python Azure 函数 - 使用 Key Vault 进行 MSI 身份验证

Posted

技术标签:

【中文标题】Python Azure 函数 - 使用 Key Vault 进行 MSI 身份验证【英文标题】:Python Azure Function - MSI Authentication with Key Vault 【发布时间】:2020-08-21 22:52:08 【问题描述】:

我正在尝试设置一个 Python Azure 函数,该函数将使用托管标识从密钥保管库中检索机密。我已授予我的 Function App 的托管身份权限以从 Key Vault 访问和检索机密。我已经根据此处看到的 Microsoft 文档配置了我的 Python 脚本:

https://docs.microsoft.com/en-us/python/api/overview/azure/key-vault?view=azure-python

我没有使用默认凭据,而是尝试使用 MSI 身份验证,如此处所述:

https://docs.microsoft.com/en-us/azure/developer/python/azure-sdk-authenticate#mgmt-auth-msi

如果我使用 MSI 身份验证链接中提供的示例,它可以工作。但是当我使用 Key Vault 方法时,我收到以下错误:

MSIAuthentication' object has no attribute 'get_token'

我的代码如下所示

    if name:
        # Create MSI Authentication
        credentials = MSIAuthentication()

        try:
            secret_client = SecretClient(vault_url="https://myvault.vault.azure.net", credential=credentials)

            secret = secret_client.get_secret("mySecret") 

            return func.HttpResponse(f"My super secret is: secret.value!")

        except Exception as e:
            err = "type error: " + str(e)
            return func.HttpResponse(f"err")

关于如何让这种方法发挥作用的任何建议。

TIA

(我知道我可以利用应用程序设置来设置到 Key Vault 的链接并在我的 Python 脚本中引用该变量。这种方法的问题是密钥库密钥是当密钥被轮换时,必须重新启动函数应用)

【问题讨论】:

我也有 Key Vault 挑战,但来自 Azure Web 应用程序。 【参考方案1】:

您需要将MSIAuthentication 更改为ManagedIdentityCredential。然后它会正常工作。这里的示例代码:

from azure.identity import ManagedIdentityCredential
from azure.keyvault.secrets import SecretClient

credentials = ManagedIdentityCredential()

secret_client = SecretClient(vault_url="https://myKeyvault.vault.azure.net", credential=credentials)
secret = secret_client.get_secret("mysecret")
print(secret.value)

【讨论】:

@Gist 没关系 :-)

以上是关于Python Azure 函数 - 使用 Key Vault 进行 MSI 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

Azure Key Vault 是不是支持客户端证书?

您如何在功能应用程序中从Azure Key Vault引用密钥?

无法使用 azure JavaScript 函数和 Key Vault 机密检索 cosmosDB 数据

在 Azure Batch 中使用托管标识在批处理池中使用 Python 对 Key Vault 进行身份验证

从 Azure Functions 访问 Azure Key Vault 时访问被拒绝

从 azure python sdk JWK 生成 jwcrypto JWK