如何使用Cloud Formation模板在S3存储桶上设置SSE-S3或SSE-KMS加密?

41

我正在尝试使用CloudFormation模板在AWS中启动一个S3存储桶。这个项目的要求之一是必须对该存储桶进行原地加密。我一直在尝试找到一种通过CloudFormation模板设置它的方法(我已经阅读了所有与SSE-S3、KMS、CFT和S3有关的文档...)。但所有迹象似乎都指向只能通过控制台进行设置。

我担心自己可能只是忽略了一些明显的东西,我想知道是否有人知道如何使用CloudFormation模板(或至少是某种自动化方式)将S3存储桶的默认加密设置为SSE-S3或SSE-KMS?


您可以创建一个自定义资源,使用AWS SDK(如boto3)在您的存储桶上设置默认加密配置。 - kichik
这是一个示例CloudFormation模板,它分配了一个存储桶加密策略 https://github.com/dcoker/cloudformation-examples/blob/master/examples/s3/s3-encrypted-only-bucket.json - John Hanley
这可能没有帮助,但Terraform支持它,https://www.terraform.io/docs/providers/aws/r/s3_bucket.html#sse_algorithm - strongjz
3个回答

57

2018年1月24日,AWS添加了以下功能:BucketEncryption属性

使用BucketEncryption属性,可以使用Amazon S3管理的密钥SSE-S3或AWS KMS管理的密钥(SSE-KMS)为存储桶指定默认加密方式。

JSON

{
  "Resources": {
    "MyBucket": {
      "Type" : "AWS::S3::Bucket",
      "Properties" : {
        "BucketEncryption": {
          "ServerSideEncryptionConfiguration": [
            {
              "ServerSideEncryptionByDefault": {
                "SSEAlgorithm": "AES256"
              }
            }
          ]
        }
      }
    }
  }
}

YAML

Resources:
  MyBucket:
    Type: "AWS::S3::Bucket"
    Properties: 
      BucketEncryption: 
        ServerSideEncryptionConfiguration: 
        - ServerSideEncryptionByDefault:
            SSEAlgorithm: AES256

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-bucketencryption.html


14

如果您有特定的KMS密钥,请使用以下方法

  ConfigBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: "mytestbucketwithkmsencryptionkey"
      AccessControl: PublicRead
      BucketEncryption: 
        ServerSideEncryptionConfiguration: 
        - ServerSideEncryptionByDefault:
            SSEAlgorithm: aws:kms
            KMSMasterKeyID: "YOUR KMS KEY ARN"     

2
你能否更新一下,展示如何生成KMSMasterKey,并且仅为存储桶要求该密钥。 - MattG

4

您还可以使用 ForceEncryption 选项:

AWSTemplateFormatVersion: '2010-09-09'
Description: Amazon S3 Bucket with 

Resources:
  CodeFlexS3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: Private
      BucketName: !Join ["-", ["codeflex-example", Ref: "AWS::Region"]]

  ForceEncryption:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref CodeFlexS3Bucket
      PolicyDocument:
        Version: "2008-10-17"
        Statement:
          - Sid: DenyUnEncryptedObjectUploads
            Effect: Deny
            Principal: "*"
            Action:
              - s3:PutObject
            Resource:
              - !Join ["", ["arn:aws:s3:::", !Ref CodeFlexS3Bucket, "/*"]]
            Condition:
              StringNotEquals:
                "s3:x-amz-server-side-encryption":
                  - "aws:kms"
    DependsOn: CodeFlexS3Bucket

参考链接:通过CloudFormation创建带有KMS加密的S3存储桶


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接