[小ネタ] AWS アカウントレベルの S3 ブロックパブリックアクセスが設定されていて S3 のオブジェクトを公開するのに少し手間取った

S3 バケットレベルのブロックパブリックアクセスの設定より、AWS アカウントレベルのブロックパブリックアクセスの設定の方が効力が強いです。GuardDuty が有効になっている本番環境などでブロックパブリックアクセスの設定を変更すると通知が飛ぶので、設定変更前に関係各所にあらかじめ連絡しておくとよいでしょう。
2023.12.26

コーヒーが好きな emi です。

ちょっとだけ画像を共有したくて S3 に置いた画像を公開する設定をしようとしたら、エラーになってしまいました。
恥ずかしながら AWS アカウントレベルでの S3 ブロックパブリックアクセスの設定を初めておこなったので、記録しておきます。

AWS アカウントレベルの S3 ブロックパブリックアクセスについて

S3 バケットの公開を制限するために、ブロックパブリックアクセスという設定があります。
この設定は AWS アカウントレベルのブロックパブリックアクセス と、S3 バケットレベルのブロックパブリックアクセス の二種類が存在します。

  • AWS アカウントレベルのブロックパブリックアクセス
    • その AWS アカウントに存在するすべての S3 バケットに対してブロックパブリックアクセスの設定をおこなう
  • S3 バケットレベルのブロックパブリックアクセス
    • 1 つの S3 バケット単体に対してブロックパブリックアクセスの設定をおこなう

AWS アカウントレベルのブロックパブリックアクセスの設定の方が効力が強いです。
つまり、AWS アカウントレベルのブロックパブリックアクセスが ON になっていると、S3 バケットレベルのブロックパブリックアクセスを OFF にして S3 バケット内のオブジェクトを公開しようとしても、AWS アカウントレベルのブロックパブリックアクセスの設定によってオブジェクトを公開することができません。

以下のブログが参考になりました。

AWS アカウントレベルのブロックパブリックアクセスが ON だと S3 バケットのオブジェクトを公開できない

以下のように S3 バケットのブロックパブリックアクセスを OFF にして、オブジェクトを公開しようとしました。

特定のオブジェクトを公開するためにバケットポリシーを設定しようとすると、以下のようにエラーになります。

バケットポリシーの変更を保存できません
バケットポリシーを編集する許可がない、またはバケットポリシーがパブリックアクセスのブロック設定と競合するレベルのパブリックアクセスを付与しています。 バケットポリシーを編集するには、s3:PutBucketPolicy 許可が必要です。 有効になっているパブリックアクセスのブロック設定を確認するには、アカウントとバケットの設定を表示します。 詳細については、Amazon S3 での Identity and Access Management をご覧ください。
▼API レスポンス
Access Denied

アカウントレベルのブロックパブリックアクセス設定を変更する

今回はオブジェクトを公開したいので、アカウントレベルのブロックパブリックアクセスを OFF にします。

S3 マネジメントコンソールのナビゲーションペインから [このアカウントのブロックパブリックアクセス設定] - [編集] をクリックします。

「パブリックアクセスをすべてブロック」のチェックを外して「変更の保存」をクリックします。

この設定を変更すると、すべての S3 バケットのブロックパブリックアクセスの設定変更が可能になります。
「確認」と入力して「確認」をクリックします。

設定が反映されました。

S3 バケットのバケットポリシーを変更する

S3 バケットのブロックパブリックアクセスは既に OFF の状態になっている前提ですすめます。

公開したいオブジェクトが格納されている S3 バケットのバケットポリシーを設定します。
「donut_1.jpg」という画像を共有するため、以下のようなバケットポリシーを設定しました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadForSpecificObjects",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::<S3 バケット名>/donut_1.jpg"
        }
    ]
}

S3 バケット一覧を見ると、バケットポリシーを変更した該当の S3 バケットが「公開」になっていることが分かります。

オブジェクトにアクセスする

ではオブジェクトにアクセスしてみましょう。
オブジェクトの詳細画面で、オブジェクト URL をコピーします。先頭のコピーボタンでコピーできます。

ブラウザに張り付けると、私が大好きなクリスピークリームドーナツの画像にアクセスできました!おいしそうです!

おまけ:GuardDuty で検知された

ブロックパブリックアクセスの設定を変更すると、GuardDuty で検出されましたのでご参考に掲載します。
GuardDuty が有効になっている本番環境などでこれらの設定を変更すると以下のような通知が飛ぶので、関係各所にあらかじめ連絡しておくとよいでしょう。

アカウントレベルのブロックパブリックアクセスを OFF にすると、Policy:S3/AccountBlockPublicAccessDisabled で検出されました。
私は GuardDuty の通知を Slack チャンネルに連携しているのですが、以下のように通知されます。

S3 バケットポリシーを変更して完全にパブリックからアクセス可能になると、以下のように Policy:S3/BucketAnonymousAccessGranted で検出されました。

おわりに

AWS アカウントレベルのブロックパブリックアクセスと S3 バケットレベルのブロックパブリックアクセスを OFF にしてオブジェクトを公開してみました。
アカウントレベルのブロックパブリックアクセスを OFF にしても、すぐにオブジェクトにアクセスできるような状態にはなりません。バケットレベルのブロックパブリックアクセスを OFF にし、かつバケットポリシーを変更するまでオブジェクトにはアクセスできないようになっています。

この記事がどなたかのお役に立てば幸いです。

参考