

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

# Amazon SQS 的屬性型存取控制
<a name="sqs-abac"></a>

## ABAC 是什麼？
<a name="sqs-abac-whatis"></a>

屬性型存取控制 (ABAC) 是一種授權程序，可根據連接至使用者 AWS 和資源的標籤來定義許可。ABAC 根據屬性和值提供精細且靈活的存取控制，降低與重新設定角色型政策相關的安全風險，並集中進行稽核及存取政策管理。如需更多有關 ABAC 的詳細資訊，請參閱《*IAM 使用者指南*》中的[什麼是適用於 AWS的 ABAC](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)。

Amazon SQS 支援 ABAC 的方式是讓您根據與 Amazon SQS 佇列相關聯的標籤和別名來控制對 Amazon SQS 佇列的存取。在 Amazon SQS 中啟用 ABAC 的標籤和別名條件金鑰，授權給 IAM 主體使用 Amazon SQS 佇列，而無需編輯政策或管理授與。若要進一步了解 ABAC 條件金鑰，請參閱*《服務授權參考*》中的 [Amazon SQS 的條件金鑰](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonsqs.html#amazonsqs-policy-keys)。

若使用 ABAC，您可以使用標籤為 Amazon SQS 佇列設定 IAM 存取許可和政策，以協助您擴展許可權限管理範圍。您可以使用新增至每個商務角色的標籤，在 IAM 中建立單一許可政策，而不必在每次新增資源時更新政策。您也可以將標籤連接至 IAM 主體，以建立 ABAC 政策。當進行呼叫的 IAM 使用者角色上的標籤與 Amazon SQS 佇列標籤相符時，您可以設計 ABAC 政策來允許 Amazon SQS 作業。若要進一步了解如何標記 AWS，請參閱[AWS 標記策略](https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html)和 [Amazon SQS 成本分配標籤](sqs-queue-tags.md)。

**注意**  
ABAC for Amazon SQS 目前可在可使用 Amazon SQS 的所有 AWS 商業區域中使用，但以下情況除外：  
亞太地區 (海德拉巴)
亞太地區 (墨爾本)
歐洲 (西班牙) 
歐洲 (蘇黎世)

## 為什麼一定要在 Amazon SQS 中使用 ABAC？
<a name="sqs-abac-benefits"></a>

以下是在 Amazon SQS 中使用 ABAC 的一些好處：
+ Amazon SQS 的 ABAC 需要較少的許可政策。您不需要為不同的工作職能建立不同政策。您可以使用套用至一個以上的佇列的資源和請求標籤，如此可降低營運成本。
+ 使用 ABAC 快速擴展團隊。當資源在建立期間適當標記，就會根據標籤自動授予新資源許可權。
+ 使用 IAM 主體的許可權來限制資源存取。您可以為 IAM 主體建立標籤，並使用這些標籤來限制對符合 IAM 主體標籤之特定動作的存取。這可協助您將授與請求權限的程序自動化。
+ 追蹤誰在存取您的資源。您可以透過查看 AWS CloudTrail中的使用者屬性來判斷工作階段的身分識別。

**Topics**
+ [ABAC 是什麼？](#sqs-abac-whatis)
+ [為什麼一定要在 Amazon SQS 中使用 ABAC？](#sqs-abac-benefits)
+ [為存取控制加上標籤](sqs-abac-tagging-resource-control.md)
+ [建立 IAM 使用者和 Amazon SQS 佇列](sqs-abac-creating-queues.md)
+ [測試屬性型存取控制](sqs-abac-testing-access-control.md)

# 標記 Amazon SQS 中的存取控制
<a name="sqs-abac-tagging-resource-control"></a>

以下是在 Amazon SQS 中使用標籤進行存取控制的範例。IAM 政策限制 IAM 使用者只能執行所有佇列的所有 Amazon SQS 操作，這些佇列包含鍵為 environment、值為 production 的資源標籤。如需詳細資訊，請參閱[使用標籤和 AWS Organizations 的屬性型存取控制](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_tagging_abac.html)。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowAccessForProd",
      "Effect": "Allow",
      "Action": "sqs:*",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:ResourceTag/environment": "prod"
        }
      }
    }
  ]
}
```

------

# 建立 IAM 使用者和 Amazon SQS 佇列
<a name="sqs-abac-creating-queues"></a>

下列範例說明如何建立 ABAC 政策，以使用 AWS 管理主控台 和 控制對 Amazon SQS 的存取 CloudFormation。

## 使用 AWS 管理主控台
<a name="sqs-abac-creating-queues-console"></a>

**建立 IAM 使用者**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 從左側導覽窗格中，選擇**使用者**。

1. 選擇**新增使用者**，然後在**使用者名稱**文字方塊中輸入名稱。

1. 選取**存取金鑰 - 程式設計存取**方塊，然後選擇**下一步：許可**。

1. 選擇 **Next: Add Tags (下一步：新增標籤)**。

1. 新增鍵 `environment` 且值為 `beta` 的標籤。

1. 選擇**下一步：檢閱**，然後選擇**建立使用者**。

1. 請將存取金鑰 ID 和私密存取金鑰複製並存放在安全之處。

**新增 IAM 使用者許可權**

1. 選取您建立的 IAM 使用者。

1. 選擇**新增內嵌政策**。

1. 在 JSON 標籤上，貼上下列政策。

1. 選擇**檢閱政策**。

1. 選擇**建立政策**。

## 使用 AWS CloudFormation
<a name="sqs-abac-creating-queues-cf"></a>

使用下列範例 CloudFormation 範本建立已連接內嵌政策和 Amazon SQS 佇列的 IAM 使用者：

```
AWSTemplateFormatVersion: "2010-09-09"
Description: "CloudFormation template to create IAM user with custom inline policy"
Resources:
    IAMPolicy:
        Type: "AWS::IAM::Policy"
        Properties:
            PolicyDocument: |
                {
                    "Version": "2012-10-17",		 	 	 
                    "Statement": [
                        {
                            "Sid": "AllowAccessForSameResTag",
                            "Effect": "Allow",
                            "Action": [
                                "sqs:SendMessage",
                                "sqs:ReceiveMessage",
                                "sqs:DeleteMessage"
                            ],
                            "Resource": "*",
                            "Condition": {
                                "StringEquals": {
                                    "aws:ResourceTag/environment": "${aws:PrincipalTag/environment}"
                                }
                            }
                        },
                        {
                            "Sid": "AllowAccessForSameReqTag",
                            "Effect": "Allow",
                            "Action": [
                                "sqs:CreateQueue",
                                "sqs:DeleteQueue",
                                "sqs:SetQueueAttributes",
                                "sqs:tagqueue"
                            ],
                            "Resource": "*",
                            "Condition": {
                                "StringEquals": {
                                    "aws:RequestTag/environment": "${aws:PrincipalTag/environment}"
                                }
                            }
                        },
                        {
                            "Sid": "DenyAccessForProd",
                            "Effect": "Deny",
                            "Action": "sqs:*",
                            "Resource": "*",
                            "Condition": {
                                "StringEquals": {
                                    "aws:ResourceTag/stage": "prod"
                                }
                            }
                        }
                    ]
                }
                
            Users: 
              - "testUser"
            PolicyName: tagQueuePolicy

    IAMUser:
        Type: "AWS::IAM::User"
        Properties:
            Path: "/"
            UserName: "testUser"
            Tags: 
              - 
                Key: "environment"
                Value: "beta"
```

# 在 Amazon SQS 中測試屬性型存取控制
<a name="sqs-abac-testing-access-control"></a>

以下範例顯示如何在 Amazon SQS 中測試屬性型存取控制。

## 使用設定為 environment 的標籤鍵和設定為 prod 的標籤值來建立佇列
<a name="sqs-abac-testing-access-control-create-queue"></a>

執行此 AWS CLI 命令來測試建立佇列時，標籤索引鍵設定為 environment，標籤值設定為 prod。如果您沒有 AWS CLI，您可以[下載並設定](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)機器的 CLI。

```
aws sqs create-queue --queue-name prodQueue —region us-east-1 —tags "environment=prod"
```

您收到來自 Amazon SQS 端點的 `AccessDenied` 錯誤訊息：

```
An error occurred (AccessDenied) when calling the CreateQueue operation: Access to the resource <queueUrl> is denied.
```

這是因為 IAM 使用者上的標籤值與 [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_CreateQueue.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_CreateQueue.html) API 呼叫中傳遞的標籤不符。請記住，我們將標籤套用至具有鍵設定為 `environment` 且值設定為 `beta` 的 IAM 使用者。

## 以設定為 environment 的標籤鍵和設定為 beta 的標籤值建立佇列
<a name="sqs-abac-testing-access-control-create-env"></a>

執行此 CLI 命令，測試以設定為 `environment` 的標籤鍵和設定為 `beta` 的標籤值建立佇列。

```
aws sqs create-queue --queue-name betaQueue —region us-east-1 —tags "environment=beta"
```

您會收到一則訊息，確認佇列已成功建立，類似下列內容。

```
{
"QueueUrl": "<queueUrl>“
}
```

## 傳送訊息至佇列
<a name="sqs-abac-testing-access-control-sending-message"></a>

執行此 CLI 命令以測試將訊息傳送至佇列。

```
aws sqs send-message --queue-url <queueUrl> --message-body testMessage
```

回應顯示已成功將訊息傳遞至 Amazon SQS 佇列。IAM 使用者許可權允許您將訊息傳送至具有 `beta` 標籤的佇列。回應包括內含訊息的 `MD5OfMessageBody` 和 `MessageId`。

```
{
"MD5OfMessageBody": "<MD5OfMessageBody>",
"MessageId": "<MessageId>"
}
```