常见场景 - AWS Identity and Access Management

常见场景

注意

我们建议您要求您的人类用户在访问 AWS 时使用临时凭证。您是否考虑过使用 AWS IAM Identity Center? 您可以使用 IAM Identity Center 集中管理对多个 AWS 账户 的访问权限,并为用户提供受 MFA 保护的单点登录访问权限,可从一个位置访问其分配的所有账户。借助 IAM Identity Center,您可以在 IAM Identity Center 中创建和管理用户身份,或者轻松连接到现有的 SAML 2.0 兼容身份提供者。有关更多信息,请参阅《AWS IAM Identity Center 用户指南》中的什么是 IAM Identity Center?

您可以使用外部身份提供者(IdP)来管理 AWS 之外的用户身份以及外部 IdP。外部 IdP 可以使用 OpenID Connect(OIDC)或安全断言标记语言(SAML)向 AWS 提供身份信息。OIDC 通常在不在 AWS 上运行的应用程序需要访问 AWS 资源时使用。

如果要使用外部 IdP 配置联合身份验证,可以创建 IAM 身份提供商,以将外部 IdP 及其配置告知 AWS。这样将在您的 AWS 账户和外部 IdP 之间建立信任。以下主题提供了使用 IAM 身份提供者的常见场景。

用于移动应用程序的 Amazon Cognito

使用 OIDC 联合身份验证的首选方式是使用 Amazon Cognito。例如,开发人员 Adele 正在制作一款用于移动设备的游戏,其中将分数和个人资料等用户数据存储在 Amazon S3 和 Amazon DynamoDB 中。Adele 还可将此数据存储在本地设备上,并使用 Amazon Cognito 来跨设备保持数据的同步。她知道,出于安全性和维护的原因,不应随游戏分配长期 AWS 安全凭证。她还知道,这个游戏可能有大量用户。出于所有这些原因,她不想在 IAM 中为每个玩家都新建用户身份,而是将游戏制作成用户可使用其已通过知名的外部身份提供程序 (IdP)(如 Login with AmazonFacebookGoogle 或任何 OpenID Connect (OIDC) 兼容的 IdP)建立的身份进行登录。她的游戏可利用其中某个提供商的身份验证机制验证用户的身份。

为使该移动应用程序可访问她的 AWS 资源,Adele 首先向她选择的 IdP 注册一个开发人员 ID。她还按其中某个提供商的要求配置该应用程序。在她的包含该游戏的 Amazon S3 存储桶和 DynamoDB 表的 AWS 账户 中,Adele 使用 Amazon Cognito 创建了精确定义该游戏所需权限的 IAM 角色。如果她使用的是 OIDC IdP,她还可创建 IAM OIDC 身份提供商实体以在其 AWS 账户 中的 Amazon Cognito 身份池和该 IdP 之间建立信任关系。

在应用程序的代码中,Adele 调用其先前配置的 IdP 的登录接口。IdP 处理让用户登录的所有详细信息,然后应用程序从提供商那里获得 OAuth 访问令牌或 OIDC ID 令牌。Adele 的应用程序可使用此身份验证信息换取一组临时安全凭证 (包括 AWS 访问密钥 ID、私有访问密钥和会话令牌)。然后,应用程序可以使用这些凭证访问 AWS 提供的 Web 服务。该应用程序仅获得在其担任的角色中定义的权限。

下图以 Login with Amazon 作为 IdP,展示此过程运行方式的简化流程。对于步骤 2,该应用程序还可以使用 Facebook、Google 或任何与 OIDC 兼容的 IdP,但此处不进行说明。

使用 Amazon Cognito 为移动应用程序用户进行联合身份验证的示例工作流

  1. 客户在移动设备上启动您的应用程序。应用程序要求用户登录。

  2. 应用程序使用 Login with Amazon 资源接受用户凭证。

  3. 应用程序使用 Amazon Cognito API 操作 GetIdGetCredentialsForIdentity 将 Login with Amazon ID 令牌交换成 Amazon Cognito 令牌。Amazon Cognito 已配置为信任 Login with Amazon 项目,它会生成一个令牌,用于与 AWS STS 交换临时会话凭证。

  4. 该应用程序从 Amazon Cognito 接收临时安全凭证。您的应用程序还可使用 Amazon Cognito 中的基本(经典)工作流程,通过 AssumeRoleWithWebIdentity 从 AWS STS 中检索令牌。有关更多信息,请参阅《Amazon Cognito 开发人员指南》中的身份池(联合身份)身份验证流程

  5. 应用程序可使用临时安全凭证访问应用程序运行所需的任何 AWS 资源。与临时安全凭证关联的角色及其分配的策略将决定可访问的资源。

使用以下过程将您的应用程序配置为使用 Amazon Cognito 对用户进行身份验证,并向您的应用程序授予对 AWS 资源的访问权限。有关完成此操作的具体步骤,请参阅 Amazon Cognito 的相关文档。

  1. (可选)使用 Login with Amazon、Facebook、Google 或任何其他与 OpenID Connect (OIDC) 兼容的 IdP 注册为开发人员,并使用这些提供商配置一个或多个应用程序。该步骤是可选的,因为 Amazon Cognito 还支持您的用户进行未经身份验证的(来宾)访问。

  2. 转到 Amazon Cognito 控制台 AWS Management Console。使用 Amazon Cognito 向导创建一个身份池,身份池是一种供 Amazon Cognito 保留为您的应用程序组织的终端用户身份的容器。您可以在应用程序间共享身份池。在设置身份池时,Amazon Cognito 将创建一个或两个定义 Amazon Cognito 用户的权限的 IAM 角色(一个角色针对经过身份验证的身份,另一个角色针对未经身份验证的“来宾”身份)。

  3. AWS Amplify 与您的应用程序集成,然后导入使用 Amazon Cognito 所需的文件。

  4. 创建一个 Amazon Cognito 凭证提供程序实例,并传递身份池 ID、您的 AWS 账户 账号,以及与身份池关联的角色的 Amazon 资源名称(ARN)。AWS Management Console 中的 Amazon Cognito 向导提供了可帮助您入门的示例代码。

  5. 当您的应用程序访问 AWS 资源时,可将该凭证提供程序实例传递给客户端对象,从而将临时安全凭证传递给该客户端。证书的权限基于您之前定义的角色。

有关更多信息,请参阅下列内容:

移动应用程序的 OIDC 联合身份验证

为获得最佳效果,请在几乎所有 OIDC 联合身份验证场景中将 Amazon Cognito 用作身份凭证代理程序。Amazon Cognito 易于使用,并提供了额外功能,如匿名(未经身份验证的)访问,以及跨设备和提供商同步用户数据。但是,如果您已通过手动调用 AssumeRoleWithWebIdentity API 创建了使用 OIDC 联合身份验证的应用程序,也可继续使用它,您的应用程序仍能正常工作。

使用 Amazon Cognito 的情况下使用 OIDC 联合身份验证的过程遵循此概要:

  1. 以开发人员身份注册到外部身份提供程序 (IdP),然后使用向您提供应用程序的唯一 ID 的 IdP 来配置您的应用程序。(不同的 IdP 使用不同的术语表示此过程。此概要使用配置一词表示通过 IdP 标识应用程序的过程。) 每个 IdP 均提供一个对于该 IdP 独一无二的应用程序 ID,因此如果按多个 IdP 的要求配置同一应用程序,则该应用程序将有多个应用程序 ID。可按每个提供商的要求配置多个应用程序。

    以下外部链接提供有关使用一些常用身份提供程序 (IdP) 的信息:

    重要

    如果您使用 Google、Facebook 或 Amazon Cognito 提供的 OIDC 身份提供程序,请勿在 AWS Management Console 中创建单独的 IAM 身份提供程序,AWS 内置了这些 OIDC 身份提供程序,可供您使用。跳过以下步骤,直接使用身份提供程序创建新角色。

  2. 如果您使用与 OIDC 兼容、除 Google、Facebook 或 Amazon Cognito 以外的 IdP,请为其创建 IAM 身份提供程序实体。

  3. 在 IAM 中,您可以创建一个或多个角色。对于每个角色,定义谁可代入该角色(信任策略)和应用程序的用户将具有什么权限(权限策略)。通常,您为应用程序支持的每个 IdP 创建一个角色。例如,可创建一个在用户通过 Login with Amazon 登录时应用程序代入的角色,为同一应用程序再创建第二个角色,其中用户通过 Facebook 登录,然后为该应用程序创建第三个角色,其中用户通过 Google 登录。对于信任关系,指定 IdP (如 Amazon.com) 作为 Principal (可信实体),并加入一个与 IdP 分配的应用程序 ID 匹配的 Condition针对第三方身份提供商创建角色(联合身份验证) 将介绍不同提供商的角色示例。

  4. 在应用程序中,通过 IdP 验证用户身份。执行此操作的方式的详情因您所使用的 IdP (Login with Amazon、Facebook 或 Google) 和运行应用程序的平台而异。例如,Android 应用程序的身份验证方式与 iOS 应用程序或基于 JavaScript 的 Web 应用程序的不同。

    通常,如果用户尚未登录,则 IdP 负责显示登录页面。Idp 在对用户进行身份验证后,会将身份验证令牌与用户相关信息一起返回到您的应用程序。包含的信息取决于 IdP 公开的内容和用户愿意共享的信息。可在应用程序中使用这些信息。

  5. 在应用程序中,对 操作进行未签名 AssumeRoleWithWebIdentity 调用以请求临时安全凭证。在该请求中,传递 IdP 的身份验证令牌,然后指定为该 IdP 创建的 IAM 角色的 Amazon Resource Name (ARN)。AWS 将验证令牌是否可信和有效,如果是这样,则会将临时安全凭证返回到具有从您在请求中命名的角色的权限的应用程序。响应中还包括来自 IdP 的用户相关元数据,例如,IdP 将其与用户关联的唯一用户 ID。

  6. 通过使用来自 AssumeRoleWithWebIdentity 响应的临时安全凭证,应用程序向 AWS API 操作发出已签名的请求。IdP 中的用户 ID 信息可以区分您的应用程序中的用户。例如,您可以将对象放入 Amazon S3 文件夹中,其包含用户 ID 作为前缀或后缀。这样可创建锁定该文件夹的访问控制策略,以使仅具有该 ID 的用户能够访问该文件夹。有关更多信息,请参阅 AWS STS 联合身份用户会话主体

  7. 您的应用程序应缓存临时安全凭证,这样您就不需要每次在应用程序需要对 AWS 发出请求时获取新凭证。默认情况下,证书的有效期为 1 小时。当凭证到期时 (或在此之前),再次调用 AssumeRoleWithWebIdentity 以获取新的一组临时安全凭证。根据 IdP 及其管理其令牌的方式,可能必须先刷新 IdP 的令牌,然后再对 AssumeRoleWithWebIdentity 进行新的调用,因为 IdP 的令牌通常也在固定的一定时间后到期。如果使用的是 AWS SDK for iOS 或 AWS SDK for Android,则可使用 AmazonSTSCredentialsProvider 操作,该操作管理 IAM 临时凭证,包括按需刷新凭证。