EBS Snapshot Block Public Access
概要
EBS Snapshot Block Public Access(BPA)は EC2 の宣言型ポリシー の属性の一つで、EBS スナップショットのパブリック共有を組織全体でブロックする。
Control Tower 予防コントロールとの関係
CT.EC2.PV.7 は内部的に本属性の宣言型ポリシーを使用している。CT.EC2.PV.7 は block-all-sharing 固定だが、Organizations で直接適用する場合は block-new-sharing も選択できる。Control Tower を使わない環境では本ページの手順で Organizations ポリシーを直接設定する。
モード
| モード | 効果 |
|---|---|
block-all-sharing | 全てのパブリック共有をブロック(既存のパブリック共有もアクセス不可になる) |
block-new-sharing | 新規のパブリック共有をブロック(既存のパブリック共有は維持) |
unblocked | 制限なし |
ポリシーの形式
{
"ec2_attributes": {
"snapshot_block_public_access": {
"state": {
"@@assign": "block_all_sharing"
}
}
}
}ポリシーの content 値はアンダースコア区切り(block_all_sharing / block_new_sharing)。API レスポンスはハイフン区切り(block-all-sharing)。
Security Hub finding への影響
| コントロール | 評価方式 | 宣言型ポリシーの影響 |
|---|---|---|
| EC2.1 | 結果ベース(パブリック共有スナップショットが存在するか) | block-all-sharing で PASSED に変化(BPA によりパブリック共有が実質無効化されるため) |
| EC2.182 | 設定ベース(BPA 設定が block-all-sharing か) | block-all-sharing で PASSED に変化(BPA が強制されるため)。ただし Configuration changes 型ルールのため反映に数時間〜1 日程度かかる |
block-new-sharing では EC2.1 / EC2.182 ともに FAILED のまま変化しない。
- EC2.1:
block-new-sharingは新規のパブリック共有をブロックするだけで、既存のパブリック共有スナップショットには影響しないため - EC2.182: BPA 設定値が
block-all-sharingでないと PASSED にならない(block-new-sharingでは不十分)
結果
| ステップ | EC2.1 | EC2.182 |
|---|---|---|
| FAILED 状態の作成 | FAILED | FAILED |
| block-new-sharing アタッチ | FAILED のまま | FAILED のまま |
| block-all-sharing に変更 | PASSED(即座) | PASSED(約 17.5〜23 時間後) |
block-all-sharingで EC2.1 / EC2.182 ともに PASSED に変化することを確認block-new-sharingでは EC2.1 / EC2.182 ともに FAILED のまま変化しないことを確認- EC2.1 は Periodic 型ルールのため手動トリガーで即座に確認できる
- EC2.182 は Configuration changes 型ルールのため、宣言型ポリシーによる変更を Config が認識するまで数時間〜1 日程度かかる。リージョンによって反映タイミングが大きく異なる(ap-northeast-1: 約 17.5 時間、ap-southeast-1: 約 23 時間)
- デタッチ後、BPA は
unblockedに復帰する
Config ルールの評価トリガーについて
AWS Config ルールには 2 種類の評価トリガーがある。
| トリガー | 動作 |
|---|---|
| Configuration changes(設定変更トリガー) | Config が監視しているリソースの設定が変更されたときに評価が実行される。変更がなければ評価されない |
| Periodic(定期実行) | 設定変更の有無に関係なく、一定間隔(1時間〜24時間)で評価が実行される |
EC2.1 と EC2.182 では評価トリガーが異なり、宣言型ポリシー適用後の確認方法に影響する。
| コントロール | Config ルール | トリガー | 宣言型ポリシー適用後の挙動 |
|---|---|---|---|
| EC2.1 | ebs-snapshot-public-restorable-check | Periodic | 手動トリガーで即座に最新の状態を取得して評価できる |
| EC2.182 | ebs-snapshot-block-public-access | Configuration changes | 宣言型ポリシーによる BPA 変更を Config が「設定変更」として認識しないため、評価がトリガーされない。Security Hub の定期スキャンによる反映を待つ必要がある |
検証の流れ
flowchart LR
A[1. FAILED 状態の作成] --> B[2. FAILED 確認]
B --> C[3. ポリシー作成・アタッチ<br>block-new-sharing]
C --> D[4. FAILED のまま<br>変化しないことを確認]
D --> E[5. block-all-sharing<br>に変更]
E --> F[6. PASSED 確認]
F --> G[7. デタッチ・削除]
G --> H[8. クリーンアップ]
--profile 指定がない場合は Workload アカウントで実行する。export AWS_PROFILE=Workload でデフォルトを設定しておくと便利。ポリシーの作成・アタッチ・更新・デタッチ・削除は --profile Master(Organizations 管理アカウント)で実行する。
1. FAILED 状態の作成
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"
}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"
}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"
}
]2. FAILED 確認
Config ルール名の確認(EC2.1 / EC2.182)
以降のステップで使用する Config ルール名を確認する。EC2.1 と EC2.182 はそれぞれ異なる 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 describe-config-rules \
--query 'ConfigRules[?contains(Source.SourceIdentifier,`EBS_SNAPSHOT_BLOCK_PUBLIC_ACCESS`)].ConfigRuleName' \
--region ap-northeast-1[
"securityhub-ebs-snapshot-block-public-access-<サフィックス>"
]EC2.1 の Config 評価・Security Hub finding 確認
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-ebs-snapshot-public-restorable-check-<サフィックス> \
--region ap-northeast-1
(出力なし)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"
}
]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 のまま。
EC2.182 の Config 評価・Security Hub finding 確認
BPA が unblocked のため既に FAILED のはず。
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-ebs-snapshot-block-public-access-<サフィックス> \
--region ap-northeast-1
(出力なし)aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-ebs-snapshot-block-public-access-<サフィックス> \
--query 'EvaluationResults[].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
--region ap-northeast-1[
{
"ResourceId": "<アカウント ID>",
"ComplianceType": "NON_COMPLIANT"
}
]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[].{Status:Compliance.Status,ResourceId:Resources[0].Id}' \
--region ap-northeast-1[
{
"Status": "FAILED",
"ResourceId": "arn:aws:ec2:<リージョン 1>:<アカウント ID>:snapshotblockpublicaccess/<アカウント ID>"
},
{
"Status": "FAILED",
"ResourceId": "arn:aws:ec2:<リージョン 2>:<アカウント ID>:snapshotblockpublicaccess/<アカウント ID>"
}
]両リージョンとも FAILED。EC2.182 の ResourceId は arn:aws:ec2:<リージョン>:<アカウント ID>:snapshotblockpublicaccess/<アカウント ID> 形式であり、EC2.1 の AWS::::Account:<アカウント ID> とは異なる。
3. ポリシー作成・アタッチ(block-new-sharing)
ステップ 4 の EC2.182 確認で ResultRecordedTime と比較するため、アタッチ時刻を記録しておく。
aws organizations create-policy \
--name ebs-snapshot-bpa-test \
--type DECLARATIVE_POLICY_EC2 \
--content '{
"ec2_attributes": {
"snapshot_block_public_access": {
"state": {
"@@assign": "block_new_sharing"
}
}
}
}' \
--description "EBS Snapshot BPA test" \
--query 'Policy.PolicySummary.{Id:Id,Name:Name,Type:Type}' \
--region ap-northeast-1 --profile Master{
"Id": "<ポリシー ID>",
"Name": "ebs-snapshot-bpa-test",
"Type": "DECLARATIVE_POLICY_EC2"
}aws organizations attach-policy \
--policy-id <ポリシー ID> \
--target-id <OU ID> \
--region ap-northeast-1 --profile Master
(出力なし)BPA 設定が block-new-sharing に強制されることを確認
aws ec2 get-snapshot-block-public-access-state \
--region ap-northeast-1{
"State": "block-new-sharing",
"ManagedBy": "declarative-policy"
}4. FAILED のまま変化しないことを確認
block-new-sharing では EC2.1 / EC2.182 ともに FAILED のまま変化しない。
- EC2.1:
block-new-sharingは新規のパブリック共有をブロックするだけで、既存のパブリック共有スナップショットには影響しないため - EC2.182: BPA 設定値が
block-all-sharingでないと PASSED にならない(block-new-sharingでは不十分)
EC2.1 の Config 評価・Security Hub finding 確認
EC2.1 の Config ルール(ebs-snapshot-public-restorable-check)は Periodic 型のため、手動トリガーで即座に確認できる。
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-ebs-snapshot-public-restorable-check-<サフィックス> \
--region ap-northeast-1
(出力なし)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"
}
]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>"
}
]EC2.182 の Config 評価・Security Hub finding 確認
EC2.182 の Config ルール(ebs-snapshot-block-public-access)は、リソースの設定変更を検知して自動的に評価を実行する Configuration changes 型である。しかし、宣言型ポリシーによる BPA 変更はこの自動検知の対象外であり、Config は BPA が変更されたことを認識しない。手動トリガーも同様に、Config が認識している古い状態で評価されるため意味がない。
Security Hub の定期スキャンにより最終的に反映されるため、反映を待って結果を確認する。ResultRecordedTime(Config が評価結果を記録した時刻)がポリシー変更後の時刻であれば、最新の BPA 状態で評価された結果であることを確認できる。この ResultRecordedTime 以降の Security Hub finding は、最新の BPA 状態を反映した正しい結果である。
評価結果を確認する。ResultRecordedTime がステップ 3 のポリシーアタッチ時刻より後であることを確認する。ポリシーアタッチ時刻より前の場合は、定期スキャンがまだ走っていないため、時間を置いて再度確認する。
aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-ebs-snapshot-block-public-access-<サフィックス> \
--query 'EvaluationResults[].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType,ResultRecordedTime:ResultRecordedTime}' \
--region ap-northeast-1[
{
"ResourceId": "<アカウント ID>",
"ComplianceType": "NON_COMPLIANT",
"ResultRecordedTime": "<評価時刻>"
}
]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[].{Status:Compliance.Status,ResourceId:Resources[0].Id}' \
--region ap-northeast-1[
{
"Status": "FAILED",
"ResourceId": "arn:aws:ec2:<リージョン 1>:<アカウント ID>:snapshotblockpublicaccess/<アカウント ID>"
},
{
"Status": "FAILED",
"ResourceId": "arn:aws:ec2:<リージョン 2>:<アカウント ID>:snapshotblockpublicaccess/<アカウント ID>"
}
]5. ポリシーを block-all-sharing に変更
ステップ 6 の EC2.182 確認で ResultRecordedTime と比較するため、変更時刻を記録しておく。
aws organizations update-policy \
--policy-id <ポリシー ID> \
--content '{
"ec2_attributes": {
"snapshot_block_public_access": {
"state": {
"@@assign": "block_all_sharing"
}
}
}
}' \
--query 'Policy.PolicySummary.{Id:Id,Type:Type}' \
--region ap-northeast-1 --profile Master{
"Id": "<ポリシー ID>",
"Type": "DECLARATIVE_POLICY_EC2"
}BPA 設定が block-all-sharing に変化したことを確認
aws ec2 get-snapshot-block-public-access-state \
--region ap-northeast-1{
"State": "block-all-sharing",
"ManagedBy": "declarative-policy"
}6. PASSED 確認
EC2.1 の Config 評価・Security Hub finding 確認
EC2.1 の Config ルール(ebs-snapshot-public-restorable-check)は Periodic 型のため、手動トリガーで即座に確認できる。
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-ebs-snapshot-public-restorable-check-<サフィックス> \
--region ap-northeast-1
(出力なし)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"
}
]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>"
}
]EC2.182 の Config 評価・Security Hub finding 確認
EC2.182 の Config ルール(ebs-snapshot-block-public-access)は Configuration changes 型のため、宣言型ポリシーによる変更は Config が設定変更として認識しない。Security Hub の定期スキャンによる自動更新を待つ必要がある。
反映後、ResultRecordedTime が block-all-sharing への変更後の時刻であることを確認する。
aws configservice get-compliance-details-by-config-rule \
--config-rule-name securityhub-ebs-snapshot-block-public-access-<サフィックス> \
--query 'EvaluationResults[].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType,ResultRecordedTime:ResultRecordedTime}' \
--region ap-northeast-1[
{
"ResourceId": "<アカウント ID>",
"ComplianceType": "COMPLIANT",
"ResultRecordedTime": "<評価時刻>"
}
]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[].{Status:Compliance.Status,ResourceId:Resources[0].Id}' \
--region ap-northeast-1[
{
"Status": "PASSED",
"ResourceId": "arn:aws:ec2:<リージョン 1>:<アカウント ID>:snapshotblockpublicaccess/<アカウント ID>"
},
{
"Status": "PASSED",
"ResourceId": "arn:aws:ec2:<リージョン 2>:<アカウント ID>:snapshotblockpublicaccess/<アカウント ID>"
}
]7. デタッチ・削除
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
(出力なし)BPA が unblocked に戻ったことを確認
aws ec2 get-snapshot-block-public-access-state \
--region ap-northeast-1{
"State": "unblocked",
"ManagedBy": "account"
}8. クリーンアップ
パブリック共有解除
aws ec2 modify-snapshot-attribute \
--snapshot-id <スナップショット ID> \
--attribute createVolumePermission \
--operation-type remove \
--group-names all \
--region ap-northeast-1
(出力なし)スナップショット削除
aws ec2 delete-snapshot \
--snapshot-id <スナップショット ID> \
--region ap-northeast-1
(出力なし)ボリューム削除
aws ec2 delete-volume \
--volume-id <ボリューム ID> \
--region ap-northeast-1
(出力なし)