Security Hub CSPM
Security Hub CSPM とは
AWS Security Hub の CSPM(Cloud Security Posture Management)機能は、AWS リソースの設定がセキュリティベストプラクティスに準拠しているかを自動チェックするサービスである。各チェック項目は「コントロール」と呼ばれ、AWS Config ルールにより評価される。
他のツールとの位置づけ
Security Hub CSPM で検出された問題に対して、「予防」と「検出の深掘り」の両面で補完するツールがある。
検出
| ツール | 役割 | チェック方法 |
|---|---|---|
| Security Hub CSPM | 設定の逸脱を継続的にチェック | AWS Config ルールによる設定チェック |
| IAM Access Analyzer | 外部からの到達可能性を分析 | Zelkova 自動推論エンジンによるポリシー分析 |
Security Hub CSPM は「設定がどうなっているか」をチェックする。IAM Access Analyzer は「最終的に誰がアクセスできるか」を分析する。Security Hub CSPM がパブリックアクセスの設定チェックを中心とするのに対し、IAM Access Analyzer はクロスアカウントアクセスも含めた到達可能性を分析する。
なお、Control Tower にも独自の検出コントロール(Strongly recommended / Elective)があり、パブリックアクセス関連のものも含まれる。ただし、FSBP の方がコントロール数が多く網羅性が高いため、本記事では FSBP を基準として整理する。
予防
| ツール | 役割 | 適用方法 |
|---|---|---|
| Control Tower 予防コントロール | AWS が提供するマネージドな予防ガードレール | Control Tower コンソールから OU 単位で有効化 |
| Declarative Policies | サービスの基本設定を組織全体に宣言的に強制 | Organizations で OU 単位またはアカウント単位で適用 |
| カスタム SCP / RCP 等 | 予防コントロールが存在しないサービスを補完 | Organizations で独自のポリシーを作成・適用 |
予防コントロールおよび Declarative Policies が存在するサービスについては、これらを優先的に活用すべきである。予防コントロールは AWS がポリシーの内容を管理しており、サービスの仕様変更に追従する。Declarative Policies はサービスのコントロールプレーンで直接強制されるため、新しい API が追加されてもポリシーの更新なしに設定を維持できる。カスタム SCP / RCP は自分でメンテナンスが必要であり、サービスの API 変更や新機能追加に対して追従漏れのリスクがある。
予防コントロールが存在しないサービスについては、カスタム SCP / RCP 等で補完する必要がある。個別コントロールの検証で、カスタムポリシーの実装例と妥当性を検証する。
セキュリティ基準と重大度
FSBP を対象とする理由
Security Hub には複数のセキュリティ基準(CIS AWS Foundations Benchmark、PCI DSS 等)があるが、本記事では AWS Foundational Security Best Practices(FSBP) を対象とする。FSBP は AWS 自身が定義したベストプラクティス集であり、AWS サービス固有の設定チェックが最も網羅的に含まれている。他の基準(CIS 等)は業界標準の観点からのチェックであり、FSBP と重複するコントロールも多い。
重大度 CRITICAL / HIGH にフォーカスする理由
Security Hub コントロールの重大度は、悪用の難易度と侵害の可能性に基づいて AWS が割り当てている(AWS Prescriptive Guidance)。
| 重大度 | 定義 | 意味 |
|---|---|---|
| CRITICAL | 即座に修復すべき(escalating を避けるため) | 悪用が容易で、侵害の可能性が高い。放置するとリスクが拡大する |
| HIGH | 優先的に対処すべき | 悪用の難易度は中程度だが、侵害された場合の影響が大きい |
| MEDIUM | 緊急ではないが対処すべき | 悪用の難易度が高い、または侵害の影響が限定的 |
| LOW | 単独では対処不要 | 他の問題と組み合わさった場合にリスクとなる可能性がある |
MEDIUM / LOW のコントロールも対処すべきものであり、無視してよいわけではない。ただし、AWS は「CRITICAL と HIGH の finding を優先的に調査することを推奨」していることから、本記事では対処の優先順位に従い、まず CRITICAL / HIGH のコントロールを対象とする。
CRITICAL / HIGH コントロールの全体像
FSBP の CRITICAL / HIGH コントロールは合計 82 件(CRITICAL 27 件、HIGH 55 件)ある。セキュリティ上の懸念パターンで分類すると以下の通り。
| パターン | 件数 | 割合 | CRITICAL | HIGH | 概要 |
|---|---|---|---|---|---|
| パブリックアクセスの防止 | 35 | 43% | 21 | 14 | リソースがインターネットに公開されていないことを確認 |
| セキュリティサービスの有効化 | 14 | 17% | 1 | 13 | GuardDuty、Inspector、Config 等の有効化 |
| パッチ / バージョン管理 | 7 | 9% | 0 | 7 | IMDSv2 強制、マイナーバージョン自動アップグレード等 |
| 最小権限 / アクセス制御 | 6 | 7% | 0 | 6 | ワイルドカード権限の禁止、SG の制限等 |
| 認証情報の保護 | 6 | 7% | 4 | 2 | クリアテキスト認証情報の排除、ルートアクセスキー排除 |
| ログ・監視の確保 | 4 | 5% | 0 | 4 | CloudTrail マルチリージョン証跡、ログ設定 |
| ネットワーク分離 / VPC 設計 | 6 | 7% | 0 | 6 | カスタム VPC 配置、拡張 VPC ルーティング |
| 暗号鍵の保護 | 2 | 2% | 1 | 1 | KMS キーの削除防止 |
| その他 | 2 | 2% | 0 | 2 | 上記に含まれないもの |
CRITICAL 27 件中 21 件(78%)がパブリックアクセスの防止に分類される。
選定の考え方
本記事では、パブリックアクセスの防止(35 件)を検証対象とする。
パブリックアクセスにフォーカスする理由:
- CRITICAL 27 件中 21 件(78%)がパブリックアクセス関連であり、最もリスクが高いパターン
- 全 82 件の 43% を占める最大のカテゴリ
残り 47 件は、テーマが異なるため今回は扱わない。セキュリティサービスの有効化(GuardDuty / Inspector 等)は組織設計、パッチ管理やネットワーク分離はワークロード固有の運用設計に依存するテーマであり、パブリックアクセスの防止とは検証の観点が異なる。なお、CloudFront.12(CloudFront ディストリビューションが存在しない S3 オリジンを指さない)は FSBP では HIGH に分類されているが、削除済みの S3 バケット名を第三者に取得されるリスク(サブドメインテイクオーバー)を検出するものであり、リソースの公開設定をチェックする他のパブリックアクセス防止コントロールとは性質が異なるため、本記事のスコープ外とする。
パブリックアクセス関連コントロール一覧(35 件)
CRITICAL(21 件)
| # | コントロール | タイトル | デフォルト保護 | 予防コントロール | Declarative Policies ※※ | カスタム SCP | IAM Access Analyzer |
|---|---|---|---|---|---|---|---|
| 1 | EC2.1 | EBS スナップショットをパブリックに復元可能にしない | 未保護(要検証) | CT.EC2.PV.3, CT.EC2.PV.7 | EBS Snapshot BPA | — | 対象 |
| 2 | EC2.19 | SG でハイリスクポートへの無制限アクセスを許可しない | 未保護(要検証) | なし | — | 要検討 | 対象外 |
| 3 | DMS.1 | DMS レプリケーションインスタンスをパブリックにしない | 未保護(要検証) | なし | — | 要検討 | 対象外 |
| 4 | ES.2 | Elasticsearch ドメインをパブリックにアクセス可能にしない | 未保護(要検証) | なし | — | 要検討 | 対象外 |
| 5 | Opensearch.2 | OpenSearch ドメインをパブリックにアクセス可能にしない | 未保護(要検証) | なし | — | 要検討 | 対象外 |
| 6 | RDS.1 | RDS スナップショットをプライベートにする | 保護済み(要検証) | なし | — | 要検討 | 対象 |
| 7 | RDS.2 | RDS DB インスタンスのパブリックアクセスを禁止する | 未保護(要検証) | なし | — | 要検討 | 対象外 |
| 8 | Redshift.1 | Redshift クラスターのパブリックアクセスを禁止する | 未保護(要検証) | なし | — | 要検討 | 対象外 |
| 9 | DocumentDB.3 | DocumentDB 手動クラスタースナップショットをパブリックにしない | 保護済み(要検証) | なし | — | 要検討 | 対象外 |
| 10 | Neptune.3 | Neptune DB クラスタースナップショットをパブリックにしない | 保護済み(要検証) | なし | — | 要検討 | 対象外 |
| 11 | MSK.4 | MSK クラスターのパブリックアクセスを無効にする | 保護済み(要検証) | なし | — | 要検討 | 対象外 |
| 12 | Lambda.1 | Lambda 関数ポリシーでパブリックアクセスを禁止する | 保護済み(要検証) | CT.LAMBDA.PV.2 | — | — | 対象 |
| 13 | S3.2 | S3 汎用バケットでパブリック読み取りアクセスをブロックする | 保護済み(要検証) | 関連あり ※ | S3 BPA | — | 対象 |
| 14 | S3.3 | S3 汎用バケットでパブリック書き込みアクセスをブロックする | 保護済み(要検証) | 関連あり ※ | S3 BPA | — | 対象 |
| 15 | S3.19 | S3 アクセスポイントで BPA 設定を有効にする | 保護済み(要検証) | 関連あり ※ | S3 BPA | — | 対象 |
| 16 | KMS.5 | KMS キーをパブリックにアクセス可能にしない | 保護済み(要検証) | CT.KMS.PV.7 | — | — | 対象 |
| 17 | SNS.4 | SNS トピックアクセスポリシーでパブリックアクセスを許可しない | 未保護(要検証) | なし | — | 要検討 | 対象 |
| 18 | SQS.3 | SQS キューアクセスポリシーでパブリックアクセスを許可しない | 未保護(要検証) | 関連あり ※ | — | — | 対象 |
| 19 | SSM.4 | SSM ドキュメントをパブリックにしない | 保護済み(要検証) | なし | — | 要検討 | 対象外 |
| 20 | SSM.7 | SSM ドキュメントのパブリック共有ブロック設定を有効にする | 未保護(要検証) | なし | — | 要検討 | 対象外 |
| 21 | EMR.2 | EMR ブロックパブリックアクセス設定を有効にする | 保護済み(要検証) | なし | — | 要検討 | 対象外 |
HIGH(14 件)
| # | コントロール | タイトル | デフォルト保護 | 予防コントロール | Declarative Policies ※※ | カスタム SCP | IAM Access Analyzer |
|---|---|---|---|---|---|---|---|
| 1 | EC2.9 | EC2 インスタンスにパブリック IPv4 アドレスを持たせない | 未保護(要検証) | なし | VPC BPA | 要検討 | 対象外 |
| 2 | EC2.25 | EC2 起動テンプレートでパブリック IP を割り当てない | 未保護(要検証) | なし | VPC BPA | 要検討 | 対象外 |
| 3 | EC2.182 | EBS スナップショットの BPA 設定を有効にする | 未保護(要検証) | CT.EC2.PV.7 | EBS Snapshot BPA | — | 対象 |
| 4 | Autoscaling.5 | Auto Scaling 起動設定でパブリック IP を割り当てない | 未保護(要検証) | なし | VPC BPA | 要検討 | 対象外 |
| 5 | ECS.2 | ECS サービスにパブリック IP を自動割り当てしない | 保護済み(要検証) | なし | VPC BPA | 要検討 | 対象外 |
| 6 | ECS.16 | ECS タスクセットにパブリック IP を自動割り当てしない | 保護済み(要検証) | なし | VPC BPA | 要検討 | 対象外 |
| 7 | EKS.1 | EKS クラスターエンドポイントをパブリックにアクセス可能にしない | 未保護(要検証) | なし | — | 要検討 | 対象外 |
| 8 | EMR.1 | EMR クラスタープライマリノードにパブリック IP を持たせない | 未保護(要検証) | なし | VPC BPA | 要検討 | 対象外 |
| 9 | RDS.46 | RDS DB インスタンスを IGW ルートがあるパブリックサブネットにデプロイしない | 未保護(要検証) | なし | VPC BPA | 要検討 | 対象外 |
| 10 | Redshift.15 | Redshift SG でクラスターポートへのインターネットアクセスを許可しない | 未保護(要検証) | なし | — | 要検討 | 対象外 |
| 11 | RedshiftServerless.3 | Redshift Serverless ワークグループのパブリックアクセスを禁止する | 未保護(要検証) | なし | — | 要検討 | 対象外 |
| 12 | SageMaker.1 | SageMaker ノートブックインスタンスでダイレクトインターネットアクセスを無効にする | 未保護(要検証) | なし | VPC BPA | 要検討 | 対象外 |
| 13 | S3.6 | S3 汎用バケットポリシーで他の AWS アカウントからのアクセスを制限する | 保護済み(要検証) | 関連あり ※ | 関連あり ※※ | — | 対象 |
| 14 | S3.8 | S3 汎用バケットで BPA を有効にする | 保護済み(要検証) | 関連あり ※ | S3 BPA | — | 対象 |
デフォルト保護の分類(暫定)
公式ドキュメントからの一次整理に基づく暫定分類。個別コントロールの検証で確定させる。
| 分類 | 件数 | コントロール |
|---|---|---|
| デフォルトで保護済み | 15 | S3.2, S3.3, S3.6, S3.8, S3.19, RDS.1, DocumentDB.3, Neptune.3, MSK.4, Lambda.1, KMS.5, SSM.4, ECS.2, ECS.16, EMR.2 |
| デフォルトで未保護 | 20 | EC2.1, EC2.19, EC2.9, EC2.25, EC2.182, Autoscaling.5, DMS.1, ES.2, Opensearch.2, RDS.2, RDS.46, Redshift.1, Redshift.15, RedshiftServerless.3, SNS.4, SQS.3, SSM.7, EKS.1, EMR.1, SageMaker.1 |
IAM Access Analyzer との検出範囲の比較
Security Hub CSPM は主にパブリックアクセスの設定をチェックする(S3.6 のようにクロスアカウントアクセスをチェックするコントロールも一部存在する)。一方、IAM Access Analyzer はパブリックアクセスに加えてクロスアカウントアクセスも検出する。
| 分類 | 件数 | コントロール |
|---|---|---|
| IAM Access Analyzer 対象 | 12 | EC2.1, EC2.182, Lambda.1, S3.2, S3.3, S3.6, S3.8, S3.19, KMS.5, SNS.4, SQS.3, RDS.1 |
| IAM Access Analyzer 対象外 | 23 | EC2.19, EC2.9, EC2.25, Autoscaling.5, DMS.1, ES.2, Opensearch.2, RDS.2, RDS.46, Redshift.1, Redshift.15, RedshiftServerless.3, DocumentDB.3, Neptune.3, MSK.4, SSM.4, SSM.7, EKS.1, EMR.1, EMR.2, SageMaker.1, ECS.2, ECS.16 |
IAM Access Analyzer 対象のリソースについては、Security Hub CSPM がパブリックアクセスのみを検出するコントロールであっても、IAM Access Analyzer でクロスアカウントアクセスを補完的に検出できる。IAM Access Analyzer 対象外のリソースについては、クロスアカウントの検出手段が限られるため、予防コントロールやカスタム SCP による予防的対処がより重要になる。
検証の進め方
確認ポイント
個別コントロールの検証では、デフォルト保護の有無に応じて以下の確認を行う。
共通
- 検出対象が何か(何の設定をチェックしているか)
- パブリックアクセスのみか、クロスアカウントアクセスも検出するか
- IAM Access Analyzer の対象リソースであれば、検出範囲の対比
- デフォルトで保護されているか
パターン A:デフォルトで保護されている場合
- 何をやったら検出するか(ユーザーの誤操作を想定した設定変更)
- Config ルールで強制的に finding 生成 → FAILED 確認
- 設定を戻す → PASSED に戻るか確認
- 設定変更を防ぐための手段(予防コントロール → カスタム SCP → Config ルールと修復)
- 予防手段を適用した後、Security Hub finding の状態はどうなるか
パターン B:デフォルトで保護されていない場合
- 今検出されているか(サービス起動が必要なら起動)
- Config ルールで強制的に finding 生成 → FAILED 確認
- デフォルトで保護するための設定方法
- 設定適用後 → PASSED に戻るか確認
- 設定変更を防ぐための手段(予防コントロール → カスタム SCP → Config ルールと修復)
- 予防手段を適用した後、Security Hub finding の状態はどうなるか
検証対象コントロール一覧
| # | コントロール | 重大度 | 対象サービス | 記事 |
|---|---|---|---|---|
| 1 | EC2.1 | CRITICAL | EBS スナップショット | 検証予定 |
| 2 | EC2.19 | CRITICAL | セキュリティグループ | 検証予定 |
| 3 | DMS.1 | CRITICAL | DMS レプリケーションインスタンス | 検証予定 |
| 4 | ES.2 | CRITICAL | Elasticsearch ドメイン | 検証予定 |
| 5 | Opensearch.2 | CRITICAL | OpenSearch ドメイン | 検証予定 |
| 6 | RDS.1 | CRITICAL | RDS スナップショット | 検証予定 |
| 7 | RDS.2 | CRITICAL | RDS DB インスタンス | 検証予定 |
| 8 | Redshift.1 | CRITICAL | Redshift クラスター | 検証予定 |
| 9 | DocumentDB.3 | CRITICAL | DocumentDB スナップショット | 検証予定 |
| 10 | Neptune.3 | CRITICAL | Neptune スナップショット | 検証予定 |
| 11 | MSK.4 | CRITICAL | MSK クラスター | 検証予定 |
| 12 | Lambda.1 | CRITICAL | Lambda 関数 | 検証予定 |
| 13 | S3.2 | CRITICAL | S3 バケット | 検証予定 |
| 14 | S3.3 | CRITICAL | S3 バケット | 検証予定 |
| 15 | S3.19 | CRITICAL | S3 アクセスポイント | 検証予定 |
| 16 | KMS.5 | CRITICAL | KMS キー | 検証予定 |
| 17 | SNS.4 | CRITICAL | SNS トピック | 検証予定 |
| 18 | SQS.3 | CRITICAL | SQS キュー | 検証予定 |
| 19 | SSM.4 | CRITICAL | SSM ドキュメント | 検証予定 |
| 20 | SSM.7 | CRITICAL | SSM ドキュメント | 検証予定 |
| 21 | EMR.2 | CRITICAL | EMR Block Public Access | 検証予定 |
| 22 | EC2.9 | HIGH | EC2 インスタンス | 検証予定 |
| 23 | EC2.25 | HIGH | EC2 起動テンプレート | 検証予定 |
| 24 | EC2.182 | HIGH | EBS Block Public Access | 検証予定 |
| 25 | Autoscaling.5 | HIGH | Auto Scaling 起動設定 | 検証予定 |
| 26 | ECS.2 | HIGH | ECS サービス | 検証予定 |
| 27 | ECS.16 | HIGH | ECS タスクセット | 検証予定 |
| 28 | EKS.1 | HIGH | EKS クラスター | 検証予定 |
| 29 | EMR.1 | HIGH | EMR クラスター | 検証予定 |
| 30 | RDS.46 | HIGH | RDS DB インスタンス(サブネット) | 検証予定 |
| 31 | Redshift.15 | HIGH | Redshift セキュリティグループ | 検証予定 |
| 32 | RedshiftServerless.3 | HIGH | Redshift Serverless | 検証予定 |
| 33 | SageMaker.1 | HIGH | SageMaker ノートブック | 検証予定 |
| 34 | S3.6 | HIGH | S3 バケット | 検証予定 |
| 35 | S3.8 | HIGH | S3 バケット | 検証予定 |