繁体   English   中英

无法使用 App Service 上的 Azure MSI 访问 Key Vault

[英]Unable to get access to Key Vault using Azure MSI on App Service

我在应用服务上启用了托管服务标识。 但是,我的 WebJobs 似乎无法访问密钥。

他们报告:

Tried the following 3 methods to get an access token, but none of them worked. Parameters: Connectionstring: [No connection string specified], Resource: https://vault.azure.net, Authority: . Exception Message: Tried to get token using Managed Service Identity. Unable to connect to the Managed Service Identity (MSI) endpoint. Please check that you are running on an Azure resource that has MSI setup. Parameters: Connectionstring: [No connection string specified], Resource: https://vault.azure.net, Authority: https://login.microsoftonline.com/common. Exception Message: Tried to get token using Active Directory Integrated Authentication. Access token could not be acquired. password_required_for_managed_user: Password is required for managed user Parameters: Connectionstring: [No connection string specified], Resource: https://vault.azure.net, Authority: . Exception Message: Tried to get token using Azure CLI. Access token could not be acquired. 'az' is not recognized as an internal or external command,

Kudo 不显示任何 MSI_ 环境变量。

这应该如何工作? 这是现有的应用程序服务计划。

AppAuthentication 库利用应用服务中的内部端点代表您的站点接收令牌。 此端点是非静态的,因此设置为环境变量。 通过 ARM 为您的站点激活 MSI 后,您的站点将需要重新启动以在其中设置两个新的环境变量:

MSI_ENDPOINTMSI_SECRET

这些变量的存在对于 MSI 功能在运行时正常工作至关重要,因为 AppAuthentication 库使用它们来获取授权令牌。 错误消息反映了这一点:

异常消息:尝试使用托管服务标识获取令牌。 无法连接到托管服务标识 (MSI) 端点 请检查您是否在具有 MSI 设置的 Azure 资源上运行。

如果这些变量不存在,您可能需要重新启动站点。

https://docs.microsoft.com/en-us/azure/app-service/app-service-managed-service-identity

如果设置了环境变量并且您仍然看到相同的错误,上面的文章有一个代码示例,显示了如何手动向该端点发送请求。

public static async Task<HttpResponseMessage> GetToken(string resource, string apiversion)  {
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Secret", Environment.GetEnvironmentVariable("MSI_SECRET"));
return await client.GetAsync(String.Format("{0}/?resource={1}&api-version={2}", Environment.GetEnvironmentVariable("MSI_ENDPOINT"), resource, apiversion));

}

我会尝试一下,看看我得到什么样的回应。

我刚刚在尝试将 MSI 与 Function 应用程序一起使用时解决了这个问题,尽管我已经设置了环境变量。 我试过多次重启都没有成功。 我最终做的是手动关闭该功能的 MSI,然后重新启用它。 这并不理想,但它奏效了。

希望有帮助!

我发现如果您启用 MSI 然后换出插槽,则功能会随着插槽的变化而消失。 您可以通过将其关闭然后再次打开来重新启用它,但这将在 AD 中创建一个新身份,并且需要您重置密钥保管库的权限才能使其工作。

启用身份并通过访问策略授予对 keyvault 中的 azure 函数应用程序的访问权限。 您可以在平台功能选项卡中找到身份这两个步骤对我有用

就我而言,我忘记为 Key Vault 中的应用程序添加访问策略

对于像我这样的人,想知道如何启用MSI

我的场景:我有一个App Service已经部署并运行了很长时间。 此外,在Azure DevOps我将我的管道配置为自动交换我的部署槽(暂存/生产)。 突然,在正常推送后,生产由于所描述的问题而开始失败。

因此,为了再次启用 MSI(我不知道为什么必须重新启用它,但我相信这只是一种解决方法,而不是解决方案,因为它应该仍然首先启用)

转到您的应用服务。 然后在设置--> 身份下。 检查状态:就我而言,它已关闭

我在下面附上了一张图片,以便更容易理解。

在此处输入图片说明

接通状态像@Sebastian Inones显示。 比为 KeyVault 添加访问策略,例如在此处输入图片说明

这样问题就解决了!!

对于会遇到这些答案的人,我想分享我的经验。

我在 Azure Synapse 管道运行时遇到了这个问题。 本质上,我向 KeyVault 添加了正确的访问策略,并且还向指向我的 KeyVault 的 Azure Synapse 添加了一个 LinkedService。

如果我手动触发笔记本,它会工作,但在管道中,它会失败。

最初,我使用了以下语句:

url = TokenLibrary.getSecret("mykeyvault", "ConnectionString")

然后我将链接服务的名称添加为第三个参数,管道能够利用该链接服务获取 Vault 的 MSI 令牌。

url = TokenLibrary.getSecret("mykeyvault", "ConnectionString", "AzureKeyVaultLinkedServiceName")

可能与您的问题无关,但我收到了相同的错误消息。

对我来说,问题是使用 pip3 的 azure-cli。 我能够通过为 azure-cli 和 azure-functions-core-tools 使用 brew 包来解决这个问题。

卸载 pip3 azure-cli

pip3 uninstall azure-cli

安装 brew azure-cli

brew update
brew install azure-cli

仔细检查错误消息是否以以下结尾:

请go到工具->选项->Azure服务认证,重新认证你要使用的账户。

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM