在通用存储桶中启用 ABAC - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

在通用存储桶中启用 ABAC

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

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

在启用 ABAC 之前审计策略

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

在 IAM 策略中包含所需的权限

您需要以下 Amazon S3 权限来为存储桶启用 ABAC:

  • s3:PutBucketAbac:更新通用存储桶的 ABAC 状态。

  • s3:GetBucketAbac:查看通用存储桶的 ABAC 状态。

启用 ABAC 后,您之前用于向存储桶添加标签或从存储桶中删除标签的权限(PutBucketTaggingDeleteBucketTagging)将不再有效。而是改为使用 TagResourceUntagResource API 来执行这些任务。

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

您需要以下权限才能将在通用存储桶上应用和删除标签。

  • s3:TagResource:向 Amazon 资源(例如 Amazon S3 通用存储桶)添加标签。

  • s3:UntagResource:从 Amazon 资源(例如 Amazon S3 通用存储桶)删除标签。

  • s3:ListTagsForResource:查看应用到 Amazon 资源(例如 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 通用存储桶结合使用

Steps

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

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

  1. 登录到 Amazon S3 控制台,网址为:https://console.aws.amazon.com/s3/

  2. 在左侧导航窗格中,选择存储桶

  3. 选择存储桶名称。

  4. 选择属性选项卡。

  5. 存储桶 ABAC 面板中,选择编辑

  6. 选择启用开关。

  7. 在启用 ABAC 之后,请检查并确认管理标签所需的权限:TagResourceUntagResourceListTagsForResource

  8. 选择保存更改

SDK for Java 2.x

此示例说明如何使用Amazon 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 的 Amazon SDK 为通用存储桶启用 ABAC。要使用该命令,请将 user input placeholders 替换为您自己的信息。

有关 Amazon S3 REST API 支持向通用存储桶添加标签的相关信息,请参阅《Amazon Simple Storage Service API 参考》中的以下部分:

要安装 Amazon CLI,请参阅《Amazon Command Line Interface 用户指南》中的安装 Amazon CLI

以下 CLI 示例说明如何使用为 Amazon 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