by Roberto Migli Alessandro Fior and Bruno Corijn 在2024年6月27日的高级技术、AWS IAM 身份中心、安全、身份与合规、技术教程永久链接评论 分享
通过引入 受信任的身份传播,应用程序现在可以将用户的工作身份从其身份提供商 (IdP) 传递到运行在 亚马逊网络服务 (AWS) 上的应用程序,以及支持这些应用程序的存储服务,如 亚马逊简单存储服务 (Amazon S3) 或 AWS Glue。由于可以直接将访问权限授予工作身份,因此可以实现无缝的单点登录体验,无需用户了解不同的 AWS 身份和访问管理 (IAM) 角色才能访问数据或使用本地数据库凭据。
虽然 AWS 管理的应用程序,如 亚马逊 QuickSight、AWS Lake Formation 或 亚马逊 EMR Studio 提供受信任身份传播的原生设置体验,但在某些用例中,需要构建自定义集成。您可能希望将工作身份集成到存储在 Amazon S3 中的自定义应用程序中,或者在现有应用程序之上构建 Java 数据库连接 (JDBC) 驱动程序接口,从而允许这些应用程序将身份传播到 AWS,以代表用户访问资源。AWS 资源所有者可以直接在其 AWS 应用程序如 Lake Formation 或 亚马逊 S3 访问授权中管理授权。
本文介绍了一个示例命令行界面 (CLI) 应用程序,使用户能够使用来自 IdP如 Okta 或 Microsoft Entra ID的工作身份访问 AWS 服务。
这个解决方案依赖于用户通过其选择的 IdP 进行认证,使用标准的 OAuth 20 认证流程来获取身份令牌。然后,该令牌可以与 AWS 安全令牌服务 (AWS STS) 和 AWS IAM 身份中心 进行交换,以代表用于登录 IdP 的工作身份访问数据。
最后,提供与 AWS 命令行界面 (AWS CLI) 的集成,允许以签入身份的名义原生访问 AWS 服务。

在本文中,您将学习如何构建和使用 CLI 应用程序来访问 S3 访问授权中的数据,查询 亚马逊 Athena 表,以及以编程方式与支持受信任身份传播的其他 AWS 服务进行互动。
要设置本文中的解决方案,您应该已经熟悉受信任身份传播和 S3 访问授权的概念和功能。如果您不熟悉,请参阅两篇博客文章 如何使用 IAM 身份中心和 S3 访问授权开发面向用户的数据应用程序 (第一部分) 和 第二部分。在这篇文章中,我们将指导您进行更动手的样本 CLI 应用程序设置。
在实际部署之前,让我们讨论一下 CLI 的架构及其如何促进不同方之间的令牌交换。
用户如开发人员和数据科学家在没有预配置 AWS 安全凭证 的情况下在其计算机上运行 CLI。要将从源 IdP 提供的 OAuth 20 凭证进行令牌交换以访问 IAM 身份中心,必须使用 CreateTokenWithIAM API,因而需要 AWS 安全凭证。为满足此要求,该解决方案使用 IAM 的 OpenID Connect (OIDC) 联邦,首先使用 AssumeRoleWithWebIdentity API 基于初始 IdP 令牌创建 IAM 角色会话因为此 API 不需要凭证,然后使用生成的 IAM 角色请求所需的单点登录 OIDC 令牌。
流程如图 1 所示:
飞机专用加速器在高层次上,图 1 中显示的交互流程如下:
用户通过 AWS CLI 进行交互,CLI 用作 源凭证提供程序。用户被要求通过浏览器使用他们在 CLI 中配置的源 IdP例如 Okta进行登录。如果授权成功,CLI 将接收 JSON Web 令牌 (JWT) 并使用它通过 OIDC 联邦使用 AssumeRoleWithWebIdentity 假设 IAM 角色。使用这个临时 IAM 角色会话,CLI 代表用户通过 IAM 身份中心的 客户管理应用程序 用 CreateTokenWithIAM API 交换 IdP 令牌以获取另一个令牌。如果成功,CLI 将使用来自身份中心的令牌创建 增强身份的 IAM 角色会话 并将相应的 IAM 凭证返回给 AWS CLI。AWS CLI 使用凭证调用支持已在身份中心客户管理应用程序中配置的信任身份传播的 AWS 服务。例如,查询 Athena。有关更多信息,请参阅身份中心文档中的 指定受信任的应用程序。如果您需要访问 S3 访问授权,CLI 还会自动请求 S3 的 GetDataAccess 的凭证,该请求使用先前创建的增强身份的 IAM 角色会话。由于 Okta OAuth 令牌和增强身份的 IAM 角色会话凭证都具有较短的有效期,CLI 提供自动刷新身份验证的功能。
图 2 是说明之前流程请求的泳道图,且如图 1 所示。
在以下程序中,您将使用两个 AWS 账户:一个是 应用账户,在其中部署所需的 IAM 角色和 OIDC 联邦,并向用户授予访问 Amazon S3 对象的权限。该账户已经配置了 S3 访问授权和与 IAM 身份中心的 Athena 工作组。如果您还没有配置,请参阅 S3 访问授权入门 和 使用启用 IAM 身份中心的 Athena 工作组。
另一个账户是 身份中心管理账户,其中已设置 IAM 身份中心,并与您所选择的 IdP在本例中为 Okta 目录 通过 SCIM 同步用户和组。该应用程序还支持 Entra ID 和 Amazon Cognito。
您无需在 IAM 身份中心配置权限集,因为将通过客户管理应用程序的身份中心授予访问权限。用户通过源 IdP 进行身份验证,不直接与 AWS 账户或 IAM 策略交互。
要配置此应用程序,您需完成以下步骤:
在 Okta 中创建一个 OIDC 应用程序。在 IAM 身份中心中创建一个客户管理应用程序。安装并使用 AWS CLI 配置应用程序。首先,在 Okta 中创建一个自定义应用程序,该应用程序将作为源 IdP,并将其配置为 IAM 身份中心中的 受信任令牌发行者。
创建 OIDC 应用程序的步骤
登录到 Okta 管理员面板,转到导航面板中的 应用程序 部分,然后选择 创建应用程序集成。由于您正在使用 CLI,请选择 OIDC 作为登录方式,选择 原生应用程序 作为应用程序类型。然后选择 下一步。在 授权类型 部分,默认选择了授权码。确保还选择 刷新令牌。CLI 应用程序在可用时使用刷新令牌生成新的访问令牌,而无需用户重新进行身份验证。否则,用户在令牌过期时将需要再次进行身份验证。将登录回调 URI 更改为 http//localhost8090/callback。该应用程序使用 OAuth 20 授权代码与 PKCE 流程 并等待通过本地监听端口 8090 确认身份验证。IdP 将在成功登录后将您的浏览器重定向到此 URL 以发送身份验证信息。选择要访问此应用程序的目录组。如果您不想限制对应用程序的访问,请选择 允许所有人。将其余设置保持不变。注意: 您还必须在 AWS 中分配和授权用户,以允许他们访问下游 AWS 服务。
完成后,选择 保存,您的 Okta 自定义应用程序将被创建,您将看到该应用程序的详细页面。请记下 Okta 客户端 ID 值,以便在后续步骤中使用。在 Okta 中设置所有内容后,继续在 IAM 身份中心中创建自定义 OAuth 20 应用程序。CLI 将使用此应用程序交换 Okta 颁发的令牌。
创建客户管理应用程序的步骤
登录到您已经配置了 IAM 身份中心的 AWS 管理控制台,并转到身份中心控制台。在导航面板中选择 应用程序 下的 应用程序分配。在顶部选择 添加应用程序。选择 我有一个要设置的应用程序,然后选择 OAuth 20 类型。输入显示名称和描述。对于 用户和组分配方式,选择 不需要分配因为您已在 Okta 中配置了用户和组分配。您可以将应用程序 URL 字段留为空,并在 AWS 访问门户中的应用程序可见性 下选择 不显示,因为您不会从身份中心的 AWS 访问门户 URL 访问此应用程序。在下一屏幕上,选择您在前提条件中设置的 受信任令牌发行者,并输入您在前一节中创建的 Okta 应用程序的 Okta 客户端 ID 作为 Aud 声明。这将确保您的身份中心自定义应用程序仅接受由 Okta 颁发的令牌。注意 此应用程序不需要 自动刷新活动应用程序会话的用户身份验证,因为 CLI 应用程序已经使用 Okta 刷新令牌。
选择 编辑应用程序策略,并编辑策略以指定 应用账户 的 AWS 账户 ID 作为执行令牌交换的允许主体。完成剩余解决方案的部署后,您将使用正确角色的 Amazon 资源名称 (ARN) 更新应用程序策略。继续到下一页面以审核应用程序配置并完成创建过程。授予应用程序代表用户调用其他 AWS 服务的权限。此步骤是必要的,因为应用程序将使用自定义应用程序交换令牌,然后用于特定 AWS 服务。选择 客户管理选项卡,浏览到您刚创建的应用程序,并选择页面底部的 指定受信任的应用程序。在这个示例中,选择 相同访问权限服务的所有应用程序,然后选择 Athena、S3 访问授权 和 Lake Formation 和 AWS Glue 数据目录 作为受信任服务,因为这些服务由示例应用程序支持。如果您不打算与 S3 或 Athena 和 Lake Formation 一起使用 CLI,您可以跳过此步骤。您已完成 IAM 身份中心的设置。切换到您的应用账户以完成接下来的步骤,这将部署后端应用程序。
该应用程序的示例代码可以在 GitHub 上找到。按照 README 文件中的说明安装命令行应用程序。您可以使用 CLI 生成一个 AWS CloudFormation 模板,以创建令牌交换过程所需的 IAM 角色。
安装和配置应用程序的步骤
您将需要您的 Okta OAuth 发布者 URI 和 Okta 应用程序客户端 ID。可以通过访问 Okta 管理页面,在左侧导航面板中转到安全部分下的 API 页面来找到发布者 URI。在此处,您将看到 授权服务器 及其 发布者 URI。应用程序客户端 ID 与您在 IAM 身份中心的 Aud 声明中使用的相同。在 CLI 中,使用以下命令生成和部署 CloudFormation