はじめに
AWS SAPのとある練習問題を解いてるときにIAM Access AnalyzerがS3でも使えると知りました。S3バケットポリシーに関する問題で、選択肢の一つにIAM Access Analyzerがあり、これは消去法ですぐ消えるやつ!かと思いきやIAM Access Analyzerが正解で違和感がたっぷりでした。
解説を見て一応納得はしましたが、IAM Access AnalyzerがS3で使えるなんてほんまかいなと思ったらほんまだったので使いっぷりを記します。
IAM Access Analyzerとは
ざっくりいうと、AWSリソースのポリシーを自動的に解析して、意図せず外部公開されているアクセスなどを見つけてくれるサービスです。
なぜ「IAM」なのにS3が出てくるのかというと、答えはシンプルでS3バケットポリシーもIAMポリシーの仲間(resource-based policy)だからです。外部アクセス分析はリソース側のポリシーを読むツールなので、S3が対象なのは当然でした。
「IAMって名前だからIAMロールの話でしょ」と決めつけていた過去の自分がいました。今思えばこの思い込み、自分で勝手にかけたいらない「制約と誓約」みたいなもので、能力が強くなるどころか、ただ視野を狭くしていただけでした。
実際、対象リソースはこんなにあります。S3はその筆頭です。
外部アクセスでサポートされるリソースタイプ
外部アクセスは組織・アカウントの外からリソースにアクセスできる場合に検出します。
- Amazon Simple Storage Service バケット
- Amazon Simple Storage Service ディレクトリバケット
- AWS Identity and Access Management ロール
- AWS Key Management Service キー
- AWS Lambda の関数とレイヤー
- Amazon Simple Queue Service キュー
- AWS Secrets Manager シークレット
- Amazon Simple Notification Service トピック
- Amazon Elastic Block Store ボリュームスナップショット
- Amazon Relational Database Service DB スナップショット
- Amazon Relational Database Service DB クラスタースナップショット
- Amazon Elastic Container Registry リポジトリ
- Amazon Elastic File System ファイルシステム
- Amazon DynamoDB Streams
- Amazon DynamoDB テーブル
内部アクセスでサポートされるリソースタイプ
内部アクセスは組織またはアカウント内のプリンシパル(ユーザーまたはロール)が指定されたリソースにアクセスできる場合に検出します。
- Amazon Simple Storage Service バケット
- Amazon Simple Storage Service ディレクトリバケット
- Amazon Relational Database Service DB スナップショット
- Amazon Relational Database Service DB クラスタースナップショット
- Amazon DynamoDB Streams
- Amazon DynamoDB テーブル
対象リソースは今後増減する可能性があります。最新はこちらをご確認ください。
やってみる
ここからは実際の画面で、「有効になっていない状態」→「有効化」→「有効になった確認」→「わざと公開して検知させる」まで一通りやってみます。
Step 0. まず「有効になっていない」ことを確認する
S3コンソールのサイドメニュー > 「アクセス管理とセキュリティ」>「IAM Access Analyzer」
まだIAM Access Analyzerを有効にしていないと、こんなメッセージが出ます。
(こんなところにIAM Access Analyzerがあったなんて、優秀なハンターであればオレでなきゃ見逃しちゃうねと気づきそうです)
Step 1. IAM Access Analyzerを有効化する
表示リンクから飛んだ先がこちら、「仕組み」と「料金」がまとまっています。
料金はこの通り、外部アクセスは無料です(コンソール表示時点)。
- 外部アクセス: 無料
- 内部アクセス: AWSリソースあたり 月額 9 USD
- 未使用アクセス: IAMユーザー/ロールあたり 月額 0.2 USD
「アナライザーを作成」へ進み、設定します。
- 検出結果のタイプ: リソース分析 - 外部アクセス(コスト:追加費用なし)
- お試しなので料金がかからないこちらを選択
- リージョン: アジアパシフィック(東京)
- 信頼ゾーン: 現在のアカウント
作成すると、こんな感じで「正常に作成されました」と出ます(検出結果はまだ0件)。
Step 2. 有効になったことを確認する
S3コンソールに戻って、もう一度「IAM Access Analyzer」を開きます。さっきの未有効化メッセージが消えて、検出結果の一覧画面に変わっていればOKです。
ここで地味に大事な注記が出ています。
プライベートアクセスのあるバケットはリストに表示されません。Access Analyzer は、パブリックアクセスとクロスアカウントアクセスのあるバケットのみの検出結果を提供します
つまり「何も出てこない=公開/共有バケットが無い」という意味なので、空っぽは良いことです。
Step 3. わざと公開して検知させてみる
せっかくなので、テスト用バケットをわざと公開して、ちゃんと検知されるか試します。
手順は2つです。
ブロックパブリックアクセスをオフにする
バケットの「アクセス許可」タブで、ブロックパブリックアクセスをオフにします。
ブロックパブリックアクセスをオフにしただけでは「公開を許可するポリシー」が無いので検知されません。そこでバケットポリシーで明示的に公開し、検知させます(ポリシー変更の反映は30分以内)。
公開を許可するバケットポリシーを入れる
同じ「アクセス許可」タブのバケットポリシーに、誰でも(Principal: "*")オブジェクトを読める設定を入れます。バケット名(20260630-example)はご自身のものに置き換えてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::20260630-example/*"
}
]
}
検知されるのを待つ
保存して少し待つと、S3コンソールの「IAM Access Analyzer」に警告が出て、「パブリックアクセスを備えたバケット」に今回のバケットが現れます。ちゃんと「公開してますよ」と教えてくれました。
Step 4. 検出結果の中身を見る(IAM側)
S3の一覧で対象バケットを選んで「検出結果を表示」を押すと、IAM Access Analyzerの「外部アクセス」画面に飛びます。
S3バケットが Read・バケットポリシー経由で検知されているのが分かります。そして同じ画面にS3バケット以外の検出結果(amplify由来のIAMロールなど)も並んでいることです。有効化して時間経過したことで過去に作成していたリソースが検知されました。Access Analyzerが、IAMやS3だけでなくリソース横断でアクセスを見ているのがよく分かります。
検出結果IDをクリックすると、詳細まで確認できます。
- パブリック: パブリックアクセスを許可するリソース、という警告
- 外部プリンシパル: すべてのプリンシパル(=誰でも)
- アクセスレベル:
Read(s3:GetObject) - 経由: バケットポリシー
- ステータス: アクティブ
さらに「次のステップ」に、意図的な公開ならアーカイブ/意図しない公開ならS3コンソールで修正、という導線まで用意されています。検知して終わりじゃなく、対処までセットなのが親切です。
Step 5. その場でブロックして解決する
S3コンソールに戻り、今回はテストなので「意図しない公開」として塞ぎます。S3の「IAM Access Analyzer」画面で対象バケットを選んで**「パブリックアクセスをすべてブロック」**。確認のため 確認 と入力します。
実行すると「パブリックアクセスのブロックが更新されました」と出て、リストからバケットが消えます。
バケット側を見ると、ブロックパブリックアクセスがちゃんとオンに戻っています。
まとめ
- IAM Access Analyzer はIAMロール専用ツールではない
resource-based policyを解析でき、S3バケットポリシーはその代表格 - 「IAM」の名前でもS3が対象なのは自然なこと
- 外部アクセス分析は無料、さらにS3コンソールから直接公開バケットを棚卸しできる
IAM Access Analyzerは想像よりはるかに多くのリソースに対応していました。IAMの面をしていて勝手に騙されていましたが、こんなサービスがあったなんて知見でした。資格勉強しているとこういう発見もあるので面白いところです。
同じように自分で勝手にかけた「制約と誓約」で視野を狭めていた人の役に立てば嬉しいです。












