IAM角色 - Amazon Cognito

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

IAM角色

创建身份池时,系统会提示您更新用户所IAM扮演的角色。IAM角色的工作原理如下:当用户登录您的应用程序时,Amazon Cognito 会为该用户生成临时 AWS 证书。这些临时证书与特定IAM角色关联。使用该IAM角色,您可以定义一组访问 AWS 资源的权限。

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

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

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

注意

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

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

设置信任策略

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

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

以下示例角色信任策略允许联合服务主体cognito-identity.amazonaws.com调用 AWS STS APIAssumeRoleWithWebIdentity。只有当请求中的身份池令牌具有以下声明时,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返回错误。 AWS STS 不允许从身份池到缺少此类条件的IAM角色进行跨账户AssumeRoleWithWebIdentity操作。

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

在使用身份池进行基本身份验证或经典身份验证中, AWS STS 只要具有正确的信任策略,您就可以扮IAM演任何角色。IAMAmazon Cognito 身份池的角色信任服务主体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

通过以下方式将角色限制为一个或多个用户。UUIDUUID这是用户在身份池中的身份 ID。此值不是来自用户原始身份提供商的sub值。Amazon Cognito UUID 在身份池令sub牌中的声明中指出了这一点。

Enhanced-Flow 身份验证要求IAM角色与身份池 AWS 账户 相同,但在基本身份验证中,情况并非如此。

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

身份池为身份发出的令牌包含有关身份池 AWS 账户 来源的信息。当您在AssumeRoleWithWebIdentityAPI请求中出示身份池令牌时, AWS STS 会检查原始身份池是否与IAM角色 AWS 账户 相同。如果 AWS STS 确定请求是跨账户的,则会检查角色信任策略是否有aud条件。如果角色信任策略中不存在此类条件,则假设角色调用将失败。如果请求不是跨账户请求,则 AWS 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策略元素:变量和标签。您可以使用该sub条件在访问策略中限制对 Amazon Cognito 身份IDs的操作。请谨慎使用此选项,特别是对于未经身份验证的身份,因为这些身份缺少一致的用户 ID。有关使用 Amazon Cognito 进行网络联合的IAM策略变量的更多信息,请参阅AWS Identity and Access Management 用户指南中的IAM和 AWS STS 条件上下文密钥

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

注意

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

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

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

  1. 用户的身份 ID。

  2. 您的用户想要IAM扮演的角色。ARN

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

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

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

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

类别 服务

分析

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

游戏开发

Amazon GameLift

物联网(IoT)

AWS 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 日志

联网和内容分发

亚马逊API网关

安全性、身份与合规性

Amazon Cognito 用户群体

存储

Amazon Simple Storage Service

¹ 对于下表 AWS 服务 中的,内联策略授予操作的子集。该表显示了每个服务中的可用操作。

AWS 服务 未经身份验证的增强型流程用户的最大权限
AWS 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*

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

访客用户的内联会话策略

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

Amazon Cognito 将以下内联策略添加到原定设置情况下启用的 AWS 区域 中的用户会话。有关内联策略和其他会话策略的净效果的概述,请参阅未经身份验证的用户可以访问的服务

{ "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:*"

访客 AWS 托管会话政策

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

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

有关此 AWS 托管策略和其他会话策略的净影响的概述,请参阅未经身份验证的用户可以访问的服务

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}。有关更多信息,请参阅AWS 移动博客上的 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 结合使用。它可以应用于需要将数据记录添加到账户中所有流的用户。有关更多信息,请参阅亚马逊 Kinesis Data Streams 开发者指南中的IAM使用控制对亚马逊 Kinesis 数据流资源的访问权限

{ "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 Co GetOpenIdToken API gnito 操作发行的令牌的多值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

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