Azure 函数和 Azure KeyVault 通过服务端点进行通信

Posted

技术标签:

【中文标题】Azure 函数和 Azure KeyVault 通过服务端点进行通信【英文标题】:Azure functions and Azure KeyVault communicating through service endpoint 【发布时间】:2020-04-21 13:18:30 【问题描述】:

我已设置并激活了带有 vNET 防火墙的 Azure KeyVault。我还设置了一个带有 vNET 集成的 Azure Functions 应用程序(Premium、Linux、Python)。我已将函数应用的子网添加为密钥保管库上的服务端点。但是我仍然无法从 azure 函数访问密钥库。

我收到一条错误消息,指出 Azure Functions IP(公共 IP)无法访问 Key Vault。

我错过了什么吗?还是它目前不起作用?

在 Keyvault 中将 azure 函数 IP 列入白名单并不是我想要的,因为通信仍将通过公共端点。

谢谢!

【问题讨论】:

您看到了什么错误?您是否为 Function App 的密钥库添加了访问策略? @DreadedFrost 是的,我确实添加了密钥保管库访问策略。这更像是一个网络问题。我收到一条错误消息,指出 Functions IP(公共 IP)无法访问 Key Vault。 Key Vault 通过 Python SDK 使用其 DNS 名称访问 【参考方案1】:

您可以检查以下内容:

使用new vNet Integration。您应该满足区域 vNet 集成的所有限制。此功能要求应用和 VNet 必须位于同一区域。它还需要一个未使用的子网来进行 VNet 集成。 为您的函数子网启用服务端点Microsoft.KeyVault。 确保在 Key Vault 的防火墙中添加了正确的功能子网。

有时,vNet 配置的部署顺序或时间很重要,您可以参考此working template 完成部署。

【讨论】:

是的,我都做到了。你有没有让它在你的末端工作?我不确定我还缺少什么 通常,人们可以使用该模板。我还验证了this tutorial。你这边有错误信息吗?您是否缩小范围是网络问题? 是的,我确定这是网络问题。我收到一条错误消息,指出 Azure Functions IP(公共 IP)无法访问 Key Vault。通过 Python SDK 使用其 DNS 名称访问 Key Vault。 提供的模板看起来像是用于设置应用服务以与同一子网中的存储帐户通信.....与 Key Vault 无关。 是的,我的意思是您可以将存储帐户资源替换为模板中的密钥保管库,只需参考该模板即可完成您的模板。【参考方案2】:

所以 VNet Integration with App Service (Function App) 只支持

通过 Key Vault 部署 Azure Web App 证书。

这里是列出所有"Trusted Services" Key Vaults supports的文档

这是另一个blog that illustrates the same issue you are facing

该问题不想将 IP 列入 Key Vault 的白名单,但要确认支持是问题,建议将其列入白名单并查看它是否有效。如果确实如此,则确认问题是应用服务检索机密不是 Key Vault 的“可信服务”

【讨论】:

以上是关于Azure 函数和 Azure KeyVault 通过服务端点进行通信的主要内容,如果未能解决你的问题,请参考以下文章

利用KeyVault来加强存储Azure Storage访问密钥管理

Azure KeyVault:Azure.Identity.CredentialUnavailableException:DefaultAzureCredential 无法从包含的凭据中检索令牌

使用 Azure.Security.KeyVault.Secrets 的网络核心密钥保管库配置

从Xamarin表单访问Azure KeyVault

使用KeyVaultClient定义Azure KeyVault密钥上的策略

使用 ARM 模板将 Azure KeyVault 机密从 KeyVault 获取到应用服务