CT.EC2.PV.7
コントロールの説明
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 policy | DeclarativePolicyViolation |
| 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-sharing(ManagedBy: declarative-policy)に変わることを確認できた。 - 有効化前にパブリック共有されていたスナップショットの属性(
Group: all)は残るが、他アカウントからはスナップショットが見えなくなり、ボリューム作成がInvalidSnapshot.NotFoundで失敗することを確認できた。 - 有効化中に新規パブリック共有を試みると、
DeclarativePolicyViolationエラーで拒否されることを確認できた。SCP のexplicit deny in a service control policyとは異なるエラーメッセージとなる。 - Block Public Access 設定を手動で無効化しようとしても、同様に
DeclarativePolicyViolationで拒否されることを確認できた。 - コントロールの無効化後、Block Public Access 設定が
unblocked(ManagedBy: 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 allaws 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"
}State が unblocked → block-all-sharing に、ManagedBy が account → declarative-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 AuditAn error occurred (InvalidSnapshot.NotFound) when calling the CreateVolume operation:
Snapshot does not existBlock Public Access が有効になったことで、他アカウントからはスナップショット自体が見えなくなった。ステップ 2 では同じ操作が成功していたため、Block Public Access によるブロックが機能していることが確認できた。
6. 新規パブリック共有は制限(拒否)されることの確認
aws ec2 modify-snapshot-attribute \
--snapshot-id <スナップショット ID> \
--attribute createVolumePermission \
--operation-type add \
--group-names allAn 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-accessAn 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 AuditAn 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 allaws 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"
}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>