インスタンスメタデータのデフォルトの宣言型ポリシーを適用してみた

インスタンスメタデータのデフォルトの宣言型ポリシーを適用してみた

非 Control Tower 環境で インスタンスメタデータのデフォルトの宣言型ポリシーを適用してみました。
Clock Icon2025.02.23

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

はじめに

先月、今月と以下の宣言型ポリシー適用に関するブログを公開しました。

  • 許可された AMI

https://dev.classmethod.jp/articles/202501-declarative-policy-for-allowed-amis/

  • EC2 シリアルコンソールアクセス

https://dev.classmethod.jp/articles/202501-declarative-policy-for-ec2-serial-console/

  • EBS スナップショットブロックパブリックアクセス

https://dev.classmethod.jp/articles/202501-declarative-policy-for-ebs-snapshots-block-public-access/

  • AMI ブロックパブリックアクセス

https://dev.classmethod.jp/articles/202502-declarative-policy-for-ami-block-public-access/

  • VPC ブロックパブリックアクセス

https://dev.classmethod.jp/articles/202502-declarative-policy-for-vpc-block-public-access/

今回は インスタンスメタデータのデフォルトの宣言型ポリシーの適用と挙動の変化を確認してみました。

前提

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

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

やってみた

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

AWS Organizations のサービスページより、「ポリシー」>「EC2 の宣言型ポリシー」>「ポリシーを作成」の順にクリックすると、以下のような入力画面が表示されます。
サービス属性は「インスタンスメタデータのデフォルト」を選択します。
2-3.png

ポリシー名、ポリシーの説明を入力します。
インスタンスメタデータのデフォルトの場合は、以下の設定値があります。

  • インスタンスメタデータサービス:優先度なし/有効/無効
  • メタデータのバージョン:V2 のみ(トークンが必要)/優先度なし/オプション
  • メタデータのタグへのアクセス:優先度なし/有効/無効
  • メタデータ応答ホップ制限: 1 ~ 64 の間の値で設定/優先度なし(チェックボックス)

今回は以下の設定値としました。
3.png

最後にカスタムエラーメッセージを設定し、「ポリシーを作成」をクリックします。
※ カスタムエラーメッセージは日本語で設定したらエラーが出たので、英語で設定しましょう

作成が完了すると、利用可能なポリシー一覧に表示されます。
4.png

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

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

6.png

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

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

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

SandboxOU 配下にある アカウント A のプライベートサブネット上に、EC2 を起動します。
以下のようなインスタンスメタデータ設定で起動します。
1-2.png

セッションマネージャーを使用して EC2 に接続し、インスタンスメタデータを取得してみます。

sh-5.2$ echo $(curl -s http://169.254.169.254/latest/meta-data/instance-id)
i-0axxxxxxxxxxxxxxx
sh-5.2$
sh-5.2$ echo $(curl -s http://169.254.169.254/latest/meta-data/tags/instance/Name)
test-20250223

インスタンスメタデータが有効で、インスタンスタグのメタデータ取得も有効であることが確認できます。

CloudShell を起動し、AWS CLI でもインスタンスメタデータ設定を確認します。

~ $ aws ec2 describe-instances \
>     --instance-id i-0axxxxxxxxxxxxxxx \
>     --query 'Reservations[].Instances[].MetadataOptions' \
>     --output json
[
    {
        "State": "applied",
        "HttpTokens": "optional",
        "HttpPutResponseHopLimit": 1,
        "HttpEndpoint": "enabled",
        "HttpProtocolIpv6": "disabled",
        "InstanceMetadataTags": "enabled"
    }
]
~ $

"HttpTokens": "optional" より、起動時の設定通り IMDSv1 と IMDSv2 の両方が使用可能なインスタンスが起動できていることが確認できます。

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

宣言型ポリシーアタッチ後、再度アカウント A のプライベートサブネット上に、EC2 を起動します。
起動画面を開き、インスタンスメタデータのセクションに移動すると、宣言型ポリシーで設定したデフォルト設定が表示されていました。
以下、ポリシーアタッチ前後のデフォルト設定を比較した画像です。
11.png

ポリシーアタッチ前のデフォルト設定から、宣言型ポリシーで設定したデフォルト設定へ変化したことが確認できます。

■ おまけ:デフォルトからパラメータを変更したらどうなるか

宣言型ポリシーによって設定されているデフォルト値から変更した場合、インスタンスは起動できるのでしょうか?
結論からいうと、起動できます。

宣言型ポリシーアタッチ後に EC2 を起動する際に、メタデータのバージョンを「V2 のみ(トークンは必須)」から「V1 および V2 (トークンはオプション)」へ変更してから起動し、AWS CLI でインスタンスメタデータ設定を確認した結果が以下です。

~ $ aws ec2 describe-instances \
> --instance-id i-03xxxxxxxxxxxxxxx \
> --query 'Reservations[].Instances[].MetadataOptions' \
> --output json
[
    {
        "State": "applied",
        "HttpTokens": "optional",
        "HttpPutResponseHopLimit": 1,
        "HttpEndpoint": "enabled",
        "HttpProtocolIpv6": "disabled",
        "InstanceMetadataTags": "enabled"
    }
]
~ $ 

エラーメッセージ等が表示されることなく、IMDSv1 と IMDSv2 の両方が使用可能なインスタンスが起動できました。
この宣言型ポリシーはデフォルト設定を統一するだけで、他のポリシーに比べて強制力は弱いようです。

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

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

~ $ aws ec2 get-instance-metadata-defaults 
{
    "AccountLevel": {
        "HttpTokens": "required",
        "HttpPutResponseHopLimit": 1,
        "HttpEndpoint": "enabled",
        "InstanceMetadataTags": "enabled",
        "ManagedBy": "declarative-policy",
        "ManagedExceptionMessage": "This functionality has been disabled by a Declarative Policy. Custom Message: This action was denied by the declarative policy: test-instance-metadata-dp"
    }
}
~ $ aws ec2 modify-instance-metadata-defaults --http-tokens optional

An error occurred (OperationNotPermitted) when calling the ModifyInstanceMetadataDefaults operation: This functionality has been disabled by a Declarative Policy. Custom Message: This action was denied by the declarative policy: test-instance-metadata-dp
~ $ 

aws ec2 get-instance-metadata-defaults で このアカウントのインスタンスメタデータのデフォルト設定のステータスを確認できます。
宣言型ポリシーによって管理されていること以外、宣言型ポリシーで設定した項目が表示されていることが分かります。

aws ec2 modify-instance-metadata-defaults --http-tokens optional でメタデータのバージョンを「V2 のみ(トークンは必須)」から「V1 および V2 (トークンはオプション)」へ変更しようとすると、エラーメッセージが表示されて実行できません。
「Custom Message:」以降の文章が、先ほど宣言型ポリシー作成時に入力したカスタムエラーメッセージになっていることが分かります。

さいごに

インスタンスメタデータのデフォルトの宣言型ポリシーの適用と挙動の変化を確認してみました。
他の宣言型ポリシーと異なり、デフォルト設定を統一するだけのポリシーということが判明しました。
予防的統制ではあるものの、他の宣言型ポリシーよりも強制力は弱いポリシーであることを頭の片隅に置いておいていただければと思います。
裏を返せばデフォルト設定を統一するだけなので、導入しやすい宣言型ポリシーであると言えるなと思いました。

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

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

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

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.