本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
IAM 角色
在创建身份池时,系统会提示您更新用户代入的 IAM 角色。IAM 角色的工作方式如下:当用户登录应用程序时,Amazon Cognito 为用户生成临时 AWS 凭证。这些临时凭证与特定 IAM 角色相关联。通过 IAM 角色,您可以定义一组权限,用来访问您的 AWS 资源。
您可以为经过身份验证的用户和未经身份验证的用户指定默认 IAM 角色。此外,您可以定义规则,以便基于用户 ID 令牌中的声明为每个用户选择角色。有关更多信息,请参阅 使用基于角色的访问控制。
默认情况下,Amazon Cognito 控制台将创建可提供访问 Amazon Mobile Analytics 和 Amazon Cognito Sync 的权限的角色。或者,您也可以选择使用现有的 IAM 角色。
修改 IAM 角色以允许或限制对其他服务的访问。为此,请登录 IAM 控制台
注意
作为最佳实践,定义策略时应遵循授予最低权限的原则。换言之,策略只包含用户执行其任务所需的权限。有关更多信息,请参阅 IAM 用户指南中的授予最低权限。
请记住,未经验证的身份会被未登录应用的用户所利用。通常情况下,为未经验证的身份分配的权限应该比为经过验证的身份分配的权限更严格。
设置信任策略
Amazon Cognito 使用 IAM 角色为应用程序的用户生成临时凭证。对权限的访问由角色的信任关系控制。了解有关 角色信任和权限 的更多信息。Amazon Cognito 代理 AWS STS 和身份池之间的连接。 IdPs
呈现给 AWS STS 的令牌由身份池生成,身份池将用户池、社交或 OIDC 提供商令牌或 SAML 断言转换为自己的令牌。身份池令牌包含一个 aud
声明,即身份池 ID。
如果 IAM 角色Principal
的信任策略是身份池服务委托人cognito-identity.amazonaws.com
,则您无法创建或修改角色信任策略以允许任何身份池代入该角色。对于身份池主体,Action
元素必须具有Condition
要求AssumeRoleWithWebIndentity
只能由您的身份池执行的,如条件密钥所指定,例如cognito-identity.amazonaws.com:aud
。其他条件密钥可用,但aud
这是必需的。如果您尝试保存没有此类条件的角色信任策略,IAM 会返回错误。
有关 OIDC(Web 身份)联合密钥的更多信息,请参阅 AWS OIDC 联合身份验证的可用密钥。
以下是 Amazon Cognito 可用的 OIDC 联合条件密钥。
cognito-identity.amazonaws.com:aud
-
将角色限制为从一个或多个身份池执行操作。Amazon Cognito 在身份池令牌的
aud
声明中标明了源身份池。 cognito-identity.amazonaws.com:amr
-
将角色限制为
authenticated
或unauthenticated
(访客)用户。Amazon Cognito 在身份池令牌的amr
声明中标明了身份验证状态。 cognito-identity.amazonaws.com:sub
-
通过 UUID 将角色限制为一个或多个用户。此 UUID 是用户在身份池中的身份 ID。此值不是来自用户的原始身份提供者的
sub
值。Amazon Cognito 在身份池令牌的sub
声明中标明了此 UUID。
以下示例角色信任策略允许联合服务主体cognito-identity.amazonaws.com
调用 AWS STS API AssumeRoleWithWebIdentity
。仅当 API 请求中的身份池令牌具有以下声明时,请求才会成功。
-
一个
aud
声明(身份池 IDus-west-2:abcdefg-1234-5678-910a-0e8443553f95
)。 -
一个
amr
声明(authenticated
),当用户已登录并且不是访客用户时添加。
基本(经典)身份验证中 IAM 角色的信任策略
摘要
只有当目标角色的信任策略包含aud
条件时,身份池才能在基本身份验证流程中代表用户扮演角色。
基本身份验证对不安全的角色信任策略的限制与增强型身份验证相同:您无法保存无法使用aud
条件限制支持的身份池的角色信任策略。该服务启动时并未强制执行此限制。在强制执行此要求之前,您可以创建没有其他安全条件的角色信任策略。强制执行此要求后, AWS STS 允许 Web 身份扮演不受条件保护的角色,但如果不引入这些条件,则无法修改这些角色。
增强型流程身份验证要求 IAM 角色与身份池 AWS 账户
相同。但是在基本身份验证中,即您的应用程序撰写AssumeRoleWithWebIdentity
请求时,您的应用程序可以请求在其他账户中扮演角色。但是,如果目标角色的旧信任策略不强制执行该aud
条件,则您的跨账户代入角色请求将失败。
身份池为身份发放的令牌包含有关身份池来源 AWS 账户 的信息。当您在 AssumeRoleWithWebIdentityAPI 请求中提供身份池令牌时, AWS STS 会检查原始身份池是否与 IAM 角色 AWS 账户 相同。如果 AWS STS 确定请求是跨账户的,则它会检查角色信任策略是否有aud
条件。如果@@ 角色信任策略中不存在此类条件,则假设角色调用将失败。如果请求不是跨账户请求,则 AWS STS 不强制执行此限制。作为一种安全的最佳实践,应始终将此类条件应用于您的身份池角色的信任策略。
以下是一个信任策略示例,它满足 IAM 角色对多个身份池进行基本身份验证的最低要求。作为最佳实践,也应仅允许带有"cognito-identity.amazonaws.com:amr": "authenticated"
条件的经过身份验证的身份。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "cognito-identity.amazonaws.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "cognito-identity.amazonaws.com:aud": [ "us-west-2:abcdefg-1234-5678-910a-0e8443553f95", "us-west-2:hijklmo-5678-9101-112b-0e4221776g96", "us-west-2:pqrstuv-9101-1121-314c-0e2110887h97" ] } } } ] }
其他信任策略条件
跨身份池重复使用角色
要跨多个身份池重复使用某个角色,由于它们共享一个通用权限集,您可以添加多个身份池,如下所示:
"StringEquals": { "cognito-identity.amazonaws.com:aud": [ "us-east-1:12345678-abcd-abcd-abcd-123456790ab", "us-east-1:98765432-dcba-dcba-dcba-123456790ab" ] }
限制对特定身份的访问权限
要创建限制为一组特定应用用户的策略,请检查 cognito-identity.amazonaws.com:sub
的值:
"StringEquals": { "cognito-identity.amazonaws.com:aud": "us-east-1:12345678-abcd-abcd-abcd-123456790ab", "cognito-identity.amazonaws.com:sub": [ "us-east-1:12345678-1234-1234-1234-123456790ab", "us-east-1:98765432-1234-1234-1243-123456790ab" ] }
限制对特定提供商的访问权限
要创建仅限于已使用特定提供商 (可能是您自己的登录提供商) 登录的用户的策略,请检查 cognito-identity.amazonaws.com:amr
的值:
"ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "login.myprovider.myapp" }
例如,一个仅信任 Facebook 的应用程序将具有以下 amr 子句:
"ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "graph.facebook.com" }
访问策略
您附加到某个角色的权限适用于代入该角色的所有用户。为区分用户的访问权限,请使用策略条件和变量。有关更多信息,请参阅 IAM policy 元素:变量和标签。您可以使用该sub
条件在访问策略中限制对 Amazon Cognito 身份 IDs 的操作。请谨慎使用此选项,特别是对于未经身份验证的身份,因为这些身份缺少一致的用户 ID。有关使用 Amazon Cognito 进行网络联合的 IAM 策略变量的更多信息,请参阅AWS Identity and Access Management
用户指南中的 IAM 和 AWS STS 条件上下文密钥。
为提供更好的安全保护,Amazon Cognito 使用 GetCredentialsForIdentity
,对在增强型流程中分配给未经身份验证用户的凭证应用缩小范围策略。缩小范围策略可向您对未经身份验证的角色应用的 IAM policy 添加 内联会话策略 和 AWS 托管会话策略。由于您必须在角色的 IAM policy 和会话策略中授予访问权限,因此,范围缩小策略限制了用户对以下服务列表以外的服务的访问权限。
注意
在基本(经典)流程中,您可以发出自己的 AssumeRoleWithWebIdentity API 请求,并可以将这些限制应用于请求。作为最佳安全实践,请勿向未经身份验证的用户分配超出此缩小范围策略的任何权限。
Amazon Cognito 还可防止经过身份验证和未经身份验证的用户向 Amazon Cognito 身份池和 Amazon Cognito Sync 发出 API 请求。其他人 AWS 服务 可能会限制通过 Web 身份访问服务。
在使用增强型流程的成功请求中,Amazon Cognito 在后台发出 AssumeRoleWithWebIdentity
API 请求。在此请求的参数中,Amazon Cognito 包括以下内容。
-
用户的身份 ID。
-
用户所需要代入的 IAM 角色的 ARN。
-
一个
policy
参数,添加内联会话策略。 -
一个
PolicyArns.member.N
参数,其值为在 Amazon 中授予额外权限的AWS 托管策略 CloudWatch。
未经身份验证的用户可以访问的服务
当您使用增强型流程时,Amazon Cognito 对您的用户会话应用的范围缩小策略会阻止用户会话使用下表中列出的服务以外的任何服务。对于服务子集,仅允许特定操作。
类别 | 服务 |
---|---|
Analytics |
Amazon Data Firehose 适用于 Apache Flink 的亚马逊托管服务 |
应用程序集成 |
Amazon Simple Queue Service |
AR 和 VR |
Amazon Sumerian¹ |
业务应用程序 |
Amazon Mobile Analytics Amazon Simple Email Service |
计算 |
AWS Lambda |
加密和 PKI |
AWS Key Management Service¹ |
数据库 |
Amazon DynamoDB Amazon SimpleDB |
前端 Web 和移动 |
AWS AppSync Amazon Location Service Amazon Simple Notification Service Amazon Pinpoint Amazon Location Service |
游戏开发 |
亚马逊 GameLift 服务器 |
物联网(IoT) |
AWS IoT |
机器学习 |
Amazon CodeWhisperer Amazon Comprehend Amazon Lex Amazon Machine Learning Amazon Personalize Amazon Polly Amazon Rekognition 亚马逊 SageMaker AI¹ Amazon Textract¹ Amazon Transcribe Amazon Translate |
管理与治理 |
Amazon CloudWatch Amazon CloudWatch 日志 |
联网和内容分发 |
Amazon API Gateway |
安全性、身份与合规性 |
Amazon Cognito 用户群体 |
存储 |
Amazon Simple Storage Service |
¹ 对于下表 AWS 服务 中的,内联策略授予操作的子集。该表显示了每个服务中的可用操作。
AWS 服务 | 未经身份验证的增强型流程用户的最大权限 |
---|---|
AWS Key Management Service |
|
亚马逊 SageMaker AI |
|
Amazon Textract |
|
Amazon Sumerian |
|
Amazon Location Service |
|
要向此列表 AWS 服务 之外的用户授予访问权限,请在您的身份池中激活基本(经典)身份验证流程。如果您的用户看到分配给未经身份验证 AWS 服务 的用户的 IAM 角色的策略所允许的NotAuthorizedException
错误,请评估您是否可以将该服务从您的用例中删除。如果不能,请切换到基本流程。
访客用户的内联会话策略
Amazon Cognito 首先会在请求 IAM 凭证时应用内联策略。内联会话策略对用户的有效权限进行限制,不能包括对以下列表之外的任何 AWS 服务 的访问权限。您还必须在应用于用户的 IAM 角色的策略 AWS 服务 中向这些角色授予权限。对于代入角色的会话,用户的有效权限是分配给其角色的策略与其会话策略的交集。有关更多信息,请参阅《AWS Identity and Access Management 用户指南》中的会话策略。
Amazon Cognito 将以下内联策略添加到原定设置情况下启用的 AWS 区域 中的用户会话。若要大概了解内联策略和其他会话策略的最终影响,请参阅未经身份验证的用户可以访问的服务。
对于所有其他区域,内联范围缩小策略包括原定设置区域中列出的所有内容,以下 Action
语句除外。
"cognito-sync:*", "sumerian:View*", "codewhisperer:*", "textract:DetectDocumentText", "textract:AnalyzeDocument", "sdb:*"
访客 AWS 托管会话政策
Amazon Cognito 还将 AWS 托管策略作为会话策略应用于未经身份验证的访客的增强流量会话。此策略通过策略 AmazonCognitoUnAuthedIdentitiesSessionPolicy
限制了未经身份验证的用户的权限范围。
您还必须在附加到未经身份验证的 IAM 角色的策略中授予此权限。对于代入角色会话,用户的有效权限是分配给其角色的 IAM 策略与其会话策略的交集。有关更多信息,请参阅《AWS Identity and Access Management 用户指南》中的会话策略。
有关此 AWS 托管策略和其他会话策略的净效果的概述,请参阅未经身份验证的用户可以访问的服务。
AmazonCognitoUnAuthedIdentitiesSessionPolicy
托管式策略具有以下权限。
访问策略示例
在本部分中,您可以找到示例 Amazon Cognito 访问策略,这些策略仅向您的用户授予完成特定操作所需的最低权限。您可以在可能的情况下使用策略变量进一步限制给定标识 ID 的权限。例如,使用 ${cognito-identity.amazonaws.com:sub}。有关更多信息,请参阅AWS 移动博客上的 nderstanding Amazon Cognito Authentication Part 3: Roles and Policies
注意
作为安全性最佳实践,策略应仅包括用户执行其任务所需的权限。这意味着您应该尽可能始终为对象限定单个身份的访问范围。
向身份授予对 Amazon S3 中单个对象的读取访问权限
以下访问策略向身份授予读取权限,以便从给定的 S3 存储桶中检索单个对象。
向身份授予对 Amazon S3 中身份特定路径的读写访问权限
以下访问策略通过将前缀映射到 ${cognito-identity.amazonaws.com:sub}
变量来授予读取和写入权限,以访问 S3 存储桶中的特定前缀“文件夹”。
利用此策略,通过 ${cognito-identity.amazonaws.com:sub}
插入的身份(例如 us-east-1:12345678-1234-1234-1234-123456790ab
)将能够在 arn:aws:s3:::amzn-s3-demo-bucket/us-east-1:12345678-1234-1234-1234-123456790ab
中获取、放置和列出对象。但是,不会授予身份访问 arn:aws:s3:::amzn-s3-demo-bucket
中的其他对象的权限。
为 Amazon DynamoDB 分配身份细粒度访问权限
以下访问策略使用 Amazon Cognito 环境变量,为 DynamoDB 资源提供细粒度访问控制。这些变量按身份 ID 授予对 DynamoDB 中项目的访问权限。有关更多信息,请参阅《Amazon DynamoDB 开发人员指南》中的使用 IAM 策略条件实现精细访问控制。
向身份授予调用 Lambda 函数的权限
以下访问策略向身份授予调用 Lambda 函数的权限。
向身份授予将记录发布到 Kinesis Data Stream 的权限
以下访问策略允许身份将 PutRecord
操作与任何 Kinesis Data Streams 结合使用。它可以应用于需要将数据记录添加到账户中所有流的用户。有关更多信息,请参阅《Amazon Kinesis Data Streams 开发人员指南》中的使用 IAM 控制对 Amazon Kinesis Data Streams 资源的访问。
向身份授予访问 Amazon Cognito 同步存储中其数据的权限
以下访问策略仅向身份授予访问 Amazon Cognito Sync 存储中其自己数据的权限。
角色信任和权限
这些角色的区别在于其信任关系。下面是未经身份验证角色的示例信任策略:
此策略向来自 cognito-identity.amazonaws.com
(OpenID Connect 令牌的发布者)的联合身份用户授予代入该角色的权限。此外,策略限制令牌的 aud
(在此示例中为身份池 ID) 匹配身份池。最后,策略指定的由 Amazon Cognito GetOpenIdToken
API 操作发布的令牌的多值 amr
声明的数组成员之一具有值 unauthenticated
。
当 Amazon Cognito 创建令牌时,它将令牌的 amr
设置为 unauthenticated
或 authenticated
。如果 amr
是 authenticated
,则令牌包括身份验证期间使用的所有提供商。这意味着,您可以创建一个角色,它只信任通过 Facebook 登录的用户,这只需将 amr
条件更改为如下所示即可:
"ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "graph.facebook.com" }
在更改角色的信任关系或尝试跨身份池使用角色时,请务必谨慎。如果您未正确配置角色来信任身份池,则 STS 结果中会出现类似以下内容的异常:
AccessDenied -- Not authorized to perform sts:AssumeRoleWithWebIdentity
如果您看到此消息,请仔细检查身份池和身份验证类型是否具有正确的角色。