動かざることバグの如し

近づきたいよ 君の理想に

S3 パブリックアクセスブロックの4つの設定について

パブリックアクセスブロックの4つの設定

terraformでAWS S3バケット作成するときに aws_s3_bucket_public_access_block を設定する。

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

  block_public_acls       = true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
}

BlockPublicAcls

目的

S3バケットやオブジェクトに対してパブリックアクセスを設定できないようにする。 新しいファイルをアップロードする際に、うっかり一般公開設定にしてしまうことを防ぐことができる。

挙動

この設定を有効にすると以下の操作が自動的にブロックされる

  • バケット全体を一般公開しようとする操作
  • 個別のファイルを一般公開しようとする操作
  • アップロード時に一般公開設定を含めようとする操作

例えばアップロード時にacl: 'public-read'をつけてアップロードしようとしても「AccessControlListNotSupported: The bucket does not allow ACLs」 エラーとなり、アップロードできない。

# 
s3_client.put_object(
  bucket: "mybucket.example.com",
  key: "hoge.txt",
  body: "hello!",
  acl: 'public-read'
)

BlockPublicPolicy

目的

バケットポリシーを使ってS3バケットやオブジェクトにパブリックアクセス許可を設定できないようにする。 うっかりバケットポリシーで一般公開設定にしてしまうことを防ぐことができる。

挙動

この設定を有効にすると、バケットポリシーでバケットやオブジェクトへのアクセスを許可する際に、Principal*ワイルドカード)を使用できなくなる。 * は「誰でも」を意味するので、これを禁止することで、特定のユーザーまたはアカウントに対してのみアクセスを許可するように強制する。

例えば、この設定が有効な状態で、以下のようなバケットポリシーを設定しようとするとエラーになる。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowPublicRead",
      "Effect": "Allow",
      "Principal": "*", // ここがエラーになる
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::mybucket.example.com/*"
    }
  ]
}

IgnorePublicAcls

目的

アクセス制御リスト(ACL) を使用して付与されたパブリックアクセス許可を無視する。 過去に ACL を使って誤って公開設定にしてしまった場合でも、この設定を有効にすることで強制的に非公開にすることができる。

挙動

この設定を有効にすると、たとえオブジェクトにパブリック読み取り許可を与える ACL が設定されていても、そのオブジェクトへのパブリックアクセスはブロックされる。 例えば、hoge.txt というオブジェクトの ACLpublic-read に設定されていても、 IgnorePublicAcls が有効になっている場合は、hoge.txt は一般公開されない。

RestrictPublicBuckets

目的

パブリックアクセスブロック設定が正しく設定されていないバケットへのアクセスを制限する。 誤って公開設定になっているバケットへのアクセスを防ぐことができる。

挙動

この設定を有効にすると、以下のいずれかの条件を満たすバケットに対して、アクセスが制限される。

  • BlockPublicAclsBlockPublicPolicyIgnorePublicAcls のいずれかの設定が無効になっている
  • バケットポリシーでパブリックアクセスが許可されている

具体的には、これらのバケットに対して以下の操作が制限される。

この設定を有効にすることで、パブリックアクセスブロック設定が不十分なバケットへのアクセスを防止し、セキュリティリスクを軽減することができる。