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

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

IAM 角色

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

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

默认情况下,Amazon Cognito Console 会创建 IAM 角色,以提供访问 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" }

访问策略

附加到角色的权限对承担该角色的所有用户都有效。如果您希望区分用户的访问权限,则可以通过策略变量来实现。在访问策略中添加用户的身份 ID 时请务必小心,特别是对未经身份验证的身份,因为它们可能会在用户选择登录时发生变化。

为提供额外的安全保护,Amazon Cognito 对提供的凭证应用范围缩小的策略,GetCredentialForIdentity,以阻止未经身份验证的用户访问除下面列出的服务以外的服务:换句话说,此策略允许使用这些凭证的身份仅访问以下服务:

Amazon AppSync

Amazon Comprehend

GameLift

Amazon Lex

Amazon Polly

Amazon SimpleDB

Amazon Transcribe

CloudWatch

DynamoDB

Amazon IoT

Amazon Machine Learning

Amazon Rekognition

Amazon SES

Amazon Translate

Amazon Cognito Identity

Amazon Kinesis Data Firehose

Amazon KMS Amazon Mobile Analytics

Amazon Sumerian

Amazon SNS

Amazon Cognito 同步

Amazon Kinesis Data Streams

Amazon Lambda

Amazon Pinpoint

Amazon S3

Amazon SQS

如果您需要支持未经身份验证的用户访问除这些服务以外的服务,您必须使用基本身份验证流程。如果您收到 NotAuthorizedException,并且您在未经身份验证的角色策略中启用了对该服务的访问权限,那么这可能就是原因所在。

访问策略示例

在此部分中,您可以找到示例 Amazon Cognito 访问策略,这些策略仅授予您的身份完成特定操作所需的权限。您可以在可能的情况下使用策略变量进一步限制给定标识 ID 的权限。例如,使用 ${cognito-identity.amazonaws.com:sub}。有关更多信息,请参阅 。了解 Amazon Cognito 身份验证第 3 部分:角色和策略AmazonMobile 博客

注意

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

示例 1:允许身份在 S3 中具有对单个对象的读取访问权限

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

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

示例 2:允许身份在 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}/*"] } ] }

示例 3:为 Amazon DynamoDB 分配身份细粒度访问权限

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

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

示例 4:允许身份执行Amazon Lambda函数调用

以下访问策略向身份授予执行Amazon Lambdafunction.

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

示例 5:允许身份将记录发布到 Amazon Kinesis 数据流

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

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

示例 6:允许身份访问 Amazon Cognito Sync 存储中的数据

以下访问策略仅向身份授予对 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}/*"] }] }