使用 S3 清单禁用 Amazon S3 访问控制列表

访问控制列表 (ACL) 定义了用户访问权限以及用户可以对特定资源采取的操作。 Amazon Simple Storage Service (Amazon S3) 于 2006 年推出,以 ACL 作为其首个授权机制。自 2011 年以来,Amazon S3 还支持用于 管理 S3 存储桶访问权限的 A WS 身份和访问管理 (IAM) 策略,并建议使用策略代替 ACL。尽管 Amazon S3 继续支持 ACL,但大多数用例不再需要它们。

2021 年,我们推出了 Amazon S3 对象所有权 , 以帮助客户完全禁用其 S3 存储桶的 ACL,并完全依赖策略进行访问控制。这简化了存储在 Amazon S3 中的数据的访问管理,因为您仅使用策略即可轻松查看、管理和修改对数据的访问权限。此外,从 2023 年 4 月起,我们现在默认禁用所有新存储 分区的 ACL 。但是,对于现有工作负载,客户告诉我们,在切换到策略之前,他们需要了解其 ACL 的使用情况。他们希望确保此更改不会删除所需的权限,从而中断他们的应用程序。

为了帮助您禁用 ACL,我们最近在 A mazon S3 服务器访问日志 亚马逊云科技 CloudTrail 中添加了信息,以便您可以查看依赖于 ACL 访问 Amazon S3 中对象的请求。有关这方面的更多信息,请参阅 亚马逊云科技 存储博客文章 “使用 S3 服务器访问日志和 亚马逊云科技 Cl oudTrail 中的信息 禁用现有 Amazon S3 工作负载的 ACL ”。这是审计 Amazon S3 ACL 使用情况时必不可少的步骤,因此您可以准确了解您的应用程序在迁移到 IAM 和 S3 存储桶策略时向需要对象 ACL 的 Amazon S3 进行 API 调用的方式和位置。

在这篇文章中,我们展示了客户现在如何使用 Amazon S3 库存报告轻松查看 ACL。这使您可以利用策略提供的更高的可扩展性和灵活性来管理资源访问权限。将特定对象的权限整合到一个策略中比多个 ACL 更易于审计和更新,尤其是在大规模时。

新增 — 亚马逊 S3 库存报告现在包含 S3 ACL 元数据

A mazon S3 清单报告 允许您生成对象和元数据列表来管理和审查您的存储。与对每个 S3 对象进行 API 调用以检索相同信息相比,通过 Amazon S3 清单报告检索所有对象 ACL 的信息是一种更具成本效益的选择。S3 清单报告每天或每周都可用,可在对象级别生成精细数据。这可以包括对象大小、上次修改日期和加密状态等字段。

2023 年 7 月 14 日,我们在亚马逊 S3 清单报告中添加了对象 ACL。此功能通过向客户提供与每个对象相关的所有 ACL 的完整列表,简化了 Amazon S3 中访问权限的审计。向 Amazon S3 清单报告中添加对象 ACL 也可以帮助节省成本,因为不再需要调用 Amazon S3 API 来确定已对您的对象设置了哪些 ACL。新的对象 ACL 字段包括标识对象所有者的 Owner 元素和标识被授权者和所授权限的 Grant 元素。这使客户能够识别现有对象 ACL,将其迁移到 IAM/Bucket 策略,并在验证了不再使用的 ACL 后禁用对象 ACL。

ACL 在 S3 清单报告中是如何显示的

亚马逊 S3 清单报告中的对象 ACL 字段以 JSON 格式定义。JSON 数据包括以下字段:

  • 版本 :亚马逊 S3 清单报告中对象 ACL 字段格式的版本。它的日期格式为 yyyy-mm-dd。
  • 状态 :可能的值为 “可用” 或 “不可用”,表示对象 ACL 是否可用于某个对象。在极少数情况下,如果 Amazon S3 清单报告不包含最近添加或删除的 ACL(下次生成 Amazon S3 库存报告时可能会包含这些内容),您可能会看到不可用状态。
  • g rants :被授权者权限对,列出对象 ACL 授予的每个被授权者的权限状态。被授权者的可用值是权威用户和群组。有关被授权者的更多信息,请参阅 ACL 中的 被授权者。

对于组类型的被授权者,被授权者权限对包括以下属性:

    • uri :预定义的亚马逊 S3 群组。
    • 权限 :对对象授予 的 ACL 权限
    • 类型 :组类型,表示被授权者是组。

对于具有 CanonicalUser 类型的被授权者,被授权者权限对包括以下属性:

    • CanonicalID :权威 ID 是一个字母数字标识符,用于在通过存储桶或对象 ACL 授予 Amazon S3 访问权限时识别 亚马逊云科技 账户。
    • 权限 :授予对象 的 ACL 权限
    • 类型 :CanonicalUser 类型,表示被授予者是一个 亚马逊云科技 账户。

以下示例显示了 JSON 中对象 ACL 字段的值。示例 ACL 授予对 Amazon S3 预定义的所有用户组的读取权限。这允许世界上任何人发出已签名或未签名的请求。

{
	"version": "2022-11-10",
	"status": "AVAILABLE",
	"grants": [{
		"uri": "http://acs.amazonaws.com/groups/global/AllUsers",
		"permission": "READ",
		"type": "Group"
	}]
}

图 1:对象 ACL 字段 JSON 示例

解决方案概述

在这篇文章中,我们将介绍以下内容:

  1. 为您的 S3 存储桶启用亚马逊 S3 清单
  2. 设置 亚马逊 Athena 并从 Amazon S3 库存报告中创建 Athena 表
  3. 使用 Athena 查询 Amazon S3 清单并使用所有者和/或授予 ACL 元素识别对象
  4. 将亚马逊 S3 ACL 权限迁移到 S3 存储桶策略
  5. 禁用亚马逊 S3 ACL

为您的 S3 存储桶启用亚马逊 S3 清单

您可以通过导航到 S3 存储桶 管理 -> 库存配置-> 创建库存配置 来创建清单配置 。在此处指定 Amazon S3 清单报告的名称和范围,以及要保存报告的目标存储桶。接下来,设置报告的频率和输出格式,从每日或每周频率中选择 CSV、Apache ORC 和 Apache Parquet 作为输出格式。对于此解决方案,我们使用 CSV 格式的 Amazon S3 库存报告。在启用报告之前,请选择要报告的可选元数据字段,因为默认情况下,Amazon S3 清单报告包含存储桶、对象密钥、版本 ID、最新版本和删除标记字段。在此解决方案示例中,请注意,我们仅启用对象 ACL 和对象所有者的其他元数据字段,如下图所示。

Example Amazon S3 Inventory report configuration

图 2:亚马逊 S3 库存报告配置示例

请注意,Amazon S3 清单报告可以设置为每天或每周运行,最多可能需要一天才能完成,而第一份 Amazon S3 库存报告可能需要长达 48 小时才能生成。创建您的 Amazon S3 清单报告并在目标 S3 存储桶中可用后,您就可以使用 Athena 处理此报告了。

设置 Athena 并从 Amazon S3 清单报告中创建雅典娜表

1。浏览到包含您的 Amazon S3 清单报告的 S3 存储桶,然后浏览到配置单元文件夹。

2。您应该看到存储桶中按上次运行日期列出的文件夹,其中 dt=yyyy-mm-dd-HHH-MM 以及诸如 dt=2023-08-03-01-00/ 之类的对象文件夹。 选择亚马逊 S3 文件夹位置作为亚马逊 S3 URL 字符串,以便在创建 Athena 表时使用。

3。在 亚马逊云科技 管理控制台 中 ,导航到 Athena。如果这是您首次在此 亚马逊云科技 账户中使用 Athena,那么您应该会看到一个已选择 “查询您的数据” 的入门页面。选择 在该页面 启动查询编辑器以继续使用 Athena 查询编辑器,如下图所示。

Location of Launch query editor on Athena Get Started page

图 3:Athena 页面 上 启动查询编辑器的位置

4。如果这是你第一次使用 Athena,那么首先要配置你的 Athena 设置。选择 编辑设置 以继续输入存储查询结果的 S3 存储桶的路径。请注意,所选的 S3 存储桶必须位于您运行 Athena 查询 的同一 亚马逊云科技 区域 中,如下图所示。

Figure 4: Dialog box to enter location to store Athena query results

图 4:用于输入存储 Athena 查询结果的位置的对话框

5。保存您的 Athena 设置后,我们可以为 Amazon S3 清单结果创建表格。我们输入此 SQL 语句在默认 Athena 数据库中创建名为 s3_inventory_csv 的表。您必须在以下位置字符串中输入 Amazon S3 库存位置,其中包含适合您的配置的值。

CREATE EXTERNAL TABLE IF NOT EXISTS `default`.`s3_inventory_csv` (
    `Bucket` string,
    `Key` string,
  `version_id` string,
  `is_latest` boolean,
  `is_delete_marker` boolean,
    `ObjectAccessControlList` string,
    `ObjectOwner` string
  )
  ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
  STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat'
  OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
  LOCATION 's3://yourS3Bucketname/inventory/hive/dt=2023-06-13-01-00/';

图 5:在 Athena 中创建 Amazon S3 清单表的示例 SQL

请注意,对于位置字段,我们使用前面在步骤 2 中注明的 Amazon S3 库存位置。选择 “ 运行 ” 创建表。

6。运行 SQL 后,您将在表列表中看到 s3_inventory_csv,并且可以对您的亚马逊 S3 清单运行 Athena 查询,如下图所示。

Location of s3_inventory_csv table in Athena query editor

图 6:雅典娜查询编辑器中 s3_inventory_csv 表的位置

使用 Athena 查询 Amazon S3 清单并使用所有者和/或授予 ACL 元素识别对象

我们介绍了几个示例场景,这些场景允许我们在示例环境中识别已经设置了 ACL 的对象。

请注意,无论您选择哪种格式(CSV、Parquet、ORC),格式的 Amazon S3 清单报告都会将对象 ACL 字段的值显示为 base64 编码的字符串。此外,它必须在 Athena 查询期间进行解码,我们将在本文中举例说明。

示例 1:在 Amazon S3 清单报告中查找所有对象的 ACL 数量

此示例查询利用 from_base64 函数解码以 base64 格式编码的 objectaccesscontrollist 列,并利用 from_utf8 函数将二进制数据转换为文本,以确定在 S3 对象上授予了多少个 ACL,如下图所示:

SELECT key,
    from_utf8(from_base64(objectaccesscontrollist)),
    json_array_length(
        json_extract(
            from_utf8(from_base64(objectaccesscontrollist)),
            '$.grants'
        )
    ) AS grants_count
FROM "default"."s3_inventory_csv";

图 7:查找所有对象的 ACL 数量的示例 SQL

出于可读性考虑,我已将查询结果导出为 CSV 格式,并显示了存在 ACL 的三个对象的示例,如下图所示。

Finding number of ACLs for all objects – Athena query results

图 8:查找所有对象的 ACL 数量 — Athena 查询结果

示例 2:识别具有 ACL 权限的 S3 对象 = 完全控制

WITH grants AS 
(SELECT key,
CAST(json_extract(objectaccesscontrollist,
'$.grants') AS ARRAY(MAP(VARCHAR, VARCHAR))) AS grants_array
FROM "default"."s3_inventory_csv" )
SELECT key,
grants_array,
grant
FROM grants, UNNEST(grants_array) AS t(grant)
WHERE element_at(grant, 'permission') = 'FULL_CONTROL'

图 9:使用 “完全控制” 标识对象 ACL 的示例 SQL

出于可读性考虑,我已将查询结果导出为 CSV 格式,并显示了一个名为 xaaaau 的对象的示例 ,该对象具有已被授予完全控制权的权威用户帐户 ID,如下图所示。

Identify Amazon S3 objects with Full Control ACL Athena query results

图 10:使用完全控制 ACL Athena 查询结果识别 S3 对象

示例 3:使用 ACL 查找具有跨账户所有权的 S3 对象

您必须找到您的 亚马逊云科技 账户的规范用户 ID 才能将其放入以下查询中。要找到您的 亚马逊云科技 账户的规范用户 ID,请浏览到您的账户中的 S3 存储桶并选择 权限 选项卡。向下浏览 ACL,找到您的 亚马逊云科技 账户的规范用户 ID,如下图所示。

Amazon S3 Console location of canonical user ID

图 11:规范用户 ID 的 Amazon S3 控制台位置

现在您有了权威用户 ID,可以在以下示例 SQL 查询中将 “CanonicalID” 替换为您的权威用户 ID,然后在 Athena 中运行查询:

SELECT key,objectowner FROM "default"."s3_inventory_csv" WHERE objectowner <> 'CanonicalID';

图 12:标识具有跨账户访问权限的 ACL 的示例 SQL

此查询的结果是所有由不同的 亚马逊云科技 账户拥有的 S3 对象,这些对象以拥有 S3 对象的规范用户 ID 格式显示。

Identify ACLs with cross-account access Athena query results

图 13:识别具有跨账户访问权限的 ACL 雅典娜查询结果

使用跨账户 IAM 角色将 Amazon S3 ACL 权限迁移到 S3 存储桶策略

现在,我们已经在前面的示例中确定了许多使用 Amazon S3 ACL 的对象,我们可以演示如何编写 S3 存储桶策略和 IAM 角色,允许跨账户访问特定 S3 存储桶,使其符合我们的安全最佳实践。

在此示例中,我们有两个实体:包含 S3 存储桶的账户 1 和包含需要访问账户 1 中的 S3 存储桶的 IAM 资源的账户 2。例如,账户 1 的 亚马逊云科技 账户 ID 为 111111111111,账户 2 的 亚马逊云科技 账户 ID 为 222222222222。

以下是我们的示例设计的架构图:

Example cross-account IAM role access to S3 bucket

图 14:对 S3 存储桶的跨账户 IAM 角色访问示例

在账户 2 中创建 IAM 角色

在账户 2 中,我们创建了一个 IAM 角色,该角色包含一个定义谁或什么可以代入角色的信任策略,以及通过导航到您的 亚马逊云科技 账户中的 IAM 控制台,选择 角色 ,然后选择 创建角色来列出允许的操作 ,如下图所示。

Location of Roles and Create role

图 15: 角色位置 和 创建角色

现在,选择 亚马逊云科技 服务作为可信实体,然后选择 EC2,这样我们就可以将角色分配给 亚马逊弹性计算云 (Amazon EC2) 实例。然后,选择 “ 下一步 ” 继续,如下图所示。

Location of EC2 Trusted Entity fields

图 16:EC2 可信实体字段的位置

添加权限 页面上,选择 创建策略, 以便我们可以直接为该角色提供 IAM 策略 JSON,如下图所示。

Location of Create policy

图 17: 创建策略的位置

在 IAM 策略编辑器中,我们选择 JSON 按钮并粘贴以下 IAM 角色的示例策略,以允许 PutObject 和 GetObject 权限访问三个特定对象。根据您的特定用例的需要对其进行修改,然后选择 “ 下一步” ,如下图所示。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": [
               "arn:aws:s3:::Account1BucketName/object1",
               "arn:aws:s3:::Account1BucketName/object2",
               "arn:aws:s3:::Account1BucketName/object3"
]            
        }
    ]
}

图 18:IAM 策略示例

Example IAM permissions

图 19:IAM 权限示例

为您的 IAM 策略提供名称和描述,然后选择 创建策略 。请注意,这仅会为您即将创建的 IAM 角色创建 IAM 策略,如下图所示。

Name, review, and create IAM policy

图 20:命名、审查和创建 IAM 策略

现在 IAM 策略已创建,我们可以返回 IAM 角色创建 选项卡屏幕(如下图所示),选择刷新按钮,然后搜索我们刚刚创建的 IAM 策略。找到策略后,通过选中策略名称旁边的复选框将其选中,然后选择 下一步

Add permissions to IAM role

图 21:向 IAM 角色添加权限

在下图所示的下一个屏幕上,命名您的 IAM 角色,提供可选描述,然后在页面 底部选择 创建角色以创建 IAM 角色。

Name, review, and create IAM role

图 22:命名、审查和创建 IAM 角色

创建 IAM 角色后,选择 查看角色 ,如下图所示。

View IAM role

图 23:查看 IAM 角色

现在选择 ARN 旁边的复制按钮来复制 IAM 角色 ARN 并将其保存在暂存板中,因为我们最终使用它来创建 S3 存储桶策略以允许访问 IAM 角色,如下图所示:

Copy IAM role ARN

图 24:复制 IAM 角色 ARN

在账户 1 中创建 S3 存储桶策略

复制完成后,通过在控制台中键入 S3 并选择它来启动 Amazon S3 控制台,切换到 Amazon S3 服务。然后,选择要应用 S3 存储桶策略的 S3 存储桶。

选择 “ 权限 ” 选项卡,向下滚动到 “ 存储桶策略” ,然后选择 “ 编辑” 以打开存储桶策略编辑器,如下图所示。

Figure 25: Edit S3 bucket policy

图 25: 编辑 S3 存储桶策略

在策略编辑器中,我们添加了以下策略 JSON,允许我们刚刚创建的 IAM 角色对三个特定 S3 对象执行 Get 和 Put 操作。根据您的特定用例修改此策略,然后选择 保存更改 ,如下图所示。有关 S3 存储桶策略的更多详细信息和示例,请访问 存储桶策略示例

Figure 26: Example S3 bucket policy

图 26:S3 存储桶策略示例

有关跨账户访问 Amazon S3 资源的更多信息,请查看 文档

测试迁移到 IAM 以及对 Amazon S3 的存储桶策略访问权限

创建 IAM 角色并分配之前的 S3 存储桶策略后,您想要将 IAM 角色附加到 EC2 实例,开始使用 IAM 角色/S3 存储桶策略组合测试跨账户访问权限。

除了前面的步骤外,我们强烈建议您在 ACL 向 IAM/存储桶策略迁移时确认您的 Amazon S3 API 调用是否需要 ACL 才能成功 API 请求。这可以通过使用亚马逊 S3 服务器访问日志或 CloudTrail 来实现,这篇 亚马逊云科技 存储博客文章 中对此进行了概述。

尽管我们在前面的示例中仅涵盖了少量对象,但客户拥有的具有 ACL 的对象可能要多得多,达到数千万或更多。尽管每个客户的用例都不同,但我们建议您首先在非生产环境中进行小规模测试,然后再通过适合迁移到基于策略的方法的 ACL 来识别生产对象。根据您的账户/存储桶/前缀/对象键命名策略,您可以考虑如何根据您的特定用法,在可管理的小块中执行这些任务,以简化权限迁移。

禁用亚马逊 S3 ACL

测试和验证完成后,我们建议您在一段时间内继续监控您的 Amazon S3 服务器访问日志,以确保在 Amazon S3 服务器访问日志或 CloudTrail 数据事件的 ACLRequired 字段中没有更多 “是” 条目。此步骤有助于全面审核您对对象 ACL 的使用情况。 有关审查 Amazon S3 服务器访问日志或 CloudTrail 中是否有 ACL 要求的请求的流程的更多信息,请参阅这篇文章。

确定不再有依赖对象 ACL 的请求才能成功后,您可以导航到存储桶,选择 权限 选项卡,然后选择对象所有权 旁边的 编辑,从而禁用存储桶上的 Amazon S3 对象 ACL ,在其中可以禁用存储桶上的 ACL 并保存更改,如下图所示。完成此操作后,请务必测试您对对象的跨账户权限,以确保可以像以前一样继续访问对象,并相应地更改您的存储桶策略和/或 IAM 权限。如果在此阶段出现错误,则可以轻松返回存储桶,并在需要时在存储桶上启用 ACL 以撤消更改。如果您想了解有关启用或禁用 S3 ACL 的 Amazon S3 所有权设置的更多信息,请访问这篇 相关的 亚马逊云科技 新闻博客文章

Figure 31: Edit Object Ownership example

图 27:编辑对象所有权示例

正在清理

如果您创建了新的 Amazon S3 清单报告来测试对象 ACL 和对象所有者字段,并且不想再计费,则必须从 S3 存储桶中删除 Amazon S3 清单报告,删除 Amazon S3 清单配置,并删除 Amazon S3 清单报告 Athena 表。如果您出于测试目的创建了 IAM 角色、IAM 策略和 S3 存储桶策略,并且不再需要它们,则还建议您删除这些资源。

结论

在这篇文章中,我们详细描述了对象 ACL 和对象所有者的两个新 Amazon S3 清单报告字段。我们还演示了如何使用 Amazon S3 清单中的新对象 ACL 和对象所有者字段来帮助审计 Amazon S3 中配置了 ACL 的对象。与使用基于 API 的方法相比,使用带有对象 ACL 的 Amazon S3 清单来审计 ACL,客户现在可以享受更低的成本和更好的扩展性。 这是从 ACL 迁移到基于策略的访问控制的关键组成部分,同时使用 Amazon S3 服务器访问日志或 亚马逊云科技 CloudTrail 审计 ACL 使用情况,如本文所述。 配对后,Amazon S3 服务器访问日志可以识别活动的 ACL 使用情况。即使在非活动工作负载中,S3 清单报告也可以帮助识别 S3 对象 ACL。这为客户提供了其 S3 存储桶中对象 ACL 的全面视图。

有关带有对象 ACL 的 Amazon S3 清单的更多信息,请访问我们有关 使用对象 ACL 字段 的 文档。

有关 Amazon S3 安全最佳实践的更多信息,请访问我们关于 Amazon S3 安全最佳实践的 文档 。

感谢您阅读这篇文章。如果您有任何意见或问题,请随时在评论部分发表。