

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

# 自定义 Amazon SQS 访问策略语言示例
<a name="sqs-creating-custom-policies-access-policy-examples"></a>

以下示例是典型的 Amazon SQS 访问策略。

## 示例 1：为一个账户授予权限
<a name="one-account"></a>

以下示例 Amazon SQS 策略为 AWS 账户 111122223333 授予权限，允许从 AWS 账户 444455556666 拥有的 `queue2` 中发送和接收请求。

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

****  

```
{   
   "Version":"2012-10-17",		 	 	 
   "Id": "UseCase1",
   "Statement" : [{
      "Sid": "1", 
      "Effect": "Allow",           
      "Principal": {
         "AWS": [
            "111122223333"
         ]
      },
      "Action": [
         "sqs:SendMessage",
         "sqs:ReceiveMessage"
      ], 
      "Resource": "arn:aws:sqs:us-east-2:444455556666:queue2"  
   }]
}
```

------

## 示例 2：对一个或多个账户授予权限
<a name="two-accounts"></a>

以下示例 Amazon SQS 策略允许在特定时间段内对您的账户拥有的队列进行一个或多个 AWS 账户 访问权限。有必要编写此策略并使用 [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SetQueueAttributes.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SetQueueAttributes.html) 操作将其上传到 Amazon SQS，因为 [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_AddPermission.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_AddPermission.html) 操作不允许在授予队列访问权限时指定时间限制。

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

****  

```
{   
   "Version":"2012-10-17",		 	 	 
   "Id": "UseCase2",
   "Statement" : [{
      "Sid": "1", 
      "Effect": "Allow",           
      "Principal": {
         "AWS": [
            "111122223333",
            "444455556666"
         ]
      },
      "Action": [
         "sqs:SendMessage",
         "sqs:ReceiveMessage"
      ], 
      "Resource": "arn:aws:sqs:us-east-2:444455556666:queue2",
      "Condition": {
         "DateLessThan": {
            "AWS:CurrentTime": "2009-06-30T12:00Z"
         }
      }   
   }]
}
```

------

## 示例 3：对来自 Amazon EC2 实例的请求授予权限
<a name="requests-from-ec2"></a>

以下示例 Amazon SQS 策略对来自 Amazon EC2 实例的请求授予访问权限。此示例根据“[示例 2：对一个或多个账户授予权限](#two-accounts)”示例编写：它将访问时间限制在 2009 年 6 月 30 日中午 12 点 (UTC) 之前，将访问 IP 的范围限制在 `203.0.113.0/24`。有必要编写此策略并使用 [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SetQueueAttributes.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SetQueueAttributes.html) 操作将其上传到 Amazon SQS，因为 [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_AddPermission.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_AddPermission.html) 操作不允许在授予队列访问权限时指定 IP 地址限制。

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

****  

```
{   
   "Version":"2012-10-17",		 	 	 
   "Id": "UseCase3",
   "Statement" : [{
      "Sid": "1", 
      "Effect": "Allow",           
      "Principal": {
         "AWS": [
            "111122223333"
         ]
      },
      "Action": [
         "sqs:SendMessage",
         "sqs:ReceiveMessage"
      ], 
      "Resource": "arn:aws:sqs:us-east-2:444455556666:queue2",
      "Condition": {
         "DateLessThan": {
            "AWS:CurrentTime": "2009-06-30T12:00Z"
         },
         "IpAddress": {
            "AWS:SourceIp": "203.0.113.0/24"
         }
      }   
   }]
}
```

------

## 示例 4：拒绝特定账户的访问
<a name="deny-account"></a>

以下示例 Amazon SQS 策略拒绝对您的队列的特定 AWS 账户 访问权限。此示例以 “[示例 1：为一个账户授予权限](#one-account)” 示例为基础：它拒绝访问指定的 AWS 账户。有必要编写此策略并使用 [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SetQueueAttributes.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SetQueueAttributes.html) 操作将其上传到 Amazon SQS，因为 [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_AddPermission.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_AddPermission.html) 操作不允许拒绝对队列的访问权限（它只允许授予对队列的访问权限）。

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

****  

```
{ 
   "Version":"2012-10-17",		 	 	 
   "Id": "UseCase4",
   "Statement" : [{
      "Sid": "1", 
      "Effect": "Deny",           
      "Principal": {
         "AWS": [
            "111122223333"
         ]
      },
      "Action": [
         "sqs:SendMessage",
         "sqs:ReceiveMessage"
      ], 
      "Resource": "arn:aws:sqs:us-east-2:444455556666:queue2"   
   }]
}
```

------

## 示例 5：如果不是来自 VPC 端点，则拒绝访问
<a name="deny-not-from-vpc"></a>

以下示例 Amazon SQS 策略限制对 `queue1` 的访问权限：111122223333 只能通过 VPC 端点 ID `vpce-1a2b3c4d`（使用 `aws:sourceVpce` 条件指定）执行 [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) 操作。有关更多信息，请参阅 [Amazon SQS 的 Amazon Virtual Private Cloud 端点](sqs-internetwork-traffic-privacy.md#sqs-vpc-endpoints)。

**注意**  
`aws:sourceVpce` 条件不需要 VPC 端点资源的 ARN，而只需要 VPC 端点 ID。
您可以通过在第二个语句中拒绝所有 Amazon SQS 操作 (`sqs:*`)，修改以下示例，以将所有操作限制到特定 VPC 端点。但是，此类策略声明将规定所有操作（包括修改队列权限所需的管理操作）必须通过在策略中定义的特定 VPC 端点进行，这可能会阻止用户以后修改队列权限。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Id": "UseCase5",
   "Statement": [{
      "Sid": "1",
      "Effect": "Allow",
      "Principal": {
         "AWS": [
            "111122223333"
         ]
      },
      "Action": [
         "sqs:SendMessage",
         "sqs:ReceiveMessage"
      ],
         "Resource": "arn:aws:sqs:us-east-2:111122223333:queue1"
      },
      {
         "Sid": "2",
         "Effect": "Deny",
         "Principal": "*",
         "Action": [
            "sqs:SendMessage",
            "sqs:ReceiveMessage"
         ],
         "Resource": "arn:aws:sqs:us-east-2:111122223333:queue1",
         "Condition": {
            "StringNotEquals": {
               "aws:sourceVpce": "vpce-1a2b3c4d"
            }
         }
      }
   ]
}
```

------

# 将临时安全凭证用于 Amazon SQS
<a name="sqs-using-temporary-security-credentials"></a>

除了使用自己的安全证书创建用户外，IAM 还允许您向任何用户授予临时安全证书，从而允许该用户访问您的 AWS 服务和资源。您可以管理拥有 AWS 账户的用户。您还可以管理系统中没有的用户 AWS 账户 （联合用户）。此外，您为访问 AWS 资源而创建的应用程序也可以被视为 “用户”。

您可以使用上述临时安全凭证对 Amazon SQS 发出请求。API 库会使用这些凭证计算必要的签名值，以便对您的请求进行身份验证。如果您使用过期的凭证发送请求，则 Amazon S3 会拒绝请求。

**注意**  
您不能基于临时凭证设置策略。

## 先决条件
<a name="temporary-security-credentials-prerequisites"></a>

1. 使用 IAM 创建临时安全凭证：
   + 安全令牌
   + 访问密钥 ID
   + 秘密访问密钥

1. 使用临时访问密钥 ID 和安全令牌准备待签字符串。

1. 使用临时秘密访问密钥（而不是您自己的秘密访问密钥）对您的查询 API 请求签名。

**注意**  
在提交已签名的查询 API 请求时，请使用临时访问密钥 ID（而不是您自己的访问密钥 ID），并且包含安全令牌。有关 IAM 对临时安全证书的支持的更多信息，请参阅 I *AM 用户指南*中的[授予对 AWS 资源的临时访问权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/TokenBasedAuth.html)。

## 使用临时安全凭证调用 Amazon SQS 查询 API 操作
<a name="temporary-security-credentials-query-api"></a>

1. 使用申请临时安全令牌 AWS Identity and Access Management。有关更多信息，请参阅《IAM 用户指南》**中的[创建临时安全凭证以便为 IAM 用户启用访问权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/CreatingSessionTokens.html)。

   IAM 会返回一个安全令牌、一个访问密钥 ID 和一个秘密访问密钥。

1. 使用临时访问密钥 ID（而不是您自己的访问密钥 ID）准备查询，并且包含安全令牌。使用临时秘密访问密钥（而不是您自己的秘密访问密钥）对请求签名。

1. 提交已使用临时访问密钥 ID 和安全令牌签名的查询字符串。

   以下示例说明如何使用临时安全凭证对 Amazon SQS 请求进行身份验证。*`AUTHPARAMS`* 的结构取决于 API 请求的签名。有关更多信息，请参阅[《*亚马逊 Web Services 一般参考*》中的 “签署 AWS API 请求](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html)”。

   ```
   https://sqs.us-east-2.amazonaws.com/
   ?Action=CreateQueue
   &DefaultVisibilityTimeout=40
   &QueueName=MyQueue
   &Attribute.1.Name=VisibilityTimeout
   &Attribute.1.Value=40
   &Expires=2020-12-18T22%3A52%3A43PST
   &SecurityToken=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
   &AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE
   &Version=2012-11-05
   &AUTHPARAMS
   ```

   以下示例使用了临时安全凭证来通过 `SendMessageBatch` 操作发送两条消息。

   ```
   https://sqs.us-east-2.amazonaws.com/
   ?Action=SendMessageBatch
   &SendMessageBatchRequestEntry.1.Id=test_msg_001
   &SendMessageBatchRequestEntry.1.MessageBody=test%20message%20body%201
   &SendMessageBatchRequestEntry.2.Id=test_msg_002
   &SendMessageBatchRequestEntry.2.MessageBody=test%20message%20body%202
   &SendMessageBatchRequestEntry.2.DelaySeconds=60
   &Expires=2020-12-18T22%3A52%3A43PST
   &SecurityToken=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
   &AWSAccessKeyId=AKIAI44QH8DHBEXAMPLE
   &Version=2012-11-05
   &AUTHPARAMS
   ```

# 使用最低权限策略管理加密 Amazon SQS 队列的访问权限
<a name="sqs-least-privilege-policy"></a>

您可以使用 Amazon SQS 通过与 [AWS Key Management Service (KMS)](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) 集成的服务器端加密 (SSE) 在应用程序之间交换敏感数据。通过集成 Amazon SQS 和 AWS KMS，您可以集中管理保护 Amazon SQS 的密钥以及保护您的其他资源的密钥。 AWS 

多个 AWS 服务可以充当向 Amazon SQS 发送事件的事件源。要使事件源能够访问加密的 Amazon SQS 队列，您需要使用[客户](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk) AWS KMS 管理的密钥配置队列。然后，使用密钥策略允许服务使用所需的 AWS KMS API 方法。该服务还需要对访问进行身份验证的权限才能使队列发送事件。您可以使用 Amazon SQS 策略来实现这一目标，该策略是一种基于资源的策略，可用于控制对 Amazon SQS 队列及其数据的访问。

以下各节提供有关如何通过亚马逊 SQS 策略和 AWS KMS 密钥策略控制对加密的 Amazon SQS 队列的访问权限的信息。本指南中的策略将帮助您实现[最低权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)。

本指南还介绍了基于资源的策略如何使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn)、[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 和 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principalorgid](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principalorgid) 全局 IAM 条件上下文键来解决[混淆代理问题](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)。

**Topics**
+ [概述](#sqs-least-privilege-overview)
+ [最低权限 Amazon SQS 密钥政策](#sqs-least-privilege-use-case)
+ [死信队列的 Amazon SQS 策略语句](#sqs-policy-dlq)
+ [防范跨服务混淆代理问题](#sqs-confused-deputy-prevention)
+ [使用 IAM Access Analyzer 查看跨账户访问权限](#sqs-cross-account-findings)

## 概述
<a name="sqs-least-privilege-overview"></a>

在本主题中，我们将为您介绍一个常见使用案例，以说明如何构建密钥政策和 Amazon SQS 队列策略。此使用案例如下图所示。

![\[将 Amazon SNS 消息发布到 Amazon SQS。\]](http://docs.aws.amazon.com/zh_cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/images/sqs-least-privilege.png)


在此示例中，消息创建者是 [Amazon Simple Notification Service (SNS)](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) 主题，该主题配置为将消息扇出到您的加密 Amazon SQS 队列。消息使用者是一项计算服务，例如 [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 函数、[Amazon Elastic Compute Cloud（EC2）](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts.html)实例或 [AWS Fargate](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/AWS_Fargate.html) 容器。然后，将您的 Amazon SQS 队列配置为将失败的消息发送到[死信队列 (DLQ)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html)。这对于调试应用程序或消息传递系统非常有用 DLQs ，因为您可以隔离未使用的消息，以确定其处理失败的原因。在本主题中定义的解决方案中，使用 Lambda 函数等计算服务来处理存储在 Amazon SQS 队列中的消息。如果消息使用者位于虚拟私有云（VPC）中，则本指南中包含的 [`DenyReceivingIfNotThroughVPCE`](#sqs-restrict-message-to-endpoint) 策略语句允许您将消息接收限制在该特定 VPC 上。

**注意**  
本指南仅以策略语句的形式包含所需的 IAM 权限。要制定政策，您需要将声明添加到您的 Amazon SQS 政策或 AWS KMS 密钥策略中。本指南不提供有关如何创建 Amazon SQS 队列或密钥的 AWS KMS 说明。有关如何创建这些资源的说明，请参阅[创建 Amazon SQS 队列](creating-sqs-standard-queues.md#step-create-standard-queue)和[创建密钥](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)。  
本指南中定义的 Amazon SQS 策略不支持将消息直接重新发送到相同或不同的 Amazon SQS 队列。

## 最低权限 Amazon SQS 密钥政策
<a name="sqs-least-privilege-use-case"></a>

在本节中，我们将介绍 AWS KMS 用于加密 Amazon SQS 队列的客户管理密钥所需的最低权限权限。使用这些权限，您可以将访问权限限制为仅限目标实体，同时实施最低权限。密钥政策必须包含以下策略语句，我们将通过以下资源详细描述这些语句：
+ [向 AWS KMS 密钥授予管理员权限](#sqs-use-case-kms-admin-permissions)
+ [授予对密钥元数据的只读访问权限](#sqs-use-case-read-only-permissions)
+ [授予 Amazon SNS KMS 对 Amazon SNS 向队列发布消息的权限](#sqs-use-case-publish-messages-permissions)
+ [允许使用者解密来自队列的消息](#sqs-use-case-decrypt-messages-permissions)

### 向 AWS KMS 密钥授予管理员权限
<a name="sqs-use-case-kms-admin-permissions"></a>

要创建 AWS KMS 密钥，您需要为用于部署密 AWS KMS 钥的 IAM 角色提供 AWS KMS 管理员权限。这些管理员权限在以下 `AllowKeyAdminPermissions` 策略语句中进行了定义。在 AWS KMS 密钥策略中添加此声明时，请务必使用用于部署密钥、管理密 AWS KMS 钥或两者兼而有之的 IAM 角色的 Amazon 资源名称 (ARN) 替换*<admin-role ARN>*。 AWS KMS 这可以是您部署管道的 IAM 角色，也可以是 [AWS Organizations](https://aws.amazon.com/organizations/) 中[您组织的管理员角色](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_accounts_access.html)。

```
{
  "Sid": "AllowKeyAdminPermissions",
  "Effect": "Allow",
  "Principal": {
    "AWS": [
      "<admin-role ARN>"
    ]
  },
  "Action": [
    "kms:Create*",
    "kms:Describe*",
    "kms:Enable*",
    "kms:List*",
    "kms:Put*",
    "kms:Update*",
    "kms:Revoke*",
    "kms:Disable*",
    "kms:Get*",
    "kms:Delete*",
    "kms:TagResource",
    "kms:UntagResource",
    "kms:ScheduleKeyDeletion",
    "kms:CancelKeyDeletion"
  ],
  "Resource": "*"
}
```

**注意**  
在 AWS KMS 密钥策略中，`Resource`元素的值必须是`*`，这意味着 “这个 AWS KMS 密钥”。星号 (`*`) 标识 AWS KMS 密钥策略所关联的密钥。

### 授予对密钥元数据的只读访问权限
<a name="sqs-use-case-read-only-permissions"></a>

要向其他 IAM 角色授予对您密钥元数据的只读访问权限，请将 `AllowReadAccessToKeyMetaData` 语句添加到您的密钥政策中。例如，以下语句允许您列出账户中的所有 AWS KMS 密钥以供审计。此语句授予 AWS 根用户对密钥元数据的只读访问权限。因此，账户中的任何 IAM 主体只要其基于身份的策略具有以下语句中列出的权限，就可以访问密钥元数据：`kms:Describe*`、`kms:Get*` 和 `kms:List*`。请务必*<account-ID>*用您自己的信息替换。

```
{
  "Sid": "AllowReadAcesssToKeyMetaData",
  "Effect": "Allow",
  "Principal": {
    "AWS": [
      "arn:aws:iam::<accountID>:root"
    ]
  },
  "Action": [
    "kms:Describe*",
    "kms:Get*",
    "kms:List*"
  ],
  "Resource": "*"
}
```

### 授予 Amazon SNS KMS 对 Amazon SNS 向队列发布消息的权限
<a name="sqs-use-case-publish-messages-permissions"></a>

要允许您的 Amazon SNS 主题向加密的 Amazon SQS 队列发布消息，请将 `AllowSNSToSendToSQS` 策略语句添加到您的密钥政策中。此声明授予亚马逊 SNS 使用该 AWS KMS 密钥发布到您的亚马逊 SQS 队列的权限。请务必*<account-ID>*用您自己的信息替换。

**注意**  
声明`Condition`中的限制只能在同一 AWS 账户中使用 Amazon SNS 服务。

```
{
  "Sid": "AllowSNSToSendToSQS",
  "Effect": "Allow",
  "Principal": {
    "Service": [
      "sns.amazonaws.com"
    ]
  },
  "Action": [
    "kms:Decrypt",
    "kms:GenerateDataKey"
  ],
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "aws:SourceAccount": "<account-id>"
    }
  }
}
```

### 允许使用者解密来自队列的消息
<a name="sqs-use-case-decrypt-messages-permissions"></a>

以下 `AllowConsumersToReceiveFromTheQueue` 语句向 Amazon SQS 消息使用者授予解密从加密 Amazon SQS 队列收到的消息所需的权限。附加策略声明时，请替换为消息*<consumer's runtime role ARN>*使用者的 IAM 运行时角色 ARN。

```
{
  "Sid": "AllowConsumersToReceiveFromTheQueue",
  "Effect": "Allow",
  "Principal": {
    "AWS": [
      "<consumer's execution role ARN>"
    ]
  },
  "Action": [
    "kms:Decrypt"
  ],
  "Resource": "*"
}
```

### 最低权限 Amazon SQS 策略
<a name="sqs-use-case-specific-policy"></a>

本节将引导您了解本指南所涵盖的使用案例的最低权限 Amazon SQS 队列策略（例如，从 Amazon SNS 到 Amazon SQS）。定义的策略旨在通过混合使用 `Deny` 和 `Allow` 语句来防止意外访问。`Allow` 语句会向目标实体或实体授予访问权限。`Deny` 语句可防止其他意外实体访问 Amazon SQS 队列，同时将目标实体排除在策略条件之外。

Amazon SQS 策略包括以下语句，我们在下面对其进行了详细描述：
+ [限制 Amazon SQS 管理权限](#sqs-use-case-restrict-permissions)
+ [限制指定组织的 Amazon SQS 队列操作](#sqs-use-case-restrict-permissions-from-org)
+ [向使用者授予 Amazon SQS 权限](#sqs-use-grant-consumer-permissions)
+ [实施传输中加密](#sqs-encryption-in-transit)
+ [将消息传输限制为特定的 Amazon SNS 主题](#sqs-restrict-transmission-to-topic)
+ [（可选）将消息接收限制为特定 VPC 端点](#sqs-restrict-message-to-endpoint)

### 限制 Amazon SQS 管理权限
<a name="sqs-use-case-restrict-permissions"></a>

以下 `RestrictAdminQueueActions` 策略语句将 Amazon SQS 管理权限限制为仅限于您用于部署队列、管理队列或两者兼而有之的 IAM 角色。确保将 *<placeholder values>* 替换为您自己的信息。指定用于部署 Amazon SQS 队列的 IAM 角色的 ARN，以及ARNs 应具有 Amazon SQS 管理权限的任何管理员角色的 ARN。

```
{
  "Sid": "RestrictAdminQueueActions",
  "Effect": "Deny",
  "Principal": {
    "AWS": "*"
  },
  "Action": [
    "sqs:AddPermission",
    "sqs:DeleteQueue",
    "sqs:RemovePermission",
    "sqs:SetQueueAttributes"
  ],
  "Resource": "<SQS Queue ARN>",
  "Condition": {
    "StringNotLike": {
      "aws:PrincipalARN": [
        "arn:aws:iam::<account-id>:role/<deployment-role-name>",
        "<admin-role ARN>"
      ]
    }
  }
}
```

### 限制指定组织的 Amazon SQS 队列操作
<a name="sqs-use-case-restrict-permissions-from-org"></a>

要帮助保护您的 Amazon SQS 资源不被外部访问（由 [AWS 组织](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html)外部实体访问），请使用以下语句。此语句会限制您在 `Condition` 中指定的组织访问 Amazon SQS 队列。请务必*<SQS queue ARN>*替换为用于部署 Amazon SQS 队列的 IAM 角色的 ARN；并使用您的组织 *<org-id>* ID 替换。

```
{
  "Sid": "DenyQueueActionsOutsideOrg",
  "Effect": "Deny",
  "Principal": {
    "AWS": "*"
  },
  "Action": [
    "sqs:AddPermission",
    "sqs:ChangeMessageVisibility",
    "sqs:DeleteQueue",
    "sqs:RemovePermission",
    "sqs:SetQueueAttributes",
    "sqs:ReceiveMessage"
  ],
  "Resource": "<SQS queue ARN>",
  "Condition": {
    "StringNotEquals": {
      "aws:PrincipalOrgID": [
        "<org-id>"
      ]
    }
  }
}
```

### 向使用者授予 Amazon SQS 权限
<a name="sqs-use-grant-consumer-permissions"></a>

要接收来自 Amazon SQS 队列的消息，您需要向消息使用者提供必要的权限。以下策略语句会向您指定的使用者授予使用来自 Amazon SQS 队列的消息所需的权限。将该声明添加到您的 Amazon SQS 策略时，请务必*<consumer's IAM runtime role ARN>*替换为使用者使用的 IAM 运行时角色的 ARN；以及*<SQS queue ARN>*替换为用于部署 Amazon SQS 队列的 IAM 角色的 ARN。

```
{
  "Sid": "AllowConsumersToReceiveFromTheQueue",
  "Effect": "Allow",
  "Principal": {
    "AWS": "<consumer's IAM execution role ARN>"
  },
  "Action": [
    "sqs:ChangeMessageVisibility",
    "sqs:DeleteMessage",
    "sqs:GetQueueAttributes",
    "sqs:ReceiveMessage"
  ],
  "Resource": "<SQS queue ARN>"
}
```

要防止其他实体接收来自 Amazon SQS 队列的消息，请将 `DenyOtherConsumersFromReceiving` 语句添加到 Amazon SQS 队列策略中。此语句会限制消息仅供您指定的使用者使用，不允许其他使用者访问，即使他们的身份权限会授予他们访问权限，也是如此。请务必*<consumer’s runtime role ARN>*用您自己的信息替换*<SQS queue ARN>*和。

```
{
  "Sid": "DenyOtherConsumersFromReceiving",
  "Effect": "Deny",
  "Principal": {
    "AWS": "*"
  },
  "Action": [
    "sqs:ChangeMessageVisibility",
    "sqs:DeleteMessage",
    "sqs:ReceiveMessage"
  ],
  "Resource": "<SQS queue ARN>",
  "Condition": {
    "StringNotLike": {
      "aws:PrincipalARN": "<consumer's execution role ARN>"
    }
  }
}
```

### 实施传输中加密
<a name="sqs-encryption-in-transit"></a>

以下 `DenyUnsecureTransport` 策略语句强制使用者和创建者使用安全通道（TLS 连接）发送和接收来自 Amazon SQS 队列的消息。请务必*<SQS queue ARN>*替换为用于部署 Amazon SQS 队列的 IAM 角色的 ARN。

```
{
  "Sid": "DenyUnsecureTransport",
  "Effect": "Deny",
  "Principal": {
    "AWS": "*"
  },
  "Action": [
    "sqs:ReceiveMessage",
    "sqs:SendMessage"
  ],
  "Resource": "<SQS queue ARN>",
  "Condition": {
    "Bool": {
      "aws:SecureTransport": "false"
    }
  }
}
```

### 将消息传输限制为特定的 Amazon SNS 主题
<a name="sqs-restrict-transmission-to-topic"></a>

以下 `AllowSNSToSendToTheQueue` 策略语句允许指定的 Amazon SNS 主题向 Amazon SQS 队列发送消息。请务必*<SQS queue ARN>*替换为用于部署亚马逊 SQS 队列的 IAM 角色的 ARN；*<SNS topic ARN>*并替换为亚马逊 SNS 主题 ARN。

```
{
  "Sid": "AllowSNSToSendToTheQueue",
  "Effect": "Allow",
  "Principal": {
    "Service": "sns.amazonaws.com"
  },
  "Action": "sqs:SendMessage",
  "Resource": "<SQS queue ARN>",
  "Condition": {
    "ArnLike": {
      "aws:SourceArn": "<SNS topic ARN>"
    }
  }
}
```

以下 `DenyAllProducersExceptSNSFromSending` 策略语句禁止其他创建者向队列发送消息。将 *<SQS queue ARN>* 和 *<SNS topic ARN>* 替换为您自己的信息。

```
{
  "Sid": "DenyAllProducersExceptSNSFromSending",
  "Effect": "Deny",
  "Principal": {
    "AWS": "*"
  },
  "Action": "sqs:SendMessage",
  "Resource": "<SQS queue ARN>",
  "Condition": {
    "ArnNotLike": {
      "aws:SourceArn": "<SNS topic ARN>"
    }
  }
}
```

### （可选）将消息接收限制为特定 VPC 端点
<a name="sqs-restrict-message-to-endpoint"></a>

要限制仅向特定的 [VPC 端点](https://aws.amazon.com/about-aws/whats-new/2018/12/amazon-sqs-vpc-endpoints-aws-privatelink/)发送消息，请在您的 Amazon SQS 队列策略中添加以下策略语句。除非消息来自所需的 VPC 端点，否则此语句可防止消息使用者接收来自队列的消息。*<SQS queue ARN>*替换为用于部署 Amazon SQS 队列的 IAM 角色的 ARN *<vpce\$1id>* 和 VPC 终端节点的 ID。

```
{
  "Sid": "DenyReceivingIfNotThroughVPCE",
  "Effect": "Deny",
  "Principal": "*",
  "Action": [
    "sqs:ReceiveMessage"
  ],
  "Resource": "<SQS queue ARN>",
  "Condition": {
    "StringNotEquals": {
      "aws:sourceVpce": "<vpce id>"
    }
  }
}
```

## 死信队列的 Amazon SQS 策略语句
<a name="sqs-policy-dlq"></a>

将以下策略语句（由其语句 ID 标识）添加到您的 DLQ 访问策略中：
+ `RestrictAdminQueueActions`
+ `DenyQueueActionsOutsideOrg`
+ `AllowConsumersToReceiveFromTheQueue`
+ `DenyOtherConsumersFromReceiving`
+ `DenyUnsecureTransport`

除了将上述策略语句添加到 DLQ 访问策略外，您还应添加一条语句，以限制向 Amazon SQS 队列传输消息，如下一节所述。

### 限制向 Amazon SQS 队列传输消息
<a name="sqs-dlq-restrict-permissions"></a>

要限制同一账户只能访问 Amazon SQS 队列，请在 DLQ 队列策略中添加以下 `DenyAnyProducersExceptSQS` 策略语句。此语句不会将消息传输限制到特定队列，因为您需要在创建主队列之前部署 DLQ，因此在创建 DLQ 时不会知道 Amazon SQS ARN。如果您需要将访问权限限制为仅一个 Amazon SQS 队列，请在知道时使用您的 Amazon SQS 源队列的 ARN 修改 `Condition` 中的 `aws:SourceArn`。

```
{
  "Sid": "DenyAnyProducersExceptSQS",
  "Effect": "Deny",
  "Principal": {
    "AWS": "*"
  },
  "Action": "sqs:SendMessage",
  "Resource": "<SQS DLQ ARN>",
  "Condition": {
    "ArnNotLike": {
      "aws:SourceArn": "arn:aws:sqs:<region>:<account-id>:*"
    }
  }
}
```

**重要**  
本指南中定义的 Amazon SQS 队列策略不会将 `sqs:PurgeQueue` 操作限制在某个 IAM 角色或多个角色。`sqs:PurgeQueue` 操作允许您删除 Amazon SQS 队列中的所有消息。您也可以使用此操作更改消息格式，而无需替换 Amazon SQS 队列。调试应用程序时，您可以清除 Amazon SQS 队列以删除可能错误的消息。测试应用程序时，您可以通过 Amazon SQS 队列发送大量消息，然后在进入生产环境之前清除队列以重新开始。之所以不将此操作限制为某个角色，是因为在部署 Amazon SQS 队列时可能不知道此角色。您需要将此权限添加到角色基于身份的策略中，才能清除队列。

## 防范跨服务混淆代理问题
<a name="sqs-confused-deputy-prevention"></a>

[混淆代理问题](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)是一个安全问题，即没有执行操作权限的实体可能会迫使更具权限的实体执行该操作。为了防止这种情况， AWS 如果您向第三方（称为跨账户）或其他 AWS 服务（称为跨服务）提供对您账户中资源的访问权限，则提供可帮助您保护账户的工具。本节中的策略语句可以帮助您防范跨服务混淆代理问题。

一个服务（呼叫服务）调用另一项服务（所谓的服务)时，可能会发生跨服务模拟。可以操纵调用服务以使用其权限对另一个客户的资源进行操作，否则该服务不应有访问权限。为了帮助防范此问题，本文中定义的基于资源的策略使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn)、[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 和 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principalorgid](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principalorgid) 全局 IAM 条件上下文键。这限制了服务对Organizations中特定资源、特定账户或特定 AWS 组织的权限。

## 使用 IAM Access Analyzer 查看跨账户访问权限
<a name="sqs-cross-account-findings"></a>

您可以使用 [AWS IAM Access Analy](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html) zer 查看您的 Amazon SQS 队列策略和 AWS KMS 密钥策略，并在亚马逊 SQS 队列或密钥授予外部 AWS KMS 实体访问权限时提醒您。IAM Access Analyzer 帮助标识您组织中的[资源](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-resources.html)和与信任区域之外的实体共享的账户。此信任区域可以是您在启用 IAM Access Analyzer 时指定的 AWS 账户或组织。 AWS 

IAM Access Analyzer 使用基于逻辑的推理来分析环境中基于资源的策略，从而识别与外部委托人共享的资源。 AWS 对于在您的信任区域外共享的资源的每个实例，Access Analyzer 都会生成一个调查结果。[调查结果](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-findings.html)包括有关访问权限以及该访问权限授予到的外部主体的信息。您可以查看调查结果，以确定该访问权限是按计划授予且安全，还是计划外的访问权限并存在安全风险。对于任何意外访问，请查看受影响的策略并进行修复。有关 AWS IAM Access Analyzer 如何识别对您的 AWS 资源的意外访问的更多信息，请参阅此[博客文章](https://aws.amazon.com/blogs/aws/identify-unintended-resource-access-with-aws-identity-and-access-management-iam-access-analyzer/)。

有关 AWS IAM 访问分析器的更多信息，请参阅 [AWS IAM 访问分析器文档](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html)。

# Amazon SQS API 权限：操作和资源参考
<a name="sqs-api-permissions-reference"></a>

在设置 [访问控制](security_iam_service-with-iam.md#access-control) 和编写您可附加到 IAM 身份的权限策略时，可以使用下表作为参考。表格列表每个 Amazon Simple Queue Service 操作、您可以为其授予执行该操作的权限的相应操作，以及您可以为其授予权限的 AWS 资源。

在策略的 `Action` 字段中指定操作，并在策略的 `Resource` 字段中指定资源值。要指定操作，请在 操作名称之前使用 `sqs:` 前缀（例如，`sqs:CreateQueue`）。

目前，Amazon SQS 支持 [IAM 中提供的全局条件上下文键](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)。

使用滚动条查看表的其余部分。


**Amazon Simple Queue Service API 和操作所需的权限**  
<a name="sqs-api-and-required-permissions-for-actions-table"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-api-permissions-reference.html)