DocumentDB.3
コントロールの説明
Amazon DocumentDB の手動クラスタースナップショットがパブリック共有されていないかをチェックする。スナップショットの restore 属性に all が含まれる場合に FAILED となる。
Amazon DocumentDB は MongoDB 互換のフルマネージドドキュメントデータベースサービスである。内部的に Amazon RDS の基盤を使用しており、スナップショットの共有設定も RDS と同じ modify-db-cluster-snapshot-attribute API で操作する。
デフォルトではスナップショットはプライベート(作成元アカウントのみ復元可能)であり、明示的に all を追加しない限りパブリックにはならない。
対応する Config ルール: DOCDB_CLUSTER_SNAPSHOT_PUBLIC_PROHIBITED(評価頻度: Configuration changes)
検証環境
--profile 指定がない場合は Workload アカウントで実行する。export AWS_PROFILE=Workload でデフォルトを設定しておくと便利。
結果
- DocumentDB スナップショットが存在しない場合は PASSED
- スナップショット作成直後はプライベート(restore 属性が空)であり、Config は COMPLIANT、Security Hub は PASSED
- restore 属性に all を追加するとパブリックになり FAILED
- all を削除してプライベートに戻すと PASSED に復帰
- デフォルトでは保護されている(スナップショットのデフォルトはプライベート)
- RDS.1 と異なり、スナップショット単位の finding が生成される(RDS.1 はアカウントレベルのみ)
検証の流れ
flowchart LR
A[1. デフォルト状態の確認<br>PASSED] --> B[2. DocumentDB クラスター起動<br>→ スナップショット作成<br>→ クラスター削除]
B --> C[3. デフォルトでプライベート<br>であることを確認<br>PASSED]
C --> D[4. スナップショットを<br>パブリックに変更]
D --> E[5. FAILED 確認]
E --> F[6. プライベートに戻す]
F --> G[7. PASSED 復帰確認]
G --> H[8. クリーンアップ]
1. デフォルト状態の確認
Security Hub finding の確認
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "DocumentDB.3"}],
"AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
"WorkflowStatus": [{"Comparison": "NOT_EQUALS", "Value": "SUPPRESSED"}],
"RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
}' \
--query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id}' \
--region ap-northeast-1[
{
"Status": "PASSED",
"ResourceId": "AWS::::Account:<アカウント ID>"
},
{
"Status": "PASSED",
"ResourceId": "AWS::::Account:<アカウント ID>"
}
]DocumentDB スナップショットが存在しないため PASSED。2 件返るのは、東京リージョン(ap-northeast-1)と集約リージョン(ap-southeast-1)の 2 リージョンで Security Hub が有効化されているためである。
2. DocumentDB クラスター起動 → スナップショット作成 → クラスター削除
スナップショットを作成するために一時的に DocumentDB クラスターを起動する。スナップショット作成後、クラスターは不要なので削除する。
クラスター作成
aws docdb create-db-cluster \
--db-cluster-identifier docdb3-test \
--engine docdb \
--master-username docdbadmin \
--master-user-password '<パスワード>' \
--query 'DBCluster.{DBClusterIdentifier:DBClusterIdentifier,Status:Status}' \
--region ap-northeast-1{
"DBClusterIdentifier": "docdb3-test",
"Status": "creating"
}インスタンス作成
DocumentDB はクラスター型のため、クラスター内にインスタンスを作成する必要がある。
aws docdb create-db-instance \
--db-instance-identifier docdb3-test-instance \
--db-instance-class db.t3.medium \
--engine docdb \
--db-cluster-identifier docdb3-test \
--query 'DBInstance.{DBInstanceIdentifier:DBInstanceIdentifier,DBInstanceStatus:DBInstanceStatus}' \
--region ap-northeast-1{
"DBInstanceIdentifier": "docdb3-test-instance",
"DBInstanceStatus": "creating"
}available になるまで数分待つ。
aws docdb describe-db-clusters \
--db-cluster-identifier docdb3-test \
--query 'DBClusters[].{DBClusterIdentifier:DBClusterIdentifier,Status:Status}' \
--region ap-northeast-1[
{
"DBClusterIdentifier": "docdb3-test",
"Status": "available"
}
]スナップショット作成
aws docdb create-db-cluster-snapshot \
--db-cluster-identifier docdb3-test \
--db-cluster-snapshot-identifier docdb3-test-snapshot \
--query 'DBClusterSnapshot.{DBClusterSnapshotIdentifier:DBClusterSnapshotIdentifier,Status:Status}' \
--region ap-northeast-1{
"DBClusterSnapshotIdentifier": "docdb3-test-snapshot",
"Status": "creating"
}available になるまで待つ。
aws docdb describe-db-cluster-snapshots \
--db-cluster-snapshot-identifier docdb3-test-snapshot \
--query 'DBClusterSnapshots[].{DBClusterSnapshotIdentifier:DBClusterSnapshotIdentifier,Status:Status}' \
--region ap-northeast-1[
{
"DBClusterSnapshotIdentifier": "docdb3-test-snapshot",
"Status": "available"
}
]クラスター削除
スナップショットは独立して存在するため、クラスターは削除できる。インスタンスを先に削除してからクラスターを削除する。
aws docdb delete-db-instance \
--db-instance-identifier docdb3-test-instance \
--query 'DBInstance.{DBInstanceIdentifier:DBInstanceIdentifier,DBInstanceStatus:DBInstanceStatus}' \
--region ap-northeast-1{
"DBInstanceIdentifier": "docdb3-test-instance",
"DBInstanceStatus": "deleting"
}インスタンス削除完了を待ってからクラスターを削除する。
aws docdb delete-db-cluster \
--db-cluster-identifier docdb3-test \
--skip-final-snapshot \
--query 'DBCluster.{DBClusterIdentifier:DBClusterIdentifier,Status:Status}' \
--region ap-northeast-1{
"DBClusterIdentifier": "docdb3-test",
"Status": "available"
}delete-db-cluster の即時レスポンスでは Status が available のまま返る場合がある。3. デフォルトでプライベートであることを確認
restore 属性の確認
aws docdb describe-db-cluster-snapshot-attributes \
--db-cluster-snapshot-identifier docdb3-test-snapshot \
--query 'DBClusterSnapshotAttributesResult.DBClusterSnapshotAttributes' \
--region ap-northeast-1[
{
"AttributeName": "restore",
"AttributeValues": []
}
]restore 属性が空であり、パブリック共有されていない(プライベート)。
Config 評価結果の確認
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-docdb-cluster-snapshot-public-prohibited-<サフィックス> \
--region ap-northeast-1
(出力なし)aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-docdb-cluster-snapshot-public-prohibited-<サフィックス> \
--query 'EvaluationResults[].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
--region ap-northeast-1[
{
"ResourceId": "<Config リソース ID>",
"ComplianceType": "COMPLIANT"
}
]スナップショット作成直後はプライベートであり、COMPLIANT。
Security Hub finding の PASSED 確認
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "DocumentDB.3"}],
"AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
"WorkflowStatus": [{"Comparison": "NOT_EQUALS", "Value": "SUPPRESSED"}],
"RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
}' \
--query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id}' \
--region ap-northeast-1[
{
"Status": "PASSED",
"ResourceId": "arn:aws:rds:ap-northeast-1:<アカウント ID>:cluster-snapshot:docdb3-test-snapshot"
},
{
"Status": "PASSED",
"ResourceId": "AWS::::Account:<アカウント ID>"
}
]スナップショットが存在してもパブリック共有されていなければ PASSED。スナップショット単位の finding が生成される点が RDS.1(アカウントレベルのみ)とは異なる。
4. スナップショットをパブリックに変更
aws docdb modify-db-cluster-snapshot-attribute \
--db-cluster-snapshot-identifier docdb3-test-snapshot \
--attribute-name restore \
--values-to-add all \
--query 'DBClusterSnapshotAttributesResult.DBClusterSnapshotAttributes' \
--region ap-northeast-1[
{
"AttributeName": "restore",
"AttributeValues": [
"all"
]
}
]5. FAILED 確認
Config ルールの手動トリガー
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-docdb-cluster-snapshot-public-prohibited-<サフィックス> \
--region ap-northeast-1
(出力なし)Config 評価結果の確認
aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-docdb-cluster-snapshot-public-prohibited-<サフィックス> \
--query 'EvaluationResults[?ComplianceType==`NON_COMPLIANT`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
--region ap-northeast-1[
{
"ResourceId": "<Config リソース ID>",
"ComplianceType": "NON_COMPLIANT"
}
]Security Hub finding の FAILED 確認
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "DocumentDB.3"}],
"AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
"ComplianceStatus": [{"Comparison": "EQUALS", "Value": "FAILED"}],
"WorkflowStatus": [{"Comparison": "NOT_EQUALS", "Value": "SUPPRESSED"}],
"RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
}' \
--query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id}' \
--region ap-northeast-1[
{
"Status": "FAILED",
"ResourceId": "arn:aws:rds:ap-northeast-1:<アカウント ID>:cluster-snapshot:docdb3-test-snapshot"
}
]6. プライベートに戻す
aws docdb modify-db-cluster-snapshot-attribute \
--db-cluster-snapshot-identifier docdb3-test-snapshot \
--attribute-name restore \
--values-to-remove all \
--query 'DBClusterSnapshotAttributesResult.DBClusterSnapshotAttributes' \
--region ap-northeast-1[
{
"AttributeName": "restore",
"AttributeValues": []
}
]7. PASSED 復帰確認
Config ルールの手動トリガー
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-docdb-cluster-snapshot-public-prohibited-<サフィックス> \
--region ap-northeast-1
(出力なし)Config 評価結果の確認
aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-docdb-cluster-snapshot-public-prohibited-<サフィックス> \
--query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`<Config リソース ID>`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
--region ap-northeast-1[
{
"ResourceId": "<Config リソース ID>",
"ComplianceType": "COMPLIANT"
}
]Security Hub finding の PASSED 確認
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "DocumentDB.3"}],
"AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
"ComplianceStatus": [{"Comparison": "EQUALS", "Value": "FAILED"}],
"WorkflowStatus": [{"Comparison": "NOT_EQUALS", "Value": "SUPPRESSED"}],
"RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
}' \
--query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id}' \
--region ap-northeast-1[]8. クリーンアップ
aws docdb delete-db-cluster-snapshot \
--db-cluster-snapshot-identifier docdb3-test-snapshot \
--query 'DBClusterSnapshot.{DBClusterSnapshotIdentifier:DBClusterSnapshotIdentifier,Status:Status}' \
--region ap-northeast-1{
"DBClusterSnapshotIdentifier": "docdb3-test-snapshot",
"Status": "available"
}補足:Config ルール名の確認方法
aws configservice describe-config-rules \
--query 'ConfigRules[?contains(Source.SourceIdentifier,`DOCDB_CLUSTER_SNAPSHOT_PUBLIC_PROHIBITED`)].ConfigRuleName' \
--region ap-northeast-1