设置和监控目录存储桶的默认加密 - Amazon Simple Storage Service

设置和监控目录存储桶的默认加密

默认设置情况下,Amazon S3 存储桶启用了存储桶加密,并且通过具有 Amazon S3 托管密钥的服务器端加密(SSE-S3)来自动加密新对象。这种加密适用于您的 Amazon S3 存储桶中的所有新对象,并且不收取任何费用。

如果您需要对加密密钥进行更多控制,例如管理密钥轮换和访问策略授予,则可以选择使用具有 AWS Key Management Service(AWS KMS)密钥的服务器端加密(SSE-KMS)。

注意
  • 我们建议存储桶的默认加密使用所需的加密配置,并且不要在 CreateSession 请求或 PUT 对象请求中覆盖存储桶默认加密。然后,使用所需的加密设置自动对新对象进行加密。有关目录存储桶中加密覆盖行为的更多信息,请参阅 Specifying server-side encryption with AWS KMS for new object uploads

  • 要使用 SSE-KMS 加密目录存储桶中的新对象,必须将具有 KMS 密钥(特别是客户自主管理型密钥)的 SSE-KMS 指定为目录存储桶的默认加密配置。然后,在为可用区端点 API 操作创建会话时,将在会话期间使用 SSE-KMS 和 S3 存储桶密钥自动加密和解密新对象。

  • 当您将默认存储桶加密设置为 SSE-KMS 时,将始终为目录存储桶中的 GETPUT 操作启用 S3 存储桶密钥,并且不能禁用。当您通过 CopyObjectUploadPartCopy批量操作中的 Copy 操作import 任务,将 SSE-KMS 加密的对象从通用存储桶复制到目录存储桶、从目录存储桶复制到通用存储桶,或在目录存储桶之间复制时,不支持 S3 存储桶密钥。在这种情况下,每次对 KMS 加密的对象发出复制请求时,Amazon S3 都会调用 AWS KMS。有关 S3 存储桶密钥如何降低 AWS KMS 请求成本的更多信息,请参阅使用 Amazon S3 存储桶密钥降低 SSE-KMS 的成本

  • 当您在目录存储桶中指定用于加密的 AWS KMS customer managed key 时,请仅使用密钥 ID 或密钥 ARN。不支持 KMS 密钥的密钥别名格式。

  • 对于目录存储桶中的默认加密,不支持具有 AWS KMS 密钥的双层服务器端加密(DSSE-KMS)和具有客户提供的密钥的服务器端加密(SSE-C)。

有关配置默认加密的更多信息,请参阅配置默认加密

有关默认加密所需的权限的更多信息,请参阅《Amazon Simple Storage Service API 参考》中的 PutBucketEncryption

您可以使用 Amazon S3 控制台、AWS SDK、Amazon S3 REST API 和 AWS Command Line Interface(AWS CLI)为 S3 存储桶配置 Amazon S3 默认加密。

在 Amazon S3 存储桶上配置默认加密
  1. 登录到AWS Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

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

  3. Buckets(存储桶)列表中,请选择您想要的存储桶的名称。

  4. 选择属性选项卡。

  5. 服务器端加密设置下,目录存储桶使用具有 Amazon S3 托管式密钥(SSE-S3)的服务器端加密。

  6. 选择 Save changes(保存更改)

这些示例说明如何使用 SSE-S3 或将 SSE-KMS 与 S3 存储桶密钥结合使用来配置默认加密。

有关默认加密的更多信息,请参阅为 Amazon S3 存储桶设置默认服务器端加密行为。有关使用 AWS CLI 配置默认加密的更多信息,请参阅 put-bucket-encryption

例 – 使用 SSE-S3 进行默认加密

此示例使用 Amazon S3 托管密钥来配置默认存储桶加密。要使用该命令,请将用户输入占位符 替换为您自己的信息。

aws s3api put-bucket-encryption --bucket bucket-base-name--azid--x-s3 --server-side-encryption-configuration '{ "Rules": [ { "ApplyServerSideEncryptionByDefault": { "SSEAlgorithm": "AES256" } } ] }'
例 – 使用 S3 存储桶密钥通过 SSE-KMS 进行默认加密

此示例使用 S3 存储桶密钥通过 SSE-KMS 配置默认存储桶加密。要使用该命令,请将用户输入占位符 替换为您自己的信息。

aws s3api put-bucket-encryption --bucket bucket-base-name--azid--x-s3 --server-side-encryption-configuration '{ "Rules": [ { "ApplyServerSideEncryptionByDefault": { "SSEAlgorithm": "aws:kms", "KMSMasterKeyID": "KMS-Key-ARN" }, "BucketKeyEnabled": true } ] }'

使用 REST API PutBucketEncryption 操作可设置默认加密,要使用的服务器端加密类型为 SSE-S3 或 SSE-KMS。

有关更多信息,请参阅《Amazon Simple Storage Service API 参考》中的 PutBucketEncryption

使用 AWS SDK 时,您可以请求 Amazon S3 使用 AWS KMS keys 进行服务器端加密。以下适用于 Java 和 .NET 的 AWS SDK 示例使用 SSE-KMS 和 S3 存储桶密钥为目录存储桶配置默认加密配置。有关其它 SDK 的信息,请参阅 AWS 开发人员中心上的示例代码和库

重要

在 Amazon S3 中使用 AWS KMS key 进行服务器端加密时,您必须选择对称加密 KMS 密钥。Amazon S3 仅支持对称加密 KMS 密钥。有关这些密钥的更多信息,请参阅《AWS Key Management Service 开发人员指南》中的对称加密 KMS 密钥

Java

使用AWS SDK for Java 2.x,可以通过 applyServerSideEncryptionByDefault 方法来指定目录存储桶的默认加密配置(也即使用 SSE-KMS 进行数据加密),从而请求 Amazon S3 使用 AWS KMS key。可以创建对称加密 KMS 密钥并在请求中指定该密钥。

import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.PutBucketEncryptionRequest; import software.amazon.awssdk.services.s3.model.ServerSideEncryption; import software.amazon.awssdk.services.s3.model.ServerSideEncryptionByDefault; import software.amazon.awssdk.services.s3.model.ServerSideEncryptionConfiguration; import software.amazon.awssdk.services.s3.model.ServerSideEncryptionRule; public class Main { public static void main(String[] args) { S3Client s3 = S3Client.create(); String bucketName = "bucket-base-name--azid--x-s3"; String kmsKeyId = "your-kms-customer-managed-key-id"; // AWS managed KMS keys aren't supported. Only customer-managed keys are supported. ServerSideEncryptionByDefault serverSideEncryptionByDefault = ServerSideEncryptionByDefault.builder() .sseAlgorithm(ServerSideEncryption.AWS_KMS) .kmsMasterKeyID(kmsKeyId) .build(); // The bucketKeyEnabled field is enforced to be true. ServerSideEncryptionRule rule = ServerSideEncryptionRule.builder() .bucketKeyEnabled(true) .applyServerSideEncryptionByDefault(serverSideEncryptionByDefault) .build(); ServerSideEncryptionConfiguration serverSideEncryptionConfiguration = ServerSideEncryptionConfiguration.builder() .rules(rule) .build(); PutBucketEncryptionRequest putRequest = PutBucketEncryptionRequest.builder() .bucket(bucketName) .serverSideEncryptionConfiguration(serverSideEncryptionConfiguration) .build(); s3.putBucketEncryption(putRequest); } }

有关创建客户托管密钥的更多信息,请参阅 AWS Key Management Service 开发人员指南中的对 AWS KMS API 进行编程

有关上传对象的工作代码示例,请参阅以下主题。要使用这些示例,您必须更新这些代码示例并提供加密信息,如上述代码片段所示。

.NET

使用AWS SDK for .NET,可以通过 ServerSideEncryptionByDefault 属性来指定目录存储桶的默认加密配置(也即使用 SSE-KMS 进行数据加密),从而请求 Amazon S3 使用 AWS KMS key。可以创建对称加密客户自主管理型密钥并在请求中指定该密钥。

// Set the bucket server side encryption to use AWSKMS with a customer-managed key id. // bucketName: Name of the directory bucket. "bucket-base-name--azid--x-s3" // kmsKeyId: The Id of the customer managed KMS Key. "your-kms-customer-managed-key-id" // Returns True if successful. public static async Task<bool> SetBucketServerSideEncryption(string bucketName, string kmsKeyId) { var serverSideEncryptionByDefault = new ServerSideEncryptionConfiguration { ServerSideEncryptionRules = new List<ServerSideEncryptionRule> { new ServerSideEncryptionRule { ServerSideEncryptionByDefault = new ServerSideEncryptionByDefault { ServerSideEncryptionAlgorithm = ServerSideEncryptionMethod.AWSKMS, ServerSideEncryptionKeyManagementServiceKeyId = kmsKeyId } } } }; try { var encryptionResponse =await _s3Client.PutBucketEncryptionAsync(new PutBucketEncryptionRequest { BucketName = bucketName, ServerSideEncryptionConfiguration = serverSideEncryptionByDefault, }); return encryptionResponse.HttpStatusCode == HttpStatusCode.OK; } catch (AmazonS3Exception ex) { Console.WriteLine(ex.ErrorCode == "AccessDenied" ? $"This account does not have permission to set encryption on {bucketName}, please try again." : $"Unable to set bucket encryption for bucket {bucketName}, {ex.Message}"); } return false; }

有关创建客户托管密钥的更多信息,请参阅 AWS Key Management Service 开发人员指南中的对 AWS KMS API 进行编程

有关上传对象的工作代码示例,请参阅以下主题。要使用这些示例,您必须更新这些代码示例并提供加密信息,如上述代码片段所示。

使用 AWS CloudTrail 监控目录存储桶的默认加密

可以使用 AWS CloudTrail 事件跟踪 Amazon S3 目录存储桶的默认加密配置请求。CloudTrail 日志中使用以下 API 事件名称:

  • PutBucketEncryption

  • GetBucketEncryption

  • DeleteBucketEncryption

注意
  • 目录存储桶不支持 EventBridge。

  • 目录存储桶不支持具有 AWS Key Management Service(AWS KMS)密钥的双层服务器端加密(DSSE-KMS),也不支持具有客户提供的加密密钥的服务器端加密(SSE-C)。

有关使用 AWS CloudTrail 监控默认加密的更多信息,请参阅使用 AWS CloudTrail 和 Amazon EventBridge 监控默认加密