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

Posted

技术标签:

【中文标题】如何使用 Cloud Formation 模板在 S3 存储桶上设置 SSE-S3 或 SSE-KMS 加密?【英文标题】:How do you set SSE-S3 or SSE-KMS encryption on S3 buckets using Cloud Formation Template? 【发布时间】:2018-06-22 02:59:27 【问题描述】:

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

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

【问题讨论】:

您可以创建一个自定义资源,该资源将使用 AWS 开发工具包(如 boto3)在您的存储桶上设置默认加密配置。 这里是一个示例 CloudFormation 模板,它分配了存储桶加密策略 github.com/dcoker/cloudformation-examples/blob/master/examples/… 这可能没有帮助,但 Terraform 确实支持它,terraform.io/docs/providers/aws/r/s3_bucket.html#sse_algorithm 【参考方案1】:

AWS 添加了这个功能on January 24th, 2018:

使用 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

【讨论】:

【参考方案2】:

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

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

【讨论】:

您能否更新此内容以显示如何生成 KMSMasterKey,然后仅要求存储桶使用该密钥。【参考方案3】:

您也可以使用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

取自这里:Creating S3 Bucket with KMS Encryption via CloudFormation

【讨论】:

以上是关于如何使用 Cloud Formation 模板在 S3 存储桶上设置 SSE-S3 或 SSE-KMS 加密?的主要内容,如果未能解决你的问题,请参考以下文章

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

我能否在 SAM 模板中使用 AWS Cloud Formation 资源语法,反之亦然?

Cloud Formation 模板将入口规则添加到现有安全组

如何在 Elastic Beanstalk Cloud Formation 脚本中强制 ELB 配置

AWS:Cloud Formation:是不是可以使用多个“DependsOn”?

以下 AWS Cloud Formation 错误?