我希望我的 S3 存储桶只存储使用我的 KMS 密钥加密的对象。该怎样做?

上次更新日期:2018 年 8 月 31 日

简短描述

使用 Simple Storage Service(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:

  1. 打开 Simple Storage Service(Amazon S3)控制台
  2. 选择要用于通过 AWS KMS 加密的对象的存储桶。
  3. 选择 Properties(属性)视图。
  4. 选择 Default encryption(默认加密),然后选择 AWS-KMS
  5. 选择 Save(保存)。

注意:要通过 REST API、AWS Command Line Interface(AWS CLI)或 AWS 开发工具包启用 Simple Storage Service(Amazon S3)默认加密,请参阅启用 Simple Storage Service(Amazon S3)默认存储桶加密

存储桶策略

按照以下步骤配置您的存储桶策略以拒绝以下上传请求:这些请求使用其他加密设置 (AES-256),或者使用 AWS KMS 加密但包含不是来自您的 AWS 账户的密钥 ID。

  1. 打开 Simple Storage Service(Amazon S3)控制台
  2. 选择要用于通过 AWS KMS 加密的对象的存储桶。
  3. 选择 Permissions(权限)视图。
  4. 选择 Bucket Policy(存储桶策略)。
  5. 输入类似于以下的存储桶策略:
    警告: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/*"
                }
            }
        }
    ]
}

这篇文章对您有帮助吗?


您是否需要账单或技术支持?