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 联合身份验证的可用密钥

在身份池的基本身份验证或经典身份验证中, Amazon STS 如果任何 IAM 角色具有正确的信任策略,则可以向其请求该角色。至少,信任策略必须允许服务主体cognito-identity.amazonaws.com担任该角色。Enhanced-Flow 身份验证要求 IAM 角色与身份池 Amazon Web Services 账户 相同,但在基本身份验证中,情况并非如此。

身份池为身份发放的令牌与身份池 Amazon Web Services 账户 的令牌相关联。当您在 AssumeRoleWithWebIdentityAPI 请求中提供身份池令牌时, Amazon STS 会检查原始身份池是否与 IAM 角色 Amazon Web Services 账户 相同。如果 Amazon STS 确定请求是跨账户的,则它会检查角色信任策略是否至少有一个限制来源身份的条件。如果角色信任策略中不存在此类条件,则假设角色调用将失败。这种行为不会影响角色信任策略,这些策略没有源身份的条件,但只能与同一个身份池一起使用 Amazon Web Services 账户。作为最佳实践,请务必将此类条件应用于您的身份池角色的信任策略。

其他信托政策条件

跨身份池重复使用角色

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

"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 进行网络联合的 IAM 策略变量的更多信息,请参阅Amazon Identity and Access Management 用户指南中的 IAM 和 Amazon STS 条件上下文密钥

为提供更好的安全保护,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 中授予额外权限的Amazon 托管策略 CloudWatch。

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

当您使用增强型流程时,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 GameLift

物联网(IoT)

Amazon IoT

机器学习

Amazon CodeWhisperer

Amazon Comprehend

Amazon Lex

Amazon Machine Learning

Amazon Personalize

Amazon Polly

Amazon Rekognition

亚马逊 SageMaker ¹

Amazon Textract¹

Amazon Transcribe

Amazon Translate

管理与治理

Amazon CloudWatch

Amazon CloudWatch 日志

联网和内容分发

Amazon API Gateway

安全性、身份与合规性

Amazon Cognito 用户群体

存储

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*

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

内联会话策略

内联会话策略限制您的用户的有效权限,使其无法访问以下列表中 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 角色的策略中授予此权限。

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

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "rum:PutRumEvents", "polly:*", "comprehend:*", "translate:*", "transcribe:*", "rekognition:*", "mobiletargeting:*", "firehose:*", "personalize:*", "sagemaker:InvokeEndpoint" ], "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}/*"] }] }