0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS解説 S3編 #4】Block Public Accessとバケットポリシーの基本

0
Posted at

【AWS解説 S3編 #4】Block Public Accessとバケットポリシーの基本

S3編 #4(全7回予定)

S3にファイルを保存できるようになると、次はアクセス制御が気になります。

ファイルを誰が読めるのか
インターネット上の誰でも読める状態にするにはどうするのか
バケットポリシーを書いたのに、なぜアクセスできないのか

S3では、設定を少し間違えるだけで、意図しない一般公開につながる可能性があります。
この記事では、Block Public Access(BPA)とバケットポリシーの役割を整理し、学習用バケットの1つのオブジェクトだけを一時的に読み取り公開するところまでを確認します。

公開設定は検証用に限定し、最後に必ず元へ戻してリソースを削除します。


この記事で分かること

  • S3のアクセス制御で登場するIAMポリシー、バケットポリシー、BPAの違い
  • Block Public Accessが何を防ぐ設定なのか
  • バケットポリシーで特定のオブジェクトの読み取りを許可する方法
  • BPAの無効化と、公開を許可する設定が別である理由
  • 公開設定を元に戻し、学習用リソースを削除する手順

S3のアクセス制御を大まかに整理する

S3のアクセス可否は、1つの設定だけで決まるわけではありません。最初は次の3つを役割で分けて考えると理解しやすくなります。

設定 主な役割
IAMポリシー IAMユーザーやロールなど、AWSの主体に許可を与える
バケットポリシー S3バケット側に、誰が何をできるかを書く
Block Public Access ACLやポリシーによる一般公開をブロックする安全装置

例えば、IAMポリシーで自分に s3:GetObject が許可されていても、別のポリシーに明示的な Deny がある場合はアクセスが拒否されます。

一方、BPAは通常のIAMアクセスを一律に拒否する設定ではなく、ACLやバケットポリシーなどを通じたパブリックアクセスを防ぐための設定です。

BPAを無効にする操作そのものは、公開の許可を追加するものではありません。今回のように公開ACLや公開ポリシーがない新規バケットでは、別途バケットポリシーなどで公開を許可する必要があります。

ただし、BPAは既存のポリシーやACLそのものを削除する機能ではありません。すでに公開ポリシーや公開ACLが存在するバケットでは、BPAの設定を外すことで再び公開される可能性があります。

s3-public-access-overview.png

Block Public Accessは「公開を防ぐ設定」

S3のBlock Public Accessには、パブリックアクセスを防ぐための4つの設定があります。

設定 主な役割
BlockPublicAcls 新しい公開ACLの設定を拒否する
IgnorePublicAcls 既存の公開ACLをアクセス判定で無視する
BlockPublicPolicy 公開を許可する新しいバケットポリシーの保存を拒否する
RestrictPublicBuckets 公開ポリシーがあるバケットへのパブリックアクセスやクロスアカウントアクセスを制限する

通常の学習や個人開発では、公開する必要がない限り4つとも有効にしておくのが安全です。

また、S3では新しく作成するバケットのObject Ownershipが、デフォルトでBucket owner enforcedになっており、ACLは無効です。そのため、この記事でもACLは使わず、バケットポリシーを使って公開を試します。

BPAはバケットだけでなく、アカウントやAWS Organizationsなどでも管理できます。複数の場所で設定されている場合、S3はより制限の強い設定を適用します。

バケットポリシーはJSONで書く

バケットポリシーは、バケットに対するアクセス許可をJSONで定義するリソースベースポリシーです。

今回使うのは、public-demo.txt だけを匿名ユーザーから読み取れるようにする例です。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowPublicReadForLearning",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/public-demo.txt"
    }
  ]
}

YOUR_BUCKET_NAME は自分で作成した学習用バケット名に置き換えます。

このポリシーでは、次のように公開範囲を限定しています。

  • Principal: "*":認証されていない利用者を含むすべての利用者が対象
  • s3:GetObject:オブジェクトの読み取りだけを許可
  • Resource:今回使用する public-demo.txt だけを指定

アップロードや削除を許可する s3:PutObjects3:DeleteObject、バケット内を一覧表示する s3:ListBucket は許可していません。

公開読み取りポリシーは、本番環境へそのまま適用してよい設定とは限りません。公開するデータを限定し、HTTPSや配信制御が必要な場合は、CloudFrontなどを組み合わせる方法を検討します。


コンソールで読み取り公開を試す

ここでは東京リージョン(ap-northeast-1)で、学習用バケットを1つ使います。

注意: 業務用バケットや既存データが入っているバケットでは実施せず、新しく作成した学習専用バケットを使用してください。

1. 学習用バケットを作成する

  1. AWSマネジメントコンソールでS3を開く
  2. 左メニューから汎用バケットを開く
  3. バケットを作成を選ぶ
  4. AWSリージョンで東京(ap-northeast-1)を選ぶ
  5. 本記事では、S3バケット名前空間に共有グローバル名前空間を選ぶ
  6. ほかの利用者と重複しないバケット名を入力する
  7. その他の設定は基本的にデフォルトのまま作成する

共有グローバル名前空間を使用する場合、バケット名は同じAWSパーティション内で一意である必要があります。

現在のS3では、自分のAWSアカウントとリージョンに予約されたアカウントリージョン名前空間も選択できますが、この記事では手順を分かりやすくするため共有グローバル名前空間を使用します。

バケット名はオブジェクトURLなどに表示されるため、メールアドレスや機密性のあるプロジェクト名など、公開されると困る情報は含めないようにします。

また、互換性を考えると、今回の学習用バケット名は英小文字・数字・ハイフンを中心にするのが分かりやすいです。

2. オブジェクトをアップロードする

内容が分かるように、次のような public-demo.txt を作成します。

S3 public access learning demo

作成したバケットを開き、次の手順でアップロードします。

  1. アップロードを選ぶ
  2. public-demo.txt を追加する
  3. アップロードを実行する
  4. オブジェクト一覧でファイル名を確認する

この時点では、BPAが有効で公開ポリシーもないため、オブジェクトURLをプライベートブラウジングなどから開いても読み取れません。

3. BPAの設定を確認する

  1. バケットのアクセス許可タブを開く
  2. パブリックアクセスをすべてブロックを確認する
  3. 編集を選ぶ
  4. 現在、4つの設定が有効になっていることを確認する

ここでは、まだ保存せずに設定の意味を確認します。

#1-s3-console-block-public-access.png

4. 学習用にバケットポリシー関連のBPAを一時的に無効化する

注意: この手順では、学習用バケットを一時的にパブリックアクセス可能な状態へ変更します。実際に設定を変更する前に、バケット名と中身を必ず確認してください。

今回の検証ではACLを使用しないため、ACLに関係する設定は有効のままにします。

  • BlockPublicAcls:有効のまま
  • IgnorePublicAcls:有効のまま
  • BlockPublicPolicy:一時的に無効
  • RestrictPublicBuckets:一時的に無効

#2-s3-console-block-public-access.png

コンソールでは、4つの個別設定のうち、バケットポリシーに関係する2項目を無効にします。

  1. パブリックアクセスをすべてブロックの編集画面を開く
  2. BlockPublicPolicyRestrictPublicBuckets に相当する2項目を無効にする
  3. 変更を保存する
  4. 確認を求められたら 確認 と入力する
  5. 確認を選ぶ

#3-s3-console-block-public-access.png

この操作そのものは、公開許可を追加するものではありません。今回の新規バケットにはまだ公開ポリシーがないため、この時点では public-demo.txt は公開されていません。

ただし、既存の公開ポリシーや公開ACLが設定されているバケットでは、BPAの設定を外すことで公開状態になる可能性があります。そのため、学習では必ず新しい専用バケットを使用します。

5. バケットポリシーを追加する

  1. 同じバケットのアクセス許可タブを開く
  2. バケットポリシーの編集欄を開く
  3. 次のJSONを貼り付ける
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowPublicReadForLearning",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::{BUCKET_NAME}/public-demo.txt"
    }
  ]
}
  1. {BUCKET_NAME} を実際のバケット名に置き換える
  2. 変更を保存する

#4-s3-console-bucket-policy.png

今回は public-demo.txt だけをResourceに指定しています。ほかのオブジェクトを同じバケットへ追加しても、このポリシーだけでは公開対象になりません。

6. オブジェクトURLを確認する

#5-s3-console-objecturl.png

  1. オブジェクトタブを開く
  2. public-demo.txt を選ぶ
  3. オブジェクトURLをコピーする
  4. プライベートブラウジングなど、AWSへログインしていないブラウザでURLを開く

s3-browser.png

ファイルの内容が表示されれば、匿名の読み取りアクセスが許可されています。

バケットポリシーのResourceに注意する

バケットそのもののARNと、特定のオブジェクトのARN、すべてのオブジェクトを表すARNは異なります。

バケットそのもの:                arn:aws:s3:::{BUCKET_NAME}
特定のオブジェクト:              arn:aws:s3:::{BUCKET_NAME}/public-demo.txt
バケット内のすべてのオブジェクト: arn:aws:s3:::{BUCKET_NAME}/*

{BUCKET_NAME} を実際のバケット名に置き換える

s3:GetObject はオブジェクトに対する操作なので、ResourceにはオブジェクトのARNを指定します。

/* を指定すると、そのバケット内のすべてのオブジェクトが対象になります。今回のように1ファイルだけを検証する場合は、オブジェクト名まで指定する方が公開範囲を限定できます。


つまずきやすいポイント

BPAを変更したのに公開できない

バケットレベルの設定を変更しても、アカウントレベルやAWS Organizationsレベルでより厳しいBPAが有効な場合は、パブリックアクセスが引き続きブロックされます。

S3は、バケット、アカウント、Organizationsなどに適用された設定のうち、より制限の強い組み合わせを使用します。

企業や業務用のAWSアカウントで上位レベルのBPAが設定されている場合は、学習目的でその設定まで変更せず、個人の検証環境などを使用する方が安全です。

また、次の点も確認します。

  • バケットポリシーの YOUR_BUCKET_NAME を置き換えているか
  • Resourceに public-demo.txt まで正しく指定しているか
  • オブジェクト名の大文字・小文字が一致しているか
  • 別のポリシーに明示的な Deny がないか

ポリシーを保存すると拒否される

バケット名の置き換え忘れ、JSONのカンマ不足、BlockPublicPolicy が有効なままになっていることなどが主な確認ポイントです。

また、アカウントレベルやOrganizationsレベルのBPAによって公開ポリシーが制限されている場合もあります。

エラーメッセージを確認し、学習用バケットで公開ポリシーを設定できる状態かを確かめます。

暗号化すれば公開されないと思っている

暗号化は、保存中のデータを保護するための仕組みです。誰が読み取れるかを決めるアクセス制御とは別の設定です。

S3では、新しくアップロードするオブジェクトがデフォルトでSSE-S3によって暗号化されますが、それだけでパブリックアクセスが防止されるわけではありません。

この記事の検証ではデフォルトのSSE-S3を前提とします。SSE-KMSなど別の暗号化方式を使用すると、S3のアクセス許可だけでなくKMS側の権限も関係するため、同じ手順どおりにアクセスできるとは限りません。


学習用リソースを削除する

確認が終わったら、公開状態を元に戻してからリソースを削除します。

  1. バケットポリシーを削除して保存する
  2. パブリックアクセスをすべてブロックの4項目をすべて有効にして保存する
  3. public-demo.txt を削除する
  4. バケットを削除する

公開設定を先に元へ戻すことで、削除作業中に学習用バケットが公開されたままになる時間を短くできます。


まとめ

  • BPAは、ACLやポリシーによる意図しない一般公開を防ぐための設定です
  • BPAの設定を外す操作そのものは、公開許可を追加するものではありません
  • ただし、既存の公開ACLや公開ポリシーがある場合は、BPAの設定を外すことで再び公開される可能性があります
  • バケットポリシーでは、PrincipalActionResourceを確認し、必要な対象だけに権限を限定します
  • 学習で公開設定を試したら、ポリシー削除、BPA再有効化、リソース削除まで行います

次回

次回は、S3にHTMLファイルを置いて静的Webサイトとして表示する方法を扱います。
今回の公開設定が、実際のWeb公開でどのように関係するかを確認します。

S3の設定をCloudFormationで確認する場合

S3のBlock Public Accessやバケットポリシーを、画面上の設定とCloudFormation YAMLの両方で確認したい場合は、IaCraft StudioのS3設定画面も参考になります。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?