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

S3 のパブリックアクセスブロックの 4 つの各設定項目の挙動を確認してみた背景

以下の画面は Amazon S3 のパブリックアクセスブロックの設定画面です。
各設定に関して日本語で書かれていますが、わかりづらく、挙動の想像がつかないので、実際に各設定の挙動を確認してみた。

パブリックアクセスブロックの設定画面

S3 のパブリックアクセスブロックの 4 つの各設定項目

新しいアクセスコントロールリスト (ACL) を介して付与されたバケットとオブジェクトへのパブリックアクセスをブロックする ( BlockPublicAcls )

BlockPublicAcls についてドキュメントでは以下のように記載しています。

Amazon S3 ストレージへのパブリックアクセスのブロック - Amazon Simple Storage Service

このオプションを TRUE に設定すると、次のように動作します。
・ 指定されたアクセスコントロールリスト (ACL) がパブリックの場合、PUT Bucket acl 呼び出しと PUT Object acl 呼び出しは失敗します。
・ リクエストにパブリック ACL が含まれていると、PUT Object 呼び出しは失敗します。
・ この設定がアカウントに適用されている場合、リクエストにパブリック ACL が含まれていると PUT Bucket の呼び出しは失敗します。

とりあえず PUT Object (アップロード) ができなくなるようです。

検証準備します。
BlockPublicAcls をオフの状態でオブジェクト A にオブジェクト ACL でパブリックアクセスを許可します。
この設定により、オブジェクト A にオブジェクト URL で外部からアクセスが可能になります。

パブリックアクセス許可

BlockPublicAcls をオンにします。

BlockPublicAclsの有効化

検証 1: オブジェクト A のオブジェクト URL にアクセスする

オブジェクト A が正常に表示されました。
どうやら既存のオブジェクトには影響がなし。

検証 2: オブジェクト B をプライベート設定でアップロードする

以下のようにプライベート設定でのアップロードは成功しました。

プライベート設定

検証 3: オブジェクト B をパブリック設定でアップロードする

以下のようにパブリック設定でのアップロードはエラーが発生しました。
どうやら新規のオブジェクトをパブリック設定でのアップロードを防ぐようです。

パブリック設定

任意のアクセスコントロールリスト (ACL) を介して付与されたバケットとオブジェクトへのパブリックアクセスをブロックする ( IgnorePublicAcls )

IgnorePublicAcls についてドキュメントでは以下のように記載しています。

Amazon S3 ストレージへのパブリックアクセスのブロック - Amazon Simple Storage Service

このオプションを TRUE に設定すると、Amazon S3 はバケットとそれに含まれるオブジェクトのすべてのパブリック ACL を無視します。この設定を使用すると、パブリック ACL を含む PUT Object 呼び出しを許可しながら、ACL によって許可されたパブリックアクセスを安全にブロックできます (BlockPublicAcls はパブリック ACL を含む PUT Object 呼び出しを拒否します)。この設定を有効にしても、既存の ACL の永続性には影響せず、新しいパブリック ACL の設定も妨げられません。

とりあえず全てのオブジェクトのパブリック設定が無視されるようです。

検証準備します。
IgnorePublicAcls をオフの状態でオブジェクト A にオブジェクト ACL でパブリックアクセスを許可します。
この設定により、オブジェクト A にオブジェクト URL で外部からアクセスが可能になります。

パブリックアクセス許可

IgnorePublicAcls をオンにします。

IgnorePublicAclsの有効化

検証 1: オブジェクト A のアクセス許可を確認

パブリックアクセスの許可が上書きされ、パブリックアクセスできなくなっています。

上書き後のアクセス許可画面

検証 2: IgnorePublicAcls をオフにしてオブジェクト A のアクセス許可を確認

パブリックアクセスの許可が IgnorePublicAcls をオンによる上書き前の設定に戻りました。

上書き前のアクセス許可画面

新しいパブリックバケットポリシーまたはアクセスポイントポリシーを介して付与されたバケットとオブジェクトへのパブリックアクセスをブロックする ( BlockPublicPolicy )

BlockPublicPolicy についてドキュメントでは以下のように記載しています。

Amazon S3 ストレージへのパブリックアクセスのブロック - Amazon Simple Storage Service

バケットに対してこのオプションを TRUE に設定すると、Amazon S3 は、指定されたバケットポリシーでパブリックアクセスが許可されている場合に、PUT バケットポリシーの呼び出しを拒否します。また、指定されたポリシーでパブリックアクセスが許可されている場合に、バケットのすべてのアクセスポイントで PUT アクセスポイントポリシーの呼び出しを拒否します。アクセスポイントに対してこのオプションを TRUE に設定すると、Amazon S3 は、指定されたポリシー (アクセスポイントまたは基になるバケットのいずれかのポリシー) がパブリックである場合に、アクセスポイントを経由した PUT アクセスポイントポリシーと PUT バケットポリシーの呼び出しを拒否します。
この設定により、バケットやバケット内のオブジェクトをパブリックに共有することを許可することなく、アクセスポイントとバケットポリシーを管理することをユーザーに許可できます。この設定を有効にしても、既存のアクセスポイントやバケットポリシーには影響しません。

とりあえずバケットポリシーの更新( PUT )を拒否するようになるようです。

検証準備します。
BlockPublicPolicy をオフにしてバケットポリシーの設定を空にしておきます。

検証 1: バケットポリシーを更新する

BlockPublicPolicy をオンにしてバケットポリシーに以下のようなパブリックアクセス許可のポリシーを適用しようとするとエラーになりました。

Copied!
{
  "Version": "2012-10-17",
  "Id": "ExamplePolicy01",
  "Statement": [
    {
      "Sid": "ExampleStatement01",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": ["s3:GetObject", "s3:GetBucketLocation", "s3:ListBucket"],
      "Resource": [
        "arn:aws:s3:::public-access-1234/*",
        "arn:aws:s3:::public-access-1234"
      ]
    }
  ]
}

任意のパブリックバケットポリシーまたはアクセスポイントポリシーを介したバケットとオブジェクトへのパブリックアクセスとクロスアカウントアクセスをブロックする ( RestrictPublicBuckets )

RestrictPublicBuckets についてドキュメントでは以下のように記載しています。

Amazon S3 ストレージへのパブリックアクセスのブロック - Amazon Simple Storage Service

このオプションを TRUE に設定すると、パブリックポリシーを持つアクセスポイントやバケットへのアクセスは、バケット所有者のアカウント内の AWS のサービスプリンシパルと承認されたユーザーのみに制限されます。この設定は、アカウント内のユーザーにアクセスポイントやバケットの管理を許可しながら、アクセスポイントやバケットへのすべてのクロスアカウントアクセス (AWS のサービスプリンシパルによるアクセスを除く) をブロックします。
この設定を有効にしても、既存のアクセスポイントポリシーやバケットポリシーには影響しません。ただし、Amazon S3 は、特定のアカウントへのパブリックではない委任を含むパブリックアクセスポイントポリシーやパブリックバケットポリシーから派生したパブリックアクセスやクロスアカウントアクセスをブロックします。

とりあえず既存のアクセスポイントポリシーやバケットポリシーを無視して、アクセスをブロックするようです。

検証準備します。
オブジェクト A を以下のようにプライベート設定でアップロードします。
プライベート設定

オブジェクト A のアクセス許可は以下のようになっていると思います。
アクセス許可画面

次に、RestrictPublicBuckets をオフにしてバケットポリシーに以下のようなパブリックアクセス許可のポリシーを適用しておきます。

Copied!
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ExampleStatement01",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": ["s3:GetObject", "s3:GetBucketLocation", "s3:ListBucket"],
      "Resource": [
        "arn:aws:s3:::public-access-1234/*",
        "arn:aws:s3:::public-access-1234"
      ]
    }
  ]
}

この設定により、オブジェクト A にオブジェクト URL で外部からアクセスが可能になります。

検証 1: RestrictPublicBuckets をオンにして、オブジェクト A のオブジェクト URL にアクセスする

RestrictPublicBuckets をオンにします。

RestrictPublicBucketsの有効化

オブジェクト A にオブジェクト URL で外部からアクセスができなくなりました。

アクセス拒否

マネジメントコンソール上でも、バケットポリシーに「このバケットに対してブロックパブリックアクセス設定が有効になっているため、パブリックアクセスがブロックされています」と表示されています。

パブリックアクセスブロック