コンテンツにスキップ

CT.EC2.PV.7

検証日: 2026-03-14 / リージョン: ap-northeast-1

コントロールの説明

EBS スナップショットのパブリック共有をアカウントレベルでブロックします。

本コントロールは Declarative Policy により、アカウントの「Block Public Access for EBS Snapshots」設定を block-all-sharing に強制します。同じ目的の [CT.EC2.PV.3](SCP)とは以下の点で異なります。

CT.EC2.PV.3(SCP)CT.EC2.PV.7(Declarative Policy)
実装方式ec2:ModifySnapshotAttribute API を拒否アカウントレベルの Block Public Access 設定を強制
既存のパブリック共有維持される(属性もアクセスもそのまま)属性は残るが、他アカウントからアクセスできなくなる
無効化後即座にパブリック共有が可能に戻る属性が残っていたスナップショットが再びパブリックに戻る(反映に時間がかかる場合がある)
エラーメッセージexplicit deny in a service control policyDeclarativePolicyViolation
Block Public Access の無効化制限しない制限する

Security Hub CSPM の [EC2.1] は「EBS スナップショットがパブリック共有されていないか」をチェック(検出)しますが、本コントロールを有効にすることで、パブリック共有の操作自体をブロックし、既存のパブリック共有も実質的に無効化します。

検証の流れ

    flowchart LR
    A[1. 事前準備] --> B[2. パブリック共有成功<br>+ 他アカウントから<br>アクセス成功]
    B --> C[3. CT.EC2.PV.7<br>有効化]
    C --> D[4. Block Public Access<br>設定の変化を確認]
    C --> E[5. 他アカウントから<br>アクセス不可]
    C --> F[6. 新規パブリック共有<br>拒否を確認]
    C --> G[7. Block Public Access<br>の無効化も拒否]
    D & E & F & G --> H[8. CT.EC2.PV.7<br>無効化]
    H --> I[9. パブリック共有<br>再設定で復活を確認]
  

結果

  • コントロールの有効化前、EBS スナップショットをパブリック共有に設定でき、他アカウント(Audit)からそのスナップショットを使ってボリュームを作成できることを確認できた。
  • コントロールの有効化後、アカウントの Block Public Access 設定が block-all-sharingManagedBy: declarative-policy)に変わることを確認できた。
  • 有効化前にパブリック共有されていたスナップショットの属性(Group: all)は残るが、他アカウントからはスナップショットが見えなくなり、ボリューム作成が InvalidSnapshot.NotFound で失敗することを確認できた。
  • 有効化中に新規パブリック共有を試みると、DeclarativePolicyViolation エラーで拒否されることを確認できた。SCP の explicit deny in a service control policy とは異なるエラーメッセージとなる。
  • Block Public Access 設定を手動で無効化しようとしても、同様に DeclarativePolicyViolation で拒否されることを確認できた。
  • コントロールの無効化後、Block Public Access 設定が unblockedManagedBy: account)に戻ることを確認できた。ただし、属性が残っていたスナップショットが即座にパブリックに復活するわけではなく、パブリック共有の再設定が必要だった。

1. 事前準備

アカウントの Block Public Access 設定がデフォルト(unblocked)であることを確認する。

aws ec2 get-snapshot-block-public-access-state
{
    "State": "unblocked",
    "ManagedBy": "account"
}

検証用の EBS ボリュームを作成し、スナップショットを取得する。

aws ec2 create-volume \
  --availability-zone ap-northeast-1a \
  --size 1 \
  --volume-type gp3 \
  --tag-specifications 'ResourceType=volume,Tags=[{Key=Name,Value=ct-ec2-pv7-test}]' \
  --query '{VolumeId:VolumeId,State:State}'
{
    "VolumeId": "vol-0180df33e17dd6df2",
    "State": "available"
}
aws ec2 create-snapshot \
  --volume-id <ボリューム ID> \
  --description "ct-ec2-pv7-test" \
  --tag-specifications 'ResourceType=snapshot,Tags=[{Key=Name,Value=ct-ec2-pv7-test}]' \
  --query '{SnapshotId:SnapshotId,State:State}'
{
    "SnapshotId": "snap-05ba629661c8f403c",
    "State": "completed"
}

2. コントロール有効化前の確認

スナップショットをパブリック共有に設定する。

aws ec2 modify-snapshot-attribute \
  --snapshot-id <スナップショット ID> \
  --attribute createVolumePermission \
  --operation-type add \
  --group-names all
aws ec2 describe-snapshot-attribute \
  --snapshot-id <スナップショット ID> \
  --attribute createVolumePermission
{
    "SnapshotId": "snap-05ba629661c8f403c",
    "CreateVolumePermissions": [
        {
            "Group": "all"
        }
    ]
}

他アカウント(Audit)から、パブリック共有されたスナップショットを使ってボリュームを作成できることを確認する。

aws ec2 create-volume \
  --snapshot-id <スナップショット ID> \
  --availability-zone ap-northeast-1a \
  --volume-type gp3 \
  --query '{VolumeId:VolumeId,SnapshotId:SnapshotId,State:State}' \
  --profile Audit
{
    "VolumeId": "vol-0e231ae526b4a884d",
    "SnapshotId": "snap-05ba629661c8f403c",
    "State": "creating"
}

ボリュームが正常に作成された。確認後、このボリュームは削除しておく。

3. 対象の予防コントロールを有効化(例外設定なし)

パブリック共有されたスナップショットが存在する状態のまま、コントロールを有効化する。

Control Tower の管理アカウントで、対象の OU にコントロールが有効になっていないことを確認する。

aws controltower list-enabled-controls \
  --target-identifier <OU の ARN>
{
    "enabledControls": []
}

コントロールを有効化する。

aws controltower enable-control \
  --control-identifier arn:aws:controlcatalog:::control/ek6wc2bmgzmho1kk6bn236mqt \
  --target-identifier <OU の ARN>
{
    "arn": "arn:aws:controltower:ap-northeast-1:<管理アカウント ID>:enabledcontrol/<enabledcontrol ID>",
    "operationIdentifier": "<オペレーション ID>"
}

有効化が完了するまで待機する。

aws controltower get-control-operation \
  --operation-identifier <オペレーション ID>
{
    "controlOperation": {
        "operationType": "ENABLE_CONTROL",
        "status": "SUCCEEDED",
        "statusMessage": "Operation was successful."
    }
}

4. Block Public Access 設定の変化を確認

アカウントの Block Public Access 設定が変わったことを確認する。

aws ec2 get-snapshot-block-public-access-state
{
    "State": "block-all-sharing",
    "ManagedBy": "declarative-policy"
}

Stateunblockedblock-all-sharing に、ManagedByaccountdeclarative-policy に変わった。Declarative Policy によって設定が強制されていることがわかる。

有効化前にパブリック共有されていたスナップショットの属性を確認する。

aws ec2 describe-snapshot-attribute \
  --snapshot-id <スナップショット ID> \
  --attribute createVolumePermission
{
    "SnapshotId": "snap-05ba629661c8f403c",
    "CreateVolumePermissions": [
        {
            "Group": "all"
        }
    ]
}

Group: all の属性はそのまま残っている。ただし、Block Public Access により他アカウントからはアクセスできない状態になっている。

5. 他アカウントからのアクセスがブロックされることの確認

Audit アカウントから、同じスナップショットを使ってボリュームを作成しようとする。

aws ec2 create-volume \
  --snapshot-id <スナップショット ID> \
  --availability-zone ap-northeast-1a \
  --volume-type gp3 \
  --profile Audit
An error occurred (InvalidSnapshot.NotFound) when calling the CreateVolume operation:
Snapshot does not exist

Block Public Access が有効になったことで、他アカウントからはスナップショット自体が見えなくなった。ステップ 2 では同じ操作が成功していたため、Block Public Access によるブロックが機能していることが確認できた。

6. 新規パブリック共有は制限(拒否)されることの確認

aws ec2 modify-snapshot-attribute \
  --snapshot-id <スナップショット ID> \
  --attribute createVolumePermission \
  --operation-type add \
  --group-names all
An error occurred (DeclarativePolicyViolation) when calling the ModifySnapshotAttribute operation:
This functionality has been disabled by a Declarative Policy.
Custom Message: This action is blocked by a declarative policy that is managed by AWS Control Tower.
For details, contact the administrator for your organization.

SCP の場合は explicit deny in a service control policy というメッセージだが、Declarative Policy の場合は DeclarativePolicyViolation というエラーになる。

7. Block Public Access の無効化も拒否されることの確認

aws ec2 disable-snapshot-block-public-access
An error occurred (DeclarativePolicyViolation) when calling the DisableSnapshotBlockPublicAccess operation:
This functionality has been disabled by a Declarative Policy.
Custom Message: This action is blocked by a declarative policy that is managed by AWS Control Tower.
For details, contact the administrator for your organization.

Declarative Policy で管理されているため、アカウント側で Block Public Access 設定を変更することもできない。

8. 対象の予防コントロールを無効化

検証完了後、コントロールを無効化する。

aws controltower disable-control \
  --control-identifier arn:aws:controlcatalog:::control/ek6wc2bmgzmho1kk6bn236mqt \
  --target-identifier <OU の ARN>
{
    "operationIdentifier": "<オペレーション ID>"
}
aws controltower get-control-operation \
  --operation-identifier <オペレーション ID>
{
    "controlOperation": {
        "operationType": "DISABLE_CONTROL",
        "status": "SUCCEEDED",
        "statusMessage": "Operation was successful."
    }
}

Block Public Access 設定が元に戻ったことを確認する。

aws ec2 get-snapshot-block-public-access-state
{
    "State": "unblocked",
    "ManagedBy": "account"
}

9. 制限解除の確認

コントロール無効化後、属性に Group: all が残っていたスナップショットが再びパブリックに戻るか確認する。

aws ec2 describe-snapshot-attribute \
  --snapshot-id <スナップショット ID> \
  --attribute createVolumePermission
{
    "SnapshotId": "snap-05ba629661c8f403c",
    "CreateVolumePermissions": [
        {
            "Group": "all"
        }
    ]
}

属性は残っているが、他アカウントからは即座にはアクセスできなかった。

aws ec2 create-volume \
  --snapshot-id <スナップショット ID> \
  --availability-zone ap-northeast-1a \
  --volume-type gp3 \
  --profile Audit
An error occurred (InvalidSnapshot.NotFound) when calling the CreateVolume operation:
Snapshot does not exist

パブリック共有を一度解除して再設定すると、他アカウントからアクセスできるようになった。

aws ec2 modify-snapshot-attribute \
  --snapshot-id <スナップショット ID> \
  --attribute createVolumePermission \
  --operation-type remove \
  --group-names all

aws ec2 modify-snapshot-attribute \
  --snapshot-id <スナップショット ID> \
  --attribute createVolumePermission \
  --operation-type add \
  --group-names all
aws ec2 create-volume \
  --snapshot-id <スナップショット ID> \
  --availability-zone ap-northeast-1a \
  --volume-type gp3 \
  --query '{VolumeId:VolumeId,SnapshotId:SnapshotId,State:State}' \
  --profile Audit
{
    "VolumeId": "vol-06f762b55bae65ebf",
    "SnapshotId": "snap-05ba629661c8f403c",
    "State": "creating"
}
AWS の公式ドキュメントには「Block Public Access を無効化すると、以前パブリック共有されていたスナップショットは再びパブリックに戻る」と記載されていますが、今回の検証では即座には復活せず、パブリック共有の再設定が必要でした。無効化後の反映タイミングには注意が必要です。

10. クリーンアップ

検証で作成したリソースをすべて削除する。パブリック共有も解除しておく。

# 他アカウントで作成したボリュームを削除
aws ec2 delete-volume --volume-id <ボリューム ID> --profile Audit

# パブリック共有を解除
aws ec2 modify-snapshot-attribute \
  --snapshot-id <スナップショット ID> \
  --attribute createVolumePermission \
  --operation-type remove \
  --group-names all

# スナップショットを削除
aws ec2 delete-snapshot --snapshot-id <スナップショット ID>

# EBS ボリュームを削除
aws ec2 delete-volume --volume-id <ボリューム ID>

Amazonアソシエイトリンク