IAM 角色 - Amazon Cognito
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

IAM 角色

在创建身份池时,系统会提示您更新用户代入的 IAM 角色。IAM 角色的工作方式如下:当用户登录应用程序时,Amazon Cognito 为用户生成临时 Amazon 凭证。这些临时凭证与特定 IAM 角色相关联。通过 IAM 角色,您可以定义一组权限,用来访问您的 Amazon 资源。

您可以为经过身份验证的用户和未经身份验证的用户指定默认 IAM 角色。此外,您可以定义规则,以便基于用户 ID 令牌中的声明为每个用户选择角色。有关更多信息,请参阅 使用基于角色的访问控制

默认情况下,Amazon Cognito 控制台将创建可提供访问 Amazon Mobile Analytics 和 Amazon Cognito Sync 的权限的角色。或者,您也可以选择使用现有的 IAM 角色。

修改 IAM 角色以允许或限制对其他服务的访问。为此,请登录 IAM 控制台。然后,选择 Roles(角色),选择一个角色。Permissions(权限)选项卡中会列出选定角色所附加的策略。您可以选择相应的 Manage Policy(管理策略)链接自定义访问策略。要了解如何使用和定义策略的更多信息,请参阅 IAM 策略概述

注意

作为最佳实践,定义策略时应遵循授予最低权限的原则。换言之,策略只包含用户执行其任务所需的权限。有关更多信息,请参阅 IAM 用户指南中的授予最低权限

请记住,未经验证的身份会被未登录应用的用户所利用。通常情况下,为未经验证的身份分配的权限应该比为经过验证的身份分配的权限更严格。

设置信任策略

Amazon Cognito 使用 IAM 角色为应用程序的用户生成临时凭证。对权限的访问由角色的信任关系控制。了解有关 角色信任和权限 的更多信息。

呈现给 Amazon STS 的令牌由身份池生成,身份池将用户群体、社交或 OIDC 提供者令牌或 SAML 断言转换为自己的令牌。身份池令牌包含一个 aud 声明,即身份池 ID。

以下示例角色信任策略允许联合身份服务主体 cognito-identity.amazonaws.com 调用 Amazon STS API AssumeRoleWithWebIdentity。仅当 API 请求中的身份池令牌具有以下声明时,请求才会成功。

  1. 一个 aud 声明(身份池 ID us-west-2:abcdefg-1234-5678-910a-0e8443553f95)。

  2. 一个 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" }, "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "authenticated" } } } ] }

基本(经典)身份验证中 IAM 角色的信任策略

您必须至少应用一个条件,限制您在身份池中使用的角色的信任策略。当您为身份池创建或更新角色信任策略时,如果您尝试在没有至少一个限制源身份的条件键的情况下保存更改,则 IAM 会返回错误。Amazon STS 不允许从身份池到缺少此类条件的 IAM 角色执行跨账户 AssumeRoleWithWebIdentity 操作。

本主题包括几个限制身份池源身份的条件。有关完整列表,请参阅 Amazon Web 身份联合验证的可用键

在使用身份池的基本(或经典)身份验证中,如果任何 IAM 角色具有正确的信任策略,即可以通过 Amazon STS 代入该角色。Amazon Cognito 身份池的 IAM 角色信任服务主体 cognito-identity.amazonaws.com 担任该角色。此配置不足以保护您的 IAM 角色来防止意外访问资源。此类角色必须对角色信任策略应用附加条件。如果没有满足以下至少一个条件,您就无法创建或修改身份池的角色。

cognito-identity.amazonaws.com:aud

将角色限制为从一个或多个身份池执行操作。Amazon Cognito 在身份池令牌的 aud 声明中标明了源身份池。

cognito-identity.amazonaws.com:amr

将角色限制为 authenticatedunauthenticated(访客)用户。Amazon Cognito 在身份池令牌的 amr 声明中标明了身份验证状态。

cognito-identity.amazonaws.com:sub

通过 UUID 将角色限制为一个或多个用户。此 UUID 是用户在身份池中的身份 ID。此值不是来自用户的原始身份提供者的 sub 值。Amazon Cognito 在身份池令牌的 sub 声明中标明了此 UUID。

增强型流程身份验证要求 IAM 角色与身份池在同一个 Amazon Web Services 账户,但在基本身份验证中,情况并非如此。

其他注意事项适用于承担跨账户 IAM 角色的 Amazon Cognito 身份池。这些角色的信任策略必须接受 cognito-identity.amazonaws.com 服务主体,并且必须包含特定的 cognito-identity.amazonaws.com:aud 条件。为防止意外访问您的 Amazon 资源,aud 条件键在条件值中将角色限制为身份池中的用户。

身份池为身份发放的令牌包含有关身份池的来源 Amazon Web Services 账户的信息。当您在 AssumeRoleWithWebIdentity API 请求中提供身份池令牌时,Amazon STS 会检查原始身份池是否与 IAM 角色位于同一个 Amazon Web Services 账户。如果 Amazon STS 确定请求是跨账户请求,则它会检查角色信任策略是否具有 aud 条件。如果角色信任策略中不存在此类条件,则 assume-role 调用会失败。如果请求不是跨账户请求,则 Amazon STS 不强制实施此限制。作为一种安全的最佳实践,应始终将此类条件应用于您的身份池角色的信任策略。

其他信任策略条件

跨身份池重复使用角色

要跨多个身份池重复使用某个角色,由于它们共享一个通用权限集,您可以添加多个身份池,如下所示:

"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 身份 ID。请谨慎使用此选项,特别是对于未经身份验证的身份,因为这些身份缺少一致的用户 ID。有关使用 Amazon Cognito 进行 Web 联合身份验证的 IAM policy 变量的更多信息,请参阅《Amazon Identity and Access Management 用户指南》中的 Amazon STSIAM 和条件上下文密钥

为提供更好的安全保护,Amazon Cognito 使用 GetCredentialsForIdentity,对在增强型流程中分配给未经身份验证用户的凭证应用缩小范围策略。缩小范围策略可向您对未经身份验证的角色应用的 IAM policy 添加 内联会话策略Amazon 托管式会话策略。由于您必须在角色的 IAM policy 和会话策略中授予访问权限,因此,范围缩小策略限制了用户对以下服务列表以外的服务的访问权限。

注意

在基本(经典)流程中,您可以发出自己的 AssumeRoleWithWebIdentity API 请求,并可以将这些限制应用于请求。作为最佳安全实践,请勿向未经身份验证的用户分配超出此缩小范围策略的任何权限。

Amazon Cognito 还可防止经过身份验证和未经身份验证的用户向 Amazon Cognito 身份池和 Amazon Cognito Sync 发出 API 请求。其他 Amazon Web Services 服务可能会限制通过 Web 身份访问服务。

在使用增强型流程的成功请求中,Amazon Cognito 在后台发出 AssumeRoleWithWebIdentity API 请求。在此请求的参数中,Amazon Cognito 包括以下内容。

  1. 用户的身份 ID。

  2. 用户所需要代入的 IAM 角色的 ARN。

  3. 一个 policy 参数,添加内联会话策略

  4. 一个 PolicyArns.member.N 参数,其值是在 Amazon CloudWatch 中授予额外权限的 Amazon 托管式策略

未经身份验证的用户可以访问的服务

当您使用增强型流程时,Amazon Cognito 对您的用户会话应用的范围缩小策略会阻止用户会话使用下表中列出的服务以外的任何服务。对于服务子集,仅允许特定操作。

类别 服务

分析

Amazon Data Firehose

适用于 Apache Flink 的亚马逊托管服务

应用程序集成

Amazon Simple Queue Service

AR 和 VR

Amazon Sumerian¹

业务应用程序

Amazon Mobile Analytics

Amazon Simple Email Service

计算

Amazon Lambda

加密和 PKI

Amazon Key Management Service¹

数据库

Amazon DynamoDB

Amazon SimpleDB

前端 Web 和移动

Amazon AppSync

Amazon Location Service

Amazon Simple Notification Service

Amazon Pinpoint

Amazon Location Service

游戏开发

Amazon GameLift

物联网(IoT)

Amazon IoT

机器学习

Amazon CodeWhisperer

Amazon Comprehend

Amazon Lex

Amazon Machine Learning

Amazon Personalize

Amazon Polly

Amazon Rekognition

Amazon SageMaker¹

Amazon Textract¹

Amazon Transcribe

Amazon Translate

管理与治理

Amazon CloudWatch

Amazon CloudWatch Logs

联网和内容分发

Amazon API Gateway

安全性、身份与合规性

Amazon Cognito 用户群体

存储

Amazon Simple Storage Service

¹ 对于下表中的 Amazon Web Services 服务,内联策略授予了一部分操作的权限。该表显示了每个服务中的可用操作。

Amazon Web Services 服务 未经身份验证的增强型流程用户的最大权限
Amazon Key Management Service

Encrypt

Decrypt

ReEncrypt

GenerateDataKey

Amazon SageMaker

InvokeEndpoint

Amazon Textract

DetectDocumentText

AnalyzeDocument

Amazon Sumerian

View*

Amazon Location Service

SearchPlaceIndex*

GetPlace

CalculateRoute*

*Geofence

*Geofences

*DevicePosition*

要授予对超出此列表之外的 Amazon Web Services 服务的访问权限,请在身份池中激活基本(经典)身份验证流程。如果您的用户发现,在分配给未经身份验证用户的 IAM 角色的策略中,其允许的 Amazon Web Services 服务中出现了 NotAuthorizedException 错误,请评估您是否可以在使用案例中删除该服务。如果不能,请切换到基本流程。

访客用户的内联会话策略

Amazon Cognito 首先会在请求 IAM 凭证时应用内联策略。内联会话策略对用户的有效权限进行限制,不能包括对以下列表之外的任何 Amazon Web Services 服务 的访问权限。您还必须在应用到用户的 IAM 角色的策略中,将权限授予这些 Amazon Web Services 服务。对于代入角色的会话,用户的有效权限是分配给其角色的策略与其会话策略的交集。有关更多信息,请参阅《Amazon Identity and Access Management 用户指南》中的会话策略

Amazon Cognito 将以下内联策略添加到原定设置情况下启用的 Amazon Web Services 区域中的用户会话。若要大概了解内联策略和其他会话策略的最终影响,请参阅未经身份验证的用户可以访问的服务

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cloudwatch:*", "logs:*", "dynamodb:*", "kinesis:*", "mobileanalytics:*", "s3:*", "ses:*", "sns:*", "sqs:*", "lambda:*", "machinelearning:*", "execute-api:*", "iot:*", "gamelift:*", "scs:*", "cognito-identity:*", "cognito-idp:*", "lex:*", "polly:*", "comprehend:*", "translate:*", "transcribe:*", "rekognition:*", "mobiletargeting:*", "firehose:*", "appsync:*", "personalize:*", "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "sagemaker:InvokeEndpoint", "cognito-sync:*", "sumerian:View*", "codewhisperer:*", "textract:DetectDocumentText", "textract:AnalyzeDocument", "sdb:*" ], "Resource": [ "*" ] } ] }

对于所有其他区域,内联范围缩小策略包括原定设置区域中列出的所有内容,以下 Action 语句除外。

"cognito-sync:*", "sumerian:View*", "codewhisperer:*", "textract:DetectDocumentText", "textract:AnalyzeDocument", "sdb:*"

访客的 Amazon 托管式会话策略

Amazon Cognito 还将 Amazon 托管式策略作为会话策略应用于未经身份验证的访客的增强型流程会话。此策略通过策略 AmazonCognitoUnAuthedIdentitiesSessionPolicy 限制了未经身份验证的用户的权限范围。

您还必须在附加到未经身份验证的 IAM 角色的策略中授予此权限。对于代入角色会话,用户的有效权限是分配给其角色的 IAM 策略与其会话策略的交集。有关更多信息,请参阅《Amazon Identity and Access Management 用户指南》中的会话策略

若要大概了解此 Amazon 托管式策略和其他会话策略的最终影响,请参阅未经身份验证的用户可以访问的服务

AmazonCognitoUnAuthedIdentitiesSessionPolicy 托管式策略具有以下权限。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "rum:PutRumEvents", "polly:*", "comprehend:*", "translate:*", "transcribe:*", "rekognition:*", "mobiletargeting:*", "firehose:*", "personalize:*", "sagemaker:InvokeEndpoint", "geo:GetMap*", "geo:SearchPlaceIndex*", "geo:GetPlace", "geo:CalculateRoute*", "geo:*Geofence", "geo:*Geofences", "geo:*DevicePosition*" ], "Resource": "*" }] }

访问策略示例

在本部分中,您可以找到示例 Amazon Cognito 访问策略,这些策略仅向您的用户授予完成特定操作所需的最低权限。您可以在可能的情况下使用策略变量进一步限制给定标识 ID 的权限。例如,使用 ${cognito-identity.amazonaws.com:sub}。有关更多信息,请参阅Amazon移动博客上的 nderstanding Amazon Cognito Authentication Part 3: Roles and Policies

注意

作为安全性最佳实践,策略应仅包括用户执行其任务所需的权限。这意味着您应该尽可能始终为对象限定单个身份的访问范围。

向身份授予对 Amazon S3 中单个对象的读取访问权限

以下访问策略向身份授予读取权限,以便从给定的 S3 存储桶中检索单个对象。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:GetObject" ], "Effect": "Allow", "Resource": ["arn:aws:s3:::amzn-s3-demo-bucket/assets/my_picture.jpg"] } ] }

向身份授予对 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 中的其他对象的权限。

{ "Version": "2012-10-17", "Statement": [ { "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::amzn-s3-demo-bucket"], "Condition": {"StringLike": {"s3:prefix": ["${cognito-identity.amazonaws.com:sub}/*"]}} }, { "Action": [ "s3:GetObject", "s3:PutObject" ], "Effect": "Allow", "Resource": ["arn:aws:s3:::amzn-s3-demo-bucket/${cognito-identity.amazonaws.com:sub}/*"] } ] }

为 Amazon DynamoDB 分配身份细粒度访问权限

以下访问策略使用 Amazon Cognito 环境变量,为 DynamoDB 资源提供细粒度访问控制。这些变量按身份 ID 授予对 DynamoDB 中项目的访问权限。有关更多信息,请参阅《Amazon DynamoDB 开发人员指南》中的使用 IAM 策略条件实现精细访问控制

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem" ], "Resource": [ "arn:aws:dynamodb:us-west-2:123456789012:table/MyTable" ], "Condition": { "ForAllValues:StringEquals": { "dynamodb:LeadingKeys": ["${cognito-identity.amazonaws.com:sub}"] } } } ] }

向身份授予调用 Lambda 函数的权限

以下访问策略向身份授予调用 Lambda 函数的权限。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": [ "arn:aws:lambda:us-west-2:123456789012:function:MyFunction" ] } ] }

向身份授予将记录发布到 Kinesis Data Stream 的权限

以下访问策略允许身份将 PutRecord 操作与任何 Kinesis Data Streams 结合使用。它可以应用于需要将数据记录添加到账户中所有流的用户。有关更多信息,请参阅《Amazon Kinesis Data Streams 开发人员指南》中的使用 IAM 控制对 Amazon Kinesis Data Streams 资源的访问

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "kinesis:PutRecord", "Resource": [ "arn:aws:kinesis:us-east-1:111122223333:stream/stream1" ] } ] }

向身份授予访问 Amazon Cognito 同步存储中其数据的权限

以下访问策略仅向身份授予访问 Amazon Cognito Sync 存储中其自己数据的权限。

{ "Version": "2012-10-17", "Statement":[{ "Effect":"Allow", "Action":"cognito-sync:*", "Resource":["arn:aws:cognito-sync:us-east-1:123456789012:identitypool/${cognito-identity.amazonaws.com:aud}/identity/${cognito-identity.amazonaws.com:sub}/*"] }] }

角色信任和权限

这些角色的区别在于其信任关系。下面是未经身份验证角色的示例信任策略:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Federated": "cognito-identity.amazonaws.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "cognito-identity.amazonaws.com:aud": "us-east-1:12345678-corner-cafe-123456790ab" }, "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "unauthenticated" } } } ] }

此策略向来自 cognito-identity.amazonaws.com(OpenID Connect 令牌的发布者)的联合身份用户授予代入该角色的权限。此外,策略限制令牌的 aud (在此示例中为身份池 ID) 匹配身份池。最后,策略指定的由 Amazon Cognito GetOpenIdToken API 操作发布的令牌的多值 amr 声明的数组成员之一具有值 unauthenticated

当 Amazon Cognito 创建令牌时,它将令牌的 amr 设置为 unauthenticatedauthenticated。如果 amrauthenticated,则令牌包括身份验证期间使用的所有提供商。这意味着,您可以创建一个角色,它只信任通过 Facebook 登录的用户,这只需将 amr 条件更改为如下所示即可:

"ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "graph.facebook.com" }

在更改角色的信任关系或尝试跨身份池使用角色时,请务必谨慎。如果您未正确配置角色来信任身份池,则 STS 结果中会出现类似以下内容的异常:

AccessDenied -- Not authorized to perform sts:AssumeRoleWithWebIdentity

如果您看到此消息,请仔细检查身份池和身份验证类型是否具有正确的角色。