コンテンツにスキップ

EBS Snapshot Block Public Access

検証日: 2026-04-19〜20 / リージョン: ap-northeast-1
本ページの情報は 2026 年 4 月時点のものです。

概要

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-sharingPASSED に変化(BPA によりパブリック共有が実質無効化されるため)
EC2.182設定ベース(BPA 設定が block-all-sharing か)block-all-sharingPASSED に変化(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.1EC2.182
FAILED 状態の作成FAILEDFAILED
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.1ebs-snapshot-public-restorable-checkPeriodic手動トリガーで即座に最新の状態を取得して評価できる
EC2.182ebs-snapshot-block-public-accessConfiguration 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 の定期スキャンによる自動更新を待つ必要がある。

EC2.182 の反映には数時間かかる場合がある。リージョンによって反映タイミングが大きく異なる。

反映後、ResultRecordedTimeblock-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
(出力なし)

Amazonアソシエイトリンク