使用具有 Amazon S3 托管式密钥的服务器端加密(SSE-S3)
重要
Amazon S3 现在将具有 Amazon S3 托管密钥的服务器端加密(SSE-S3)作为 Amazon S3 中每个存储桶的基本加密级别。从 2023 年 1 月 5 日起,上传到 Amazon S3 的所有新对象都将自动加密,不会产生额外费用,也不会影响性能。S3 存储桶默认加密配置和上传的新对象的自动加密状态可在 AWS CloudTrail 日志、S3 清单、S3 Storage Lens 存储统计管理工具、Amazon S3 控制台中获得,并可用作 AWS Command Line Interface 和 AWS SDK 中的附加 Amazon S3 API 响应标头。有关更多信息,请参阅默认加密常见问题解答。
默认情况下,向 Amazon S3 存储桶上传的所有新对象都使用具有 Amazon S3 托管密钥的服务器端加密(SSE-S3)进行加密。
服务器端加密可保护静态数据。Amazon S3 使用唯一的密钥来加密每个对象。作为额外的保护,它将使用定期轮换的密钥加密密钥本身。Amazon S3 服务器端加密使用 256 位高级加密标准 Galois/Counter 模式(AES-GCM)对所有上传的对象进行加密。
使用具有 Amazon S3 托管式密钥的服务器端加密(SSE-S3)不会产生额外费用。然而,请求配置默认加密特征会产生标准 Amazon S3 请求费用。有关定价的信息,请参阅 Amazon S3 定价
如果您要求仅使用 Amazon S3 托管密钥对上传的数据进行加密,则可以使用以下存储桶策略。例如,以下存储桶策略拒绝上传对象的权限,除非请求包含用于请求服务器端加密的 x-amz-server-side-encryption
标头:
{ "Version": "2012-10-17", "Id": "PutObjectPolicy", "Statement": [ { "Sid": "DenyObjectsThatAreNotSSES3", "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::
amzn-s3-demo-bucket
/*", "Condition": { "StringNotEquals": { "s3:x-amz-server-side-encryption": "AES256" } } } ] }
注意
服务器端加密仅加密对象数据而非加密对象元数据。
服务器端加密的 API 支持
默认情况下,所有 Amazon S3 存储桶都配置了加密,所有上传到 S3 存储桶的新对象都会自动静态加密。具有 Amazon S3 托管密钥的服务器端加密(SSE-S3)是 Amazon S3 中每个存储桶的默认加密配置。要使用其他类型的加密,您可以指定要在 S3 PUT
请求中使用的服务器端加密类型,也可以在目标存储桶中设置默认加密配置。
如果您想在 PUT
请求中指定不同的加密类型,则可以使用具有 AWS Key Management Service(AWS KMS)密钥的服务器端加密(SSE-KMS)、具有 AWS KMS 密钥的双层服务器端加密(DSSE-KMS)或具有客户提供的密钥的服务器端加密(SSE-C)。如果您想在目标存储桶中设置不同的默认加密配置,则可以使用 SSE-KMS 或 DSSE-KMS。
要使用对象创建 REST API 配置服务器端加密,必须提供 x-amz-server-side-encryption
请求标头。有关 REST API 的信息,请参阅 使用 REST API。
以下 Amazon S3 API 支持此标头:
-
PUT 操作 - 在使用
PUT
API 上传数据时指定请求标头。有关更多信息,请参阅 PUT Object。 -
启动分段上传 - 当使用分段上传 API 操作上传大型对象时,在启动请求中指定标头。有关更多信息,请参阅启动分段上传。
-
COPY 操作 - 在复制对象时,您同时具有源对象和目标对象。有关更多信息,请参阅 PUT Object - 复制。
注意
当使用 POST
操作上传对象时,请在表单字段中提供相同的信息,而不是提供请求标头。有关更多信息,请参阅 POST 对象。
AWS SDK 还提供了一个可用于请求服务器端加密的包装程序 API。您还可以使用 AWS Management Console 来上传对象并请求服务器端加密。
有关更多常规信息,请参阅《AWS Key Management Service 开发人员指南》中的 AWS KMS 概念。