使用 Azure Managed Identities 进行服务到服务调用
Use Azure Managed Identities for service to service calls
现在我正在使用 AAD 应用进行服务 A => 服务 B 调用。这包括:
- AAD 应用程序
- 为 AAD 应用程序保留 secret/certificate 的 KeyVault
- 可访问 KeyVault 的托管身份
流程如下所示:
- 服务 A:从托管身份获取令牌
- 服务 A:转到 KeyVault,出示令牌并获取 AAD 应用程序的密钥
- 服务 A:转到 AAD,提供秘密并请求特定资源的令牌
- 服务 A:调用服务 B
- 服务 B:验证令牌和资源
我想知道是否可以在我的服务中注册一个托管身份,所以如果提供了一个托管身份令牌,那么服务 B 就可以信任服务 A。像这样:
- 服务 A:从托管身份获取令牌
- 服务 A:调用服务 B
- 服务 B:验证令牌来自已注册的托管身份
可行吗?它是否违反了任何安全最佳实践?
更新: 除了下面的答案,下面的堆栈溢出 post 描述了如何在一个租户中创建托管身份以在另一个租户中获取应用程序的角色声明
我写了一篇关于这个主题的博客文章: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
The ObjectId and PrincipalId are both the MSI-generated service principal's id. Id is the id of the role. ResourceId is the id for the API service principal.
这是使用 AzureAD PowerShell 模块。
分配权限后,您的托管身份应该能够为您获取服务 B 的令牌。
您的本地开发环境需要不同的方法,因为那里没有托管身份。
例如,您可以在其中使用客户端密码来测试对服务 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/
现在我正在使用 AAD 应用进行服务 A => 服务 B 调用。这包括:
- AAD 应用程序
- 为 AAD 应用程序保留 secret/certificate 的 KeyVault
- 可访问 KeyVault 的托管身份
流程如下所示:
- 服务 A:从托管身份获取令牌
- 服务 A:转到 KeyVault,出示令牌并获取 AAD 应用程序的密钥
- 服务 A:转到 AAD,提供秘密并请求特定资源的令牌
- 服务 A:调用服务 B
- 服务 B:验证令牌和资源
我想知道是否可以在我的服务中注册一个托管身份,所以如果提供了一个托管身份令牌,那么服务 B 就可以信任服务 A。像这样:
- 服务 A:从托管身份获取令牌
- 服务 A:调用服务 B
- 服务 B:验证令牌来自已注册的托管身份
可行吗?它是否违反了任何安全最佳实践?
更新: 除了下面的答案,下面的堆栈溢出 post 描述了如何在一个租户中创建托管身份以在另一个租户中获取应用程序的角色声明
我写了一篇关于这个主题的博客文章: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
The ObjectId and PrincipalId are both the MSI-generated service principal's id. Id is the id of the role. ResourceId is the id for the API service principal.
这是使用 AzureAD PowerShell 模块。
分配权限后,您的托管身份应该能够为您获取服务 B 的令牌。
您的本地开发环境需要不同的方法,因为那里没有托管身份。 例如,您可以在其中使用客户端密码来测试对服务 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/