コンテンツにスキップ

CT.EC2.PV.11

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

コントロールの説明

AMI のパブリック共有をアカウントレベルでブロックします。

本コントロールは Declarative Policy により、アカウントの「Block Public Access for AMIs」設定を block-new-sharing に強制します。ただし、有効化前に既にパブリック共有されていた AMI はそのまま公開され続けます。

デフォルト設定について

AMI の Block Public Access は、多くのアカウントでデフォルトで有効になっています。AWS 公式ドキュメントによると、デフォルト設定は以下の通りです。

AWS アカウントデフォルト設定
新しいアカウント有効
パブリック AMI のない既存のアカウント ¹有効
1 つ以上のパブリック AMI がある既存のアカウント無効

¹ 2023 年 7 月 15 日以降にアカウントに 1 つ以上のパブリック AMI があった場合、その後すべての AMI を非公開にしたとしても、デフォルトで無効になっています。

デフォルトで有効であっても、アカウント管理者が disable-image-block-public-access API で無効化できてしまいます。本コントロールを有効にすると Declarative Policy で管理されるため、アカウント側で無効化できなくなります。つまり、本コントロールの主な価値は「デフォルト設定を勝手に変更させない」ことにあります。

CT.EC2.PV.7(スナップショット)との違い

同じ Declarative Policy ベースのコントロールですが、挙動が異なります。

CT.EC2.PV.7(スナップショット)CT.EC2.PV.11(AMI)
ポリシー設定値block_all_sharingblock_new_sharing
既存のパブリック共有他アカウントからアクセス不可になるそのまま公開され続ける
新規パブリック共有のエラーDeclarativePolicyViolationOperationNotPermitted(Block Public Access が有効なため)

検証の流れ

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

結果

  • デフォルトで block-new-sharingManagedBy: account)が有効だが、アカウント側で無効化できることを確認できた。
  • コントロールの有効化前、AMI をパブリック共有に設定でき、他アカウント(Audit)からその AMI が見えることを確認できた。
  • コントロールの有効化後、Block Public Access 設定が block-new-sharingManagedBy: declarative-policy)に変わることを確認できた。
  • 有効化前にパブリック共有されていた AMI は、有効化後も他アカウントから引き続きアクセス可能であることを確認できた。CT.EC2.PV.7(スナップショット)では既存のパブリック共有がブロックされたのとは対照的な挙動。
  • 有効化中に新規パブリック共有を試みると、OperationNotPermitted エラーで拒否されることを確認できた。これは Block Public Access が有効なために発生するエラーであり、CT.EC2.PV.7 の DeclarativePolicyViolation とは異なる。
  • Block Public Access 設定を無効化しようとすると、DeclarativePolicyViolation で拒否されることを確認できた。
  • コントロールの無効化後、再びパブリック共有が可能になることを確認できた。

1. 事前準備

アカウントの Block Public Access for AMIs 設定を確認する。

aws ec2 get-image-block-public-access-state
{
    "ImageBlockPublicAccessState": "block-new-sharing",
    "ManagedBy": "account"
}

デフォルトで block-new-sharing が有効になっている。検証のため、アカウント側で無効化する。

aws ec2 disable-image-block-public-access
{
    "ImageBlockPublicAccessState": "unblocked"
}

このようにアカウント管理者であれば無効化できてしまう。本コントロールはこの操作を防ぐためのものである。

検証用の AMI を作成する。EBS ボリュームからスナップショットを取得し、AMI として登録する。

aws ec2 create-volume \
  --availability-zone ap-northeast-1a \
  --size 1 \
  --volume-type gp3 \
  --tag-specifications 'ResourceType=volume,Tags=[{Key=Name,Value=ct-ec2-pv11-test}]' \
  --query '{VolumeId:VolumeId,State:State}'
{
    "VolumeId": "vol-08d3e5f5954379660",
    "State": "available"
}
aws ec2 create-snapshot \
  --volume-id <ボリューム ID> \
  --description "ct-ec2-pv11-test" \
  --tag-specifications 'ResourceType=snapshot,Tags=[{Key=Name,Value=ct-ec2-pv11-test}]' \
  --query '{SnapshotId:SnapshotId,State:State}'
{
    "SnapshotId": "snap-02de637a50a26c3f3",
    "State": "completed"
}
aws ec2 register-image \
  --name "ct-ec2-pv11-test" \
  --description "ct-ec2-pv11-test" \
  --architecture x86_64 \
  --root-device-name /dev/xvda \
  --block-device-mappings '[{"DeviceName":"/dev/xvda","Ebs":{"SnapshotId":"<スナップショット ID>","VolumeSize":1,"VolumeType":"gp3"}}]'
{
    "ImageId": "ami-0fe70f1fd73cea30b"
}

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

AMI をパブリック共有に設定する。

aws ec2 modify-image-attribute \
  --image-id <AMI ID> \
  --launch-permission "Add=[{Group=all}]"
aws ec2 describe-image-attribute \
  --image-id <AMI ID> \
  --attribute launchPermission
{
    "ImageId": "ami-0fe70f1fd73cea30b",
    "LaunchPermissions": [
        {
            "Group": "all"
        }
    ]
}

他アカウント(Audit)からパブリック共有された AMI が見えることを確認する。

aws ec2 describe-images \
  --image-ids <AMI ID> \
  --query 'Images[0].{ImageId:ImageId,Name:Name,Public:Public}' \
  --profile Audit
{
    "ImageId": "ami-0fe70f1fd73cea30b",
    "Name": "ct-ec2-pv11-test",
    "Public": true
}

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

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

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

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

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

aws controltower enable-control \
  --control-identifier arn:aws:controlcatalog:::control/clmlaa2in1wkntwekh7uw2jyx \
  --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 設定の変化を確認

aws ec2 get-image-block-public-access-state
{
    "ImageBlockPublicAccessState": "block-new-sharing",
    "ManagedBy": "declarative-policy"
}

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

5. 既存パブリック AMI は引き続きアクセス可能であることの確認

Audit アカウントから、有効化前にパブリック共有された AMI が引き続き見えることを確認する。

aws ec2 describe-images \
  --image-ids <AMI ID> \
  --query 'Images[0].{ImageId:ImageId,Name:Name,Public:Public}' \
  --profile Audit
{
    "ImageId": "ami-0fe70f1fd73cea30b",
    "Name": "ct-ec2-pv11-test",
    "Public": true
}

CT.EC2.PV.7(スナップショット)では block-all-sharing により既存のパブリック共有もブロックされたが、CT.EC2.PV.11(AMI)は block-new-sharing のため、既存のパブリック AMI はそのまま公開され続ける。

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

別の AMI を作成し、パブリック共有を試みる。

aws ec2 register-image \
  --name "ct-ec2-pv11-test-2" \
  --description "ct-ec2-pv11-test-2" \
  --architecture x86_64 \
  --root-device-name /dev/xvda \
  --block-device-mappings '[{"DeviceName":"/dev/xvda","Ebs":{"SnapshotId":"<スナップショット ID>","VolumeSize":1,"VolumeType":"gp3"}}]'
{
    "ImageId": "ami-01b77db8e90fe4c6d"
}
aws ec2 modify-image-attribute \
  --image-id <AMI ID> \
  --launch-permission "Add=[{Group=all}]"
An error occurred (OperationNotPermitted) when calling the ModifyImageAttribute operation:
You can't publicly share this image because block public access for AMIs is enabled for this account.
To publicly share the image, you must call the DisableImageBlockPublicAccess API.

CT.EC2.PV.7(スナップショット)では DeclarativePolicyViolation エラーだったが、AMI の場合は Block Public Access の仕組みにより OperationNotPermitted エラーとなる。エラーメッセージでは DisableImageBlockPublicAccess を呼ぶよう案内されるが、次のステップで確認する通り、それも拒否される。

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

aws ec2 disable-image-block-public-access
An error occurred (DeclarativePolicyViolation) when calling the DisableImageBlockPublicAccess 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/clmlaa2in1wkntwekh7uw2jyx \
  --target-identifier <OU の ARN>
{
    "operationIdentifier": "<オペレーション ID>"
}
aws controltower get-control-operation \
  --operation-identifier <オペレーション ID>
{
    "controlOperation": {
        "operationType": "DISABLE_CONTROL",
        "status": "SUCCEEDED",
        "statusMessage": "Operation was successful."
    }
}

9. 制限解除の確認

コントロール無効化後、再びパブリック共有が可能になることを確認する。

aws ec2 modify-image-attribute \
  --image-id <AMI ID> \
  --launch-permission "Add=[{Group=all}]"
aws ec2 describe-image-attribute \
  --image-id <AMI ID> \
  --attribute launchPermission
{
    "ImageId": "ami-01b77db8e90fe4c6d",
    "LaunchPermissions": [
        {
            "Group": "all"
        }
    ]
}

パブリック共有が再び可能になり、制限が解除されたことを確認できた。

10. クリーンアップ

検証で作成したリソースをすべて削除する。パブリック共有も解除し、Block Public Access をデフォルトに戻す。

# パブリック共有を解除
aws ec2 modify-image-attribute --image-id <AMI ID> --launch-permission "Remove=[{Group=all}]"
aws ec2 modify-image-attribute --image-id <AMI ID> --launch-permission "Remove=[{Group=all}]"

# AMI を登録解除
aws ec2 deregister-image --image-id <AMI ID>
aws ec2 deregister-image --image-id <AMI ID>

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

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

# Block Public Access をデフォルトに戻す
aws ec2 enable-image-block-public-access \
  --image-block-public-access-state block-new-sharing

Amazonアソシエイトリンク