Amazon Simple Queue Service
开发人员指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

为 Amazon SQS 使用基于身份的策略 (IAM)

本主题提供了基于身份的策略示例,在这些示例中,账户管理员可以向 IAM 身份 (用户、组和角色) 附加权限策略。

重要

我们建议您首先阅读以下介绍性主题,这些主题讲解了管理 Amazon Simple Queue Service 资源访问权限的基本概念和选项。有关更多信息,请参阅 管理您 Amazon Simple Queue Service 资源的访问权限概览

使用 Amazon SQS 和 IAM 策略

可通过两种方式向您的用户授予访问您 Amazon SQS 资源的权限:使用 Amazon SQS 策略系统和使用 IAM 策略系统。您可以使用其中任意一套或两套系统。在绝大部分情况下,无论采用上述哪种方式,都可以得到同样的结果。

例如,下图显示了等效的 IAM 策略和 Amazon SQS 策略。IAM 策略可授权对您 AWS 账户中名为 queue_xyz 的队列执行 Amazon SQS ReceiveMessageSendMessage 操作,并且该策略已附加到用户 Bob 和 Susan (Bob 和 Susan 拥有该策略中所述的权限)。此 Amazon SQS 策略还向 Bob 和 Susan 授予对同一队列进行 ReceiveMessageSendMessage 操作的权限。

注意

此示例显示了不带条件的简单策略。您可以在上述任一策略中指定特定条件,并获得同样的结果。

IAM 策略与 Amazon SQS 策略之间有一个重大差别:Amazon SQS 策略系统允许您向其他 AWS 账户授予权限,而 IAM 则不允许。

您可以自行决定如何综合使用上述两种系统来管理您的权限。以下示例展示这两种策略系统是如何共同运行的。

  • 在第一个示例中,Bob 同时拥有 IAM 策略和适用于其账户的 Amazon SQS 策略。IAM 策略向其账户授予对 queue_xyz 执行 ReceiveMessage 操作的权限,而 Amazon SQS 策略向其账户授予对同一队列执行 SendMessage 操作的权限。下图阐明了这一概念。

    如果 Bob 向 queue_xyz 发送 ReceiveMessage 请求,IAM 策略将允许执行该操作。如果 Bob 向 queue_xyz 发送 SendMessage 请求,Amazon SQS 策略将允许执行该操作。

  • 在第二个示例中,Bob 滥用他对 queue_xyz 的访问权限,因此有必要删除他对该队列的所有访问权限。最简单的方法是添加一个策略,拒绝他访问该队列的所有操作。此策略会覆盖另外两个策略,因为显式 deny 始终覆盖 allow。有关策略评估逻辑的更多信息,请参阅使用 Amazon SQS Access Policy Language创建自定义策略。下图阐明了这一概念。

    您还可以向 Amazon SQS 策略中添加一条额外的语句,拒绝 Bob 以任何方式访问该队列。添加一条 IAM 策略拒绝 Bob 访问该队列也具有同样的效果。有关涉及 Amazon SQS 操作和资源的策略示例,请参阅“客户托管的策略示例”。有关编写 Amazon SQS 策略的更多信息,请参阅使用 Amazon SQS Access Policy Language创建自定义策略

使用 Amazon SQS 控制台所需要的权限

希望使用 Amazon SQS 控制台的用户必须具有在用户的 AWS 账户中使用 Amazon SQS 队列的最小权限集。例如,用户必须具有调用 ListQueues 操作的权限才能列出队列,或者必须具有调用 CreateQueue 操作的权限才能创建队列。要将 Amazon SQS 队列订阅到 Amazon SNS 主题,则除了 Amazon SQS 权限之外,控制台还需要针对 Amazon SNS 操作的权限。

如果创建比必需的最低权限更为严格的 IAM 策略,对于附加了该 IAM 策略的用户,控制台可能无法按预期方式运行。

对于只需要调用 AWS CLI 或 Amazon SQS API 操作的用户,您无需为其提供最低控制台权限。

适用于 Amazon SQS 的 AWS 托管 (预定义) 策略

AWS 通过提供独立的 AWS 托管 IAM 策略处理了很多常见使用案例。这些 AWS 托管策略通过授予常用案例所需的权限来简化对权限的使用。有关更多信息,请参阅 IAM 用户指南 中的 AWS 托管策略

以下 AWS 托管策略 (可将它们附加到您的账户中的用户) 是特定于 Amazon SQS 的:

  • AmazonSQSReadOnlyAccess - 使用 AWS 管理控制台授予对 Amazon SQS 队列的只读访问权限。

  • AmazonSQSFullAccess - 使用 AWS 管理控制台授予对 Amazon SQS 队列的完全访问权限。

您可以在 IAM 控制台上搜索和查看可用策略。此外,您还可以创建自己的自定义 IAM 策略,以授予 Amazon SQS 操作和队列的相关权限。您可以将这些自定义策略附加到需要权限的 IAM 用户或组。

编写 Amazon SQS 策略

以下示例介绍了权限策略的详细信息。

示例 1:允许用户创建队列

在以下示例中,我们为 Bob 创建了一条策略,允许他访问所有 Amazon SQS 操作,但是仅限于名称前缀为文本字符串 bob_queue_ 的队列。

Amazon SQS 不会自动向队列创建者授予使用该队列的权限。因此,除了 IAM 策略中的 CreateQueue 操作,我们还必须向 Bob 显式授予使用所有 Amazon SQS 操作的权限。

Copy
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "sqs:*", "Resource": "arn:aws:sqs:*:123456789012:bob_queue_*" }] }

示例 2:允许开发人员向共享队列写入消息

在以下示例中,我们为开发人员创建了一个组,并挂载了一条策略,允许该组使用 Amazon SQS SendMessage 操作,但是仅限于属于特定 AWS 账户且名为 CompanyTestQueue 的队列。

Copy
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "sqs:SendMessage", "Resource": "arn:aws:sqs:*:123456789012:CompanyTestQueue" }] }

示例 3:允许管理人员获取队列的一般大小

在以下示例中,我们为管理人员创建了一个组,并挂载了一条策略,允许该组对属于指定 AWS 账户的所有队列使用 Amazon SQS GetQueueAttributes 操作。

Copy
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "sqs:GetQueueAttributes", "Resource": "*" }] }

示例 4:允许合作伙伴向指定队列发送消息

您可以使用 Amazon SQS 策略或 IAM 策略完成此任务。如果您的合作伙伴拥有 AWS 账户,这样会比使用 Amazon SQS 策略简单。但是,合作伙伴公司中拥有 AWS 安全凭证的任何用户都可以向该队列发送消息。假设您希望仅向特定用户或应用程序授予访问权限,则必须像对待您公司内部的用户那样对待合作伙伴,并使用 IAM 策略而不是 Amazon SQS 策略。

本示例将执行以下操作:

  1. 创建名为 WidgetCo 的组,代表合作伙伴公司。

  2. 为合作伙伴公司中需要访问权限的特定用户或应用程序创建用户。

  3. 将用户添加到组。

  4. 挂载一条策略,仅允许该组对名为 WidgetPartnerQueue 的队列执行 SendMessage 操作。

Copy
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": "sqs:SendMessage", "Resource": "arn:aws:sqs:*:123456789012:WidgetPartnerQueue" }] }

客户托管的策略示例

本节显示了 Amazon SQS 常用案例的示例策略。

在将每个策略附加到用户时,可使用控制台验证该策略的效果。最初,用户没有权限并且无法在控制台中执行任何操作。在将策略附加到用户时,可以验证用户是否能在控制台中执行各种操作。

建议您使用两个浏览器窗口:一个浏览器窗口用于授予权限,另一个浏览器窗口用于使用用户凭证登录 AWS 管理控制台,并在向用户授予权限时验证这些权限。

示例 1:向一个 AWS 账户授予一项权限

以下示例策略向 AWS 账户号 111122223333 授予对美国东部(俄亥俄州)区域中名为 444455556666/queue1 的队列的 SendMessage 权限。

Copy
{ "Version": "2012-10-17", "Id": "Queue1_Policy_UUID", "Statement": [{ "Sid":"Queue1_SendMessage", "Effect": "Allow", "Principal": { "AWS": [ "111122223333" ] }, "Action": "sqs:SendMessage", "Resource": "arn:aws:sqs:us-east-2:444455556666:queue1" }] }

示例 2:向一个 AWS 账户授予两项权限

以下示例策略向 AWS 账号 111122223333 授予对名为 444455556666/queue1 的队列的 SendMessageReceiveMessage 权限。

Copy
{ "Version": "2012-10-17", "Id": "Queue1_Policy_UUID", "Statement": [{ "Sid":"Queue1_Send_Receive", "Effect": "Allow", "Principal": { "AWS": [ "111122223333" ] }, "Action": [ "sqs:SendMessage", "sqs:ReceiveMessage" ], "Resource": "arn:aws:sqs:*:444455556666:queue1" }] }

示例 3:向两个 AWS 账户授予所有权限

以下示例策略向两个不同的 AWS 账号 (111122223333444455556666) 授予权限以使用所有操作,Amazon SQS 允许这些操作共享对美国东部(俄亥俄州)区域中名为 123456789012/queue1 的队列的访问权限。

Copy
{ "Version": "2012-10-17", "Id": "Queue1_Policy_UUID", "Statement": [{ "Sid":"Queue1_AllActions", "Effect": "Allow", "Principal": { "AWS": [ "111122223333", "444455556666" ] }, "Action": "sqs:*", "Resource": "arn:aws:sqs:us-east-2:123456789012:queue1" }] }

示例 4:向角色和用户名授予跨账户权限

以下示例策略向 AWS 账号 111122223333 下的 role1username1 授予跨账户权限以使用所有操作,Amazon SQS 允许这些操作共享对美国东部(俄亥俄州)区域中名为 123456789012/queue1 的队列的访问权限。

Copy
{ "Version": "2012-10-17", "Id": "Queue1_Policy_UUID", "Statement": [{ "Sid":"Queue1_AllActions", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::111122223333:role/role1", "arn:aws:iam::111122223333:user/username1" ] }, "Action": "sqs:*", "Resource": "arn:aws:sqs:us-east-2:123456789012:queue1" }] }

示例 5:向所有用户授予一项权限

以下示例策略向所有用户授予对名为 111122223333/queue1 的队列的 ReceiveMessage 权限。

Copy
{ "Version": "2012-10-17", "Id": "Queue1_Policy_UUID", "Statement": [{ "Sid":"Queue1_AnonymousAccess_ReceiveMessage", "Effect": "Allow", "Principal": "*", "Action": "sqs:ReceiveMessage", "Resource": "arn:aws:sqs:*:111122223333:queue1" }] }

示例 6:向所有用户授予有时间限制的权限

以下示例策略向所有用户授予对名为 111122223333/queue1 的队列的 ReceiveMessage 权限,但有效时间仅限于 2009 年 1 月 31 日中午 12:00 至下午 3:00 期间。

Copy
{ "Version": "2012-10-17", "Id": "Queue1_Policy_UUID", "Statement": [{ "Sid":"Queue1_AnonymousAccess_ReceiveMessage_TimeLimit", "Effect": "Allow", "Principal": "*", "Action": "sqs:ReceiveMessage", "Resource": "arn:aws:sqs:*:111122223333:queue1", "Condition" : { "DateGreaterThan" : { "aws:CurrentTime":"2009-01-31T12:00Z" }, "DateLessThan" : { "aws:CurrentTime":"2009-01-31T15:00Z" } } }] }

示例 7:向 CIDR 范围内的所有用户授予所有权限

以下示例策略向所有用户授予对名为 111122223333/queue1 的队列使用可以共享的所有可能的 Amazon SQS 操作的权限,但条件是请求必须来自于 192.168.143.0/24 CIDR 范围。

Copy
{ "Version": "2012-10-17", "Id": "Queue1_Policy_UUID", "Statement": [{ "Sid":"Queue1_AnonymousAccess_AllActions_WhitelistIP", "Effect": "Allow", "Principal": "*", "Action": "sqs:*", "Resource": "arn:aws:sqs:*:111122223333:queue1", "Condition" : { "IpAddress" : { "aws:SourceIp":"192.168.143.0/24" } } }] }

示例 8:不同 CIDR 范围内用户的白名单和黑名单权限

以下策略示例具有两项陈述:

  • 第一个语句向 192.168.143.0/24 CIDR 范围 (192.168.143.188 除外) 内的所有用户授予对名为 111122223333/queue1 的队列使用 SendMessage 操作的权限。

  • 第二个语句将 10.1.2.0/24 CIDR 范围内的所有用户列入黑名单来阻止其使用该队列。

Copy
{ "Version": "2012-10-17", "Id": "Queue1_Policy_UUID", "Statement": [{ "Sid":"Queue1_AnonymousAccess_SendMessage_IPLimit", "Effect": "Allow", "Principal": "*", "Action": "sqs:SendMessage", "Resource": "arn:aws:sqs:*:111122223333:queue1", "Condition" : { "IpAddress" : { "aws:SourceIp":"192.168.143.0/24" }, "NotIpAddress" : { "aws:SourceIp":"192.168.143.188/32" } } }, { "Sid":"Queue1_AnonymousAccess_AllActions_IPLimit_Deny", "Effect": "Deny", "Principal": "*", "Action": "sqs:*", "Resource": "arn:aws:sqs:*:111122223333:queue1", "Condition" : { "IpAddress" : { "aws:SourceIp":"10.1.2.0/24" } } }] }