使用Azure托管身份提供服务以服务呼叫

时间:2020-04-27 07:25:37

标签: azure azure-managed-identity

现在我正在使用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

2 个答案:

答案 0 :(得分:1)

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

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

不过,您将需要使用PowerShell / Graph API将应用程序权限分配给托管身份服务主体。 没有为此的UI。 示例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的调用。

答案 1 :(得分:1)

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