🔦

CFn/CDKでS3バケットのブロックパブリックアクセスのコードを削除してもS3デフォルトの挙動にはなりません

2024/02/04に公開

こんにちは。早川です。

AWSではS3バケットを作成すると、自動的にS3ブロックパブリックアクセスが有効化されるようになり、デフォルトでのセキュリティが強化されました。

https://aws.amazon.com/jp/about-aws/whats-new/2022/12/amazon-s3-automatically-enable-block-public-access-disable-access-control-lists-buckets-april-2023/

デフォルトで有効化されるように変更されたため、IaC(CFn, AWS CDK)での構築時に、ブロックパブリックアクセスを定義しなくても、有効化されるかを確認してみます。
一方で、デフォルト値が変更される前にIaCで明示的にブロックパブリックアクセスを定義していた箇所を削除するとデフォルトの挙動になるのかを確認してみました。

結論

デフォルト設定が有効化へ変更されてからS3バケットを作成した場合は、ブロックパブリックアクセスを定義しなくても、有効化されることを確認しました。

しかし、有効化される前に明示的に記載してS3バケットを作成した場合は、該当箇所を削除してデプロイすると、有効化は維持されず無効化されることを確認しました。
おそらく、デフォルト設定の挙動を変更した場合、既存コードのブロックパブリックアクセスの状態が変更(反転する)されると思わぬ事故につながるために、このような動作にしたものと推察する。
このことから、仕様変更後にS3バケットを作成する場合は、ブロックパブリックアクセスの制御を明示しなくても有効化になるが、既存コードはブロックパブリックアクセスを削除すると無効化になるため注意が必要である。

やってみた

  • CloudFormation

    • 該当箇所をコメントアウトしています。

      AWSTemplateFormatVersion: 2010-09-09
      Description: S3 Bucket Creation Template with Public Access Block Configuration
      Resources:
        MySampleBucket:
          Type: AWS::S3::Bucket
          Properties:
            BucketName: sample-s3bucket-123456789012
            # PublicAccessBlockConfiguration:
            #   BlockPublicAcls: true
            #   IgnorePublicAcls: true
            #   BlockPublicPolicy: true
            #   RestrictPublicBuckets: true
      Outputs:
        BucketName:
          Description: S3 bucket Nmae
          Value: !Ref MySampleBucket
      
    • 実行(実行計画は省略しています)

      make apply
      1) 001-s3
      #? 1
      CFn Lint: OK
      Enter the apply profile (Current profile: sandbox)[appcode: satozou-dev][template: 001-s3]. => sandbox
      *** OK ***
      
      Waiting for changeset to be created..
      Waiting for stack create/update to complete
      Successfully created/updated stack - satozou-dev-stack-001-s3
      
    • ブロックパブリックアクセス確認

      • ブロックパブリックアクセスを明示的に定義しなくても有効になっていることが確認できました。
      make get-bpa
      {
          "PublicAccessBlockConfiguration": {
              "BlockPublicAcls": true,
              "IgnorePublicAcls": true,
              "BlockPublicPolicy": true,
              "RestrictPublicBuckets": true
          }
      }
      
    • 今度は明示して作成した後に、該当行を削除してデプロイします。

      • 先程コメントアウトした箇所を外します。
      AWSTemplateFormatVersion: 2010-09-09
      Description: S3 Bucket Creation Template with Public Access Block Configuration
      Resources:
        MySampleBucket:
          Type: AWS::S3::Bucket
          Properties:
            BucketName: sample-s3bucket-123456789012
            PublicAccessBlockConfiguration:
              BlockPublicAcls: true
              IgnorePublicAcls: true
              BlockPublicPolicy: true
              RestrictPublicBuckets: true
      Outputs:
        BucketName:
          Description: S3 bucket Nmae
          Value: !Ref MySampleBucket
      
    • 実行(実行計画は省略しています)

      make apply
      1) 001-s3
      #? 1
      CFn Lint: OK
      Enter the apply profile (Current profile: sandbox)[appcode: satozou-dev][template: 001-s3]. => sandbox
      *** OK ***
      
      Waiting for changeset to be created..
      Waiting for stack create/update to complete
      Successfully created/updated stack - satozou-dev-stack-001-s3
      
      ❯ make get-bpa
      {
          "PublicAccessBlockConfiguration": {
              "BlockPublicAcls": true,
              "IgnorePublicAcls": true,
              "BlockPublicPolicy": true,
              "RestrictPublicBuckets": true
          }
      }
      
    • ブロックパブリックアクセスが有効化された状態で作成されることが確認できます。

    • 次に、PublicAccessBlockConfiguration関連をコメントアウト(または削除)してデプロイします。

      AWSTemplateFormatVersion: 2010-09-09
      Description: S3 Bucket Creation Template with Public Access Block Configuration
      Resources:
        MySampleBucket:
          Type: AWS::S3::Bucket
          Properties:
            BucketName: sample-s3bucket-123456789012
            # PublicAccessBlockConfiguration:
            #   BlockPublicAcls: true
            #   IgnorePublicAcls: true
            #   BlockPublicPolicy: true
            #   RestrictPublicBuckets: true
      Outputs:
        BucketName:
          Description: S3 bucket Nmae
          Value: !Ref MySampleBucket
      
    • 実行(実行計画は省略しています)

      • 実行計画をだすと差分が表示されていることが確認できます。
      • ブロックパブリックアクセスが無効化されていることが確認できます。
      make apply
      1) 001-s3
      #? 1
      CFn Lint: OK
      Enter the apply profile (Current profile: sandbox)[appcode: satozou-dev][template: 001-s3]. => sandbox
      *** OK ***
      
      Waiting for changeset to be created..
      Waiting for stack create/update to complete
      Successfully created/updated stack - satozou-dev-stack-001-s3
      
      ❯ make get-bpa
      
      An error occurred (NoSuchPublicAccessBlockConfiguration) when calling the GetPublicAccessBlock operation: The public access block configuration was not found
      
    • マネコンでも「オブジェクトは公開することができます」に変更されていることが確認できます。

  • AWS CDK

    • AWS CDKもCloudFormationと同様です。
    • 「blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL」を定義すると、トランスコードされて「PublicAccessBlockConfiguration」が実行されますので、該当箇所をコメントアウトしてデプロイすると、CloudFormation同様にブロックパブリックアクセスが無効化されます。
    • blockPublicAccessを記載してS3バケットを作成した結果
      const bucket = new s3.Bucket(this, 'CreateBucket', {
          bucketName: "sample-s3bucket-123456789012",
          enforceSSL: true,
          blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL
      })
      
      make deploy
      ・・・snip・・
      
      ❯ make get-bpa
      {
          "PublicAccessBlockConfiguration": {
              "BlockPublicAcls": true,
              "IgnorePublicAcls": true,
              "BlockPublicPolicy": true,
              "RestrictPublicBuckets": true
          }
      }
      
    • blockPublicAccessをコメントアウト(または削除)してデプロイした結果
      const bucket = new s3.Bucket(this, 'CreateBucket', {
          bucketName: "sample-s3bucket-123456789012",
          enforceSSL: true,
          # blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL
      })
      
      make diff
      ・・・snip・・
      Resources
      [~] AWS::S3::Bucket CreateBucket CreateBucketABCDEF78
       └─ [-] PublicAccessBlockConfiguration
           └─ {"BlockPublicAcls":true,"BlockPublicPolicy":true,"IgnorePublicAcls":true,"RestrictPublicBuckets":true}
      
      ✨  Number of stacks with differences: 1make deploy
      ・・・snip・・
      
      ❯ make get-bpa
      
      An error occurred (NoSuchPublicAccessBlockConfiguration) when calling the GetPublicAccessBlock operation: The public access block configuration was not found
      

まとめ

  • S3バケット作成時にブロックパブリックアクセスを定義しなくても有効化されるようになり、セキュリティ対策がなされたと考える。
  • しかし、一度でもコードへ「PublicAccessBlockConfiguration」を定義してデプロイしまうと、定義しない=S3デフォルト動作(ブロックパブリックアクセス有効化)にすることが現時点ではできません。
  • 定義したまま運用するか、やむを得ずコード外で有効化する必要があります。

補足

  • AWSアカウントを組織管理している状況下では、ブロックパブリックアクセスの変更自体を抑制しているケースがあるのではないでしょうか。
  • 例えば、SCPでPublicAccessBlockをDenyで設定している場合は、「PublicAccessBlockConfiguration」をコードに記載してS3バケットを作成または変更するとDeny設定に抵触してエラーになるため注意が必要です。

この記事がどなたかの参考になれば幸いです。

東急URBAN HACKS

Discussion