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