我希望我的 Amazon Simple Storage Service (Amazon S3) 存储桶仅存储使用我的 AWS 账户中的 AWS Key Management Service (AWS KMS) 密钥加密的对象。我怎样才能确保只有那些对象可以上传到我的存储桶?
使用 Amazon S3 默认加密可确保在没有加密标头(例如 x-amz-server-side-encryption 和 x-amz-server-side-encryption-aws-kms-key-id)的情况下上传的对象先通过 AWS KMS 加密,然后再存储到您的 S3 存储桶中。然后,使用存储桶策略确保无法上传具有其他加密设置 (AES-256) 的对象,并且使用 AWS KMS 加密上传的对象包含来自您的 AWS 账户的密钥 ID。
注意: 要上传使用 AWS KMS 密钥加密的对象,密钥和 S3 存储桶必须在同一 AWS 区域中。
Amazon S3 默认加密
按照以下步骤,使用 Amazon S3 控制台将存储桶的 Amazon S3 默认加密设置为 AWS KMS:
- 打开 Amazon S3 控制台。
- 选择要用于通过 AWS KMS 加密的对象的存储桶。
- 选择 Properties (属性) 视图。
- 选择 Default encryption (默认加密),然后选择 AWS-KMS。
- 选择 Save。
注意:要通过 REST API、AWS 命令行界面 (AWS CLI) 或 AWS 开发工具包启用 Amazon S3 默认加密,请参阅如何为 S3 存储桶设置 Amazon S3 默认加密?
存储桶策略
按照以下步骤配置您的存储桶策略以拒绝以下上传请求:这些请求使用其他加密设置 (AES-256),或者使用 AWS KMS 加密但包含不是来自您的 AWS 账户的密钥 ID。
- 打开 Amazon S3 控制台。
- 选择要用于通过 AWS KMS 加密的对象的存储桶。
- 选择路由视图。
- 选择存储桶策略。
- 输入类似于以下的存储桶策略:
警告:将 samplebucketname 替换为您的存储桶的名称,并且将 us-east-1:111122223333 替换为正确的 AWS 区域和您的 AWS 账户 ID。
{ "Version": "2012-10-17", "Id": "PutObjPolicy", "Statement": [ { "Sid": "DenySSE-S3", "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::samplebucketname/*", "Condition": { "StringEquals": { "s3:x-amz-server-side-encryption": "AES256" } } }, { "Sid": "RequireKMSEncryption", "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::samplebucketname/*", "Condition": { "StringNotLikeIfExists": { "s3:x-amz-server-side-encryption-aws-kms-key-id": "arn:aws:kms:us-east-1:111122223333:key/*" } } } ] }