我希望我的 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)的上传对象在存储在 S3 存储桶中之前由 AWS KMS 进行加密。然后,使用存储桶策略确保不能上传具有其他加密设置 (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 SDK 启用 Amazon S3 默认加密,请参阅配置默认加密。
存储桶策略
按照以下步骤配置您的存储桶策略,以拒绝使用其他加密设置 (AES-256) 或使用 AWS KMS 加密但包含非您的 AWS 账户的密钥 ID 的上传请求:
- 打开 Amazon S3 控制台。
- 选择要用于由 AWS KMS 加密的对象的存储桶。
- 选择 Permissions(权限)视图。
- 选择 Bucket Policy(存储桶策略)。
- 输入与以下内容类似的存储桶策略:
**注意:**将 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/*"
}
}
}
]
}
相关信息
Amazon Simple Storage Service (Amazon S3) 如何使用 AWS KMS