

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

# 管理 Amazon SQS 中的访问权限概述
<a name="sqs-overview-of-managing-access"></a>

每个 AWS 资源都归人所有 AWS 账户，创建或访问资源的权限受权限策略的约束。账户管理员可以向 IAM 身份（用户、组和角色）附加权限策略，某些服务（如 Amazon SQS）也支持向资源附加权限策略。

**注意**  
*账户管理员*（或管理员用户）是具有管理权限的用户。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM 最佳实操](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

在授予权限时，由您指定哪些用户获得权限，获得对哪些资源的权限，以及您允许对这些资源执行哪些具体操作。

## Amazon Simple Queue Service 资源和操作
<a name="sqs-resource-and-operations"></a>

在 Amazon SQS 中，唯一的资源是*队列*。在策略中，可使用 Amazon 资源名称 (ARN) 标识策略应用到的资源。以下资源具有与之关联的唯一 ARN：


| 资源类型 | ARN 格式 | 
| --- | --- | 
| 队列 | arn:aws:sqs:region:account\$1id:queue\$1name | 

以下是队列的 ARN 格式的示例：
+ 在美国东部（俄亥俄州）`my_queue`地区命名的队列的 ARN，属于 AWS 账户 123456789012：

  ```
  arn:aws:sqs:us-east-2:123456789012:my_queue
  ```
+ Amazon SQS 支持的每个不同区域中名为 `my_queue` 的队列的 ARN：

  ```
  arn:aws:sqs:*:123456789012:my_queue
  ```
+ 使用 `?` 或 `*` 作为队列名称通配符的 ARN。在以下示例中，ARN 匹配前缀为 `my_prefix_` 的所有队列：

  ```
  arn:aws:sqs:*:123456789012:my_prefix_*
  ```

调用 [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_GetQueueAttributes.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_GetQueueAttributes.html) 操作可以获取现有队列的 ARN 值。`QueueArn` 属性的值即为队列的 ARN。有关更多信息 ARNs，请参阅 [IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns) *用户指南ARNs中的 IAM*。

Amazon SQS 提供用于处理队列资源的一组操作。有关更多信息，请参阅 [Amazon SQS API 权限：操作和资源参考](sqs-api-permissions-reference.md)。

## 了解资源所有权
<a name="sqs-understanding-resource-ownership"></a>

 AWS 账户 拥有在账户中创建的资源，无论谁创建了这些资源。具体而言，资源所有者是对资源创建请求进行身份验证的*主体实体*（即根账户、用户或 IAM 角色）的 AWS 账户 。以下示例说明了它的工作原理：
+ 如果您使用您的 AWS 账户 根账户证书创建亚马逊 SQS 队列，则您 AWS 账户 就是该资源的所有者（在 Amazon SQS 中，资源是亚马逊 SQS 队列）。
+ 如果您在中创建用户 AWS 账户 并向该用户授予创建队列的权限，则该用户可以创建队列。但是，该用户所属的 AWS 账户 是此队列资源的所有者。
+ 如果您在中创建 AWS 账户 具有创建 Amazon SQS 队列权限的 IAM 角色，则任何能够担任该角色的人都可以创建队列。您的 AWS 账户 （角色所属的）拥有队列资源。

## 管理对 资源的访问
<a name="sqs-managing-access-to-resources"></a>

*权限策略*描述了授予给账户的权限。下一节介绍创建权限策略时的可用选项。

**注意**  
 本节讨论如何在 Amazon SQS 范围内使用 IAM。这里不提供有关 IAM 服务的详细信息。有关完整的 IAM 文档，请参阅 *IAM 用户指南*中的[什么是 IAM？](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)。有关 IAM 策略语法和说明的信息，请参阅《IAM 用户指南》中的 [AWS IAM 策略参考](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html)。

附加到 IAM 身份的策略称作*基于身份* 的策略（IAM 策略），附加到资源的策略称作*基于资源* 的策略。

### 基于身份的策略
<a name="sqs-identity-based-features-of-sqs-policies"></a>

可通过两种方式向用户授予访问 Amazon SQS 队列的权限：使用 Amazon SQS 策略系统和使用 IAM 策略系统。您可以使用任一系统或这两种系统来将策略附加到用户或角色。在大多数情况下，使用任一系统都能获得相同的结果。例如，您可以执行以下操作：
+ **将权限策略附加到账户中的用户或组** - 要向用户授予创建 Amazon SQS 队列的权限，请将权限策略附加到用户或用户所属的组。
+ 将@@ **权限策略附加到其他用户中的用户 AWS 账户**-您可以将权限策略附加到其他用户中的用户， AWS 账户 以允许他们与 Amazon SQS 队列进行交互。但跨账户权限不能应用于以下操作：

  跨账户权限不能应用于以下操作：
  + `[AddPermission](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_AddPermission.html)`
  + `[CancelMessageMoveTask](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_CancelMessageMoveTask.html)`
  + `[CreateQueue](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_CreateQueue.html)`
  + `[DeleteQueue](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_DeleteQueue.html)`
  + `[ListMessageMoveTask](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ListMessageMoveTasks.html)`
  + `[ListQueues](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ListQueues.html)`
  + `[ListQueueTags](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ListQueueTags.html)`
  + `[RemovePermission](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_RemovePermission.html)`
  + `[SetQueueAttributes](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SetQueueAttributes.html)`
  + `[StartMessageMoveTask](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_StartMessageMoveTask.html)`
  + `[TagQueue](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_TagQueue.html)`
  + `[UntagQueue](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_UntagQueue.html)`

  要授予对这些操作的访问权限，用户必须属于拥有该 Amazon SQS 队列的同一 AWS 账户 。
+ **将权限策略附加到角色（授予跨账户权限）** – 要向 SQS 队列授予跨账户权限，您必须同时结合使用 IAM 策略和基于资源的策略：

  1. 在**账户 A**（队列所有者）中:
     + 将**基于资源的策略**附加到 SQS 队列。该策略必须向**账户 B** 中的主体（例如 IAM 角色）显式授予所需权限（例如 [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html)、[https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html)）。

  1. 在**账户 A** 中，创建一个 IAM 角色：
     + 一个**信任策略**，允许**账户 B** 或 AWS 服务 代入该角色。
**注意**  
如果您想让 AWS 服务 （例如 Lambda 或EventBridge）担任该角色，请在信任策略中指定服务委托人（例如lambda.amazonaws.com）。
     + 一个**基于身份的策略**，向该代入角色授予与队列交互的权限。

  1. 在**账户 B** 中，授予在**账户 A** 中代入角色的权限。

您必须将队列的访问策略配置为允许跨账户主体。仅使用基于 IAM 身份的策略不足以实现跨账户访问 SQS 队列。

有关使用 IAM 委托权限的更多信息，请参阅《IAM 用户指南》**中的[访问权限管理](https://docs.aws.amazon.com/IAM/latest/UserGuide/access.html)。

尽管 Amazon SQS 使用 IAM 策略，但它拥有自己的策略基础架构。您可以使用带有队列的 Amazon SQS 策略来指定哪些 AWS 账户有权访问队列。您可以指定访问类型和条件（例如，条件是如果请求早于 2010 年 12 月 31 日，即授予使用 `SendMessage` 和 `ReceiveMessage` 的权限）。您可以为其授予权限的特定操作是整个 Amazon SQS 操作列表的子集。如果编写 Amazon SQS 策略并指定 `*` 以“允许所有 Amazon SQS 操作”，则意味着用户可以在此子集中执行所有操作。

下图说明了这些基本 Amazon SQS 策略中涵盖操作子集的一个策略的概念。该策略适用于`queue_xyz`，并授予 AWS 账户 1 和 AWS 账户 2 在指定队列中使用任何允许的操作的权限。

**注意**  
策略中的资源指定为`123456789012/queue_xyz`，其中`123456789012`是拥有队列的账户的账户 ID。 AWS 

![\[一项涵盖操作子集的 Amazon SQS 策略\]](http://docs.aws.amazon.com/zh_cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/images/SQS_BasicPolicy.png)


随着 IAM 的引入以及*用户*和 A *mazon 资源名称 (ARNs)* 的概念，SQS 策略发生了一些变化。以下示意图和表格描述了这些变化。

![\[IAM 和 Amazon 资源名称已添加到 Amazon SQS 策略中。\]](http://docs.aws.amazon.com/zh_cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/images/SQS_PolicyWithNewFeatures.png)


![\[Number one in the diagram.\]](http://docs.aws.amazon.com/zh_cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/images/number-1-red.png)有关向不同账户中的用户授予权限的信息，请参阅 IAM *用户指南*中的[教程：使用 IAM 角色委派跨 AWS 账户访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html)权限。

![\[Number two in the diagram.\]](http://docs.aws.amazon.com/zh_cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/images/number-2-red.png) `*` 中包含的操作子集已扩展。有关允许的操作的列表，请参阅[Amazon SQS API 权限：操作和资源参考](sqs-api-permissions-reference.md)。

![\[Number three in the diagram.\]](http://docs.aws.amazon.com/zh_cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/images/number-3-red.png) 您可以使用 Amazon 资源名称 (ARN) 指定资源，这是在 IAM 策略中指定资源的标准方法。有关 Amazon SQS 队列的 ARN 格式的信息，请参阅 [Amazon Simple Queue Service 资源和操作](#sqs-resource-and-operations)。

例如，根据上图中的 Amazon SQS 政策，任何拥有 AWS 账户 1 或 AWS 账户 2 安全证书的人都可以访问。`queue_xyz`此外，您自己的 AWS 账户（ID 为 `123456789012`）中的用户 Bob 和 Susan 也可以访问该队列。

在推出 IAM 之前，Amazon SQS 会自动向某个队列的创建者授予对该队列的完全控制权限（即访问该队列中所有可能的 Amazon SQS 操作）。现在，除非创建者使用 AWS 安全凭证，否则上述情况将不再出现。如果任何有权创建队列的用户希望对所创建的队列执行任何操作，还必须拥有使用其他 Amazon SQS 操作的权限。

下面是一个示例策略，该策略允许用户使用所有 Amazon SQS 操作，但只能对其名称的前缀为文字字符串 `bob_queue_` 的队列使用。

------
#### [ JSON ]

****  

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

------

有关更多信息，请参阅《IAM 用户指南》**中的[将策略用于 Amazon SQS](sqs-using-identity-based-policies.md)以及[身份（用户、组和角色）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html)。

## 指定策略元素：操作、效果、资源和主体
<a name="sqs-specifying-policy-elements"></a>

对于每种 [Amazon Simple Queue Service 资源](#sqs-resource-and-operations)，该服务都定义一组[操作](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_Operations.html)。为授予这些操作的权限，Amazon SQS 定义一组可以在策略中指定的操作。

**注意**  
执行一个 操作可能需要多个操作的权限。在授予特定操作的权限时，您也可以标识允许或拒绝对其执行操作的资源。

以下是最基本的策略元素：
+ **Resource**（资源）- 在策略中，您可以使用 Amazon 资源名称 (ARN) 标识策略应用到的资源。
+ **操作** - 您可以使用操作关键字标识要允许或拒绝的资源操作。例如，`sqs:CreateQueue` 权限允许用户执行 Amazon Simple Queue Service `CreateQueue` 操作。
+ **效果**：您可以指定当用户请求特定操作（可以是允许或拒绝）时的效果。如果您没有显式授予对资源的访问权限，则隐式拒绝访问。您也可明确拒绝对资源的访问，这样可确保用户无法访问该资源，即使有其他策略授予了访问权限的情况下也是如此。
+ **主体** – 在基于身份的策略（IAM 策略）中，附加了策略的用户是隐式主体。对于基于资源的策略，您可以指定要接收权限的用户、账户、服务或其他实体（仅适用于基于资源的策略）。

要详细了解 Amazon SQS 策略语法和描述，请参阅《IAM 用户指南》**中的 [AWS IAM 策略参考](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html)。

有关所有 Amazon Simple Queue Service 操作及其适用资源的表格，请参阅 [Amazon SQS API 权限：操作和资源参考](sqs-api-permissions-reference.md)。