EC2.1
--profile 指定がない場合は Workload アカウントで実行する。export AWS_PROFILE=Workload でデフォルトを設定しておくと便利。Control Tower の有効化・無効化操作(ステップ 6・8・10)は --profile Master(Organizations 管理アカウント)で実行する。
コントロールの説明
パブリック共有されている EBS スナップショット(他のアカウントから復元可能な状態)が存在しないかをチェックする。1 件でも存在する場合に FAILED となる。
対応する Config ルール: EBS_SNAPSHOT_PUBLIC_RESTORABLE_CHECK(評価頻度: 定期実行)
結果
- デフォルト状態(パブリック共有スナップショットなし)では PASSED。ResourceId は
AWS::::Account:<アカウント ID> - パブリック共有スナップショットを作成すると FAILED
- パブリック共有を解除すると PASSED に復帰
- CT.EC2.PV.3(SCP 型)を有効化しても finding は FAILED のまま変化しない。CT.EC2.PV.3 は
ec2:ModifySnapshotAttributeでパブリック化する API コールをブロックする予防策であり、検証時点で既にパブリック共有されているスナップショットの設定は変更しないため - CT.EC2.PV.7(Declarative Policy 型)を有効化すると PASSED に変化。BPA が
block-all-sharingに強制され、設定上はパブリック共有のままでも他のアカウントからの復元がブロックされるため
検証の流れ
flowchart LR
A[1. デフォルト状態の確認<br>PASSED] --> B[2. スナップショット作成<br>パブリック共有設定]
B --> C[3. FAILED 確認]
C --> D[4. パブリック共有解除]
D --> E[5. PASSED 復帰確認]
E --> F[6. FAILED 再作成と<br>CT.EC2.PV.3 有効化]
F --> G[7. FAILED のまま変化しないことを確認]
G --> H[8. CT.EC2.PV.7 有効化]
H --> I[9. PASSED に変化することを確認]
I --> J[10. クリーンアップ]
1. デフォルト状態の確認
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "EC2.1"}],
"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>"
}
]パブリック共有スナップショットが存在しないため PASSED。
AWS::::Account:<アカウント ID> で同一に見える。各 finding は異なるリージョンで生成されたものであり、実際の件数は環境によって異なる。2. スナップショット作成・パブリック共有設定
EBS ボリュームを作成
aws ec2 create-volume \
--availability-zone ap-northeast-1a \
--size 1 \
--volume-type gp3 \
--query '{VolumeId:VolumeId,State:State}' \
--region ap-northeast-1{
"VolumeId": "<ボリューム ID>",
"State": "creating"
}ボリュームが available になったことを確認
aws ec2 describe-volumes \
--volume-ids <ボリューム ID> \
--query 'Volumes[].{VolumeId:VolumeId,State:State}' \
--region ap-northeast-1[
{
"VolumeId": "<ボリューム ID>",
"State": "available"
}
]スナップショットを作成
aws ec2 create-snapshot \
--volume-id <ボリューム ID> \
--query '{SnapshotId:SnapshotId,State:State}' \
--region ap-northeast-1{
"SnapshotId": "<スナップショット ID>",
"State": "pending"
}スナップショットが completed になったことを確認
aws ec2 describe-snapshots \
--snapshot-ids <スナップショット ID> \
--query 'Snapshots[].{SnapshotId:SnapshotId,State:State}' \
--region ap-northeast-1[
{
"SnapshotId": "<スナップショット ID>",
"State": "completed"
}
]スナップショットをパブリック共有に設定
aws ec2 modify-snapshot-attribute \
--snapshot-id <スナップショット ID> \
--attribute createVolumePermission \
--operation-type add \
--group-names all \
--region ap-northeast-1
(出力なし)パブリック共有設定の確認
aws ec2 describe-snapshot-attribute \
--snapshot-id <スナップショット ID> \
--attribute createVolumePermission \
--query 'CreateVolumePermissions' \
--region ap-northeast-1[
{
"Group": "all"
}
]3. FAILED 確認
Config ルールの手動トリガー
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-ebs-snapshot-public-restorable-check-<サフィックス> \
--region ap-northeast-1
(出力なし)Config 評価結果の確認
aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-ebs-snapshot-public-restorable-check-<サフィックス> \
--query 'EvaluationResults[].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
--region ap-northeast-1[
{
"ResourceId": "<アカウント ID>",
"ComplianceType": "NON_COMPLIANT"
}
]Security Hub finding の FAILED 確認
Config → Security Hub の反映には数分かかる。
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "EC2.1"}],
"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": "FAILED",
"ResourceId": "AWS::::Account:<アカウント ID>"
},
{
"Status": "PASSED",
"ResourceId": "AWS::::Account:<アカウント ID>"
}
]パブリック共有スナップショットを作成したリージョン(ap-northeast-1)のみ FAILED。他のリージョンにはパブリック共有スナップショットが存在しないため PASSED のまま。
4. パブリック共有解除
aws ec2 modify-snapshot-attribute \
--snapshot-id <スナップショット ID> \
--attribute createVolumePermission \
--operation-type remove \
--group-names all \
--region ap-northeast-1
(出力なし)設定の確認
aws ec2 describe-snapshot-attribute \
--snapshot-id <スナップショット ID> \
--attribute createVolumePermission \
--query 'CreateVolumePermissions' \
--region ap-northeast-1[]5. PASSED 復帰確認
Config ルールの手動トリガー
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-ebs-snapshot-public-restorable-check-<サフィックス> \
--region ap-northeast-1
(出力なし)Config 評価結果の確認
aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-ebs-snapshot-public-restorable-check-<サフィックス> \
--query 'EvaluationResults[].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
--region ap-northeast-1[
{
"ResourceId": "<アカウント ID>",
"ComplianceType": "COMPLIANT"
}
]Security Hub finding の PASSED 確認
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "EC2.1"}],
"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>"
}
]6. FAILED 状態の再作成と CT.EC2.PV.3 有効化
ステップ 5 で PASSED に戻したため、まず FAILED 状態を再作成してから CT.EC2.PV.3 を有効化する。CT.EC2.PV.3 は ec2:ModifySnapshotAttribute でパブリック化する API コールをブロックする SCP 型の予防コントロールであり、既にパブリック共有されているスナップショットの設定は変更しないため、finding は変化しないはずである。
パブリック共有状態に戻す
aws ec2 modify-snapshot-attribute \
--snapshot-id <スナップショット ID> \
--attribute createVolumePermission \
--operation-type add \
--group-names all \
--region ap-northeast-1
(出力なし)パブリック共有設定の確認
aws ec2 describe-snapshot-attribute \
--snapshot-id <スナップショット ID> \
--attribute createVolumePermission \
--query 'CreateVolumePermissions' \
--region ap-northeast-1[
{
"Group": "all"
}
]CT.EC2.PV.3 の有効化
aws controltower enable-control \
--control-identifier arn:aws:controlcatalog:::control/chlzfpsllhs3knp1ixr773wa6 \
--target-identifier <OU の ARN> \
--query '{arn:arn,operationIdentifier:operationIdentifier}' \
--region ap-northeast-1 --profile Master{
"arn": "<有効化 ARN>",
"operationIdentifier": "<オペレーション ID>"
}aws controltower get-control-operation \
--operation-identifier <オペレーション ID> \
--query 'controlOperation.{operationType:operationType,status:status}' \
--region ap-northeast-1 --profile Master{
"operationType": "ENABLE_CONTROL",
"status": "SUCCEEDED"
}7. FAILED のまま変化しないことを確認
Config ルールの手動トリガー
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-ebs-snapshot-public-restorable-check-<サフィックス> \
--region ap-northeast-1
(出力なし)Config 評価結果の確認(NON_COMPLIANT のまま)
aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-ebs-snapshot-public-restorable-check-<サフィックス> \
--query 'EvaluationResults[].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
--region ap-northeast-1[
{
"ResourceId": "<アカウント ID>",
"ComplianceType": "NON_COMPLIANT"
}
]CT.EC2.PV.3 は既にパブリック共有されているスナップショットの設定は変更しないため、finding は NON_COMPLIANT のまま変化しない。Security Hub finding の確認はステップ 3 と同様のため省略する。
8. CT.EC2.PV.7 有効化
CT.EC2.PV.3 を無効化してから CT.EC2.PV.7 を有効化する。
CT.EC2.PV.3 の無効化
aws controltower disable-control \
--control-identifier arn:aws:controlcatalog:::control/chlzfpsllhs3knp1ixr773wa6 \
--target-identifier <OU の ARN> \
--query '{operationIdentifier:operationIdentifier}' \
--region ap-northeast-1 --profile Master{
"operationIdentifier": "<オペレーション ID>"
}aws controltower get-control-operation \
--operation-identifier <オペレーション ID> \
--query 'controlOperation.{operationType:operationType,status:status}' \
--region ap-northeast-1 --profile Master{
"operationType": "DISABLE_CONTROL",
"status": "SUCCEEDED"
}CT.EC2.PV.7 は Declarative Policy 型の予防コントロールであり、BPA を block-all-sharing に強制する。パブリック共有スナップショットへのアクセスが実質無効化されるため、finding が PASSED に変化するはずである。
CT.EC2.PV.7 の有効化
aws controltower enable-control \
--control-identifier arn:aws:controlcatalog:::control/ek6wc2bmgzmho1kk6bn236mqt \
--target-identifier <OU の ARN> \
--query '{arn:arn,operationIdentifier:operationIdentifier}' \
--region ap-northeast-1 --profile Master{
"arn": "<有効化 ARN>",
"operationIdentifier": "<オペレーション ID>"
}aws controltower get-control-operation \
--operation-identifier <オペレーション ID> \
--query 'controlOperation.{operationType:operationType,status:status}' \
--region ap-northeast-1 --profile Master{
"operationType": "ENABLE_CONTROL",
"status": "SUCCEEDED"
}BPA 設定の変化を確認
aws ec2 get-snapshot-block-public-access-state \
--region ap-northeast-1{
"State": "block-all-sharing",
"ManagedBy": "declarative-policy"
}9. PASSED に変化することを確認
EBS_SNAPSHOT_PUBLIC_RESTORABLE_CHECK は Periodic 型ルールのため、手動トリガーで即座に確認できる。
Config ルールの手動トリガー
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-ebs-snapshot-public-restorable-check-<サフィックス> \
--region ap-northeast-1
(出力なし)Config 評価結果の確認(COMPLIANT に変化)
aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-ebs-snapshot-public-restorable-check-<サフィックス> \
--query 'EvaluationResults[].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
--region ap-northeast-1[
{
"ResourceId": "<アカウント ID>",
"ComplianceType": "COMPLIANT"
}
]Security Hub finding の PASSED 確認
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "EC2.1"}],
"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>"
}
]スナップショットの設定上はパブリック共有のまま(createVolumePermission: Group=all)だが、BPA が block-all-sharing に強制されているため他のアカウントからの復元がブロックされ、PASSED と判定される。
10. クリーンアップ
CT.EC2.PV.7 の無効化
aws controltower disable-control \
--control-identifier arn:aws:controlcatalog:::control/ek6wc2bmgzmho1kk6bn236mqt \
--target-identifier <OU の ARN> \
--query '{operationIdentifier:operationIdentifier}' \
--region ap-northeast-1 --profile Master{
"operationIdentifier": "<オペレーション ID>"
}aws controltower get-control-operation \
--operation-identifier <オペレーション ID> \
--query 'controlOperation.{operationType:operationType,status:status}' \
--region ap-northeast-1 --profile Master{
"operationType": "DISABLE_CONTROL",
"status": "SUCCEEDED"
}スナップショットの削除
aws ec2 delete-snapshot \
--snapshot-id <スナップショット ID> \
--region ap-northeast-1
(出力なし)ボリュームの削除
aws ec2 delete-volume \
--volume-id <ボリューム ID> \
--region ap-northeast-1
(出力なし)補足:Config ルールの手動トリガー手順
EBS_SNAPSHOT_PUBLIC_RESTORABLE_CHECK は Periodic 型ルールのため、手動トリガーで即座に評価できる。
Config ルール名の確認
aws configservice describe-config-rules \
--query 'ConfigRules[?contains(Source.SourceIdentifier,`EBS_SNAPSHOT_PUBLIC_RESTORABLE_CHECK`)].ConfigRuleName' \
--region ap-northeast-1[
"securityhub-ebs-snapshot-public-restorable-check-<サフィックス>"
]手動トリガー
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-ebs-snapshot-public-restorable-check-<サフィックス> \
--region ap-northeast-1
(出力なし)数十秒〜数分程度で評価が完了し、Security Hub に反映される。