应用服务中的 Docker 容器无法使用 Node SDK 访问 KeyVault

Posted

技术标签:

【中文标题】应用服务中的 Docker 容器无法使用 Node SDK 访问 KeyVault【英文标题】:Docker Container in App Service not able to access KeyVault with Node SDK 【发布时间】:2022-01-12 07:40:21 【问题描述】:

我正在应用服务中使用 docker-compose 运行两个容器。

容器被授予获取/列出我的 KeyVault 的机密和证书的权限,但我无法使用 SDK 访问它们(或我的订阅中的任何其他 Azure 资源)。

我正在使用 Node SDK,看起来像这样(这里没什么特别的):

import  SecretClient  from '@azure/keyvault-secrets';
import  DefaultAzureCredential  from '@azure/identity';

// ...

const keyVaultClient = new SecretClient(
   `https://<key-vault-name>.vault.azure.net`,
   new DefaultAzureCredential()
)
await this.keyVaultClient.getSecret('<some-secret>');

首先,我有Azure CLI could not be found

所以我在我的容器中安装了 Azure CLI,这将我带到了Please run 'az login' from a command prompt to authenticate before using this credential

文档说DefaultAzureCredential 应该适用于大多数服务,因为它会一个接一个地尝试所有可用的凭据。

我错过了什么?


编辑1:更进一步,使用AZURE_LOG_LEVEL=verbose

2021-12-07T08:13:31.661891058Z azure:identity:info ManagedIdentityCredential - Fabric MSI => ManagedIdentityCredential - Fabric MSI: Unavailable. The environment variables needed are: IDENTITY_ENDPOINT, IDENTITY_HEADER and IDENTITY_SERVER_THUMBPRINT
2021-12-07T08:13:31.670324114Z azure:identity:info ManagedIdentityCredential - AppServiceMSI 2017 => ManagedIdentityCredential - AppServiceMSI 2017: Unavailable. The environment variables needed are: MSI_ENDPOINT and MSI_SECRET.
2021-12-07T08:13:31.670736112Z azure:identity:info ManagedIdentityCredential - CloudShellMSI => ManagedIdentityCredential - CloudShellMSI: Unavailable. The environment variable MSI_ENDPOINT is needed.
2021-12-07T08:13:31.671181710Z azure:identity:info ManagedIdentityCredential - Azure Arc MSI => ManagedIdentityCredential - Azure Arc MSI: The environment variables needed are: IMDS_ENDPOINT and IDENTITY_ENDPOINT
2021-12-07T08:13:31.671509608Z azure:identity:info ManagedIdentityCredential - Token Exchange => ManagedIdentityCredential - Token Exchange: Unavailable. The environment variables needed are: AZURE_CLIENT_ID (or the client ID sent through the parameters), AZURE_TENANT_ID and AZURE_FEDERATED_TOKEN_FILE

编辑 2:通过 docker-compose 传递 MSI_ENDPOINTMSI_SECRET,但它在我的容器中是空的。

如果我看一下 Kudu,它会告诉我它们已经被填充了。

MSI_ENDPOINT = [Managed identity has been configured. This value is not viewable in Kudu but is exposed to the app.]
MSI_SECRET = [Managed identity has been configured. This value is not viewable in Kudu but is exposed to the app.]

编辑3:相关问题:Azure Managed Service Identity endpoint missing in App Service for Containers

【问题讨论】:

当您说“容器被授予获取/列出我的 KeyVault 的机密和证书的权限”时,您的意思是应用服务的托管标识具有获取/列出权限或其他权限吗?查看应用服务的日志流/容器日志也可能让您更深入地了解。 是的,正是马特。容器日志当前只是错误地显示“请运行 az login”消息,这告诉我所有其他凭据都不起作用。我刚刚发现了AZURE_LOG_LEVEL=verbose,希望这能给我一些见解。 有趣,为了进一步隔离问题,您可以尝试的一件事是针对使用 Key Vault references 的 Web 应用程序配置一些应用程序设置,如果可行(您会得到一个绿色勾号)然后您在 App Service 和 Key Vault 之间设置的权限很好,并且问题存在于您的容器中,如果不是,那么这是权限问题。 关于 DefaultAzureCredentials,如果您还没有查看它的功能 under the hood,则值得一试。您是否能够在本地成功运行容器并访问机密?如果是这样,您在本地使用的身份(假设它是您自己的帐户)和托管身份之间的权限有什么区别? 没问题,我很高兴能成为你的橡皮鸭!祝你好运。 :-) 【参考方案1】:

好像Managed Identities are not supported by Multi Container Apps in App Service。

【讨论】:

以上是关于应用服务中的 Docker 容器无法使用 Node SDK 访问 KeyVault的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 node:alpine 在 Docker 容器中运行 React 应用程序的开发版本

容器中的 Node.js 始终获取 docker0 ip

Docker容器中的Node-sass绑定问题

如何使用Docker Compose将容器A中的Node.js TCP客户端连接到容器B中的TCP服务器?

VS Code 没有为在 Docker 容器中运行的 Node 应用程序打断点

无法在 docker 容器中安装 npm?