如何通过服务主体通过 Azure Key Vault 访问 Azure 存储帐户

Posted

技术标签:

【中文标题】如何通过服务主体通过 Azure Key Vault 访问 Azure 存储帐户【英文标题】:How to access Azure storage account Via Azure Key Vault by service principal 【发布时间】:2022-01-03 20:28:43 【问题描述】:

我有一个外部 Web 应用程序,它可以选择使用服务主体访问存储帐户。

我想通过外部应用程序将数据直接加载到 datalake 帐户中来访问 Azure 存储帐户/blob。

这就是我想要做的:

设置服务主体(使用 Azure AD 应用注册) 创建存储帐户并将访问密钥存储在 Azure Key Vault 中。 将服务主体机密添加到同一个密钥保管库。 在 Key Vault 中创建一个策略,让服务主体有权读取 Key Vault 中的密钥和机密。 还要在 Key Vault 中创建一个策略,让服务主体拥有访问存储帐户的参与者角色。 还将对存储帐户容器的访问权限授予服务主体。

但我无法连接,也无法授权连接。

我很困惑我缺少哪些步骤来解决这个问题。

【问题讨论】:

您的外部 Web 应用程序(我假设您在这里谈论的是应用服务)是在托管标识下运行还是使用服务主体? 据我了解,您希望您的外部应用程序从您的密钥保管库中获取存储访问密钥。您的应用程序使用什么秘密来访问密钥保管库?为此,您必须与应用程序共享秘密。如果您这样做,您不妨共享该密钥并直接授予服务主体访问存储帐户的权限。这里不需要密钥库。如果您的应用程序托管在与您的存储帐户相同的 azure 租户下,那么情况就不同了。 @kane 应用程序是 'Adverity',作为使用服务原则将目标配置为 Azure blob 的选项。 @AnupamChand 我的应用程序是 SAS 产品“Adverity”,它希望将数据加载到 Azure blob,这意味着它没有托管在同一个 Azure 租户上。因此,如果这是真的,那么我已经为服务原则赋予了读取/写入存储帐户的角色......所以,他们不需要将存储访问密钥存储在密钥库中,然后从他们的服务原则中读取? 然后他们应该将服务主体机密存储在他们的应用程序中,并使用它直接访问存储帐户。无需对其进行密钥保管。他们将需要使用密钥从您的 AAD 中获取不记名令牌,然后访问存储帐户。 【参考方案1】:

由于您要使用服务主体访问存储帐户,因此无需将存储帐户访问权限存储在密钥保管库中。

您可以按照服务主体访问存储帐户的步骤:

    创建服务主体(Azure AD 应用注册) 创建存储帐户 将存储 Blob 数据参与者角色分配给服务主体

现在您将能够使用您的服务主体访问 Azure 存储 Blob 数据

注意:您不需要将服务主体客户端机密存储在密钥保管库中。因为您需要再次使用客户端密码才能首先访问密钥保管库。

【讨论】:

【参考方案2】:

感谢@RamaraoAdapa-MT 这行得通

最后,我按照你说的设置, SAS -> 服务原理 -> 存储帐户权限 -> 存储帐户。

在这种情况下,不需要 Key Vault。

谢谢你们, Anupam Chand, RamaraoAdapa-MT

【讨论】:

以上是关于如何通过服务主体通过 Azure Key Vault 访问 Azure 存储帐户的主要内容,如果未能解决你的问题,请参考以下文章

Azure Databricks 通过服务主体访问 Azure Data Lake Storage Gen2

服务主体如何登录到我的 Azure 应用服务?

Azure - 使用服务主体对 Key Vault 进行身份验证返回未经授权的异常

什么是 Azure 服务主体?

Azure通过RBAC对资源进行管理

Azure API 无法识别来自 Terraform 的服务主体