【问题标题】:Use Azure Managed Identities for service to service calls使用 Azure 托管标识进行服务到服务调用
【发布时间】:2020-08-10 16:46:37
【问题描述】:

现在我正在使用 AAD 应用程序进行服务 A => 服务 B 调用。这包括:

  1. AAD 应用程序
  2. 为 AAD 应用程序保留秘密/证书的 KeyVault
  3. 可访问 KeyVault 的托管身份

流程如下所示:

  1. 服务 A:从托管身份获取令牌
  2. 服务 A:转到 KeyVault,出示令牌并获取 AAD 应用程序的机密
  3. 服务 A:转到 AAD,提供秘密并为特定资源请求令牌
  4. 服务 A:调用服务 B
  5. 服务 B:验证令牌和资源

我想知道是否可以向我的服务注册托管身份,因此如果提供托管身份令牌,则服务 B 可以信任服务 A。如下所示:

  1. 服务 A:从托管身份获取令牌
  2. 服务 A:调用服务 B
  3. 服务 B:验证令牌来自已注册的托管身份

可行吗?它是否违反任何安全最佳实践?

更新:除了下面的答案,下面的堆栈溢出帖子描述了如何在一个租户中创建托管身份以获取另一个租户中应用程序的角色声明

Grant service principal access to application in other tenant

【问题讨论】:

    标签: azure azure-managed-identity


    【解决方案1】:

    我已经写了一篇关于这个主题的博客文章:https://joonasw.net/view/calling-your-apis-with-aad-msi-using-app-permissions

    你绝对可以做到, 这意味着您不需要使用任何秘密来从服务 A 调用服务 B :)

    不过,您需要使用 PowerShell / Graph API 将应用程序权限分配给托管身份服务主体。 没有用户界面。 PowerShell 命令示例:

    New-AzureADServiceAppRoleAssignment -ObjectId 1606ffaf-7293-4c5b-b971-41ae9122bcfb -Id 32028ccd-3212-4f39-3212-beabd6787d81 -PrincipalId 1606ffaf-7293-4c5b-b971-41ae9122bcfb -ResourceId c3ccaf5a-47d6-4f11-9925-45ec0d833dec
    

    ObjectId 和 PrincipalId 都是 MSI 生成的服务主体的 ID。 id 是角色的id。 ResourceId 是 API 服务主体的 ID。

    这是使用 AzureAD PowerShell 模块。

    分配权限后,您的托管身份应该能够为您获取服务 B 的令牌。

    但是,您的本地开发环境将需要一种不同的方法,因为那里没有托管身份。 例如,您可以在其中使用客户端密钥来测试对服务 B 的调用。

    【讨论】:

    • 我花了一段时间来了解这个新术语 =) 我设法运行了那个 powershell cmdlet,但我看不到它正在生效。我的猜测是我需要授予管理员同意。但不清楚在哪里做(没有 UX,也找不到它的 cmdlet)。不知道你有没有指点...
    • 标记为答案,但由于我的设置更复杂,我无法验证它。托管身份由我不是管理员的租户颁发(因此,仍然不要取回此角色)。我们实际上使用不同的租户进行服务调用。因此,需要了解如何授予托管标识来自不同租户的权限...
    • 原来需要再等一会儿。我现在可以在我的 MSI 令牌中看到角色声明。谢谢!
    • 太棒了 :) 是的 cmdlet 本质上是管理员同意。如果管理员同意应用程序权限,则会添加相同的 appRoleAssigment。
    【解决方案2】:

    抱歉,我无法对 juunas 的回复发表评论,因为我没有足够的声誉来发表评论。只是想说,juunas 推荐的解决方案只有在我尝试使用用户分配的托管身份获取令牌的地方重新启动 VM 后才对我有效。重新启动 VM 的想法来自下面的文章。本文还推荐了与 juunas 完全相同的解决方案,但还提到了重新启动 VM 以清除缓存,以防令牌在遵循推荐的步骤后仍然不显示角色。 https://www.jasonfritts.me/2019/07/15/assigning-azure-ad-graph-api-permissions-to-a-managed-service-identity-msi/

    【讨论】:

    • 可能它解释了我的虚拟机仅在 12 小时后才开始获取令牌。可能这个缓存过期了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 2019-10-26
    • 2019-01-24
    • 2018-09-05
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    相关资源
    最近更新 更多