使用批量操作为 SSE-KMS 启用 S3 存储桶密钥
S3 存储桶密钥通过减少从 Amazon S3 到 AWS KMS 的请求流量,降低了具有 AWS Key Management Service(AWS KMS)的服务器端加密(SSE-KMS)的成本。有关更多信息,请参阅使用 Amazon S3 存储桶密钥降低 SSE-KMS 的成本 和将存储桶配置为将 S3 存储桶密钥与 SSE-KMS 结合使用于新对象。当您使用 REST API、AWS SDK 或 AWS CLI 执行 CopyObject
操作时,可以通过添加带有 true
或 false
值的 x-amz-server-side-encryption-bucket-key-enabled
请求标头,在对象级别启用或禁用 S3 存储桶密钥。
当您使用 CopyObject
操作为对象配置 S3 存储桶密钥时,Amazon S3 仅更新该对象的设置。目标存储桶的 S3 存储桶密钥设置不会发生变化。如果您向启用了 S3 存储桶密钥的存储桶提交对于 AWS KMS 加密对象的 CopyObject
请求,对象级操作将自动使用 S3 存储桶密钥,则除非您在请求标头中禁用这些密钥。如果您未为对象指定 S3 存储桶密钥,则 Amazon S3 会将目标存储桶的 S3 存储桶密钥设置应用于该对象。
要加密现有 Amazon S3 对象,可以使用 S3 批量操作。您可以使用批量操作复制操作复制现有的未加密对象,并将其作为加密对象写回同一存储桶。有关更多信息,请参阅 AWS 存储博客上的 Encrypting objects with Amazon S3 Batch Operations
在以下示例中,使用批量操作复制操作在现有对象上启用 S3 存储桶密钥。有关更多信息,请参阅 在对象级别配置 S3 存储桶密钥 。
主题
使用 S3 批量操作通过已启用的 S3 存储桶密钥加密对象的注意事项
使用 S3 批量操作通过已启用的 S3 存储桶密钥加密对象时,请考虑以下问题:
-
除了与 S3 批量操作代表您执行的操作关联的任何费用之外(包括数据传输、请求等费用),您还需要为 S3 批量操作任务、对象和请求付费。有关更多信息,请参阅 Amazon S3 定价
。 -
如果您使用受版本控制的桶,则执行的每个 S3 分批操作任务都会创建对象的新加密版本。另外,无需配置 S3 桶密钥即可维护以前的版本。要删除旧版本,请为非当前版本设置 S3 生命周期过期策略,如 生命周期配置元素。
-
复制操作会创建具有新创建日期的新对象,这会影响生命周期操作(如归档)。如果您复制桶中的所有对象,所有新副本均具有相同或相似的创建日期。要进一步识别这些对象并为各种数据子集创建不同的生命周期规则,请考虑使用对象标签。
先决条件
在将对象配置为使用 S3 存储桶密钥之前,请查看启用 S3 存储桶密钥之前需要注意的更改。
要使用此示例,您必须具有 AWS 账户和至少一个 S3 存储桶来存放工作文件和加密的结果。您可能还会发现许多有用的现有 S3 分批操作文档,包括以下主题:
第 1 步:使用 Amazon S3 清单获取对象列表
要开始操作,请确定包含要加密对象的 S3 Bucket,并获取其内容列表。Amazon S3 清单报告是完成此操作的最方便且最经济的方式。报告提供存储桶中对象的列表及其关联的元数据。在此步骤中,源存储桶是进行清点的存储桶,目标存储桶是您存储清单报告文件的存储桶。有关 Amazon S3 清单源桶和目标桶的更多信息,请参阅 使用 S3 清单对数据进行编目和分析。
设置清单最简单的方法是使用 AWS Management Console。但您也可以使用 REST API、AWS Command Line Interface (AWS CLI) 或 AWS 开发工具包。执行以下步骤之前,请务必登录控制台,并通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/
使用 S3 清单获取对象列表
通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/
。 -
在左侧导航窗格中,选择存储桶,然后选择包含要加密的对象的存储桶。
-
在 Management (管理) 选项卡导航至 Inventory configurations (清单配置) 部分,然后选择 Create inventory configuration (创建清单配置)。
-
为您的新清单命名,输入目标 S3 Bucket 的名称,并可选择为 Amazon S3 创建目标前缀,以便在该桶中分配对象。
-
为 Output format (输出格式) 选择 CSV。
-
(可选)在其他字段 – 可选部分中,选择加密以及您感兴趣的任何其他报告字段。将报告发送频率设置为 Daily(每天),以便更快将第一个报告发送到您的桶。
-
选择 Create (创建) 以保存您的配置。
Amazon S3 可能需要长达 48 小时才能交付第一个报告,所以当第一个报告到达时请予以查看。收到第一个报告后,请转入下一步来筛选 S3 清单报告的内容。如果您不再希望接收此桶的清单报告,请删除您的 S3 清单配置。否则,Amazon S3 会继续按每日或每周计划提供报告。
清单列表并非所有对象的单个时间点视图。清单列表是桶项的滚动快照,最终是一致的(例如,列表可能不包含最近添加或删除的对象)。当您使用静态对象或两天乃至更多天之前创建的对象集时,将 S3 清单和 S3 分批操作结合使用效果最佳。要处理最新数据,请使用 ListObjectsV2(GET
存储桶)API 操作来手动构建对象列表。如有需要,请在接下来的几天内重复该过程,或直到清单报告显示所有对象的理想状态。
第 2 步:使用 S3 Select 筛选对象列表
收到 S3 清单报告后,可以筛选报告的内容,以仅列出未使用已启用的 S3 存储桶密钥进行加密的对象。如果您希望使用已启用的 S3 存储桶密钥来加密存储桶的所有对象,则可以忽略此步骤。但是,在此阶段筛选 S3 清单报告,则对于先前使用已启用的 S3 存储桶密钥加密的对象,可以节省对其重新加密的时间和费用。
尽管以下步骤介绍的是如何使用 Amazon S3 Selectmanifest.json
文件。此文件列出了与该报告关联的数据文件的数量。如果数量较大,请使用 Amazon Athena,因为其运行在多个 S3 对象之间,而 S3 Select 一次仅适用一个对象。有关将 Amazon S3 和 Athena 结合使用的更多信息,请参阅使用 Amazon Athena 查询 Amazon S3 清单以及 AWS 存储博客文章 Encrypting objects with Amazon S3 Batch Operations
使用 S3 Select 筛选 S3 清单报告
-
打开清单报告中的
manifest.json
文件,然后查看 JSON 中的fileSchema
部分。这将通知您的数据运行查询。以下 JSON 是一个示例
manifest.json
文件,用于查看已启用版本控制的桶上的 CSV 格式清单。根据您配置库存报告的方式,您的清单可能会有所不同。{ "sourceBucket": "batchoperationsdemo", "destinationBucket": "arn:aws:s3:::
amzn-s3-demo-destination-bucket
", "version": "2021-05-22", "creationTimestamp": "1558656000000", "fileFormat": "CSV", "fileSchema": "Bucket, Key, VersionId, IsLatest, IsDeleteMarker, BucketKeyStatus", "files": [ { "key": "demoinv/batchoperationsdemo/DemoInventory/data/009a40e4-f053-4c16-8c75-6100f8892202.csv.gz", "size": 72691, "MD5checksum": "c24c831717a099f0ebe4a9d1c5d3935c" } ] }如果桶未激活版本控制,或者您选择运行最新版本报告,则
fileSchema
是Bucket
、Key
和BucketKeyStatus
。如果激活了版本控制,根据您设置清单报告的方式,
fileSchema
可能包括:Bucket
、Key
、VersionId
、IsLatest
、IsDeleteMarker
、BucketKeyStatus
。因此,当您运行查询时,请注意第 1、2、3 和 6 栏。除了搜索依据字段(即
BucketKeyStatus
)外,S3 批量操作还需要输入桶、密钥和版本 ID 以执行任务。您不需要VersionID
字段,但在对受版本控制的存储桶进行操作时,指定VersionID
字段很有用。有关更多信息,请参阅 使用启用版本控制的存储桶中的对象。 -
找到清单报告的数据文件。
manifest.json
对象列出了文件夹下的数据文件。 -
在 S3 控制台中找到并选择数据文件后,选择 Actions (操作),然后选择 Query with S3 Select (使用 S3 Select 进行查询)。
-
保留预设 CSV、逗号 和 GZIP 字段,然后选择 Next (下一步)。
-
如需在继续操作之前检查清单报告格式,请选择 Show file preview (显示文件预览)。
-
在 SQL 表达式字段中输入要引用的列,然后选择 Run SQL(运行 SQL)。以下表达式为未配置 S3 桶密钥的所有对象返回列 1-3。
select s._1, s._2, s._3 from s3object s where s._6 = 'DISABLED'
以下是示例结果。
batchoperationsdemo,0100059%7Ethumb.jpg,lsrtIxksLu0R0ZkYPL.LhgD5caTYn6vu batchoperationsdemo,0100074%7Ethumb.jpg,sd2M60g6Fdazoi6D5kNARIE7KzUibmHR batchoperationsdemo,0100075%7Ethumb.jpg,TLYESLnl1mXD5c4BwiOIinqFrktddkoL batchoperationsdemo,0200147%7Ethumb.jpg,amufzfMi_fEw0Rs99rxR_HrDFlE.l3Y0 batchoperationsdemo,0301420%7Ethumb.jpg,9qGU2SEscL.C.c_sK89trmXYIwooABSh batchoperationsdemo,0401524%7Ethumb.jpg,ORnEWNuB1QhHrrYAGFsZhbyvEYJ3DUor batchoperationsdemo,200907200065HQ%7Ethumb.jpg,d8LgvIVjbDR5mUVwW6pu9ahTfReyn5V4 batchoperationsdemo,200907200076HQ%7Ethumb.jpg,XUT25d7.gK40u_GmnupdaZg3BVx2jN40 batchoperationsdemo,201103190002HQ%7Ethumb.jpg,z.2sVRh0myqVi0BuIrngWlsRPQdb7qOS
-
下载结果,将其保存为 CSV 格式,然后将其作为 S3 分批操作任务的对象列表上传至 Amazon S3。
-
如果您有多个清单文件,也请对它们运行 Query with S3 Select (使用 S3 Select 进行查询)。根据结果的大小,您可以合并列表并运行单个 S3 分批操作任务,或将每个列表作为单独任务运行。要决定要运行的任务数量,请考虑运行每个 S3 批量操作任务的价格
。
第 3 步:设置并运行 S3 分批操作任务
现在,您有了 S3 对象的筛选 CSV 列表,可以开始 S3 批量操作任务,以使用已启用的 S3 存储桶密钥来加密对象。
任务指提供的对象列表(清单)、执行的操作以及指定的参数的统称。使用已启用的 S3 存储桶密钥加密此对象集的最简单方法是使用复制操作,并指定与清单中列出的对象相同的目标前缀。在不受版本控制的存储桶中,此操作会覆盖现有对象。在开启了版本控制的存储桶中,此操作将创建对象的较新的加密版本。
作为复制对象的一部分,指定 Amazon S3 应使用 SSE-KMS 加密来为对象进行加密。此任务会复制这些对象,因此,所有对象在完成时都显示更新后的创建日期,无论最初是何时将其添加到 Amazon S3 的。另外,在 S3 分批操作任务中指定对象集的其他属性,包括对象标记和存储类。
设置 IAM 策略
通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/
。 -
在左侧导航窗格中,选择策略,然后选择创建策略。
-
选择 JSON 选项卡。选择 Edit Policy (编辑策略),然后添加出现在以下代码块中的示例 IAM 策略。
将策略示例复制到 IAM 控制台
后,请替换以下内容: -
将
替换为要从中复制对象的源存储桶的名称。amzn-s3-demo-source-bucket
-
将
替换为要向其中复制对象的目标存储桶的名称。amzn-s3-demo-destination-bucket
-
将
替换为清单对象的名称。amzn-s3-demo-manifest-bucket
/manifest-key
-
将
替换为要用于保存完成报告的存储桶的名称。amzn-s3-demo-completion-report-bucket
{ "Version": "2012-10-17", "Statement": [ { "Sid": "CopyObjectsToEncrypt", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:PutObjectTagging", "s3:PutObjectAcl", "s3:PutObjectVersionTagging", "s3:PutObjectVersionAcl", "s3:GetObject", "s3:GetObjectAcl", "s3:GetObjectTagging", "s3:GetObjectVersion", "s3:GetObjectVersionAcl", "s3:GetObjectVersionTagging" ], "Resource": [ "arn:aws:s3:::
amzn-s3-demo-source-bucket
/*", "arn:aws:s3:::amzn-s3-demo-destination-bucket
/*" ] }, { "Sid": "ReadManifest", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:GetObjectVersion" ], "Resource": "arn:aws:s3:::
" }, { "Sid": "WriteReport", "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::amzn-s3-demo-manifest-bucket
/manifest-key
amzn-s3-demo-completion-report-bucket
/*" } ] } -
-
选择 Next: Tags (下一步:标签)。
-
添加您想要的所有标签(可选),然后选择 Next: Review (下一步:审核)。
-
添加策略名称,可添加描述,然后选择 Create Policy (创建策略)。
-
选择 Review policy (查看策略) 和 Save changes (保存更改)。
-
您的 S3 分批操作策略现已完成,控制台会将您返回到 IAM Policies (策略) 页面。筛选策略名称,选择策略名称左侧的按钮,选择 Policy actions (策略操作),然后选择 Attach (附加)。
如需将新创建的策略附加到 IAM 角色,请在账户中选择相应的用户、组或角色,然后选择 Attach policy (附加策略)。系统会带您返回 IAM 控制台。
设置分批操作 IAM 角色
-
在 IAM 控制台
的导航窗格中,选择角色,然后选择创建角色。 -
选择 AWS 服务、S3 和 S3 批量操作。然后选择 Next: Permissions (下一步:权限)。
-
输入您刚刚创建的 IAM 策略的名称。根据出现的策略名称选中相应名称,然后选择 Next: Tags (下一步:标签)。
-
(可选)为本次练习添加标签或将密钥和值字段保留为空。选择 Next: Review (下一步:审核)。
-
输入角色名称,然后接受默认说明或添加您自己的说明。选择 Create role (创建角色)。
-
确保创建任务的用户具有以下示例中的权限。
将
替换为您的 AWS 账户 ID,并将account-id
替换为您计划应用于稍后将在批量操作任务创建步骤中创建的 IAM 角色的名称。有关更多信息,请参阅 授予批处理操作的权限。IAM-role-name
{ "Sid": "AddIamPermissions", "Effect": "Allow", "Action": [ "iam:GetRole", "iam:PassRole" ], "Resource": "arn:aws:iam::
account-id
:role/IAM-role-name
" }
为现有存储桶启用 S3 存储桶密钥
通过以下网址打开 Simple Storage Service(Amazon S3)控制台:https://console.aws.amazon.com/s3/
。 -
在桶列表中,选择要为其启用 S3 桶密钥的桶。
-
选择 Properties (属性)。
-
在 Default encryption (默认加密) 下,请选择 Edit (编辑)。
-
在加密类型下,您可以在 Amazon S3 托管式密钥(SSE-S3)和 AWS Key Management Service 密钥(SSE-KMS)之间进行选择。
-
如果您选择了 AWS Key Management Service 密钥(SSE-KMS),则在 AWS KMS key 之下,您可以通过以下选项之一指定 AWS KMS 密钥。
-
要从可用的 KMS 密钥列表中进行选择,请选择从您的 AWS KMS 密钥中进行选择。从可用密钥的列表中,选择与桶位于同一区域的对称加密 KMS 密钥。AWS 托管式密钥(
aws/s3
)和您的客户自主管理型密钥都显示在列表中。 -
要输入 KMS 密钥 ARN,请选择输入 AWS KMS 密钥 ARN,然后在显示的字段中输入您的 KMS 密钥 ARN。
-
要在 AWS KMS 控制台中创建新的客户自主管理型密钥,请选择创建 KMS 密钥。
-
-
在 Bucket Key(桶密钥)中,选择 Enable(启用),然后选择 Save changes(保存更改)。
现在,S3 存储桶密钥已在存储桶级别启用,默认情况下,上传、修改或复制到此存储桶中的对象将继承此加密配置。这包括使用 Amazon S3 批量操作复制的对象。
创建分批操作任务
通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/
。 -
在导航窗格中,选择 Batch Operations (分批操作),然后选择 Create Job (创建任务)。
-
选择您存储对象的 Region (区域),然后选择 CSV 作为清单类型。
-
输入路径或导航至您之前从 S3 Select(或 Athena)结果创建的 CSV 清单文件。如果您的清单包含版本 ID,请选中该框。选择 Next (下一步)。
-
选择 Copy 操作,然后选择复制目标桶。您可以保持禁用服务器端加密。只要桶目标启用了 S3 桶密钥,复制操作将在目标桶上应用 S3 桶密钥。
-
(可选)根据需要选择存储类和其他参数。您在此步骤中指定的参数将应用于清单中列出的对象执行的所有操作。选择下一步。
-
要配置服务器端加密,请执行以下步骤:
-
在服务器端加密下,选择以下选项之一:
-
要在将对象存储在 Amazon S3 中时保留适用于对象原定设置服务器端加密的桶设置,请选择不要指定加密密钥。只要桶目标启用了 S3 桶密钥,复制操作就将在目标桶上应用 S3 桶密钥。
注意
如果指定的目标的桶策略要求在将对象存储到 Amazon S3 之前对其进行加密,则必须指定加密密钥。否则,将对象复制到目标将失败。
-
要在将对象存储到 Amazon S3 之前对其进行加密,请选择指定加密密钥。
-
-
在加密设置下,如果您选择指定加密密钥,则必须选择使用用于原定设置加密的目标桶设置或覆盖用于原定设置加密的目标桶设置。
-
如果您选择覆盖用于原定设置加密的目标桶设置,则必须配置以下加密设置。
-
在加密类型下,您必须选择 Amazon S3 托管式密钥(SSE-S3)或 AWS Key Management Service 密钥(SSE-KMS)。SSE-S3 使用最强的数据块密码之一 [即 256 位高级加密标准(AES-256)] 来加密每个对象。SSE-KMS 为您提供了对密钥的更多控制。有关更多信息,请参阅使用具有 Amazon S3 托管式密钥的服务器端加密(SSE-S3) 和使用具有 AWS KMS 密钥的服务器端加密(SSE-KMS)。
-
如果您选择 AWS Key Management Service 密钥(SSE-KMS),则在 AWS KMS key 之下,您可以通过以下选项之一指定 AWS KMS key。
-
要从可用 KMS 密钥列表中进行选择,请选择从您的 AWS KMS keys 中进行选择,然后选择与桶位于同一区域的对称加密 KMS 密钥。AWS 托管式密钥(
aws/s3
)和您的客户自主管理型密钥都显示在列表中。 -
要输入 KMS 密钥 ARN,请选择输入 AWS KMS 密钥 ARN,然后在显示的字段中输入您的 KMS 密钥 ARN。
-
要在 AWS KMS 控制台中创建新的客户自主管理型密钥,请选择创建 KMS 密钥。
-
-
在 Bucket Key(存储桶密钥)下,请选择 Enable(启用)。复制操作将在目标桶应用 S3 桶密钥。
-
-
-
提供任务说明(或保留默认值),设置其优先级,选择报告类型,然后指定 Path to completion report destination (完成报告目标的路径)。
-
在 Permissions (权限) 部分,请确保选择您之前定义的分批操作 IAM 角色。选择 Next (下一步)。
-
在 Review (审核) 中验证设置。如果需要进行更改,请选择 Previous (上一步)。确认分批操作设置后,选择 Create job (创建任务)。
有关更多信息,请参阅 创建 S3 批量操作任务。
运行您的分批操作任务
安装向导将自动将您返回 Amazon S3 控制台的 S3 分批操作部分。随着 S3 开始此过程,您的新任务将从 New (新建) 状态变为 Preparing (准备中) 状态。在 Preparing (准备中) 状态下,S3 会读取任务清单,检查是否存在错误,并计算对象数量。
-
在 Amazon S3 控制台中选择刷新按钮以检查进度。根据清单的大小,读取可能需要几分钟或几小时。
-
S3 读取任务清单后,任务将转移至 Awaiting your confirmation (待确认) 状态。选择任务 ID 左侧的选项按钮,然后选择 Run job (运行任务)。
-
检查任务设置,然后选择右下角的 Run job (运行任务)。
任务开始运行后,您可以选择刷新按钮通过控制台控制面板视图或选择特定任务来检查进度。
-
任务完成后,您可以查看 Successful (成功) 和 Failed (失败) 对象数量以确认所有任务均按预期执行。如果您启用了任务报告,请检查任务报告,了解失败操作的确切原因。
还可以使用 AWS CLI、AWS SDK 或 Amazon S3 REST API 来执行这些步骤。有关追踪任务状态和完成报告的更多信息,请参阅 跟踪任务状态和完成报告。