EC2.182
コントロールの説明
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(評価頻度: 変更トリガー)
検証環境
--profile 指定がない場合は Workload アカウントで実行する。export AWS_PROFILE=Workload でデフォルトを設定しておくと便利。
結果
- デフォルト状態(
unblocked)では FAILED block-new-sharingに設定しても FAILED のまま変化しないblock-all-sharingに設定すると PASSEDunblockedに戻すと FAILED に復帰- CT.EC2.PV.3(SCP 型)は
ec2:ModifySnapshotAttributeをブロックするだけで BPA 設定を変更しないため、finding には影響しない - CT.EC2.PV.7(Declarative Policy 型)を有効化すると finding は PASSED に変化。ただし
ebs-snapshot-block-public-accessは Configuration changes 型ルールのため、Declarative Policy による変更は Config が設定変更として認識しない。Security Hub の定期スキャンによる自動更新を待つ必要があり、反映には数時間かかる場合がある - CT.EC2.PV.7 は内部的に Organizations ポリシーを使用しているが、Control Tower を使わない環境では Organizations ポリシーを直接設定する方法もある。宣言型ポリシー(EBS Snapshot BPA)を Organizations で直接適用した場合の finding への影響は EBS Snapshot Block Public Access を参照
検証の流れ
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. クリーンアップ]
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 が有効なリージョンごとに finding が生成される。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 は Configuration changes 型ルールのため Declarative Policy による変更は Config が設定変更として認識せず、Security Hub の定期スキャンを待つ必要がある。8. クリーンアップ
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"
}補足:Config ルールと Security Hub の反映について
ebs-snapshot-block-public-access は Configuration changes 型ルールである。
手動で 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 の定期スキャンによる自動更新を待つ必要があり、反映には数時間かかる場合がある。