

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

# 适用于 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 条件键，请参阅《服务授权参考》**中的 [Condition keys for Amazon SQS](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonsqs.html#amazonsqs-policy-keys)。

借助 ABAC，您可以使用标签为 Amazon SQS 队列配置 IAM 访问权限和策略，这有助于您扩展权限管理。您可以使用添加到每个业务角色的标签在 IAM 中创建单个权限策略，而不必在每次添加新资源时都更新策略。您还可以向 IAM 主体附加标签以创建 ABAC 策略。您可以将 ABAC 策略设计为在进行调用的 IAM 用户角色上的标签与 Amazon SQS 队列标签匹配时允许 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 目前已在 AWS 所有提供亚马逊 SQS 的商业区域推出，但以下情况除外：  
亚太地区（海得拉巴）
亚太地区（墨尔本）
欧洲（西班牙） 
欧洲（苏黎世）

## 为什么应该在 Amazon SQS 中使用 ABAC？
<a name="sqs-abac-benefits"></a>

以下是在 Amazon SQS 中使用 ABAC 的一些好处：
+ ABAC for Amazon SQS 需要更少的权限策略。您无需为不同工作职能创建不同策略。您可以使用适用于多个队列的资源和请求标签，这样可以减少操作开销。
+ 使用 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 用户只能针对包括特定资源标签（键：environment，值：production）的所有队列执行所有 Amazon SQS 操作。有关更多信息，请参阅[使用标签进行基于属性的访问控制和 Organizations。 AWS](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>

以下示例说明如何使用 AWS 管理控制台 和创建 ABAC 策略来控制对 Amazon SQS 的访问。 CloudFormation

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

**创建 IAM 用户**

1. 登录 AWS 管理控制台 并打开 IAM 控制台，网址为[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 从左侧导航窗格中选择**用户**。

1. 选择**添加用户**，然后在**用户名**文本框中输入名称。

1. 选择**访问密钥 - 编程访问**框，然后选择**下一步: 权限**。

1. 选择**下一步: 标签**。

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 中测试基于属性的访问控制。

## 创建一个队列，将标签键设置为环境，将标签值设置为生产
<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)它。

```
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 调用中传递的标签不一致。请记住，我们向 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>"
}
```