2023年 4月から順次、S3 の ブロックパブリックアクセスが デフォルトで有効になります。

記事タイトルとURLをコピーする

こんにちは。 技術課の山本です。

最近は冬山シーズンが来て、テンションが上がっています。
手始めに乗鞍岳に登りました。最高でした。

今年は色々な冬山に挑戦しようと思っています。

2023年 4月から順次、S3 の ブロックパブリックアクセスが デフォルトで有効になります。

こんな予告が出ています。

Advanced Notice: Amazon S3 will automatically enable S3 Block Public Access and disable access control lists for all new buckets starting in April 2023

Starting in April 2023, Amazon S3 will introduce two new default bucket security settings by automatically enabling S3 Block Public Access and disabling S3 access control lists (ACLs) for all new S3 buckets. Once complete, these defaults will apply to all new buckets regardless of how they are created, including AWS CLI, APIs, SDKs, and AWS CloudFormation. These defaults have been in place for buckets created in the S3 management console since the two features became available in 2018 and 2021, respectively, and are recommended security best practices. There is no change for existing buckets.

要約:

2023年 4月以降に新規作成する S3 バケットは以下の設定がデフォルトになります。

  • ブロックパブリックアクセスが有効
  • アクセスコントロールリスト (ACL) が無効

AWS マネジメントコンソールから作成する場合、上記は既にデフォルトです。
2023年 4月以降は、AWS CLI、API、SDK、CloudFormation で作成した S3 バケットについても上記がデフォルトになります。

2023 年 4月以降、順次全てのリージョンに、これらのデフォルトを展開します。
これらのデフォルト値は、S3バケット内のオブジェクト(ファイル)を不必要にインターネット公開しないための、セキュリティのベストプラクティスです。
なお、既存のS3バケットについては、変更無しです。既存のバケットは、今の設定のままです。

S3 のオブジェクトをインターネットに公開する方法

S3 のオブジェクトをインターネットに公開する方法を、まずは、確認しましょう。
以下の2つの方法があります。

  1. バケットポリシーを使用する
  2. アクセスコントロールリスト (ACL) を使用する

以下の FAQもご参照ください。
Amazon S3 バケットの一部のオブジェクトにパブリック読み取りアクセス許可を付与する

1. バケットポリシーを使用する

例えば「test-buckect-123456789012」というS3 バケットの「アクセス許可」タブにある、バケットポリシーを以下に設定します。
これにより、同バケット内のオブジェクト(ファイル)はインターネット上から取得可能になります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::test-buckect-123456789012/*"
        }
    ]
}

2. アクセスコントロールリスト (ACL) を使用する

基本的には前述の「バケットポリシー」を使用することが多く、あまり使わない機能です。
例えばS3 バケット内の 2つのオブジェクト ( a.txt , b.txt ) を、アクセスコントロールリスト (ACL) で公開します。

インターネット上から閲覧可能になります。

2つのオブジェクト ( a.txt , b.txt ) の「アクセス許可」タブにある「アクセスコントロールリスト (ACL) 」では 「全員 (パブリックアクセス)」に「読み込み」権限が付きました。

また、S3 バケット自体の「アクセス許可」タブにある「アクセスコントロールリスト (ACL) 」には、S3バケットにあるオブジェクトの「リスト」権限をつけることができます。

2023年 4月以降にデフォルトとなる「ブロックパブリックアクセスが有効」とは

「ブロックパブリックアクセスが有効」の場合、上に記載した2つの設定ができなくなります。インターネット公開から二重防御する役割です。

  1. バケットポリシーを使用する
  2. アクセスコントロールリスト (ACL) を使用する

この2つができないようになります。

AWS マネジメントコンソールで S3 をバケットを作成する時に「ブロックパブリックアクセス」を有効にする画面です。

「ブロックパブリックアクセス」を「無効」にする(チェックを外す)と、上の2つの設定ができるようになります。

2023年 4月以降にデフォルトとなる「アクセスコントロールリスト (ACL) が無効」とは

「アクセスコントロールリスト (ACL) が無効」の場合、アクセスコントロールリスト (ACL) を使用できなくなります。
ACL でオブジェクトの読み取り権限を付与できなくなります。

AWS マネジメントコンソールで S3 をバケットを作成する時に「アクセスコントロールリスト (ACL) 」を無効にする画面です。

「アクセスコントロールリスト (ACL) が無効」の時は「編集」ボタンを押せなくなります。

デフォルトが変わる際の注意点

2023年 4月以降に、AWS CLI、API、SDK、CloudFormation で、「インターネットに公開するオブジェクトを置くS3 バケット」を作成する場合、注意が必要です。

2022年12月現在のCloudFormation でのデフォルトは以下です。

  • ブロックパブリックアクセスが無効
  • アクセスコントロールリスト (ACL) が有効

参考: AWS::S3::Bucket PublicAccessBlockConfiguration - AWS CloudFormation

そのため、「インターネットに公開するオブジェクトを置くS3 バケット」は、以下のCloudFormation で作成可能です。
S3バケットはデフォルトで作成し、BucketPolicy を追加するのみで、インターネットに公開できます。
PublicAccessBlockConfiguration の記述は不要です。

AWSTemplateFormatVersion: 2010-09-09
Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: "my-bucket-123456789012-yama"
  BucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      PolicyDocument:
        Id: MyPolicy
        Version: 2012-10-17
        Statement:
          - Sid: PublicReadForGetBucketObjects
            Effect: Allow
            Principal: '*'
            Action: 's3:GetObject'
            Resource: 'arn:aws:s3:::my-bucket-123456789012-yama/*'
      Bucket: "my-bucket-123456789012-yama"

2023年 4月からは明示的に ブロックパブリックアクセスを無効にしないと、インターネットに公開できません。(7〜9行目を追加)
PublicAccessBlockConfiguration の記述が必要です。

AWSTemplateFormatVersion: 2010-09-09
Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: "my-bucket-123456789012-yama"
      PublicAccessBlockConfiguration:
        BlockPublicPolicy: False # バケットポリシーの作成を拒否しない(False)
        RestrictPublicBuckets: False # バケットポリシーを制限しない(False)
  BucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      PolicyDocument:
        Id: MyPolicy
        Version: 2012-10-17
        Statement:
          - Sid: PublicReadForGetBucketObjects
            Effect: Allow
            Principal: '*'
            Action: 's3:GetObject'
            Resource: 'arn:aws:s3:::my-bucket-123456789012-yama/*'
      Bucket: "my-bucket-123456789012-yama"

Terraformの場合

Terraform のデフォルトも CloudFormation と同じです。

参考: Terraform Registry

Terraform では以下のようなコードになります。
aws_s3_bucket_public_access_block は不要です。

2022年 12月現在

resource "aws_s3_bucket" "example" {
  bucket = "my-tf-test-bucket-123456789012"
}

resource "aws_s3_bucket_policy" "allow_public_access" {
  bucket = aws_s3_bucket.example.id
  policy = data.aws_iam_policy_document.allow_public_access.json
}

data "aws_iam_policy_document" "allow_public_access" {
  statement {
    principals {
      type        = "*"
      identifiers = ["*"]
    }

    actions = [
      "s3:GetObject",
    ]

    resources = [
      aws_s3_bucket.example.arn,
      "${aws_s3_bucket.example.arn}/*",
    ]
  }
}

2023年 4月以降(23〜27行目を追加)
aws_s3_bucket_public_access_block が必要です。

resource "aws_s3_bucket" "example" {
  bucket = "my-tf-test-bucket-123456789012"
}

resource "aws_s3_bucket_policy" "allow_public_access" {
  bucket = aws_s3_bucket.example.id
  policy = data.aws_iam_policy_document.allow_public_access.json
}

data "aws_iam_policy_document" "allow_public_access" {
  statement {
    principals {
      type        = "*"
      identifiers = ["*"]
    }

    actions = [
      "s3:GetObject",
    ]

    resources = [
      aws_s3_bucket.example.arn,
      "${aws_s3_bucket.example.arn}/*",
    ]
  }
}

resource "aws_s3_bucket_public_access_block" "example" {
  bucket = aws_s3_bucket.example.id

  block_public_policy     = false
  restrict_public_buckets = false
}

まとめ

AWSマネジメントコンソールから S3 バケットを作成しているなら、何も変わりません。
AWS CLI、API、SDK、CloudFormation で作成する S3 バケットは場合によっては、注意が必要です。
インターネットに公開するS3バケットを作成する場合は、「ブロックパブリックアクセス」や「アクセスコントロールリスト (ACL) 」の設定を、2023年 4月以降は、コード内に明示的に書く必要が出てきます。
タイミングが良くないと、3月に書いて構築して大丈夫だったコードを、4月に試したらダメだった、ということもあり得るなと思い、本記事を執筆しました。
これを機に、これらの設定をしているコードを見直してみては、いかがでしょうか。

参考リンク

News Blog Heads-Up: Amazon S3 Security Changes Are Coming in April of 2023 | AWS News Blog

FAQページ docs.aws.amazon.com

山本 哲也 (記事一覧)

カスタマーサクセス部のエンジニア(一応)

好きなサービス:ECS、ALB

趣味:トレラン、登山(たまに)