

# 在通用存储桶中启用 ABAC
<a name="buckets-tagging-enable-abac"></a>

基于属性的访问权限控制（ABAC）是一种授权策略，您可以利用这种策略基于属性（即标签）来定义权限。默认情况下，ABAC 在所有 Amazon S3 通用存储桶中禁用。要为通用存储桶使用 ABAC，您必须启用它。

在为通用存储桶启用 ABAC 之前，建议您先完成以下主题中描述的任务：

**Topics**
+ [在启用 ABAC 之前审计策略](#buckets-tagging-enable-abac-audit)

## 在启用 ABAC 之前审计策略
<a name="buckets-tagging-enable-abac-audit"></a>

在为存储桶启用 ABAC 之前，如果您的存储桶有标签，请审计您的访问控制策略，检查基于标签的条件是否引用了存储桶上的任何现有标签。如果有引用，请确认这些策略按照预期进行设置，并且启用基于标签的访问控制不会对您的 Amazon S3 工作流造成意外的授权更改。这样做有助于确保在存储桶上启用 ABAC 后，您的策略正常运行。有关将基于属性的条件与标签结合使用的示例，请参阅[将标签与 S3 通用存储桶结合使用](buckets-tagging.md)。

### 在 IAM 策略中包含所需的权限
<a name="buckets-tagging-enable-abac-permissions"></a>

您需要以下 Amazon S3 权限来为存储桶启用 ABAC：
+ `s3:PutBucketAbac`：更新通用存储桶的 ABAC 状态。
+ `s3:GetBucketAbac`：查看通用存储桶的 ABAC 状态。

启用 ABAC 后，您之前用于向存储桶添加标签或从存储桶中删除标签的权限（`PutBucketTagging` 或 `DeleteBucketTagging`）将不再有效。而是改为使用 `TagResource` 和 *UntagResource* API 来执行这些任务。

建议您在存储桶上启用 ABAC 之前，使用 `TagResource` 和 `UntagResource` API 来管理标签事宜。现在，Amazon S3 控制台和 CloudFormation 默认使用 `TagResource` 和 `UntagResource` API。您也可以使用 `PutBucketAbac` API 在存储桶上禁用 ABAC。您可以使用 `GetBucketTagging` 列出存储桶上的标签。在为存储桶启用 ABAC 后，此 API 可继续使用。或者，您也可以使用 `ListTagsForResource` 列出存储桶上的所有标签。

您需要以下权限才能将在通用存储桶上应用和删除标签。
+ `s3:TagResource`：向 AWS 资源（例如 Amazon S3 通用存储桶）添加标签。
+ `s3:UntagResource`：从 AWS 资源（例如 Amazon S3 通用存储桶）删除标签。
+ `s3:ListTagsForResource`：查看应用到 AWS 资源（例如 Amazon S3 通用存储桶）上的标签。

以下 IAM 策略授予为存储桶启用 ABAC 和查看其状态的权限。

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutBucketAbac",
        "s3:GetBucketAbac"
      ],
      "Resource": "arn:aws:s3:::my-s3-bucket/*"
    }
  ]
}
```

有关标记通用存储桶的更多信息以及用于通用存储桶的 ABAC 策略示例，请参阅[将标签与 S3 通用存储桶结合使用](buckets-tagging.md)。

### Steps
<a name="bucket-tag-add-steps"></a>

如果您拥有通用存储桶的 `s3:PutBucketAbac` 权限，则可以使用 Amazon S3 控制台、AWS 命令行界面（AWS CLI）、Amazon S3 REST API 和 AWS SDK 为存储桶启用 ABAC。

### 使用 S3 控制台
<a name="bucket-enable-abac-console"></a>

要使用 Amazon S3 控制台为通用存储桶启用 ABAC，请执行以下操作：

1. 登录到 Amazon S3 控制台，网址为：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择**存储桶**。

1. 选择存储桶名称。

1. 选择**属性**选项卡。

1. 在**存储桶 ABAC** 面板中，选择**编辑**。

1. 选择**启用**开关。

1. 在启用 ABAC 之后，请检查并确认管理标签所需的权限：`TagResource`、`UntagResource` 和 `ListTagsForResource`。

1. 选择**保存更改**。

### 使用 AWS SDK
<a name="bucket-enable-abac-sdks"></a>

------
#### [ SDK for Java 2.x ]

此示例说明如何使用AWS SDK for Java 2.x 为通用存储桶启用 ABAC。要使用该命令，请将*用户输入占位符* 替换为您自己的信息。

```
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.AbacStatus;
import software.amazon.awssdk.services.s3.model.GetBucketAbacRequest;
import software.amazon.awssdk.services.s3.model.GetBucketAbacResponse;
import software.amazon.awssdk.services.s3.model.PutBucketAbacRequest;
import software.amazon.awssdk.services.s3.model.PutBucketAbacResponse;
import software.amazon.awssdk.regions.Region; 

public class BucketAbac {
    public static void main(String[] args) {
        Region region = Region.US_EAST_1;
        S3Client s3 = S3Client.builder()
            .region(region)
            .build();

        putBucketAbac(s3, "amzn-s3-demo-bucket", "Enabled");
        getBucketAbac(s3, "amzn-s3-demo-bucket");

        putBucketAbac(s3, "amzn-s3-demo-bucket", "Disabled");
        getBucketAbac(s3, "amzn-s3-demo-bucket");
    }

    /**
     * Sets the ABAC (Attribute-Based Access Control) status for a specified S3 bucket.
     * 
     * @param s3 The S3Client instance to use for the API call
     * @param bucketName The name of the S3 bucket to update
     * @param status The desired ABAC status ("Enabled" or "Disabled")
    */
    public static void putBucketAbac(S3Client s3, String bucketName, String status) {
       try {
            AbacStatus abacStatus = AbacStatus.builder()
                .abacStatus(status)
                .build();
            PutBucketAbacReqquest request = PutBucketAbacRequest.builder()
                .bucket(bucketName)
                .abacStatus(abacStatus)
                .build();
            s3.putBucketAbac(request);
        } catch (S3Exception e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
    }
    
    /**
     * Retrieves the current ABAC (Attribute-Based Access Control) status for a specified S3 bucket.
     * 
     * @param s3 The S3Client instance to use for the API call
     * @param bucketName The name of the S3 bucket to query
    */
    public static void getBucketAbac(S3Client s3, String bucketName) {
       try {
            GetBucketAbacReqquest request = GetBucketAbacRequest.builder()
                .bucket(bucketName)
                .build();
            GetBucketAbacResponse response = s3.getBucketAbac(request);
        } catch (S3Exception e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
    }
}
```

此示例说明如何使用适用于 Java 2.x 的 AWS SDK 为通用存储桶启用 ABAC。要使用该命令，请将 `user input placeholders` 替换为您自己的信息。

------

### 使用 REST API
<a name="bucket-enable-abac-api"></a>

有关 Amazon S3 REST API 支持向通用存储桶添加标签的相关信息，请参阅《Amazon Simple Storage Service API 参考》**中的以下部分：
+ [PutBucketAbac](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutBucketABAC.html)

### 使用 AWS CLI
<a name="bucket-enable-abac-cli"></a>

要安装 AWS CLI，请参阅《AWS Command Line Interface 用户指南》**中的[安装 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。

以下 CLI 示例说明如何使用为 AWS CLI 通用存储桶启用 ABAC。要使用该命令，请将*用户输入占位符* 替换为您自己的信息。

**请求**

```
# Enable ABAC on a general purpose bucket

aws s3api put-bucket-abac --bucket amzn-s3-demo-bucket --abac-status Status=Enabled --region us-east-2

# Disable ABAC on a general purpose bucket

aws s3api put-bucket-abac --bucket amzn-s3-demo-bucket --abac-status Status=Disabled --region us-east-2

# Get ABAC status on a general purpose bucket

aws s3api get-bucket-abac --bucket amzn-s3-demo-bucket --region us-east-2
```