AMI ブロックパブリックアクセスの宣言型ポリシーを適用してみた

AMI ブロックパブリックアクセスの宣言型ポリシーを適用してみた

非 Control Tower 環境で AMI ブロックパブリックアクセスの宣言型ポリシーを適用してみました。
Clock Icon2025.02.12

カスタマーサクセス部 運用支援チームのいたくらです。

はじめに

先月、許可された AMI、EC2 シリアルコンソールアクセス、EBS スナップショットブロックパブリックアクセスの宣言型ポリシーの適用に関するブログを公開しました。
https://dev.classmethod.jp/articles/202501-declarative-policy-for-allowed-amis/
https://dev.classmethod.jp/articles/202501-declarative-policy-for-ec2-serial-console/
https://dev.classmethod.jp/articles/202501-declarative-policy-for-ebs-snapshots-block-public-access/

今回は AMI ブロックパブリックアクセスの宣言型ポリシーの適用と挙動の変化を確認してみました。

前提

前提として、自分が検証した環境について補足します。

  • AWS Organizations を有効化済みで、以下の OU 構成
    • 3.png
    • SandboxOU 配下には itkr_mem02(以降、アカウントA と表記)と itkr_mem03(以降、アカウントB と表記)が存在
  • AWS Control Tower は有効化していない
  • 宣言型ポリシーは有効化済み
    • 有効化手順はこちらを参照ください
  • もしも本番環境で試そうとしている方は、宣言型ポリシーのアカウントステータスレポートを生成することをおすすめします
    • 生成手順はこちらを参照ください

やってみた

宣言型ポリシーを作成する

AWS Organizations のサービスページより、「ポリシー」>「EC2 の宣言型ポリシー」>「ポリシーを作成」の順にクリックすると、以下のような入力画面が表示されます。
サービス属性は「画像ブロックパブリックアクセス」を選択します。
※ 以降は「画像ブロックパブリックアクセス」を「AMI ブロックパブリックアクセス」と表記します。
4.png

ポリシー名、ポリシーの説明を入力します。
AMI ブロックパブリックアクセスの場合は、新規パブリック共有をブロック する / しない のチェックボックスがあります。
今回は ブロックする で設定するため、チェックして進めます。

最後にカスタムエラーメッセージを設定し、「ポリシーを作成」をクリックします。
※ カスタムエラーメッセージは日本語で設定したらエラーが出たので、英語で設定しましょう
5.png
作成が完了すると、利用可能なポリシー一覧に表示されます。
6.png

宣言型ポリシーをアタッチする

作成した宣言型ポリシーを SandboxOU にアタッチします。
7.png

8.png

作成した宣言ポリシーの詳細画面の「ターゲット」タブに、ポリシーをアタッチした SandboxOU が表示されていれば OK です。
9.png

宣言型ポリシーによる挙動の変化を確認する

■ 宣言型ポリシー アタッチ前

SandboxOU 配下にある アカウント A で適当に AMI を作成したのち、アクセス許可を「パブリック」に変更します。
2.png
3.png
パブリックアクセスに変更できました。

次に SandboxOU 配下にある アカウント B にて、AMI 一覧より「パブリックイメージ」を選択し、さらに アカウント A で作成した AMI ID(ami-0f……)でフィルタします。
アカウント B からパブリックアクセスが許可されているアカウント A の AMI 情報を確認できました。
10-1.png

■ 宣言型ポリシー アタッチ後

既存でパブリックアクセス可能となっている AMI には影響が出ないため、SandboxOU 配下にある アカウント A で作成した AMI(ami-0f……)は引き続きパブリックアクセス許可の状態で存在しています。
11.png
アクセス許可をパブリックからプライベートへ変更するのは可能です。
13-1.png

アカウント A で別の AMI を新規作成したのち、アクセス許可を「パブリック」に変更しようとしてみます。
12.png
AMI の可用性の選択肢である「パブリック」がグレーアウトになっています。
パブリックを選択できないようにブロックされていることが確認できました。

カスタムエラーメッセージを確認してみる

アカウント A にて CloudShell を起動して、以下コマンドを実行して確認します。

~ $ aws ec2 get-image-block-public-access-state 
{
    "ImageBlockPublicAccessState": "block-new-sharing",
    "ManagedBy": "declarative-policy"
}
~ $ 
~ $ 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 was denied by the declarative policy: test-image-block-public-access-dp
~ $ 

get-image-block-public-access-state で このアカウントの AMI ブロックパブリックアクセスのステータスを確認できます。
上記の実行結果より「宣言型ポリシーによって管理されていて、新規 AMI のパブリック共有をブロックしている」ということが分かります。

また、disable-image-block-public-access でブロックパブリックアクセスを無効(=パブリック共有を許可)に変更しようとすると、エラーメッセージが表示されて実行できません。
「Custom Message:」以降の文章が、先ほど宣言型ポリシー作成時に入力したカスタムエラーメッセージになっていることが分かります。

さいごに

AMI ブロックパブリックアクセスの宣言型ポリシーの適用と挙動の変化を確認してみました。
EBS スナップショットブロックパブリックアクセスと同様に、一般的にはあえてパブリックに公開する必要はないと思うので、「ブロックパブリックアクセスを有効」に設定してポリシーをアタッチしておけばいいと思いました。
設定する際は現状の AWS 環境を確認し、適切なオプションを選択いただければと思います。

この記事がどなたかのお役に立てれば幸いです。

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。
サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.