← ハンズオン一覧に戻る

AWS Hands-on / Security

S3バケットが外部に開いていないかを、自動で見つける

バケットポリシーなどの設定は複雑で、見ただけでは「結局どこからアクセスできるのか」が分かりにくいことがあります。IAM Access Analyzer を使って、わざと外部公開したS3バケットを自動的に検出し、ポリシーを修正すると検出結果が解消される様子を確認します。

● Lv.2 基本的なリソースを作れる人 ⏱ 所要 30〜50 分 コンソールのみで完結
01 — Prerequisites

はじめる前に

  • 必須AWS アカウントを持っていること
  • 必須マネジメントコンソールにサインインできること
  • 必須S3バケットの作成・バケットポリシーの編集をしたことがある
  • あると良いIAMポリシー(JSON)を読んだ経験

※ このハンズオンは すべてコンソールだけで完結します

02 — References

参照する公式ドキュメント

手順に迷ったときや、用語の意味を確かめたいときに開きましょう。

※ リンク切れの場合は、ページタイトルで検索してください。

03 — Background

背景・シナリオ

S3バケットや IAM ロールなどに、意図せず外部のアカウントや全世界からアクセスできる設定を入れてしまうことは、よくあるミスの1つです。バケットポリシーやリソースベースポリシーは項目が複雑で、設定を見ただけでは「結局どこからアクセスできるのか」がひと目で分かりにくいという問題があります。

IAM Access Analyzer は、こうした「アカウントの外からアクセスできるリソース」を自動的に分析し、検出結果(Finding)として教えてくれるサービスです。今回は、わざと全世界に公開されるバケットポリシーを設定したS3バケットを用意し、Access Analyzer がそれを外部アクセスの検出結果として報告することを確認します。さらにポリシーを修正し、検出結果が解消される様子も確認します。

Access Analyzer はS3だけを見ているの?

いいえ。S3バケットだけでなく、IAMロール、KMSキー、Lambda関数、SQSキューなど、外部アカウントからアクセスできる可能性のある複数のリソースタイプを対象にしています。今回はわかりやすいS3バケットを例に使います。

見つかった検出結果は、自動的に直してもらえるの?

いいえ、検出するだけで自動修正はされません。S3コンソールからは、検出結果の画面でその場で「パブリックアクセスをブロック」を適用できる場合がありますが、ポリシーの内容自体は自分で見直して修正する必要があります。意図した公開であれば「アーカイブ」として記録することもできます。

Goal

アカウント用のアナライザーを作成し、外部公開を許可するバケットポリシーを設定したS3バケットについて、IAM Access Analyzer が「外部アクセス」の検出結果を報告することを確認したうえで、ポリシーを修正して検出結果が解消されることを確認する。

04 — Architecture

つくる構成

同じS3バケットのまま、バケットポリシーを変更する前後で、外部からのアクセス可否とAccess Analyzerの検出結果がどう変わるかを比較します。

Before — 外部公開ポリシーのまま

誰でもオブジェクトを読める状態

🌍 外部の誰でも s3:GetObject 許可 🪣 S3バケット
外部アクセスの検出結果(Finding)が「アクティブ」で報告される
After — ポリシーを修正

外部からの読み取りを許可しない

🌍 外部の誰でも アクセス不可 ✕ 🪣 S3バケット
検出結果が「アーカイブ済み」になる

※ IAM Access Analyzer はポリシーの変更を継続的に分析しており、反映には数分かかることがあります。

05 — Requirements

要件

以下の要件を満たし、「検出される」→「直す」→「検出結果が解消される」という変化を確認してください。

No要件
1リージョンは「東京(ap-northeast-1)」を使用する。
2IAM Access Analyzerで、ゾーンタイプ「アカウント」のアナライザーを1つ作成する(名前は自由、例:account-analyzer)。
3テスト用のS3バケットを1つ作成する(名前は一意に、例:access-analyzer-demo-yourname)。中に適当なテストファイルを1つアップロードしておく。
4バケットの「パブリックアクセスをブロック」設定を一部解除し、Principalを *(全世界)として s3:GetObject を許可するバケットポリシーを設定する。
5Access Analyzerの検出結果一覧に、このバケットに対する「外部アクセス」の検出結果(アクティブ)が表示されることを確認する。
6バケットポリシーを削除し、パブリックアクセスのブロック設定を元に戻したうえで、同じ検出結果が「アーカイブ済み」に変わることを確認する。
06 — Steps

構築の進め方

「アナライザーを作る」→「わざと公開して検出される」→「直して解消される」という順番で進めます。

  1. フェーズ1 — アナライザーを作成する
  2. マネジメントコンソールにサインインし、リージョンを合わせる

    ブラウザで AWS マネジメントコンソールにサインインし、画面右上のリージョンが「アジアパシフィック(東京)ap-northeast-1」になっていることを確認します。

  3. IAM Access Analyzerでアナライザーを作成する

    IAMコンソールの左メニュー「Access Analyzer」を開き、「分析機能の作成」を選びます。ゾーンタイプは「アカウント」を選び、名前を自由に決めて作成します(例:account-analyzer)。

    作成すると自動的に分析が始まる

    アナライザーを作成すると、アカウント内の対象リソース(S3、IAMロールなど)のポリシーが分析され、その後も継続的に再分析されます。手動でスキャンを実行する必要はありません。

  4. フェーズ2 — わざと公開して検出される
  5. テスト用のS3バケットを作成する

    S3コンソールでバケットを1つ作成します(名前は一意に、例:access-analyzer-demo-yourname)。中に適当なテストファイルを1つアップロードしておきます。

  6. パブリックアクセスのブロックを一部解除する

    バケットの「アクセス許可」タブで「パブリックアクセスをブロック(バケット設定)」を編集し、「新しいパブリックバケットポリシーまたはアクセスポイントポリシーを介したパブリックアクセスとクロスアカウントアクセスをブロックする」のチェックを外します。

    学習目的の一時的な操作

    この設定はバケットポリシーによる公開を許可するためのものです。検証が終わったら、フェーズ3で必ず元に戻します。

  7. 全世界に読み取りを許可するバケットポリシーを設定する

    「アクセス許可」タブの「バケットポリシー」に、Principal*、アクションを s3:GetObject として許可するポリシーを設定します。

  8. Access Analyzerの検出結果を確認する

    IAMコンソールの「Access Analyzer」→「検出結果」を開きます。少し時間が経つと、作成したバケットに対する外部アクセスの検出結果(ステータス:アクティブ)が表示されます。詳細を開き、どの外部プリンシパル(今回は「すべての人」)に、どのアクセス権が付与されているかを確認します。

    反映には数分かかることがある

    ポリシーを変更してから検出結果に反映されるまで、数分程度かかることがあります。すぐに表示されない場合は、少し待ってから一覧を更新してみましょう。

  9. フェーズ3 — 直して解消される
  10. バケットポリシーを削除する

    「アクセス許可」タブの「バケットポリシー」を編集し、先ほど設定した内容を削除します。

  11. パブリックアクセスのブロックを元に戻す

    フェーズ2で解除した「パブリックアクセスをブロック(バケット設定)」のチェックを、すべて元のオン(ブロックする)の状態に戻します。

  12. 検出結果が解消されることを確認する

    もう一度「Access Analyzer」→「検出結果」を開きます。しばらくすると、対象の検出結果のステータスが「アーカイブ済み」に変わっていることを確認します。

    これがゴール

    同じ検出結果が「アクティブ」から「アーカイブ済み」に変わる——この変化を確認できたら、このハンズオンの目的は達成です。

07 — Pitfalls

つまずきポイント

初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直すか」の手がかりとして使ってください。

Pitfall 01 — バケットポリシーを設定しても検出結果が出ない

「ポリシーを設定したのに、Findingが出てこない」

「パブリックアクセスをブロック」の設定が有効なままだと、バケットポリシーの内容に関わらず実際には公開されないため、検出結果も生成されません。バケットレベルの設定を見直しましょう。

Pitfall 02 — ポリシーを直したのに検出結果がアクティブのまま

「修正したのに、まだアクティブと表示される」

Access Analyzerの再分析には数分程度かかることがあります。すぐに反映されない場合は、少し時間を置いてから一覧を更新してみましょう。また、ポリシーの削除や設定変更が実際に保存されているかも見直しましょう。

08 — Checklist

完了チェック

要件の再確認ではなく、画面のどこを見れば達成を確認できるかをまとめました。次を順に確かめましょう。

  • IAMコンソールの「Access Analyzer」一覧に、作成したアナライザーが「アクティブ」と表示されている。
  • バケットポリシーを公開状態に設定した後、「検出結果」一覧に対象バケットの外部アクセスFindingが「アクティブ」として表示される。
  • ポリシーを修正し、パブリックアクセスのブロックを戻した後、同じFindingが「アーカイブ済み」になっている。
  • S3バケットの「アクセス許可」タブで、パブリックアクセスがすべてブロックされた状態に戻っている。
09 — Think

考えてみよう

手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。

  1. バケットポリシーのJSONを見ただけでは、「外部に公開されているか」がなぜ分かりにくいのでしょうか。
    ヒント
    ポリシーは複数のステートメント(条件)が組み合わさってできています。Principal・Action・Condition・パブリックアクセスのブロック設定など、複数の要素を同時に読み解く必要がある、という点がヒントです。
  2. 静的ウェブサイトホスティングのように、意図的に外部公開しているS3バケットがある場合、Access Analyzerの検出結果をどう扱うべきでしょうか。
    ヒント
    意図した公開であれば、毎回「問題あり」として通知され続けるのは運用上望ましくありません。検出結果を「アーカイブ」として記録する機能が、どんな場面のために用意されているか考えてみましょう。
  3. S3以外に、Access Analyzerが外部アクセスの対象とするリソースにはどんなものがありそうでしょうか。なぜそれらが対象になるのでしょうか。
    ヒント
    「リソースベースのポリシーを持ち、他のAWSアカウントや外部のプリンシパルに権限を付与できるリソース」という共通点で考えてみましょう。IAMロールの信頼ポリシーなどが一例です。
10 — Clean up

後片づけ

作成したリソースを順番に削除します。

  1. S3バケットを空にして削除する:バケットの中のオブジェクトをすべて削除してから、バケット本体を削除します。
  2. アナライザーを削除する(必要であれば):継続的に学習で使う予定がなければ、IAMコンソールの「Access Analyzer」から削除します。残しておいても料金はかかりません。
Caution — パブリックアクセスのブロックを戻し忘れない

検証用に解除した設定は、検証後に必ず元に戻す

フェーズ2で一時的に解除した「パブリックアクセスをブロック」の設定は、バケットを削除する場合でも、先に元の状態に戻しておくことをおすすめします。誤って別の検証で同じバケット名を使い回した際に、公開状態のまま忘れてしまうことを防げます。

コストに関する注意: 今回作成する「アカウント用」の外部アクセスアナライザーには料金はかかりません。(IAMロールの未使用アクセス分析など、一部の追加機能には別途料金がかかる場合があります。)S3の保存容量・リクエストには料金がかかりますが、少量のテストファイルであれば無料利用枠の範囲内に収まることが多いです。IAM・バケットポリシー自体に料金はかかりません。検証が終わったら、上の「後片づけ」に沿って公開設定を元に戻し、バケットを削除しましょう。最新の料金は AWS の公式料金ページで確認してください。