リソースポリシー系
リソースベースポリシーによるパブリックアクセス許可をチェックするコントロール群。Lambda 関数、KMS キー、SNS トピック、SQS キューなど、リソースポリシー(Principal フィールドを持つ JSON ポリシー)でアクセス制御を行うサービスが対象である。
4 件のコントロールはいずれも「Principal: "*" または等価な Principal: {"AWS": "*"} を許可しているか」のみをチェックする。特定の外部アカウントへのクロスアカウントアクセス(例: Principal: {"AWS": "arn:aws:iam::123456789012:root"})は検出しないため、組織外への意図しない共有を検出するには別途 IAM Access Analyzer の利用が必要である。
対象コントロール(4 件)
デフォルト保護は API のデフォルト値(CLI でオプションを省略した場合の値)に基づく。マネジメントコンソールではより安全な値がプリセットされている場合がある。4 件すべてがデフォルトでパブリックアクセスを許可しない状態であり、明示的にリソースポリシーを変更しない限り FAILED にはならない。
| コントロール | 重大度 | タイトル | デフォルト保護 | IAM Access Analyzer | 記事 |
|---|---|---|---|---|---|
| Lambda.1 | CRITICAL | Lambda 関数ポリシーがパブリックアクセスを許可していないこと | 保護済み: デフォルトではリソースベースポリシーが存在しない。lambda:AddPermission で Principal: "*" を明示的に追加しない限り FAILED にならない | 対象 | 検証済み |
| KMS.5 | CRITICAL | KMS キーがパブリックにアクセス可能でないこと | 保護済み: kms:CreateKey で生成されるデフォルトキーポリシーは自アカウント root のみに kms:* を許可。kms:PutKeyPolicy で Principal: "*" を明示的に設定しない限り FAILED にならない。なお、AWS マネージドキーは Config ルール kms-key-policy-no-public-access の対象外(カスタマーマネージドキーのみ評価) | 対象 | 検証済み |
| SNS.4 | CRITICAL | SNS トピックアクセスポリシーがパブリックアクセスを許可していないこと | 保護済み: デフォルトのトピックポリシーは Principal: {"AWS": "*"} を含むが、Condition.StringEquals.AWS:SourceOwner により自アカウントのみに制限される。Condition を削除するなどして sns:SetTopicAttributes を実行しない限り FAILED にならない | 対象 | 検証済み |
| SQS.3 | CRITICAL | SQS キューアクセスポリシーがパブリックアクセスを許可していないこと | 保護済み: デフォルトではキューポリシーが存在しない。sqs:SetQueueAttributes で Principal: "*" を含むポリシーを明示的に設定しない限り FAILED にならない | 対象 | 検証済み |
ES.2(Elasticsearch ドメイン)と Opensearch.2(OpenSearch ドメイン)は、当初このカテゴリに分類していたが、実際の Config ルール(elasticsearch-in-vpc-only / opensearch-in-vpc-only)はリソースポリシーを評価せず、VPC アクセス方式で作成されているかのみをチェックする。構造的には SageMaker.1(DirectInternetAccess パラメータ)と同じ「サービス固有のインターネットアクセス設定」のため、インターネット到達性 カテゴリに移動した。
共通の検出ロジック
Lambda.1 / KMS.5 / SNS.4 / SQS.3 の 4 件は、いずれも IAM ベースのリソースポリシー(Principal フィールドを持つ JSON ポリシー)を対象とし、Principal: "*" または Principal: {"AWS": "*"} を許可しているかを評価する。Condition による絞り込み(SNS のデフォルトポリシーで使われる AWS:SourceOwner など)は適切に解釈され、自アカウントのみに制限されている場合は PASSED となる。
なお、SSM.4(SSM ドキュメントがパブリックでないこと)は当初このカテゴリに分類していたが、SSM ドキュメントは IAM ベースのリソースポリシーを持たず、ssm:ModifyDocumentPermission API でアカウント ID のリスト(個別アカウント ID または all)を指定して共有する仕組みのため、リソースポリシー系の検出ロジックとは性質が異なる。SSM のアカウント単位のサービス機能(Block Public Sharing)と対になる構造であることから、サービス独自の公開設定 カテゴリに移動した。
IAM Access Analyzer との関係
これら 4 件のコントロールは「*」によるパブリック公開のみを検出するが、実際の脅威としては「特定の外部アカウントへの意図しない共有」も同等に重要である。IAM Access Analyzer はこの領域をカバーする:
| 検出対象 | Security Hub CSPM(本カテゴリ) | IAM Access Analyzer |
|---|---|---|
Principal: "*" によるパブリック公開 | ✅ 検出 | ✅ 検出 |
| 特定の外部アカウントへのクロスアカウントアクセス | ❌ 検出しない | ✅ 検出(信頼ゾーン外であれば) |
| 評価方式 | Config ルールによる定期評価 | リソース作成・変更時の継続的分析 |
本カテゴリの 4 リソース(Lambda 関数 / KMS キー / SNS トピック / SQS キュー)はいずれも IAM Access Analyzer の対象リソースであり、クロスアカウントアクセスは IAM Access Analyzer で補完的に検出できる。
予防手段との対応
4 件のコントロールに対する予防手段の整備状況は、サービスによって大きく異なる。予防手段のタイプは大きく 3 つに分けられる: ポリシー設定自体を設定時にブロックする「直接的な予防」(SCP / サービス機能)、ポリシーは許容するが組織外からの実アクセスをブロックする「間接的な予防」(RCP)、そして専用の予防手段が存在しない場合のカスタム対応である。
Lambda.1: 直接的な予防コントロールあり(SCP)
CT.LAMBDA.PV.2 は SCP として動作し、lambda:AddPermission で外部プリンシパル(パブリック Principal: "*" および特定の外部アカウント ID)を指定する操作を設定時に拒否する。Lambda.1 自体はパブリックアクセスのみを検出するが、CT.LAMBDA.PV.2 は Lambda.1 の対象範囲に加えてクロスアカウントも併せてブロックする。有効化前から存在する FAILED な関数ポリシーは解消されないが、新規違反は発生しない(CT.LAMBDA.PV.2 の検証で確認済み)。
なお、CT.LAMBDA.PV.1 は関数 URL の AuthType: NONE を禁止するコントロールで、PV.2 と併用することで「認証なしの関数 URL を作らせない + そもそもパブリックアクセスを許可させない」という多層防御になる。
KMS.5 / SQS.3: 間接的な予防コントロールあり(RCP)
CT.KMS.PV.7 と CT.SQS.PV.1 は RCP(リソースコントロールポリシー)として動作し、組織外の IAM プリンシパルからの KMS / SQS API 操作を拒否する。これらはリソースポリシーの内容(Principal: "*" の有無)には介入しないため、Security Hub finding は FAILED のまま変化しない。ただし、リソースポリシーが緩い状態でも、組織外からの実アクセスは RCP で阻止される(VPC BPA がインターネット到達性に対して果たす役割と類似)。
SNS.4: 専用の予防コントロールなし
SNS.4 については、Security Hub finding 発生を防ぐ専用の Control Tower 予防コントロールおよび宣言型ポリシーが本記事執筆時点では存在しない。SNS はプロアクティブコントロール(CloudFormation Hooks 型)のカテゴリ自体が提供されていない。リスク低減には、SNS API の設定操作を拒否するカスタム SCP、または組織外プリンシパルからの SNS API を拒否するカスタム RCP(CT.KMS.PV.7 / CT.SQS.PV.1 と同じパターンを SNS に適用)が必要となるが、いずれも本記事執筆時点で未検証である。
影響まとめ
| コントロール | 対応する予防手段 | 種別 | 動作 | finding への影響 |
|---|---|---|---|---|
| Lambda.1 | CT.LAMBDA.PV.2 | SCP(設定時) | Principal: "*" および外部アカウント指定の add-permission を拒否 | 新規違反は発生しない。有効化前の FAILED は維持 |
| KMS.5 | CT.KMS.PV.7 | RCP(実行時) | 組織外プリンシパルの KMS API をブロック | FAILED のまま変化しない(実際のアクセスは阻止される) |
| SNS.4 | 専用なし | - | - | カスタム SCP / RCP で対応する必要あり |
| SQS.3 | CT.SQS.PV.1 | RCP(実行時) | 組織外プリンシパルの SQS API をブロック | FAILED のまま変化しない(実際のアクセスは阻止される) |
補足: パブリック公開と外部アカウント共有の脅威モデル
リソースポリシー系の 4 件のコントロールはあくまで「パブリック(全 AWS プリンシパル)への公開」を検出するものであり、より一般的な脅威である「意図しない外部アカウントへの共有」は対象外である。多層防御の観点では、以下のレイヤーを組み合わせる必要がある:
- Security Hub CSPM(本カテゴリ): リソースポリシーの
Principal: "*"を検出(事後検出) - IAM Access Analyzer: 信頼ゾーン外への共有を検出(事後検出。本カテゴリの 4 リソースはいずれも対象)
- Control Tower 予防コントロール(CT.LAMBDA.PV.2 等): 設定時に違反設定をブロック(事前防止)
- RCP / SCP(CT.KMS.PV.7 / CT.SQS.PV.1 等): リソースポリシーの内容に関係なく、組織外からの実アクセスをブロック(実行時防止)
SNS.4 のように専用の予防手段がないコントロールについては、カスタム SCP / RCP でレイヤー 3 / 4 を独自に整備することが、検出に頼らないリスク低減の鍵となる。