使用Azure托管标识进行服务对服务调用



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

  1. AAD应用程序
  2. KeyVault为AAD应用程序保留秘密/证书
  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:验证令牌是否来自已注册的托管身份

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

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

授予服务主体对其他租户中应用程序的访问权限

我写了一篇关于这个主题的博客文章: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的令牌。

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

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

最新更新