如何为受 Amazon Cognito 保护的应用程序实现可信身份传播 安全博客
  • 11

实现受信任身份传播以保护应用程序

关键要点

在本指南中,我们将讨论如何使用Amazon Cognito作为受信任的令牌发行者,实现身份传播,以便在AWS服务上创建经过身份增强的会话。通过这种方法,您可以精细控制应用程序的访问权限,提高身份管理的效率。

AWS最近发布了 AWS IAM身份中心 的受信任身份传播功能,这可以在访问AWS服务时为用户创建身份增强的IAM角色会话。这使得客户能够在AWS之上构建自定义应用程序,尤其是针对需要细粒度访问数据分析的AWS服务,如 Amazon Q Business、Amazon Athena 和 AWS Lake Formation。通过使用受信任身份传播,您可以将身份传播至AWS服务,从而无需仅依赖于 AWS身份与访问管理IAM 角色权限。

在这篇文章中,我将展示如何使用 Amazon Cognito 用户池作为IAM身份中心的受信任令牌发行者。此外,您还将了解如何将IAM身份中心用作 联合身份提供商,为Cognito用户池提供无缝的身份验证流。

IAM身份中心概念

IAM身份中心是用于管理员工访问AWS应用程序的推荐服务。它支持多种身份源,如内部目录、外部Active Directory或符合SAML的身份提供商IdP,并可选支持 SCIM 集成。

通过 受信任身份传播,用户可以登录到应用程序,应用程序可在创建AWS会话时传递用户身份上下文。AWS服务可以依赖于IAM角色权限以及用户的授权范围和组成员资格来授权访问。

受信任令牌发行者 是创建签名令牌的OAuth 20授权服务器,使您能够使用受信任身份传播处理在AWS外部进行身份验证的应用程序。

解决方案概述

解决方案架构包括以下元素和步骤,如下图所示:

元素描述自定义应用程序为Amazon Q Business应用程序提供API访问。用户使用Amazon Cognito作为OAuth 20身份提供商进行身份验证。Amazon Q Business此应用程序需要通过 AWS安全令牌服务AWS STS 发放的身份增强AWS凭证来授权来自自定义应用程序的请求。AWS STS通过setContext和AssumeRole API调用向自定义应用程序发放身份增强AWS凭证。SetContext需要将用户身份上下文从IAM身份中心签发的JSON Web令牌JWT传递过来。IAM身份中心要求自定义应用程序执行令牌交换操作,以从受信任的IAM角色和受信任的令牌发行者Cognito获取JWT。Amazon Cognito用户池该用户池对用户进行身份验证。通过SAML联合身份验证,用户在成功身份验证后自动创建。用户池返回JWT给自定义应用程序。

操作指南

本部分将重点介绍架构步骤3至6,采用三步法进行说明。

创建并初步配置Amazon Cognito用户池及域名配置受信任身份传播的OAuth集成配置IAM身份中心与Cognito之间的SAML联合信任

前提条件

您需要满足以下前提条件:

一个 AWS账户创建好的 IAM身份中心 实例一个已设置好的Amazon Q Business应用程序可选具备AWS账户的管理权限AWS命令行工具AWS CLI

第一步:创建Cognito用户池、域名和客户端

如下Bash脚本将设置Amazon Cognito用户池、用户池域名及用户池客户端,并输出用于配置IAM身份中心的发行者URL和受众。

注意 Cognito用户池域名前缀在特定AWS区域内必须是唯一的。请将lt demottigt 替换为一个唯一的前缀。

bash

!/bin/bash

export AWSPAGER= # 关闭分页输出export USERPOOLNAME=BlogTrustedTokenIssuerexport COGNITODOMAINPREFIX=lt demottigt # 必须唯一

创建用户池

USERPOOLID=(aws cognitoidp createuserpool poolname {USERPOOLNAME} aliasattributes email schema Name=emailRequired=trueMutable=trueAttributeDataType=String query UserPoolId admincreateuserconfig AllowAdminCreateUserOnly=True output text)

创建用户池域名

aws cognitoidp createuserpooldomain domain {COGNITODOMAINPREFIX} userpoolid {USERPOOLID}

创建用户池客户端

AUDIENCE=(aws cognitoidp createuserpoolclient userpoolid {USERPOOLID} clientname TTI explicitauthflows ALLOWREFRESHTOKENAUTH ALLOWUSERSRPAUTH allowedoauthflowsuserpoolclient allowedoauthscopes openid email profile allowedoauthflows code callbackurls http//localhost8080 query UserPoolClientClientId output text )ISSUERURL=https//cognitoidp{AWSREGION}amazonawscom/{USERPOOLID}

第二步:创建受信任身份传播的OAuth集成

要创建OAuth集成,您需要设置受信任令牌发行者并配置OAuth客户管理应用程序。

配置受信任令牌发行者

开始配置IAM身份中心,以信任由Amazon Cognito用户池发布的令牌。

bashINSTANCEARN=(aws ssoadmin listinstances output text query Instances[]InstanceArn)TRUSTEDTOKENISSUERARN=(aws ssoadmin createtrustedtokenissuer name cognito instancearn INSTANCEARN trustedtokenissuerconfiguration OidcJwtConfiguration={IssuerUrl=ISSUERURLClaimAttributePath=emailIdentityStoreAttributePath=emailsvalueJwksRetrievalOption=OPENIDDISCOVERY} trustedtokenissuertype OIDCJWT output text query TrustedTokenIssuerArn)

风驰加速器官网入口配置OAuth客户管理应用程序

创建OAuth客户管理应用程序,允许您的AWS账户为Cognito用户池客户端交换发放的令牌。

bash

创建OAuth客户管理应用程序

OAUTHAPPLICATIONARN=(aws ssoadmin createapplication instancearn INSTANCEARN applicationproviderarn arnawsssoawsapplicationProvider/custom name DemoApplication output text query ApplicationArn)

不要求显式分配用户访问此应用程序

aws ssoadmin putapplicationassignmentconfiguration applicationarn OAUTHAPPLICATIONARN noassignmentrequired

允许受信任令牌发行者发行的令牌的交换过程

cat ltlt EOF gt /tmp/grantjson{ JwtBearer { AuthorizedTokenIssuers [ { TrustedTokenIssuerArn TRUSTEDTOKENISSUERARN AuthorizedAudiences [AUDIENCE] } ] }}EOF

aws ssoadmin putapplicationgrant applicationarn OAUTHAPPLICATIONARN granttype urnietfparamsoauthgranttypejwtbearer grant file///tmp/grantjson

允许此应用程序用于Q Business应用程序

for scope in qbusinessmessagesaccess qbusinessmessagesreadwrite qbusinessconversationsaccess qbusinessconversationsreadwrite qbusinessqappsaccess do aws ssoadmin putapplicationaccessscope applicationarn OAUTHAPPLICATIONARN scope scopedone

允许此AWS账户ID调用API以交换令牌(CreateTokenWithIAM)

AWSACCOUNTID=(aws sts getcalleridentity output text query Account)cat ltlt EOF gt /tmp/authenticationmethodjson{ Iam { ActorPolicy { Version 20121017 Statement [ { Effect Allow Principal { AWS {AWSACCOUNTID} } Action ssooauthCreateTokenWithIAM Resource OAUTHAPPLICATIONARN } ] } }}EOF

aws ssoadmin putapplicationauthenticationmethod applicationarn OAUTHAPPLICATIONARN authenticationmethod file///tmp/authenticationmethodjson authenticationmethodtype IAM

如何为受 Amazon Cognito 保护的应用程序实现可信身份传播 安全博客

第三步:在IAM身份中心和Cognito之间创建SAML联合信任

SAML集成对于IAM身份中心和Amazon Cognito之间的合作非常有用,当您的身份源是IAM身份中心时,SAML集成本质上确保用户在使用Cognito用户池之前,会使用IAM身份中心凭证进行身份验证。

配置IAM身份中心登录AWS管理控制台,导航至IAM身份中心。从导航面板中选择应用程序。选择添加应用程序。选择我有一个想要设置的应用程序,选择SAML 20,然后选择下一步。对于显示名称,输入DemoSAMLApplication。复制IAM身份中心SAML元数据文件URL以备后用。对于应用程序属性,将两个字段留空。对于应用程序ACS URL,输入https//lt CognitoUserPoolDomaingtauthlt AWSREGIONgtamazoncognitocom/saml2/idpresonse。

将lt CognitoUserPoolDomaingt替换为您在第一步中选择的域名,lt AWSREGIONgt替换为您创建Cognito用户池的区域。

对于应用程序SAML受众,输入urnamazoncognitosplt CognitoUserPoolIdgt。

将lt CognitoUserPoolIdgt替换为您在第一步中创建的Cognito用户池的ID。

选择提交。配置映射属性选择操作,然后选择编辑属性映射。在映射到此字符串值或IAM身份中心中的用户属性字段中输入{useremail}。为格式选择持久。选择保存更改。配置Cognito用户池导航至Amazon Cognito控制台,并从导航面板中选择用户池。选择第一步中创建的用户池。选择登录体验选项卡。在联合身份提供商登录下,选择添加身份提供商。选择SAML。在提供程序名称字段中输入IAMIdentityCenter。在元数据文档源下,选择输入元数据文档端点URL并粘贴您在第6步中复制的URL。在SAML属性中,输入Subject。选择添加身份提供商。配置应用集成以使用IAM身份中心选择应用集成选项卡。在应用程序客户端和分析下,选择TTI。在托管用户界面下,选择编辑。对于身份提供商,选择IAMIdentityCenter。选择保存更改。

架构图

下图展示了从用户连接到Web应用程序到与Amazon Q Business APIs进行聊天交互的身份验证流程。

注意 AWS资源可以在同一区域内,但这不是Amazon Cognito和IAM身份中心的要求。

清理

为避免将来对您的AWS账户产生费用,请删除在本指南中创建的资源。这些资源包括:

Amazon Cognito用户池删除此内容还将删除子资源,例如用户池客户端IAM身份中心中的SAML应用程序IAM身份中心中的OAuth应用程序IAM身份中心中的受信任令牌发行者配置

结论

在本文中,我们演示了如何为受Amazon Cognito保护的应用程序实现受信任身份传播。同时,我们展示了如何通过IAM身份中心对Cognito用户进行身份验证,以确保用户使用正确的机制和策略进行身份验证,并减少管理Cognito目录的操作负担。

将Amazon Cognito用作受信任的令牌发行者,对已经通过用户池安全保护的应用程序特别有用,并允许您实现数据功能,如Amazon Q Business聊天功能或通过S3访问权限安全地访问S3桶。

若用户通过不同的身份提供商进行身份验证,本文提供的解决方案可简化身份集成工作,通过使您能够将多个身份提供商添加到单个用户池,从而减少配置的复杂性。

由于受信任身份传播在AWS服务中变得越来越普遍,我建议您阅读以下博客文章,以了解更多关于在各个服务中使用它的内容。

如何使用IAM身份中心和S3访问权限开发面向用户的数据应用程序 分为两部分使用IAM身份中心和受信任令牌发行者简化员工身份管理为外部身份提供商的用户简化Amazon Redshift和AWS Lake Formation的访问管理AWS分析服务简化用户对数据的访问、权限设置和审计使用受信任身份传播以编程方式访问AWS服务

如果您对本文有任何反馈,请在下方的评论部分提交您的意见。