使用 S3 清单禁用 Amazon S3 访问控制列表
访问控制列表 (ACL) 定义了用户访问权限以及用户可以对特定资源采取的操作。
2021 年,我们推出了
为了帮助您禁用 ACL,我们最近在 A
在这篇文章中,我们展示了客户现在如何使用 Amazon S3 库存报告轻松查看 ACL。这使您可以利用策略提供的更高的可扩展性和灵活性来管理资源访问权限。将特定对象的权限整合到一个策略中比多个 ACL 更易于审计和更新,尤其是在大规模时。
新增 — 亚马逊 S3 库存报告现在包含 S3 ACL 元数据
A
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 类型,表示被授予者是一个 亚马逊云科技 账户。
- CanonicalID :权威
以下示例显示了 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 示例
解决方案概述
在这篇文章中,我们将介绍以下内容:
- 为您的 S3 存储桶启用亚马逊 S3 清单
- 设置
亚马逊 Athena 并从 Amazon S3 库存报告中创建 Athena 表 - 使用 Athena 查询 Amazon S3 清单并使用所有者和/或授予 ACL 元素识别对象
- 将亚马逊 S3 ACL 权限迁移到 S3 存储桶策略
- 禁用亚马逊 S3 ACL
为您的 S3 存储桶启用亚马逊 S3 清单
您可以通过导航到 S3 存储桶 管理 -> 库存配置-> 创建库存配置 来创建清单配置 。在此处指定 Amazon S3 清单报告的名称和范围,以及要保存报告的目标存储桶。接下来,设置报告的频率和输出格式,从每日或每周频率中选择 CSV、Apache ORC 和 Apache Parquet 作为输出格式。对于此解决方案,我们使用 CSV 格式的 Amazon S3 库存报告。在启用报告之前,请选择要报告的可选元数据字段,因为默认情况下,Amazon S3 清单报告包含存储桶、对象密钥、版本 ID、最新版本和删除标记字段。在此解决方案示例中,请注意,我们仅启用对象 ACL 和对象所有者的其他元数据字段,如下图所示。
图 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。在
图 3:Athena 入 门 页面 上 启动查询编辑器 的位置
4。如果这是你第一次使用 Athena,那么首先要配置你的 Athena 设置。选择 编辑设置 以继续输入存储查询结果的 S3 存储桶的路径。请注意,所选的 S3 存储桶必须位于您运行 Athena 查询 的同一
图 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 查询,如下图所示。
图 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 的三个对象的示例,如下图所示。
图 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,如下图所示。
图 10:使用完全控制 ACL Athena 查询结果识别 S3 对象
示例 3:使用 ACL 查找具有跨账户所有权的 S3 对象
您必须找到您的 亚马逊云科技 账户的规范用户 ID 才能将其放入以下查询中。要找到您的 亚马逊云科技 账户的规范用户 ID,请浏览到您的账户中的 S3 存储桶并选择 权限 选项卡。向下浏览 ACL,找到您的 亚马逊云科技 账户的规范用户 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 格式显示。
图 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。
以下是我们的示例设计的架构图:
图 14:对 S3 存储桶的跨账户 IAM 角色访问示例
在账户 2 中创建 IAM 角色
在账户 2 中,我们创建了一个 IAM 角色,该角色包含一个定义谁或什么可以代入角色的信任策略,以及通过导航到您的 亚马逊云科技 账户中的 IAM 控制台,选择 角色 ,然后选择 创建角色 来列出允许的操作 ,如下图所示。
图 15: 角色 位置 和 创建角色
现在,选择 亚马逊云科技 服务作为可信实体,然后选择 EC2,这样我们就可以将角色分配给
图 16:EC2 可信实体字段的位置
在 添加权限 页面上,选择 创建策略 , 以便我们可以直接为该角色提供 IAM 策略 JSON,如下图所示。
图 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 策略示例
图 19:IAM 权限示例
为您的 IAM 策略提供名称和描述,然后选择 创建策略 。请注意,这仅会为您即将创建的 IAM 角色创建 IAM 策略,如下图所示。
图 20:命名、审查和创建 IAM 策略
现在 IAM 策略已创建,我们可以返回 IAM 角色创建 选项卡屏幕(如下图所示),选择刷新按钮,然后搜索我们刚刚创建的 IAM 策略。找到策略后,通过选中策略名称旁边的复选框将其选中,然后选择 下一步 。
图 21:向 IAM 角色添加权限
在下图所示的下一个屏幕上,命名您的 IAM 角色,提供可选描述,然后在页面 底部选择 创建角色 以创建 IAM 角色。
图 22:命名、审查和创建 IAM 角色
创建 IAM 角色后,选择 查看角色 ,如下图所示。
图 23:查看 IAM 角色
现在选择 ARN 旁边的复制按钮来复制 IAM 角色 ARN 并将其保存在暂存板中,因为我们最终使用它来创建 S3 存储桶策略以允许访问 IAM 角色,如下图所示:
图 24:复制 IAM 角色 ARN
在账户 1 中创建 S3 存储桶策略
复制完成后,通过在控制台中键入 S3 并选择它来启动 Amazon S3 控制台,切换到 Amazon S3 服务。然后,选择要应用 S3 存储桶策略的 S3 存储桶。
选择 “ 权限 ” 选项卡,向下滚动到 “ 存储桶策略 ” ,然后选择 “ 编辑 ” 以打开存储桶策略编辑器,如下图所示。
图 25: 编辑 S3 存储桶策略
在策略编辑器中,我们添加了以下策略 JSON,允许我们刚刚创建的 IAM 角色对三个特定 S3 对象执行 Get 和 Put 操作。根据您的特定用例修改此策略,然后选择 保存更改 ,如下图所示。有关 S3 存储桶策略的更多详细信息和示例,请访问
图 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 的使用情况。
确定不再有依赖对象 ACL 的请求才能成功后,您可以导航到存储桶,选择 权限 选项卡,然后选择对象 所有权 旁边的 编辑 ,从而禁用存储桶上的 Amazon S3 对象 ACL ,在其中可以禁用存储桶上的 ACL 并保存更改,如下图所示。完成此操作后,请务必测试您对对象的跨账户权限,以确保可以像以前一样继续访问对象,并相应地更改您的存储桶策略和/或 IAM 权限。如果在此阶段出现错误,则可以轻松返回存储桶,并在需要时在存储桶上启用 ACL 以撤消更改。如果您想了解有关启用或禁用 S3 ACL 的 Amazon S3 所有权设置的更多信息,请访问这篇
图 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 清单的更多信息,请访问我们有关
有关 Amazon S3 安全最佳实践的更多信息,请访问我们关于
感谢您阅读这篇文章。如果您有任何意见或问题,请随时在评论部分发表。