IAM 角色
在创建身份池时,系统会提示您更新用户代入的 IAM 角色。IAM 角色的工作方式如下:当用户登录应用程序时,Amazon Cognito 为用户生成临时Amazon凭证。这些临时凭证与特定 IAM 角色相关联。通过 IAM 角色,您可以定义一组权限,用来访问您的 Amazon 资源。
您可以为经过身份验证的用户和未经身份验证的用户指定默认 IAM 角色。此外,您可以定义规则,以便基于用户 ID 令牌中的声明为每个用户选择角色。有关更多信息,请参阅 基于角色的访问控制。
默认情况下,Amazon Cognito 控制台将创建可提供访问 Amazon Mobile Analytics 和 Amazon Cognito Sync 的权限的角色。或者,您也可以选择使用现有的 IAM 角色。
修改 IAM 角色以允许或限制对其他服务的访问。为此,请登录 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 CloudWatch
-
Amazon Cognito Identity
-
Amazon Cognito Sync
-
Amazon Comprehend
-
Amazon DynamoDB
-
Amazon GameLift
-
Amazon IoT
-
Amazon Key Management Service (Amazon KMS)
-
Amazon Kinesis Data Firehose
-
Amazon Kinesis Data Streams
-
Amazon Lambda
-
Amazon Lex
-
Amazon Location Service
-
Amazon Machine Learning
-
Amazon Mobile Analytics
-
Amazon Pinpoint
-
Amazon Polly
-
Amazon Rekognition
-
Amazon SimpleDB
-
Amazon Simple Email Service (Amazon SES)
-
Amazon Simple Notification Service (Amazon SNS)
-
Amazon Simple Queue Service (Amazon SQS)
-
Amazon Simple Storage Service (Amazon S3)
-
Amazon Sumerian
-
Amazon Transcribe
-
Amazon Translate
此外,有一些服务向未经身份验证的用户授予访问权限,但不允许这些用户使用服务的任意操作。下表显示了具有受限操作的服务。
服务 | 向未经身份验证的用户授予的权限 |
---|---|
Amazon Key Management Service | Encrypt , Decrypt ,
ReEncrypt , GenerateDataKey |
Amazon SageMaker | InvokeEndpoint |
Amazon Textract | DetectDocumentText ,
AnalyzeDocument |
Amazon Sumerian | View* |
如果您需要支持未经身份验证的用户访问除这些服务以外的服务,您必须使用基本身份验证流程。如果您收到 NotAuthorizedException
,并且您在未经身份验证的角色策略中启用了对该服务的访问权限,那么这可能就是原因所在。
访问策略示例
在此部分中,您可以找到示例 Amazon Cognito 访问策略,这些策略仅授予您的身份完成特定操作所需的权限。您可以在可能的情况下使用策略变量进一步限制给定标识 ID 的权限。例如,使用 ${cognito-identity.amazonaws.com:sub}。有关更多信息,请参阅Amazon移动博客上的 nderstanding Amazon Cognito Authentication Part 3: Roles and Policies
作为安全性最佳实践,策略应仅包括用户执行其任务所需的权限。这意味着您应该尽可能始终为对象限定单个身份的访问范围。
示例 1:向身份授予对 Amazon S3 中单个对象的读取访问权限
以下访问策略向身份授予读取权限,以便从给定的 S3 存储桶中检索单个对象。
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:GetObject" ], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket/assets/my_picture.jpg"] } ] }
示例 2:向身份授予对 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}/*"] } ] }
示例 3:为 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}"] } } } ] }
示例 4:向身份授予调用 Lambda 函数的权限
以下访问策略向身份授予调用 Lambda 函数的权限。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": [ "arn:aws:lambda:us-west-2:123456789012:function:MyFunction" ] } ] }
示例 5:向身份授予将记录发布到 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" ] } ] }
示例 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}/*"] }] }