IAM Access Analyzer
IAM Access Analyzer とは
IAM Access Analyzer は、AWS リソースが組織外やパブリックに公開されていないかを自動的に検出するサービスである。
一般的な構成管理ツール(CSPM)が「パブリックアクセスブロックがオンか」といった設定の有無をチェックするのに対し、IAM Access Analyzer は Zelkova という自動推論エンジンを用いて、バケットポリシー・ACL・IAM ポリシー・VPC エンドポイントポリシー等を組み合わせた到達可能性を数学的に分析する。
つまり、「設定がどうなっているか」ではなく「最終的に誰がアクセスできるか」を判定する。
Analyzer のタイプ
外部アクセスの Analyzer には、信頼ゾーン(zone of trust)の範囲に応じて 2 つのタイプがある。
| タイプ | 信頼ゾーン | 検出対象 | コスト |
|---|---|---|---|
| ACCOUNT | 単一の AWS アカウント | アカウント外からのアクセスを検出 | 無料 |
| ORGANIZATION | AWS Organizations 全体 | 組織外からのアクセスを検出 | 無料 |
ORGANIZATION タイプは組織全体を信頼ゾーンとするため、組織内のクロスアカウントアクセスは検出せず、組織外へのアクセスのみを検出する。Security Hub CSPM や予防コントロール(SCP / RCP)と同様に組織全体を一元的に管理する運用と整合するため、本記事では ORGANIZATION タイプを使用する。
なお、外部アクセスの検出は無料で利用できる。未使用アクセスの分析(別機能)は有料であり、本記事では外部アクセスの検出に焦点を当てるため扱わない。
外部アクセスの検出
IAM Access Analyzer の外部アクセス検出は、以下の 2 種類のアクセスを検出する。
| 検出対象 | 説明 | Security Hub での重要度 |
|---|---|---|
| パブリックアクセス | 全世界に公開されている(認証なしでアクセス可能) | MEDIUM |
| クロスアカウントアクセス | 組織外の特定の AWS アカウントからアクセス可能 | LOW |
パブリックアクセスについては、Block Public Access のようにデフォルトでブロックする仕組みを持つサービスがある。
| リソース | Block Public Access のレベル | デフォルト状態 |
|---|---|---|
| S3 バケット | アカウント + バケット | バケットレベル: 有効(2023 年 4 月〜)、アカウントレベル: 無効 |
| S3 ディレクトリバケット | 常時有効(変更不可) | 有効 |
| EBS スナップショット | アカウント(リージョン単位) | 無効 |
| EC2 AMI | アカウント(リージョン単位) | 有効(block-new-sharing) |
| DynamoDB | 常時有効(無効化不可) | 有効 |
一方、クロスアカウントアクセスについては、明示的にブロックする仕組みがないサービスが多い。S3 の BPA は RestrictPublicBuckets=true によりクロスアカウントアクセスもブロックするが(S3 バケットの検証で確認済み)、EBS の Block Public Access はパブリック共有のみが対象でクロスアカウント共有はブロックしない(公式ドキュメントに明記、CT.EC2.PV.7 の検証でも確認済み)。クロスアカウント共有を防ぐにはポリシーの適切な管理や予防コントロール(RCP / SCP)の導入が必要となる。
AWS は 2022 年から「データペリメーター」という概念を公式に推進しており、「信頼された ID だけが、信頼されたリソースに、期待されたネットワークからアクセスする」ことを保証する予防的ガードレールの確立を推奨している。Control Tower では SCP(サービスコントロールポリシー)によりアカウント内の IAM ユーザーやロールの操作(設定変更など)を制御できる。2024 年 11 月には RCP(リソースコントロールポリシー)が追加され、リソース側から組織外のアクセスを拒否する制御も可能になった。
IAM Access Analyzer は、BPA やリソースポリシー、予防コントロール等の設定を総合的に分析し、外部からアクセス可能なリソースが残っていないかを検出するツールとして位置づけられる。
対応リソース
外部アクセス検出に対応するリソースは 15 種類(2026 年 4 月時点)。
| リソースタイプ | パブリックアクセス検出 | クロスアカウントアクセス検出 |
|---|---|---|
| S3 バケット | ✅ | ✅ |
| S3 ディレクトリバケット | ✅ ※ | ✅ |
| IAM ロール | ✅ | ✅ |
| KMS キー | ✅ | ✅ |
| Lambda 関数・レイヤー | ✅ | ✅ |
| SQS キュー | ✅ | ✅ |
| Secrets Manager シークレット | ✅ | ✅ |
| SNS トピック | ✅ | ✅ |
| EBS ボリュームスナップショット | ✅ | ✅ |
| RDS DB スナップショット | ✅ | ✅ |
| RDS DB クラスタースナップショット | ✅ | ✅ |
| ECR リポジトリ | ✅ | ✅ |
| EFS ファイルシステム | ✅ | ✅ |
| DynamoDB ストリーム | ✅ ※ | ✅ |
| DynamoDB テーブル | ✅ ※ | ✅ |
※ S3 ディレクトリバケットおよび DynamoDB は BPA が常時有効で無効化できないため、パブリックポリシーの設定自体がブロックされる。IAM Access Analyzer はパブリックアクセスの分析能力を持つと考えられるが、パブリックアクセスの状態が作れないため実際には finding は生成されない
Security Hub CSPM との比較
Security Hub CSPM(FSBP)は AWS のベストプラクティスに準拠するための設定チェックを提供する。外部アクセスに関連するコントロールも含まれるが、IAM Access Analyzer とはカバー範囲が異なる。
主な違いは以下の 2 点。
- Security Hub CSPM は主にパブリックアクセス(
*プリンシパルによるアクセス)の設定をチェックする。特定の外部アカウントへのクロスアカウント共有は検出対象外のものが多い - IAM Access Analyzer はパブリックアクセスとクロスアカウントアクセスの両方を、ポリシーの組み合わせによる到達可能性分析で検出する
| リソースタイプ | Security Hub CSPM(FSBP) | IAM Access Analyzer |
|---|---|---|
| S3 バケット | S3.1, S3.2, S3.3, S3.8(パブリックアクセスの設定チェック) | パブリック + クロスアカウント(ポリシーの組み合わせ分析) |
| IAM ロール | 外部アクセスの直接チェックなし | パブリック + クロスアカウント(信頼ポリシーの外部プリンシパルを検出) |
| KMS キー | KMS.5(パブリックアクセスのチェック) | パブリック + クロスアカウント |
| Lambda 関数 | Lambda.1(パブリックアクセスのチェック) | パブリック + クロスアカウント |
| SQS キュー | SQS.3(パブリックアクセスのチェック) | パブリック + クロスアカウント |
| SNS トピック | SNS.4(パブリックアクセスのチェック) | パブリック + クロスアカウント |
| Secrets Manager | 外部アクセスチェックなし(暗号化チェックのみ) | パブリック + クロスアカウント |
| EBS スナップショット | EC2.1(パブリック共有のチェック) | パブリック + クロスアカウント(共有先アカウント ID の特定) |
| RDS スナップショット | RDS.1(パブリック共有のチェック) | パブリック + クロスアカウント(共有先アカウント ID の特定) |
| ECR / EFS | 外部アクセスチェックなし | パブリック + クロスアカウント |
| DynamoDB | 外部アクセスチェックなし | クロスアカウント ※※ |
| S3 ディレクトリバケット | 外部アクセスチェックなし | クロスアカウント ※※ |
※※ DynamoDB および S3 ディレクトリバケットは BPA が常時有効でパブリックポリシーの設定自体がブロックされるため、IAM Access Analyzer が検出するのはクロスアカウントアクセスのみ
予防コントロールとの関係
IAM Access Analyzer で外部アクセスを検出した後、それを予防するには Control Tower の予防コントロールが有効である。
| 対象サービス | IAM Access Analyzer(検出) | 予防コントロール(ブロック) |
|---|---|---|
| S3 | パブリック + クロスアカウント | CT.S3.PV.4(RCP: 組織外アクセスブロック) |
| IAM ロール(STS) | パブリック + クロスアカウント | CT.STS.PV.1(RCP: 組織外 AssumeRole ブロック) |
| KMS | パブリック + クロスアカウント | CT.KMS.PV.7(RCP: 組織外アクセスブロック) |
| Lambda | パブリック + クロスアカウント | CT.LAMBDA.PV.2(SCP: パブリック・クロスアカウントの権限付与をブロック) |
| SQS | パブリック + クロスアカウント | CT.SQS.PV.1(RCP: 組織外アクセスブロック) |
| Secrets Manager | パブリック + クロスアカウント | CT.SECRETSMANAGER.PV.1(RCP: 組織外アクセスブロック) |
| EBS スナップショット | パブリック + クロスアカウント | CT.EC2.PV.3(SCP: パブリック共有をブロック), CT.EC2.PV.7(Declarative: パブリック共有をブロック)※クロスアカウント共有のブロックは未対応 |
| SNS / RDS / ECR / EFS | パブリック + クロスアカウント | Control Tower 予防コントロールなし |
| DynamoDB | クロスアカウント(BPA によりパブリックはブロック) | Control Tower 予防コントロールなし |
IAM Access Analyzer で検出 → 予防コントロールでブロック → IAM Access Analyzer で検証、というサイクルを回すことで、データペリメーターを段階的に確立できる。なお、上記の予防コントロールには SCP と RCP が混在しており、制御の仕組みが異なる。SCP は組織内プリンシパルの操作を制限し、RCP はリソース側から組織外アクセスを遮断する。詳細は予防コントロールの SCP と RCP の違いを参照。
構築
委任管理者の設定、Terraform による全リージョン展開、アーカイブルールの設計については以下を参照。
- 委任管理者の設定 — サービスアクセスの有効化、SLR 作成、委任管理者の登録
- Terraform による全リージョン展開 — S3 バックエンド準備、Terraform デプロイ、アーカイブルール設計、デプロイ確認
検証
全 15 リソースタイプについて、外部アクセスの検出を検証した。各リソースの詳細は個別記事を参照。
| # | リソースタイプ | 記事 |
|---|---|---|
| 1 | S3 バケット(汎用 + ディレクトリ) | s3-bucket |
| 2 | IAM ロール | iam-role |
| 3 | KMS キー | kms-key |
| 4 | Lambda 関数 | lambda |
| 5 | SQS キュー | sqs |
| 6 | Secrets Manager シークレット | secrets-manager |
| 7 | SNS トピック | sns |
| 8 | EBS スナップショット | ebs-snapshot |
| 9 | RDS スナップショット(DB + クラスター) | rds-snapshot |
| 10 | ECR リポジトリ | ecr-repository |
| 11 | EFS ファイルシステム | efs-filesystem |
| 12 | DynamoDB(テーブル + ストリーム) | dynamodb |
確認項目と結果
- 組織外アカウントへの共有が検出されるか — 全リソースで確認済み。クロスアカウントアクセスの finding(
isPublic: false)が生成された - パブリックアクセスが検出されるか — BPA が常時有効な DynamoDB・S3 ディレクトリバケットを除く全リソースで確認済み。パブリックアクセスの finding(
isPublic: true)が生成された - アーカイブルールにより SSO ロールの検出が抑制されるか — Terraform デプロイで確認済み
- アーカイブルールにより東京以外の IAM ロール検出が抑制されるか — Terraform デプロイで確認済み
- Security Hub に検出結果が連携されるか — S3 バケットの検証で確認済み
- アーカイブ後に Security Hub から検出結果が消えるか — S3 バケットの検証で確認済み