IAM 角色 - Amazon Cognito

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

IAM 角色

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

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

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

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

将角色限制为 authenticatedunauthenticated(访客)用户。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 请求中的身份池令牌具有以下声明时,请求才会成功。

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

  2. 一个 amr 声明(authenticated),当用户已登录并且不是访客用户时添加。

JSON
{ "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 角色的信任策略

摘要

只有当目标角色的信任策略包含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 包括以下内容。

  1. 用户的身份 ID。

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

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

  4. 一个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

Encrypt

Decrypt

ReEncryptTo

ReEncryptFrom

GenerateDataKey

GenerateDataKeyPair

GenerateDataKeyPair

GenerateDataKeyPairWithoutPlaintext

GenerateDataKeyWithoutPlaintext

亚马逊 SageMaker AI

InvokeEndpoint

Amazon Textract

DetectDocumentText

AnalyzeDocument

Amazon Sumerian

View*

Amazon Location Service

SearchPlaceIndex*

GetPlace

CalculateRoute*

*Geofence

*Geofences

*DevicePosition*

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

访客用户的内联会话策略

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

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

JSON
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cloudwatch:*", "logs:*", "dynamodb:*", "kinesis:*", "mobileanalytics:*", "s3:*", "ses:*", "sns:*", "sqs:*", "lambda:*", "machinelearning:*", "execute-api:*", "iot:*", "gamelift:*", "cognito-identity:*", "cognito-idp:*", "lex:*", "polly:*", "comprehend:*", "translate:*", "transcribe:*", "rekognition:*", "mobiletargeting:*", "firehose:*", "appsync:*", "personalize:*", "sagemaker:InvokeEndpoint", "cognito-sync:*", "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 托管式策略具有以下权限。

JSON
{ "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*", "kms:Encrypt", "kms:Decrypt", "kms:ReEncryptTo", "kms:ReEncryptFrom", "kms:GenerateDataKey", "kms:GenerateDataKeyPair", "kms:GenerateDataKeyPairWithoutPlaintext", "kms:GenerateDataKeyWithoutPlaintext" ], "Resource": "*" }] }

访问策略示例

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

注意

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

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

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

JSON
{ "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 中的其他对象的权限。

JSON
{ "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 S3 访问权限授予也实现了类似的访问模式。

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

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

JSON
{ "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 函数的权限。

JSON
{ "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 资源的访问

JSON
{ "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 存储中其自己数据的权限。

JSON
{ "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}/*"] }] }

角色信任和权限

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

JSON
{ "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

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