

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 自訂 Amazon SQS 存取政策語言範例
自訂存取政策語言範例

以下是典型 Amazon SQS 存取政策的範例。

## 範例 1：提供許可給一個帳戶


以下範例 Amazon SQS 政策提供允許對 AWS 帳戶 444455556666 擁有的 `queue2` 傳送及接收的 AWS 帳戶 111122223333 許可權。

------
#### [ 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：提供許可給一或多個帳戶


下列範例 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 執行個體的請求


以下範例 Amazon SQS 政策提供許可給來自 Amazon SQS 執行個體的請求。此範例是根據「[範例 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：拒絕特定帳戶的存取權


下列範例 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 端點，則拒絕存取


下列範例 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
使用臨時安全憑證

除了使用自己的安全登入資料建立使用者之外，IAM 也可讓您將臨時安全登入資料授予任何使用者，讓使用者存取您的 AWS 服務和資源。您可以管理擁有 AWS 帳戶的使用者。您也可以為沒有 AWS 帳戶 （聯合身分使用者） 的系統管理使用者。此外，您為存取 AWS 資源而建立的應用程式也可以被視為「使用者」。

您可以使用這些臨時安全憑證，對 Amazon SQS 提出請求。API 程式庫會使用這些憑證來運算出必要的簽章值，以驗證您的請求。若使用過期的憑證傳送請求，Amazon SQS 會拒絕該請求。

**注意**  
您不能根據臨時憑證來設定政策。

## 先決條件


1. 使用 IAM 建立臨時安全憑證：
   + 安全權杖
   + 存取金鑰 ID
   + 私密存取金鑰

1. 準備您的登入字串搭配臨時存取金鑰 ID 和安全權杖。

1. 請使用臨時私密存取金鑰，而不是您自己的私密存取金鑰來簽署查詢 API 請求。

**注意**  
當您提交已簽署的查詢 API 請求，請使用臨時存取金鑰 ID 而不是自己的存取金鑰 ID，並包含安全權杖。如需暫時安全登入資料之 IAM 支援的詳細資訊，請參閱《*IAM 使用者指南*》中的[授予 AWS 資源的暫時存取權](https://docs.aws.amazon.com/IAM/latest/UserGuide/TokenBasedAuth.html)。

## 若要使用臨時安全憑證呼叫 Amazon SQS 查詢 API 動作


1. 使用 請求臨時安全字符 AWS Identity and Access Management。如需詳細資訊，請參閱《[IAM 使用者指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/CreatingSessionTokens.html)》中的*建立臨時安全登入資料以啟用 IAM 使用者的存取權*。

   IAM 會傳回安全權杖、存取金鑰 ID 和私密存取金鑰。

1. 請使用臨時存取金鑰 ID (而不是自己的存取金鑰 ID) 來準備查詢，並包含安全權杖。使用臨時私密存取金鑰 (而不是您自己的金鑰) 簽署您的請求。

1. 使用臨時存取金鑰 ID 和安全權杖來提交已簽署的查詢字串。

   以下範例示範如何使用臨時安全憑證，來驗證 Amazon SQS 請求。*`AUTHPARAMS`* 的結構取決於 API 請求的簽署。如需詳細資訊，請參閱《*Amazon 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 佇列的存取管理
具有最低權限政策的加密 Amazon SQS 佇列的存取管理

您可以使用 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 佇列及其資料的存取。

以下各節提供有關如何透過 Amazon 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)

## 概觀


在本主題中，我們會引導您完成一個常見使用案例，說明如何建立金鑰政策和 Amazon SQS 佇列政策。這個使用案例如下圖所示。

![\[將 Amazon SNS 訊息發佈到 Amazon SQS。\]](http://docs.aws.amazon.com/zh_tw/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)。這很適合用來為應用程式或傳訊系統偵錯，因為 DLQ 可讓您隔離未取用的訊息以判斷無法成功處理的原因。在本主題定義的解決方案中，使用運算服務 (例如 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 的最低權限金鑰政策
使用案例

在本節中，我們會針對您用來加密 Amazon SQS 佇列的客戶受管金鑰，說明 AWS KMS 中所需的最低權限許可。透過這些許可權，您可以在實作最低權限時限制只有預定實體的存取權。金鑰政策必須包含以下政策陳述式，詳述如下：
+ [授予 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 金鑰的管理員許可


若要建立 AWS KMS 金鑰，您需要提供 AWS KMS 管理員許可給用來部署 AWS KMS 金鑰的 IAM 角色。這些管理員權定義於下列 `AllowKeyAdminPermissions` 政策陳述式中。當您將此陳述式新增至 AWS KMS 金鑰政策時，請務必以用來部署 AWS KMS 金鑰、管理 AWS KMS 金鑰或兩者的 IAM 角色 Amazon Resource Name (ARN) 取代 *<admin-role ARN>*。這可以是部署管道的 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 附加金鑰政策的金鑰。

### 授予金鑰中繼資料的唯讀存取權


若要授予其他 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，以將訊息發佈到佇列


若要允許 Amazon SNS 主題將訊息發佈到加密的 Amazon SQS 佇列，請將 `AllowSNSToSendToSQS` 政策聲明新增至您的金鑰政策。此陳述式授予 Amazon SNS 使用 AWS KMS 金鑰發佈至 Amazon 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>"
    }
  }
}
```

### 允許取用者解密佇列中的訊息


下列 `AllowConsumersToReceiveFromTheQueue` 陳述式授予 Amazon SQS 訊息取用者將從加密之 Amazon SQS 佇列接收到的訊息解密的必要許可。附加政策陳述式時，請將 *<取用者的執行期角色 ARN>* 取代為訊息取用者的 IAM 執行期角色 ARN。

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

### 最低權限 Amazon SQS 政策


本節引導您針對本指南所涵蓋的使用案例 (例如 Amazon SNS 轉換至 Amazon SQS) 的最低權限 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 管理許可權


以下 `RestrictAdminQueueActions` 政策陳述式將 Amazon SQS 管理許可權限制為僅允許用於部署佇列、管理佇列或兩者的一或多個 IAM 角色。請務必使用您自己的資訊取代 *<預留位置值>*。指定用於部署 Amazon SQS 佇列的 IAM 角色的 ARN，以及任何應具有 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 佇列動作


若要協助保護 Amazon SQS 資源免於外部存取 (由您的 [AWS 組織](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html)外的實體存取)，請使用下列陳述式。此陳述式將 Amazon SQS 佇列存取權限制於您在 `Condition` 中指定的組織。請務必將 *<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 許可授予取用者


若要從 Amazon SQS 佇列接收訊息，您需要向訊息取用者提供必要的許可。下列政策陳述式授予您指定之取用者取用 Amazon SQS 佇列訊息的必要許可。將陳述式新增到 Amazon SQS 政策時，請務必將 *<取用者的 IAM 執行期角色 ARN>* 取代為取用者所使用之 IAM 執行期角色的 ARN；並將 *<SQS 佇列 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 佇列政策。此陳述式會將訊息消取用限制在您指定的取用者，即使其他取用者的身分權限會授予他們存取權，也不允許其他取用者擁有存取權。確實將 *<SQS 佇列 ARN>* 和 *<取用者的執行期角色 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>"
    }
  }
}
```

### 傳輸中強制加密


下列 `DenyUnsecureTransport` 政策陳述式強制取用者和生產者使用安全通道 (TLS 連線) 從 Amazon SQS 佇列傳送和接收訊息。請務必將 *<SQS 佇列 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 主題


以下 `AllowSNSToSendToTheQueue` 政策陳述式允許指定 Amazon SNS 主題將訊息傳送至 Amazon SQS 佇列。請務必將 *<SQS 佇列 ARN>* 取代為用於部署 Amazon SQS 佇列的 IAM 角色的 ARN；並將 *<SNS 主題 ARN>* 取代為 Amazon 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 佇列 ARN>* 和 *<SNS 主題 ARN>* 取代為您自己的資訊。

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

### (選用) 限制接收特定 VPC 端點的訊息


若要限制只接收特定 [VPC 端點](https://aws.amazon.com/about-aws/whats-new/2018/12/amazon-sqs-vpc-endpoints-aws-privatelink/)的訊息，請將以下政策陳述式新增至 Amazon SQS 佇列政策。除非訊息來自所需的 VPC 端點，否則此陳述式可防止訊息取用者從佇列接收訊息。將 *<SQS 佇列 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 政策陳述式
適用於無效字母佇列的 Amazon SQS 政策陳述式

將以下政策陳述式 (以其陳述式 ID 識別) 新增至您的 DLQ 存取政策：
+ `RestrictAdminQueueActions`
+ `DenyQueueActionsOutsideOrg`
+ `AllowConsumersToReceiveFromTheQueue`
+ `DenyOtherConsumersFromReceiving`
+ `DenyUnsecureTransport`

除了將上述政策陳述式新增至 DLQ 存取政策之外，您也應該新增陳述式以限制傳輸至 Amazon SQS 佇列的訊息，如下節所述。

### 限制 Amazon SQS 佇列的訊息傳輸


若要限制只存取來自相同帳戶的 Amazon SQS 佇列，請將以下 `DenyAnyProducersExceptSQS` 政策陳述式新增至 DLQ 佇列政策。此陳述式不會將訊息傳輸限制到特定佇列，因為您需要在建立主要佇列之前部署 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 佇列時可能不知道此角色。您必須將此許可權新增至角色的身分型政策，才能清除佇列。

## 防止跨服務混淆代理人問題


[混淆代理人問題](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 條件內容索引鍵。這會限制服務對 AWS Organizations 中特定資源、特定帳戶或特定組織的許可。

## 使用 IAM Access Analyzer 檢閱跨帳户存取權


您可以使用 [AWS IAM Access Analyzer](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html) 檢閱 Amazon SQS 佇列政策和 AWS KMS 金鑰政策，並在 Amazon SQS 佇列或 AWS KMS 金鑰授予外部實體存取權時提醒您。IAM Access Analyzer 可協助識別組織與帳戶中，與信任區域外實體共用的[資源](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-resources.html)。此信任區域可以是您在啟用 IAM Access Analyzer 時指定的 AWS Organizations 內的 AWS 帳戶或組織。

IAM Access Analyzer 會使用邏輯式推理來分析 AWS 環境中以資源為基礎的政策，藉此識別與外部主體共用的資源。針對信任區域外共用資源的每一個執行個體，Access Analyzer 都會產生一份調查結果。[調查結果](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-findings.html)包括存取權及其被授與存取的外部主體的資訊。請檢閱調查結果，判斷此為有意為之且安全的存取權，還是非預期且有安全風險的存取。對於任何非預定的存取，請檢閱受影響的政策並加以修正。如需 IAM Access Analyzer AWS 如何識別意外存取 AWS 資源的詳細資訊，請參閱此[部落格文章](https://aws.amazon.com/blogs/aws/identify-unintended-resource-access-with-aws-identity-and-access-management-iam-access-analyzer/)。

如需 AWS IAM Access Analyzer 的詳細資訊，請參閱 [AWS IAM Access Analyzer 文件](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html)。

# Amazon SQS API 許可：動作和資源參考
API 許可參考

當您設定 [存取控制](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_tw/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-api-permissions-reference.html)