亚马逊AWS官方博客

Amazon S3 默认加密新对象

在 AWS,安全是首要任务。即日起,Amazon Simple Storage Service(Amazon S3)默认加密所有新对象。现在,S3 会自动为每个新对象应用服务器端加密(SSE-S3),除非您指定不同的加密选项。SSE-S3 于 2011 年推出。正如 Jeff 当时写道:“Amazon S3 服务器端加密以完全透明的方式处理所有加密、解密和密钥管理。当您 PUT 一个对象时,我们会生成一个唯一的密钥,并使用该密钥加密您的数据,然后使用一个[根]密钥加密该密钥。”

此次调整会自动生效另一项安全最佳实践,而不会对性能产生影响,您也无需采取任何动作。对于未使用默认加密方式的 S3 存储桶,现在默认自动应用 SSE-S3 加密。而对于当前使用 S3 默认加密方式的现有存储桶,加密方式则不会变化。

与往常一样,您可以选择使用我们提供的三个加密选项之一来加密对象:S3 默认加密(新的默认加密选项 SSE-S3)、客户提供的加密密钥(SSE-C)AWS Key Management Service 密钥(SSE-KMS)。要进行额外的加密,您还可以使用客户端库(例如 Amazon S3 加密客户端)在客户端加密对象。

虽然启用 SSE-S3 很简单,但您仍然需要选择启用它,这意味着您必须确认它在新存储桶上始终得到配置,并且随着时间的推移保持正确配置。对于要求其所有对象使用 SSE-S3 保持静态加密的组织,此更新有助于满足其加密合规性需求,而无需任何其他工具或进行客户端配置更改。

即日起,您无需进行任何操作,即可对每个 S3 存储桶应用这种基本级别的加密。

验证对象是否已得到加密
您现在就可以在 AWS CloudTrail 数据事件日志中看到此调整。在接下来几周,您将在 AWS 管理控制台Amazon S3 清单Amazon S3 Storage Lens 存储统计管理工具的 S3 部分以及 AWS CLIAWS SDK 的额外标题中看到相关调整。当加密状态在所有 AWS 区域的这些工具中可用时,我们将更新此博文和相关文档。

要验证此调整现在对您的存储桶是否生效,您可以配置 CloudTrail 以记录数据事件。默认情况下,跟踪记录不记录数据事件,启用该功能需要额外付费。数据事件显示对资源或在资源内执行的资源操作,例如用户将文件上传到 S3 存储桶这样的操作。您可以记录 Amazon S3 存储桶、AWS Lambda 函数、Amazon DynamoDB 表或它们之间的组合的数据事件。

启用后,搜索 PutObject API 可找到文件上传的信息,搜索 InitiateMultipartUpload 则可以找到分段上传的信息。当 Amazon S3 使用默认加密设置自动加密对象时,日志包含以下字段作为名称-值对:"SSEApplied":"Default_SSE_S3"。这是我使用 AWS CLI 命令 aws s3 cp backup .sh s3://private-sst 将一个文件上传到我的一个存储桶时的 CloudTrail 日志示例(在启用了数据事件日志记录的情况下)。

启用默认加密情况下的 S3 Cloudtrail 日志

Amazon S3 加密选项
正如前文所述,现在在未指定其他加密类型时,将默认使用新的基本加密级别 SSE-S3。SSE-S3 使用采用由 AWS 管理的 256 位密钥的高级加密标准(AES)。

您可以选择使用 SSE-CSSE-KMS 而不是 SSE-S3 来加密对象,可以通过“一键式”对某个存储桶设置默认加密方式来加密该存储桶中的所有对象,也可以通过 PUT 请求对单个对象进行加密。

SSE-C 让 Amazon S3 执行对象的加密和解密,同时您保留对用于加密对象的密钥的控制权。使用 SSE-C 时,您无需实现或使用客户端库来对存储在 Amazon S3 中的对象执行加密和解密,但您需要管理发送到 Amazon S3 用于加密和解密对象的密钥。

使用 SSE-KMS 时,则由 AWS Key Management Service(AWS KMS)管理您的加密密钥。使用 AWS KMS 管理您的密钥可让您获得多项额外优势。在您使用 AWS KMS 时, KMS 密钥的使用需要单独的权限,从而您可以获得额外的一层控制,并可进一步防止未经授权访问您存储在 Amazon S3 中的对象。AWS KMS 提供审计跟踪记录,因此您可以查看谁使用您的密钥在何时访问了哪个对象,以及来自未获解密数据权限的用户访问数据的失败尝试。

使用加密客户端库(例如 Amazon S3 加密客户端)时,您可以保留对密钥的控制权,并使用您选择的加密库在客户端完成对象的加密和解密。您在将对象发送到 Amazon S3 进行存储之前对其进行加密。Java、.Net、Ruby、PHP、Go 和 C++ AWS SDK 均支持客户端加密。

如果您想要对您的存储桶中的现有对象追加加密,您可以按照这篇博文中的说明进行操作。

现已推出
此调整现已在所有 AWS 区域生效,包括 AWS GovCloud(美国)AWS 中国 区域。默认的对象层级加密不收取额外费用。

— seb