自動修復
Security Hub CSPM のコントロールのうち、SCP / 宣言型ポリシー / Control Tower 予防コントロールによる予防が不可能なものに対して、検知後の自動修復による対応策を検証する。
自動修復の構成
本サイトでは、Security Hub finding をトリガーに EventBridge 経由で SSM Automation を起動する構成を採用する。
Config ルール評価
→ NON_COMPLIANT 検出
→ Security Hub finding → FAILED
→ EventBridge ルールで finding をフィルタ
→ SSM Automation を起動
→ リソースをコンプライアンス状態に修復
→ Config 再評価 → COMPLIANT
→ Security Hub finding → PASSEDConfig 修復アクションを使わない理由
AWS Config には Remediation Action という機能があり、Config ルールに直接 SSM Automation を紐付けて自動修復を実行できる。ただし、AWS 公式ドキュメント PutRemediationConfigurations に明記の通り、Security Hub によってデプロイされた Config ルール(securityhub- プレフィックスのルール)には修復アクションを追加できない。
This API does not support adding remediation configurations for service-linked AWS Config Rules such as Organization AWS Config rules, the rules deployed by conformance packs, and rules deployed by AWS Security Hub.
本サイトの対象コントロールはすべて Security Hub 管理の Config ルールに依存するため、Config 修復アクションは使用できない。代わりに EventBridge → SSM Automation の構成を採用する。
対象コントロール(検証対象 5 件 + 自動修復不可 4 件)
| コントロール | 重大度 | カテゴリ | Config ルール | マネージド修復ドキュメント | 記事 |
|---|---|---|---|---|---|
| RDS.1 | CRITICAL | スナップショット公開 | rds-snapshots-public-prohibited | AWSSupport-ModifyRDSSnapshotPermission(DB インスタンススナップショットのみ。クラスタースナップショットには非対応) | RDS.1 自動修復 |
| DocumentDB.3 | CRITICAL | スナップショット公開 | docdb-cluster-snapshot-public-prohibited | なし(カスタムランブック必要) | DocumentDB.3 自動修復 |
| Neptune.3 | CRITICAL | スナップショット公開 | neptune-cluster-snapshot-public-prohibited | なし(カスタムランブック必要) | Neptune.3 自動修復 |
| DMS.1 | CRITICAL | インターネット到達性 | dms-replication-not-public | 自動修復不可(再作成が必須、後述) | 対象外(自動修復不可) |
| Redshift.1 | CRITICAL | インターネット到達性 | redshift-cluster-public-access-check | AWSConfigRemediation-DisablePublicAccessToRedshiftCluster | Redshift.1 自動修復 |
| ES.2 | CRITICAL | インターネット到達性 | elasticsearch-in-vpc-only | 自動修復不可(再作成が必須、後述) | 対象外(自動修復不可) |
| Opensearch.2 | CRITICAL | インターネット到達性 | opensearch-in-vpc-only | 自動修復不可(再作成が必須、後述) | 対象外(自動修復不可) |
| SageMaker.1 | HIGH | インターネット到達性 | sagemaker-notebook-no-direct-internet-access | 自動修復不可(再作成が必須、後述) | 対象外(自動修復不可) |
| SNS.4 | CRITICAL | リソースポリシー | sns-topic-no-public-access | なし(カスタムランブック必要) | SNS.4 自動修復 |
ES.2 / Opensearch.2 / DMS.1 / SageMaker.1 は自動修復不可:
- ES.2 / Opensearch.2: AWS 公式ドキュメント Launching your Amazon OpenSearch Service domains within a VPC に「If you create a domain with a public endpoint, you can’t later place it within a VPC. You must instead create a new domain and migrate your data.」と明記されている。
- DMS.1: Security Hub DMS.1 コントロール公式ドキュメント の Remediation セクションで「You can’t change the public access setting for a DMS replication instance after creating it. To change the public access setting, delete your current instance, and then recreate it.」と明記されている。
- SageMaker.1: UpdateNotebookInstance API リファレンス の Request Syntax に
DirectInternetAccessパラメータが含まれていない。作成後にこの設定を変更できないため、再作成が必須となる。
いずれもリソースを削除して再作成しない限り COMPLIANT に戻せない。Config ルールによる検知は可能だが、自動修復は実質的に成立しない。代替策として VPC BPA による実害ブロック(既に対応)か、リソース再作成の運用手順を整備する。
AWSConfigRemediation- プレフィックスは AWS Config が公式に修復アクション用として提供するランブック。AWSSupport- プレフィックスは AWS サポート用の汎用ランブックだが、SSM Automation として実行可能なため EventBridge 経由でも利用できる。本サイトでは Config 修復アクションを使わないため、両者の差は実装上は問題にならない。SCP で予防できない理由
| コントロール | 該当 API | SCP 予防不可の理由 |
|---|---|---|
| RDS.1 | rds:ModifyDBSnapshotAttribute | パブリック共有を判定する条件キーが提供されていない |
| DocumentDB.3 | rds:ModifyDBClusterSnapshotAttribute | 同上 |
| Neptune.3 | rds:ModifyDBClusterSnapshotAttribute | 同上 |
| DMS.1 | dms:CreateReplicationInstance | パブリックアクセスを制御する条件キーが提供されていない |
| Redshift.1 | redshift:CreateCluster / redshift:ModifyCluster | 同上 |
| ES.2 | es:CreateElasticsearchDomain(deprecated)/ es:CreateDomain | VPC アクセスを制御する条件キーが提供されていない |
| Opensearch.2 | es:CreateDomain | 同上(OpenSearch Service の IAM サービスプレフィックスは es:) |
| SageMaker.1 | sagemaker:CreateNotebookInstance | DirectInternetAccess を制御する条件キーが提供されていない |
| SNS.4 | sns:SetTopicAttributes | アクセスポリシー内容を評価する条件キーが提供されていない |
デフォルト挙動の補足
各サービスのリソース作成時のデフォルトのパブリック設定値は以下の通り(2026 年 5 月時点の AWS 公式ドキュメント・API リファレンスで確認)。デフォルトがパブリックのサービスは、明示的に対策を指定しない限り公開状態で作成される。
| サービス | デフォルト | パブリック化の操作 | 備考 |
|---|---|---|---|
| RDS スナップショット | プライベート | modify-db-snapshot-attribute --attribute-name restore --values-to-add all | デフォルトで保護されている |
| DocumentDB / Neptune クラスタースナップショット | プライベート | modify-db-cluster-snapshot-attribute --attribute-name restore --values-to-add all | デフォルトで保護されている |
| DMS レプリケーションインスタンス | パブリック | create-replication-instance で --no-publicly-accessible を省略 | API パラメータ PubliclyAccessible のデフォルト値が true。Config 検知の重要性が特に高い |
| Redshift クラスター | プライベート(2025 年 1 月以降) | create-cluster --publicly-accessible を明示指定 | 2025 年 1 月から新規・復元したプロビジョン済みクラスターはデフォルトで非公開になった。デフォルト変更前の既存クラスターも検知対象 |
| ES / OpenSearch ドメイン | パブリック | create-elasticsearch-domain / create-domain で --vpc-options を省略 | パブリックエンドポイントで作成された場合、後から VPC 内へ移行できない(再作成必須) |
| SageMaker ノートブックインスタンス | パブリック(DirectInternetAccess=Enabled) | create-notebook-instance で --direct-internet-access を省略 | DirectInternetAccess のデフォルト値が Enabled。Disabled に設定するには SubnetId(VPC 配置)の指定が必須。作成後の変更不可 |
| SNS トピック | プライベート | set-topic-attributes でアクセスポリシーに Principal: *(Condition なし)を明示設定 | デフォルトトピックポリシーは自アカウントのみ許可 |