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 角色为应用程序的用户生成临时凭证。对权限的访问由角色的信任关系控制。了解有关 角色信任和权限 的更多信息。

跨身份池重复使用角色

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

"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 在后台发出 AssumeRoleWithWebIdentity API 请求。在此请求的参数中,Amazon Cognito 包括以下内容。

  1. 用户的身份 ID。

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

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

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

内联会话策略

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

未经身份验证的增强型流程用户可以访问的服务

类别 服务

分析

Amazon Kinesis Data Firehose

Amazon Kinesis Data Analytics

应用程序集成

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 GameLift

物联网 (IoT)

Amazon IoT

Machine Learning

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 Identity

Amazon Cognito 用户池

Amazon Cognito Sync

存储

Amazon Simple Storage Service

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

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

Encrypt

Decrypt

ReEncrypt

GenerateDataKey

Amazon SageMaker

InvokeEndpoint

Amazon Textract

DetectDocumentText

AnalyzeDocument

Amazon Sumerian

View*

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

Amazon 托管式会话策略

Amazon Cognito 还会在增强流程中将 Amazon 托管式策略 AmazonCognitoUnauthenticatedIdentities 附加到未经身份验证的用户。该策略授予向 CloudWatch RUM 发送指标的权限。您还必须在附加到未经身份验证的 IAM 角色的策略中授予此权限。

您可以在 CloudWatch RUM 中创建应用程序监控器,并将性能数据和其他事件从您的应用程序发送到监控器。当您在 IAM policy 中为未经身份验证的用户分配对 CloudWatch RUM 的访问权限时,使用 Resource 元素将该策略范围限定到您想要与您的应用程序关联的应用程序监控器。有关 CloudWatch RUM 的更多信息,请参阅《Amazon CloudWatch 用户指南》中的使用 CloudWatch RUM

Amazon Cognito 将以下会话策略添加到未经身份验证的增强流程用户会话中。它增加了 CloudWatch RUM PutRumEvents 权限。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "rum:PutRumEvents", "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:::mybucket/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:::mybucket/us-east-1:12345678-1234-1234-1234-123456790ab 中获取、放置和列出对象。但是,不会授予身份访问 arn:aws:s3:::mybucket 中的其他对象的权限。

{ "Version": "2012-10-17", "Statement": [ { "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket"], "Condition": {"StringLike": {"s3:prefix": ["${cognito-identity.amazonaws.com:sub}/*"]}} }, { "Action": [ "s3:GetObject", "s3:PutObject" ], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket/${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}/*"] }] }