EC2.182
--profile 指定がない場合は Workload アカウントで実行する。export AWS_PROFILE=Workload でデフォルトを設定しておくと便利。
コントロールの説明
EBS スナップショットのブロックパブリックアクセス(BPA)設定がアカウントレベルで有効かどうかをチェックする。BPA が unblocked(無効)または block-new-sharing の場合に FAILED となる。block-all-sharing が設定されている場合のみ PASSED となる。
block-new-sharing が FAILED になる理由:Security Hub のドキュメントには「block public access is not enabled to block sharing of Amazon EBS snapshots to all」の場合に FAILED と明記されている。block-new-sharing は新規のパブリック共有をブロックするが、「全てのパブリック共有をブロック(to all)」ではないため NON_COMPLIANT と評価される。
BPA の設定値と意味:
| 設定値 | 意味 |
|---|---|
unblocked | BPA 無効。スナップショットをパブリック共有できる |
block-new-sharing | 新規のパブリック共有をブロック。既存のパブリック共有は維持される |
block-all-sharing | 全てのパブリック共有をブロック。既存のパブリック共有もアクセス不可になる |
対応する Config ルール: EBS_SNAPSHOT_BLOCK_PUBLIC_ACCESS(評価頻度: 変更トリガー)
結果
- デフォルト状態(
unblocked)では FAILED block-new-sharingに設定しても FAILED のまま変化しないblock-all-sharingに設定すると PASSEDunblockedに戻すと FAILED に復帰- CT.EC2.PV.7(Declarative Policy 型)を有効化すると finding は PASSED に変化。ただし
ebs-snapshot-block-public-accessは Change triggered 型ルールのため、Declarative Policy による変更は Config の変更検知を発火させない。Security Hub の定期スキャンによる自動更新を待つ必要があり、反映には数時間かかる場合がある - 宣言型ポリシー(EBS Snapshot BPA)を OU に直接適用しても同様に BPA 設定が強制される。
block-all-sharingとblock-new-sharingの両方を設定可能(ポリシーの content 値はアンダースコア区切り:block_all_sharing/block_new_sharing)
検証の流れ
flowchart LR
A[1. デフォルト状態の確認<br>FAILED] --> B[2. block-all-sharing に設定]
B --> C[3. PASSED 確認]
C --> D[4. unblocked に戻す]
D --> E[5. FAILED 復帰確認]
E --> F[6. CT.EC2.PV.7 有効化]
F --> G[7. PASSED に変化することを確認]
G --> H[8. 宣言型ポリシー直接適用<br>動作確認のみ]
H --> I[9. クリーンアップ]
1. デフォルト状態の確認
EBS Snapshot BPA の現在の設定を確認
aws ec2 get-snapshot-block-public-access-state \
--region ap-northeast-1{
"State": "unblocked",
"ManagedBy": "account"
}unblocked(BPA 無効)。デフォルトでは保護されていない。
Security Hub finding の現在の状態を確認
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "EC2.182"}],
"AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
"WorkflowStatus": [{"Comparison": "NOT_EQUALS", "Value": "SUPPRESSED"}],
"RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
}' \
--query 'Findings[].{ControlId:Compliance.SecurityControlId,Status:Compliance.Status,ResourceId:Resources[0].Id}' \
--region ap-northeast-1[
{
"ControlId": "EC2.182",
"Status": "FAILED",
"ResourceId": "arn:aws:ec2:ap-northeast-1:<アカウント ID>:snapshotblockpublicaccess/<アカウント ID>"
},
{
"ControlId": "EC2.182",
"Status": "FAILED",
"ResourceId": "arn:aws:ec2:ap-southeast-1:<アカウント ID>:snapshotblockpublicaccess/<アカウント ID>"
}
]Security Hub が有効な 2 リージョン分が FAILED。ResourceId はリージョンごとのアカウントレベルリソース(snapshotblockpublicaccess/<アカウント ID>)。
arn:aws:ec2:<リージョン>:<アカウント ID>:snapshotblockpublicaccess/<アカウント ID>)である。EBS Snapshot BPA はスナップショット単位ではなくアカウント単位の設定であるため、ResourceId もアカウントレベルになる。Security Hub が有効なリージョンごとに finding が生成される。2. block-all-sharing に設定
EBS Snapshot BPA はリージョン単位の設定のため、Security Hub が有効な全リージョンで設定する必要がある。
ap-northeast-1
aws ec2 enable-snapshot-block-public-access \
--state block-all-sharing \
--region ap-northeast-1{
"State": "block-all-sharing"
}ap-southeast-1 でも同じコマンドを実行する(--region ap-southeast-1)。
設定の確認
aws ec2 get-snapshot-block-public-access-state \
--region ap-northeast-1{
"State": "block-all-sharing",
"ManagedBy": "account"
}3. PASSED 確認
EBS Snapshot BPA はリージョン単位の設定のため、Config ルールのトリガーも全リージョンで実施する。
aws configservice describe-config-rules --query 'ConfigRules[?contains(Source.SourceIdentifier,\EBS_SNAPSHOT_BLOCK_PUBLIC_ACCESS`)].ConfigRuleName’` で確認できる。Config ルールの手動トリガー(全リージョン)
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-ebs-snapshot-block-public-access-6026c41a \
--region ap-northeast-1
(出力なし)aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-ebs-snapshot-block-public-access-acadb690 \
--region ap-southeast-1
(出力なし)Config 評価結果の確認(各リージョン)
aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-ebs-snapshot-block-public-access-6026c41a \
--query 'EvaluationResults[].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
--region ap-northeast-1[
{
"ResourceId": "<アカウント ID>",
"ComplianceType": "COMPLIANT"
}
]Security Hub finding の PASSED 確認
Config → Security Hub の反映には数分かかる。
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "EC2.182"}],
"AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
"WorkflowStatus": [{"Comparison": "NOT_EQUALS", "Value": "SUPPRESSED"}],
"RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
}' \
--query 'Findings[].{ControlId:Compliance.SecurityControlId,Status:Compliance.Status,ResourceId:Resources[0].Id}' \
--region ap-northeast-1[
{
"ControlId": "EC2.182",
"Status": "PASSED",
"ResourceId": "arn:aws:ec2:ap-northeast-1:<アカウント ID>:snapshotblockpublicaccess/<アカウント ID>"
},
{
"ControlId": "EC2.182",
"Status": "PASSED",
"ResourceId": "arn:aws:ec2:ap-southeast-1:<アカウント ID>:snapshotblockpublicaccess/<アカウント ID>"
}
]4. unblocked に戻す
aws ec2 disable-snapshot-block-public-access \
--region ap-northeast-1{
"State": "unblocked"
}ap-southeast-1 でも同じコマンドを実行する(--region ap-southeast-1)。
設定の確認
aws ec2 get-snapshot-block-public-access-state \
--region ap-northeast-1{
"State": "unblocked",
"ManagedBy": "account"
}5. FAILED 復帰確認
Config ルールの手動トリガー
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-ebs-snapshot-block-public-access-6026c41a \
--region ap-northeast-1
(出力なし)Config 評価結果の確認
aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-ebs-snapshot-block-public-access-6026c41a \
--query 'EvaluationResults[].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
--region ap-northeast-1[
{
"ResourceId": "<アカウント ID>",
"ComplianceType": "NON_COMPLIANT"
}
]Security Hub finding の FAILED 復帰確認
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "EC2.182"}],
"AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
"WorkflowStatus": [{"Comparison": "NOT_EQUALS", "Value": "SUPPRESSED"}],
"RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
}' \
--query 'Findings[].{ControlId:Compliance.SecurityControlId,Status:Compliance.Status,ResourceId:Resources[0].Id}' \
--region ap-northeast-1[
{
"ControlId": "EC2.182",
"Status": "FAILED",
"ResourceId": "arn:aws:ec2:ap-northeast-1:<アカウント ID>:snapshotblockpublicaccess/<アカウント ID>"
},
{
"ControlId": "EC2.182",
"Status": "FAILED",
"ResourceId": "arn:aws:ec2:ap-southeast-1:<アカウント ID>:snapshotblockpublicaccess/<アカウント ID>"
}
]6. CT.EC2.PV.7 有効化
CT.EC2.PV.7 は Declarative Policy 型の予防コントロールであり、アカウントレベルの BPA 設定を block-all-sharing に強制する。finding が PASSED に変化するはずである。
aws controltower enable-control \
--control-identifier arn:aws:controlcatalog:::control/ek6wc2bmgzmho1kk6bn236mqt \
--target-identifier arn:aws:organizations::<マスターアカウント ID>:ou/<Organization ID>/<OU ID> \
--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"
}7. PASSED に変化することを確認
Security Hub が定期スキャンを実行すると、finding が PASSED に変化する。反映には数時間かかる場合があり、リージョンによってタイミングが異なる。
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "EC2.182"}],
"AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
"WorkflowStatus": [{"Comparison": "NOT_EQUALS", "Value": "SUPPRESSED"}],
"RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
}' \
--query 'Findings[].{ControlId:Compliance.SecurityControlId,Status:Compliance.Status,ResourceId:Resources[0].Id}' \
--region ap-northeast-1[
{
"ControlId": "EC2.182",
"Status": "PASSED",
"ResourceId": "arn:aws:ec2:ap-northeast-1:<アカウント ID>:snapshotblockpublicaccess/<アカウント ID>"
},
{
"ControlId": "EC2.182",
"Status": "FAILED",
"ResourceId": "arn:aws:ec2:ap-southeast-1:<アカウント ID>:snapshotblockpublicaccess/<アカウント ID>"
}
]block-all-sharing に変化する(ポリシー伝播の問題ではない)。リージョンによって反映タイミングが大きく異なる場合があり、いつ反映されるか予測できない。ebs-snapshot-block-public-access は Change triggered 型ルールのため Declarative Policy による変更は Config の変更検知を発火させず、Security Hub の定期スキャンを待つ必要がある。8. 宣言型ポリシー直接適用(動作確認)
CT.EC2.PV.7 を無効化した後、Organizations API で宣言型ポリシーを直接適用する。Control Tower を使わない環境での代替手段として、また block-all-sharing 以外の設定値(block-new-sharing)も選択できることを確認する。
確認項目:
- Control Tower 不使用環境での代替手段として機能すること(
block-all-sharingを適用して BPA が強制されることを確認) block-new-sharingも設定できること
ただし block-all-sharing の Security Hub finding への影響はステップ 2〜3 および 6〜7 で確認済みのため、ここでは BPA 設定値が正しく強制されることのみ確認し、Security Hub の finding 確認は省略する。CT.EC2.PV.7 経由と宣言型ポリシー直接適用はどちらも Organizations の Declarative Policy を使用しており、Change triggered 型ルールの発火挙動も同じ(Declarative Policy による変更は Config の変更検知を発火させない)ため、finding の挙動も同一と判断できる。
CT.EC2.PV.7 の無効化
aws controltower disable-control \
--control-identifier arn:aws:controlcatalog:::control/ek6wc2bmgzmho1kk6bn236mqt \
--target-identifier arn:aws:organizations::<マスターアカウント ID>:ou/<Organization ID>/<OU ID> \
--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"
}宣言型ポリシーの作成(block-all-sharing)
aws organizations create-policy \
--name cspm-ec2-182-test \
--type DECLARATIVE_POLICY_EC2 \
--content '{
"ec2_attributes": {
"snapshot_block_public_access": {
"state": {
"@@assign": "block_all_sharing"
}
}
}
}' \
--description "EC2.182 CSPM test" \
--region ap-northeast-1 --profile Master{
"Policy": {
"PolicySummary": {
"Id": "<ポリシー ID>",
"Arn": "<ポリシー ARN>",
"Name": "cspm-ec2-182-test",
"Type": "DECLARATIVE_POLICY_EC2"
}
}
}OU にアタッチ
aws organizations attach-policy \
--policy-id <ポリシー ID> \
--target-id <OU ID> \
--region ap-northeast-1 --profile Master
(出力なし)BPA 設定が block-all-sharing に強制されることを確認
aws ec2 get-snapshot-block-public-access-state \
--region ap-northeast-1{
"State": "block-all-sharing",
"ManagedBy": "declarative-policy"
}ManagedBy: declarative-policy に変化。block-all-sharing が強制されている。
ポリシーを block-new-sharing に更新
aws organizations update-policy \
--policy-id <ポリシー ID> \
--content '{
"ec2_attributes": {
"snapshot_block_public_access": {
"state": {
"@@assign": "block_new_sharing"
}
}
}
}' \
--region ap-northeast-1 --profile Master{
"Policy": {
"PolicySummary": {
"Id": "<ポリシー ID>",
"Name": null,
"Type": "DECLARATIVE_POLICY_EC2"
}
}
}BPA 設定が block-new-sharing に変化したことを確認
aws ec2 get-snapshot-block-public-access-state \
--region ap-northeast-1{
"State": "block-new-sharing",
"ManagedBy": "declarative-policy"
}block-new-sharing に変化。EC2.182 は block-new-sharing では FAILED のままとなる(ステップ 2〜3 で確認済み)。
9. クリーンアップ
宣言型ポリシーのデタッチ
aws organizations detach-policy \
--policy-id <ポリシー ID> \
--target-id <OU ID> \
--region ap-northeast-1 --profile Master
(出力なし)宣言型ポリシーの削除
aws organizations delete-policy \
--policy-id <ポリシー ID> \
--region ap-northeast-1 --profile Master
(出力なし)EBS Snapshot BPA の状態を確認(unblocked に戻ったことを確認)
aws ec2 get-snapshot-block-public-access-state \
--region ap-northeast-1{
"State": "unblocked",
"ManagedBy": "account"
}宣言型ポリシーのデタッチ後、アカウントレベルの設定はポリシー適用前の状態(unblocked)に復帰する。
補足:Config ルールと Security Hub の反映について
ebs-snapshot-block-public-access は Change triggered 型ルールである。
手動で BPA を変更した場合(enable-snapshot-block-public-access / disable-snapshot-block-public-access)は Config が変更を検知して自動評価される。すぐに確認したい場合は Config ルールを手動でトリガーする。
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-ebs-snapshot-block-public-access-6026c41a \
--region ap-northeast-1
(出力なし)Config の評価結果が更新された後、Security Hub への反映にさらに数分かかる。
Declarative Policy による BPA 変更(CT.EC2.PV.7 または宣言型ポリシー直接適用)は Config の変更検知を発火させない。手動トリガーを実行しても Config が記録した古い状態で評価されるため NON_COMPLIANT のままとなる。Security Hub の定期スキャンによる自動更新を待つ必要があり、反映には数時間かかる場合がある。