IMDSパケットアナライザーを用いたIMDSv2 への移行方法 (EC2.8対応)

エージェンシー事業でリードアプリケーションエンジニアの大窄 直樹 (おおさこ)です.

最近は SRE 的な業務が楽しく, サービスの品質の向上や, 費用削減にハマってます.

現在は Security Hub の AWS 基礎セキュリティのベストプラクティスのスコアアップが楽しいこの頃です.
今回はその中の一つである "EC2.8 EC2 インスタンスでは、Instance Metadata Service Version 2 (IMDSv2) を使用する必要があります" の対応について記載していこうと思います.

IMDS(Instance Metadata Service) とは

IMDS(Instance Metadata Service) とは EC2 の仮想エンドポイント(http://169.254.169.254)でインスタンスのメタデータを取り扱うサービスで, EC2 の内部から HTTP リクエストを送ることでインスタンスメタデータを取得できます.

現在は v1 と v2 が公開されていて, v1 及び v2 どちらも使える状態 or v1 を無効化して v2 のみ使える状態のどちらかを EC2 ごとに設定できます.
AWS のベストプラクティスではセキュリティの観点から v1 を無効化して v2 のみ使える状態に設定することを推奨されています.

EC2 から下記のようなコマンドを実行することでアクセスすることが可能です.

IMDSv1 を用いたアクセス

$ curl http://169.254.169.254/latest/meta-data/

IMDSv2 を用いたアクセス

$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
$ curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/

また IMDS はインスタンスプロファイルにもアクセスができるため, 下記のようにアクセスキーのクレデンシャルも取得することが可能です.

$ incetance_profile=$(curl http://169.254.169.254/latest/meta-data/iam/security-credentials)
$ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/$incetance_profile | jq -r .SecretAccessKey

そのため IMDS を外部ネットワークからアクセスできないようにすることは非常に重要です.

過去には, WAF(AWS WAFではない独自運用のWAF) の設定不備により外部ネットワークから IMDSv1 にアクセスを行ってクレデンシャルを取得し, そのクレデンシャルの権限を持って S3 にアクセスされ1億人をこえる個人情報が流出した事例があります.

正しく WAF の設定を行えていれば, 上記のような出来事は起きなかったですが, 多層防御するに越したことはありません.

IMDSv1 を無効化し IMDSv2 のみの利用に変更することで, リクエストの過程で PUT リクエストを用いてのトークン取得が必須になるため, 上記のように少々WAFに不備があったとしても IMDSv2 へのアクセスは困難になります.

IMDSv2 への移行 (v1を無効化してv2のみ使える状態)

IMDSv2 への移行手順

  • CloudWatch の MetadataNoToken を確認
    • MetadataNoToken=0 の場合
      • IMDSv1 をすでに利用していないので, IMDSv1 の停止対応
    • MetadataNoToken>0 の場合
      • IMDS パケットアナライザーを用いてプロセスを特定し, IMDSv1 を使わないように対応

IMDSv2 への移行手順を実施

  • 環境
    • インスタンスファミリー: t2
    • OS: Amazon Linux2

1. CloudWatch の MetadataNoToken を確認

MetadataNoToken は IMDSv1 の呼び出し回数を表しています.
値が 0 より大きいので, このインスタンスは IMDSv1 を利用しています.

CloudWatch で確認: MetaDataNoToken>0

2. IMDS パケットアナライザーを用いて, IMDSv1を呼び出しているプロセスの特定

IMDS パケットアナライザーはIMDSとのTCP通信をトレースするツールで, これを用いるとEC2とIMDS間のプロセスを確認することができます.

IMDS パケットアナライザーをドキュメントに従いインストール.

$ sudo yum install git -y

$ git -v
git version 2.40.1

$ pwd
/home/ec2-user

$ git clone https://github.com/aws/aws-imds-packet-analyzer.git
$ cd aws-imds-packet-analyzer/
$ sudo yum install python3
$ sudo bash install-deps.sh

▽ コンソール出力

$ sudo yum install git -y
インストール:
  git.x86_64 0:2.40.1-1.amzn2.0.1                                                                                                                                                                                                                                            

依存性関連をインストールしました:
  git-core.x86_64 0:2.40.1-1.amzn2.0.1                 git-core-doc.noarch 0:2.40.1-1.amzn2.0.1                 pcre2.x86_64 0:10.23-11.amzn2.0.1                 perl-Error.noarch 1:0.17020-2.amzn2                 perl-Git.noarch 0:2.40.1-1.amzn2.0.1                

依存性を更新しました:
  curl.x86_64 0:8.0.1-1.amzn2.0.1                                                        libcurl.x86_64 0:8.0.1-1.amzn2.0.1                                                        libnghttp2.x86_64 0:1.41.0-1.amzn2                                                       

完了しました!

$ git -v
git version 2.40.1

$ pwd
/home/ec2-user

$ git clone https://github.com/aws/aws-imds-packet-analyzer.git
Cloning into 'aws-imds-packet-analyzer'...
remote: Enumerating objects: 72, done.
remote: Counting objects: 100% (72/72), done.
remote: Compressing objects: 100% (56/56), done.
remote: Total 72 (delta 26), reused 50 (delta 12), pack-reused 0
Receiving objects: 100% (72/72), 31.51 KiB | 4.50 MiB/s, done.
Resolving deltas: 100% (26/26), done.
$ cd aws-imds-packet-analyzer/
$ sudo yum install python3

$ sudo bash install-deps.sh
[INFO] Running with sudo..checking if SUDO_USER: 'ec2-user' has home dir to support amazon-linux-extras cache...
[INFO] SUDO_USER: ec2-user homedir '/home/ec2-user' exists, moving forward with BCC installs
  0  ansible2                 available    \
        [ =2.4.2  =2.4.6  =2.8  =stable ]
  2  httpd_modules            available    [ =1.0  =stable ]
  3  memcached1.5             available    \
        [ =1.5.1  =1.5.16  =1.5.17 ]
  4 *nginx1.12=latest         enabled      [ =1.12.2 ]
  6  postgresql10             available    [ =10  =stable ]
  8 *redis4.0=latest          enabled      \
        [ =4.0.5  =4.0.10  =stable ]
  9  R3.4                     available    [ =3.4.3  =stable ]
 10  rust1                    available    \
        [ =1.22.1  =1.26.0  =1.26.1  =1.27.2  =1.31.0  =1.38.0
          =stable ]
 18  libreoffice              available    \
        [ =5.0.6.2_15  =5.3.6.1  =stable ]
 19  gimp                     available    [ =2.8.22 ]
 20  docker=latest            enabled      \
        [ =17.12.1  =18.03.1  =18.06.1  =18.09.9  =stable ]
 21  mate-desktop1.x          available    \
        [ =1.19.0  =1.20.0  =stable ]
 22  GraphicsMagick1.3        available    \
        [ =1.3.29  =1.3.32  =1.3.34  =stable ]
 23  tomcat8.5                available    \
        [ =8.5.31  =8.5.32  =8.5.38  =8.5.40  =8.5.42  =8.5.50
          =stable ]
 24  epel=latest              enabled      [ =7.11  =stable ]
 25  testing                  available    [ =1.0  =stable ]
 26  ecs                      available    [ =stable ]
 27  corretto8                available    \
        [ =1.8.0_192  =1.8.0_202  =1.8.0_212  =1.8.0_222  =1.8.0_232
          =1.8.0_242  =stable ]
 29  golang1.11               available    \
        [ =1.11.3  =1.11.11  =1.11.13  =stable ]
 30  squid4                   available    [ =4  =stable ]
 32  lustre2.10               available    \
        [ =2.10.5  =2.10.8  =stable ]
 33  java-openjdk11           available    [ =11  =stable ]
 34  lynis                    available    [ =stable ]
 36  BCC=latest               enabled      [ =0.x  =stable ]
 37  mono                     available    [ =5.x  =stable ]
 38  nginx1                   available    [ =stable ]
 40  mock                     available    [ =stable ]
 41  postgresql11             available    [ =11  =stable ]
 43  livepatch                available    [ =stable ]
 44  python3.8                available    [ =stable ]
 45  haproxy2                 available    [ =stable ]
 46  collectd                 available    [ =stable ]
 47  aws-nitro-enclaves-cli   available    [ =stable ]
 48  R4                       available    [ =stable ]
  _  kernel-5.4               available    [ =stable ]
 50  selinux-ng               available    [ =stable ]
 51  php8.0                   available    [ =stable ]
 52  tomcat9                  available    [ =stable ]
 53  unbound1.13              available    [ =stable ]
 54  mariadb10.5              available    [ =stable ]
 55  kernel-5.10=latest       enabled      [ =stable ]
 56  redis6                   available    [ =stable ]
 57  ruby3.0                  available    [ =stable ]
 58  postgresql12             available    [ =stable ]
 59  postgresql13             available    [ =stable ]
 60  mock2                    available    [ =stable ]
 61  dnsmasq2.85              available    [ =stable ]
 62  kernel-5.15              available    [ =stable ]
 63  postgresql14             available    [ =stable ]
 64  firefox                  available    [ =stable ]
 65  lustre                   available    [ =stable ]
 66  php8.1                   available    [ =stable ]
 67  awscli1                  available    [ =stable ]
 68  php8.2                   available    [ =stable ]
 69  dnsmasq                  available    [ =stable ]
 70  unbound1.17              available    [ =stable ]
 71  golang1.19               available    [ =stable ]
 72  collectd-python3         available    [ =stable ]
* Extra topic has reached end of support.

Now you can install:
 # yum clean metadata
 # yum install bcc
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
amzn2extra-BCC                                                                                                                                      | 3.0 kB  00:00:00
amzn2extra-docker                                                                                                                                   | 3.0 kB  00:00:00
amzn2extra-epel                                                                                                                                     | 3.0 kB  00:00:00
amzn2extra-kernel-5.10                                                                                                                              | 3.0 kB  00:00:00
amzn2extra-nginx1.12                                                                                                                                | 1.3 kB  00:00:00
amzn2extra-redis4.0                                                                                                                                 | 3.0 kB  00:00:00
(1/4): amzn2extra-BCC/2/x86_64/updateinfo                                                                                                           |   76 B  00:00:00
(2/4): amzn2extra-kernel-5.10/2/x86_64/updateinfo                                                                                                   |  31 kB  00:00:00
(3/4): amzn2extra-BCC/2/x86_64/primary_db                                                                                                           |  10 kB  00:00:00
(4/4): amzn2extra-kernel-5.10/2/x86_64/primary_db                                                                                                   |  20 MB  00:00:00
238 packages excluded due to repository priority protections
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ bcc-devel.x86_64 0:0.24.0-3.amzn2.0.4 を インストール
--> 依存性の処理をしています: bcc(x86-64) = 0.24.0-3.amzn2.0.4 のパッケージ: bcc-devel-0.24.0-3.amzn2.0.4.x86_64
--> 依存性の処理をしています: libbcc_bpf.so.0()(64bit) のパッケージ: bcc-devel-0.24.0-3.amzn2.0.4.x86_64
--> 依存性の処理をしています: libbcc.so.0()(64bit) のパッケージ: bcc-devel-0.24.0-3.amzn2.0.4.x86_64
---> パッケージ kernel-devel.x86_64 0:5.10.179-171.711.amzn2 を インストール
--> 依存性の処理をしています: elfutils-libelf-devel のパッケージ: kernel-devel-5.10.179-171.711.amzn2.x86_64
--> 依存性の処理をしています: gcc10 のパッケージ: kernel-devel-5.10.179-171.711.amzn2.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ bcc.x86_64 0:0.24.0-3.amzn2.0.4 を インストール
--> 依存性の処理をしています: bcc-tools = 0.24.0-3.amzn2.0.4 のパッケージ: bcc-0.24.0-3.amzn2.0.4.x86_64
--> 依存性の処理をしています: libbpf >= 0.0.5-3 のパッケージ: bcc-0.24.0-3.amzn2.0.4.x86_64
--> 依存性の処理をしています: libbpf.so.0(LIBBPF_0.5.0)(64bit) のパッケージ: bcc-0.24.0-3.amzn2.0.4.x86_64
--> 依存性の処理をしています: libbpf.so.0(LIBBPF_0.1.0)(64bit) のパッケージ: bcc-0.24.0-3.amzn2.0.4.x86_64
--> 依存性の処理をしています: libbpf.so.0(LIBBPF_0.0.9)(64bit) のパッケージ: bcc-0.24.0-3.amzn2.0.4.x86_64
--> 依存性の処理をしています: libbpf.so.0(LIBBPF_0.0.8)(64bit) のパッケージ: bcc-0.24.0-3.amzn2.0.4.x86_64
--> 依存性の処理をしています: libbpf.so.0(LIBBPF_0.0.7)(64bit) のパッケージ: bcc-0.24.0-3.amzn2.0.4.x86_64
--> 依存性の処理をしています: libbpf.so.0(LIBBPF_0.0.6)(64bit) のパッケージ: bcc-0.24.0-3.amzn2.0.4.x86_64
--> 依存性の処理をしています: libbpf.so.0(LIBBPF_0.0.2)(64bit) のパッケージ: bcc-0.24.0-3.amzn2.0.4.x86_64
--> 依存性の処理をしています: libbpf.so.0(LIBBPF_0.0.1)(64bit) のパッケージ: bcc-0.24.0-3.amzn2.0.4.x86_64
--> 依存性の処理をしています: libLLVM-11.so(LLVM_11)(64bit) のパッケージ: bcc-0.24.0-3.amzn2.0.4.x86_64
--> 依存性の処理をしています: libclang-cpp.so.11.1()(64bit) のパッケージ: bcc-0.24.0-3.amzn2.0.4.x86_64
--> 依存性の処理をしています: libbpf.so.0()(64bit) のパッケージ: bcc-0.24.0-3.amzn2.0.4.x86_64
--> 依存性の処理をしています: libLLVM-11.so()(64bit) のパッケージ: bcc-0.24.0-3.amzn2.0.4.x86_64
---> パッケージ elfutils-libelf-devel.x86_64 0:0.176-2.amzn2 を インストール
---> パッケージ gcc10.x86_64 0:10.4.0-1.amzn2.0.1 を インストール
--> 依存性の処理をしています: cpp10 = 10.4.0-1.amzn2.0.1 のパッケージ: gcc10-10.4.0-1.amzn2.0.1.x86_64
--> 依存性の処理をしています: gcc10-binutils のパッケージ: gcc10-10.4.0-1.amzn2.0.1.x86_64
--> 依存性の処理をしています: libzstd.so.1()(64bit) のパッケージ: gcc10-10.4.0-1.amzn2.0.1.x86_64
--> 依存性の処理をしています: libisl.so.15()(64bit) のパッケージ: gcc10-10.4.0-1.amzn2.0.1.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ bcc-tools.x86_64 0:0.24.0-3.amzn2.0.4 を インストール
--> 依存性の処理をしています: python3-bcc = 0.24.0-3.amzn2.0.4 のパッケージ: bcc-tools-0.24.0-3.amzn2.0.4.x86_64
--> 依存性の処理をしています: python3-netaddr のパッケージ: bcc-tools-0.24.0-3.amzn2.0.4.x86_64
---> パッケージ clang-libs.x86_64 0:11.1.0-1.amzn2.0.2 を インストール
--> 依存性の処理をしています: clang-resource-filesystem(x86-64) = 11.1.0 のパッケージ: clang-libs-11.1.0-1.amzn2.0.2.x86_64
---> パッケージ cpp10.x86_64 0:10.4.0-1.amzn2.0.1 を インストール
---> パッケージ gcc10-binutils.x86_64 0:2.35.2-9.amzn2.0.1 を インストール
--> 依存性の処理をしています: gcc10-binutils-gold >= 2.35.2 のパッケージ: gcc10-binutils-2.35.2-9.amzn2.0.1.x86_64
---> パッケージ isl.x86_64 0:0.16.1-6.amzn2 を インストール
---> パッケージ libbpf.x86_64 0:0.5.0-2.amzn2.0.4 を インストール
---> パッケージ libzstd.x86_64 0:1.5.2-1.amzn2 を インストール
---> パッケージ llvm-libs.x86_64 0:11.1.0-1.amzn2.0.2 を インストール
--> トランザクションの確認を実行しています。
---> パッケージ clang-resource-filesystem.x86_64 0:11.1.0-1.amzn2.0.2 を インストール
---> パッケージ gcc10-binutils-gold.x86_64 0:2.35.2-9.amzn2.0.1 を インストール
---> パッケージ python3-bcc.noarch 0:0.24.0-3.amzn2.0.4 を インストール
---> パッケージ python3-netaddr.noarch 0:0.7.18-3.amzn2.0.2 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

===========================================================================================================================================================================
 Package                                        アーキテクチャー            バージョン                                   リポジトリー                                 容量
===========================================================================================================================================================================
インストール中:
 bcc-devel                                      x86_64                      0.24.0-3.amzn2.0.4                           amzn2-core                                   30 k
 kernel-devel                                   x86_64                      5.10.179-171.711.amzn2                       amzn2extra-kernel-5.10                       16 M
依存性関連でのインストールをします:
 bcc                                            x86_64                      0.24.0-3.amzn2.0.4                           amzn2-core                                  589 k
 bcc-tools                                      x86_64                      0.24.0-3.amzn2.0.4                           amzn2-core                                  490 k
 clang-libs                                     x86_64                      11.1.0-1.amzn2.0.2                           amzn2-core                                   22 M
 clang-resource-filesystem                      x86_64                      11.1.0-1.amzn2.0.2                           amzn2-core                                   17 k
 cpp10                                          x86_64                      10.4.0-1.amzn2.0.1                           amzn2-core                                  9.4 M
 elfutils-libelf-devel                          x86_64                      0.176-2.amzn2                                amzn2-core                                   40 k
 gcc10                                          x86_64                      10.4.0-1.amzn2.0.1                           amzn2-core                                   38 M
 gcc10-binutils                                 x86_64                      2.35.2-9.amzn2.0.1                           amzn2-core                                  2.8 M
 gcc10-binutils-gold                            x86_64                      2.35.2-9.amzn2.0.1                           amzn2-core                                  768 k
 isl                                            x86_64                      0.16.1-6.amzn2                               amzn2-core                                  833 k
 libbpf                                         x86_64                      0.5.0-2.amzn2.0.4                            amzn2-core                                  135 k
 libzstd                                        x86_64                      1.5.2-1.amzn2                                amzn2-core                                  284 k
 llvm-libs                                      x86_64                      11.1.0-1.amzn2.0.2                           amzn2-core                                   22 M
 python3-bcc                                    noarch                      0.24.0-3.amzn2.0.4                           amzn2-core                                   97 k
 python3-netaddr                                noarch                      0.7.18-3.amzn2.0.2                           amzn2-core                                  1.3 M

トランザクションの要約
===========================================================================================================================================================================
インストール  2 パッケージ (+15 個の依存関係のパッケージ)

総ダウンロード容量: 114 M
インストール容量: 403 M
Downloading packages:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
(1/17): bcc-devel-0.24.0-3.amzn2.0.4.x86_64.rpm                                                                                                     |  30 kB  00:00:00
(2/17): bcc-0.24.0-3.amzn2.0.4.x86_64.rpm                                                                                                           | 589 kB  00:00:00
(3/17): bcc-tools-0.24.0-3.amzn2.0.4.x86_64.rpm                                                                                                     | 490 kB  00:00:00
(4/17): clang-resource-filesystem-11.1.0-1.amzn2.0.2.x86_64.rpm                                                                                     |  17 kB  00:00:00
(5/17): cpp10-10.4.0-1.amzn2.0.1.x86_64.rpm                                                                                                         | 9.4 MB  00:00:00
(6/17): elfutils-libelf-devel-0.176-2.amzn2.x86_64.rpm                                                                                              |  40 kB  00:00:00
(7/17): clang-libs-11.1.0-1.amzn2.0.2.x86_64.rpm                                                                                                    |  22 MB  00:00:00
(8/17): gcc10-binutils-2.35.2-9.amzn2.0.1.x86_64.rpm                                                                                                | 2.8 MB  00:00:00
(9/17): gcc10-binutils-gold-2.35.2-9.amzn2.0.1.x86_64.rpm                                                                                           | 768 kB  00:00:00
(10/17): gcc10-10.4.0-1.amzn2.0.1.x86_64.rpm                                                                                                        |  38 MB  00:00:00
(11/17): isl-0.16.1-6.amzn2.x86_64.rpm                                                                                                              | 833 kB  00:00:00
(12/17): libzstd-1.5.2-1.amzn2.x86_64.rpm                                                                                                           | 284 kB  00:00:00
(13/17): libbpf-0.5.0-2.amzn2.0.4.x86_64.rpm                                                                                                        | 135 kB  00:00:00
(14/17): python3-bcc-0.24.0-3.amzn2.0.4.noarch.rpm                                                                                                  |  97 kB  00:00:00
(15/17): kernel-devel-5.10.179-171.711.amzn2.x86_64.rpm                                                                                             |  16 MB  00:00:00
(16/17): python3-netaddr-0.7.18-3.amzn2.0.2.noarch.rpm                                                                                              | 1.3 MB  00:00:00
(17/17): llvm-libs-11.1.0-1.amzn2.0.2.x86_64.rpm                                                                                                    |  22 MB  00:00:00
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
合計                                                                                                                                        57 MB/s | 114 MB  00:00:02
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : gcc10-binutils-gold-2.35.2-9.amzn2.0.1.x86_64                                                                                             1/17
  インストール中          : gcc10-binutils-2.35.2-9.amzn2.0.1.x86_64                                                                                                  2/17
  インストール中          : llvm-libs-11.1.0-1.amzn2.0.2.x86_64                                                                                                       3/17
  インストール中          : libzstd-1.5.2-1.amzn2.x86_64                                                                                                              4/17
  インストール中          : libbpf-0.5.0-2.amzn2.0.4.x86_64                                                                                                           5/17
  インストール中          : cpp10-10.4.0-1.amzn2.0.1.x86_64                                                                                                           6/17
  インストール中          : clang-resource-filesystem-11.1.0-1.amzn2.0.2.x86_64                                                                                       7/17
  インストール中          : clang-libs-11.1.0-1.amzn2.0.2.x86_64                                                                                                      8/17
  インストール中          : python3-netaddr-0.7.18-3.amzn2.0.2.noarch                                                                                                 9/17
  インストール中          : isl-0.16.1-6.amzn2.x86_64                                                                                                                10/17
  インストール中          : gcc10-10.4.0-1.amzn2.0.1.x86_64                                                                                                          11/17
  インストール中          : elfutils-libelf-devel-0.176-2.amzn2.x86_64                                                                                               12/17
  インストール中          : kernel-devel-5.10.179-171.711.amzn2.x86_64                                                                                               13/17
  インストール中          : bcc-tools-0.24.0-3.amzn2.0.4.x86_64                                                                                                      14/17
  インストール中          : bcc-0.24.0-3.amzn2.0.4.x86_64                                                                                                            15/17
  インストール中          : python3-bcc-0.24.0-3.amzn2.0.4.noarch                                                                                                    16/17
  インストール中          : bcc-devel-0.24.0-3.amzn2.0.4.x86_64                                                                                                      17/17
  検証中                  : bcc-0.24.0-3.amzn2.0.4.x86_64                                                                                                             1/17
  検証中                  : elfutils-libelf-devel-0.176-2.amzn2.x86_64                                                                                                2/17
  検証中                  : cpp10-10.4.0-1.amzn2.0.1.x86_64                                                                                                           3/17
  検証中                  : isl-0.16.1-6.amzn2.x86_64                                                                                                                 4/17
  検証中                  : gcc10-binutils-2.35.2-9.amzn2.0.1.x86_64                                                                                                  5/17
  検証中                  : bcc-devel-0.24.0-3.amzn2.0.4.x86_64                                                                                                       6/17
  検証中                  : python3-netaddr-0.7.18-3.amzn2.0.2.noarch                                                                                                 7/17
  検証中                  : libbpf-0.5.0-2.amzn2.0.4.x86_64                                                                                                           8/17
  検証中                  : bcc-tools-0.24.0-3.amzn2.0.4.x86_64                                                                                                       9/17
  検証中                  : clang-libs-11.1.0-1.amzn2.0.2.x86_64                                                                                                     10/17
  検証中                  : clang-resource-filesystem-11.1.0-1.amzn2.0.2.x86_64                                                                                      11/17
  検証中                  : kernel-devel-5.10.179-171.711.amzn2.x86_64                                                                                               12/17
  検証中                  : libzstd-1.5.2-1.amzn2.x86_64                                                                                                             13/17
  検証中                  : gcc10-10.4.0-1.amzn2.0.1.x86_64                                                                                                          14/17
  検証中                  : llvm-libs-11.1.0-1.amzn2.0.2.x86_64                                                                                                      15/17
  検証中                  : python3-bcc-0.24.0-3.amzn2.0.4.noarch                                                                                                    16/17
  検証中                  : gcc10-binutils-gold-2.35.2-9.amzn2.0.1.x86_64                                                                                            17/17

インストール:
  bcc-devel.x86_64 0:0.24.0-3.amzn2.0.4                                            kernel-devel.x86_64 0:5.10.179-171.711.amzn2

依存性関連をインストールしました:
  bcc.x86_64 0:0.24.0-3.amzn2.0.4                               bcc-tools.x86_64 0:0.24.0-3.amzn2.0.4              clang-libs.x86_64 0:11.1.0-1.amzn2.0.2
  clang-resource-filesystem.x86_64 0:11.1.0-1.amzn2.0.2         cpp10.x86_64 0:10.4.0-1.amzn2.0.1                  elfutils-libelf-devel.x86_64 0:0.176-2.amzn2
  gcc10.x86_64 0:10.4.0-1.amzn2.0.1                             gcc10-binutils.x86_64 0:2.35.2-9.amzn2.0.1         gcc10-binutils-gold.x86_64 0:2.35.2-9.amzn2.0.1
  isl.x86_64 0:0.16.1-6.amzn2                                   libbpf.x86_64 0:0.5.0-2.amzn2.0.4                  libzstd.x86_64 0:1.5.2-1.amzn2
  llvm-libs.x86_64 0:11.1.0-1.amzn2.0.2                         python3-bcc.noarch 0:0.24.0-3.amzn2.0.4            python3-netaddr.noarch 0:0.7.18-3.amzn2.0.2

完了しました!

IMDS パケットアナライザーの実行

$ aws-imds-packet-analyzer]$ sudo python3 src/imds_snoop.py
Logging to /var/log/imds/imds-trace.log
Starting ImdsPacketAnalyzer...
Output format: Info Level:[INFO/ERROR...] IMDS version:[IMDSV1/2?] (pid:[pid]:[process name]:argv:[argv]) -> repeats 3 times for parent process

別ウィンドウで IMDSv1 を呼び出し, IMDS パケットアナライザーの様子を確認

$ curl http://169.254.169.254/latest/meta-data/
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
events/
hostname
iam/
identity-credentials/
instance-action
instance-id
instance-life-cycle
instance-type
local-hostname
local-ipv4
mac
metrics/
network/
placement/
profile
public-hostname
public-ipv4
public-keys/
reservation-id
security-groups
services/

IMDS パケットアナライザーのログの確認

$ sudo tail -f /var/log/imds/imds-trace.log
## 上記でIMDSv1にリクエストしたcurlのログ
[2023-06-29 08:59:01,788] [WARNING] IMDSv1(!) (pid:25738:curl argv:curl http://169.254.169.254/latest/meta-data/) called by -> (pid:25716:bash argv:-bash) -> (pid:25715:sshd argv:sshd: ec2-user@pts/1) -> (pid:25715:sshd argv:sshd: ec2-user [priv]) Req details: GET /latest/meta-data/ HTTP/1.1, Host: 169.254.169.254, User-Agent: curl/7.88.1, Accept: */*,
.....
## 特定したかったプロセス
[2023-06-29 09:22:43,197] [WARNING] IMDSv1(!) (pid:11785:curl argv:curl http://169.254.169.254/latest/dynamic/instance-identity/document) called by -> (pid:11780:ssm-document-wo argv:/usr/bin/ssm-document-worker f2dc1815-9d41-4da4-8522-583a3ee09a5f.2023-06-26T09-22-43.050Z i-0579274eac9c92ff9) -> (pid:3158:ssm-agent-worke argv:/usr/bin/ssm-agent-worker) -> (pid:3158:amazon-ssm-agen argv:/usr/bin/amazon-ssm-agent) Req details: GET /latest/dynamic/instance-identity/document HTTP/1.1, Host: 169.254.169.254, User-Agent: curl/7.61.1, Accept: */*,
.....

上記のログから, ssm-agent が IMDSv1 を利用している事がわかります. (このインスタンスでは, Amazon Inspector -> ssm-agent -> IMDSv1 のように呼び出していたみたいです.)

3. 対象パッケージのアップデート

AWS提供のパッケージが IMDSv1 を利用していた場合は, 基本的にバージョンアップ対応で v2 利用に変更されるみたいです.

### バージョンの確認
$ yum info amazon-ssm-agent 
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
インストール済みパッケージ
名前                : amazon-ssm-agent
アーキテクチャー    : x86_64
バージョン          : 3.0.161.0
リリース            : 1.amzn2
容量                : 135 M
リポジトリー        : installed
要約                : Manage EC2 Instances using SSM APIs
URL                 : http://docs.aws.amazon.com/ssm/latest/APIReference/Welcome.html
ライセンス          : ASL 2.0
説明                : This package provides Amazon SSM Agent for managing EC2 Instances using SSM APIs

利用可能なパッケージ
名前                : amazon-ssm-agent
アーキテクチャー    : x86_64
バージョン          : 3.1.1732.0
リリース            : 1.amzn2
容量                : 24 M
リポジトリー        : amzn2-core/2/x86_64
要約                : Manage EC2 Instances using SSM APIs
URL                 : http://docs.aws.amazon.com/ssm/latest/APIReference/Welcome.html
ライセンス          : ASL 2.0
説明                : This package provides Amazon SSM Agent for managing EC2 Instances using SSM APIs

### アップデート
$ sudo yum update amazon-ssm-agent

▽ コンソール出力

### バージョンの確認
$ yum info amazon-ssm-agent 
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
インストール済みパッケージ
名前                : amazon-ssm-agent
アーキテクチャー    : x86_64
バージョン          : 3.0.161.0
リリース            : 1.amzn2
容量                : 135 M
リポジトリー        : installed
要約                : Manage EC2 Instances using SSM APIs
URL                 : http://docs.aws.amazon.com/ssm/latest/APIReference/Welcome.html
ライセンス          : ASL 2.0
説明                : This package provides Amazon SSM Agent for managing EC2 Instances using SSM APIs

利用可能なパッケージ
名前                : amazon-ssm-agent
アーキテクチャー    : x86_64
バージョン          : 3.1.1732.0
リリース            : 1.amzn2
容量                : 24 M
リポジトリー        : amzn2-core/2/x86_64
要約                : Manage EC2 Instances using SSM APIs
URL                 : http://docs.aws.amazon.com/ssm/latest/APIReference/Welcome.html
ライセンス          : ASL 2.0
説明                : This package provides Amazon SSM Agent for managing EC2 Instances using SSM APIs

### アップデート
$ yum update amazon-ssm-agent
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
このコマンドを実行するには root である必要があります。
ex$ sudo yum update amazon-ssm-agent
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                                                                                                                          | 3.7 kB  00:00:00
amzn2extra-docker                                                                                                                                   | 3.0 kB  00:00:00
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ amazon-ssm-agent.x86_64 0:3.0.161.0-1.amzn2 を 更新
---> パッケージ amazon-ssm-agent.x86_64 0:3.1.1732.0-1.amzn2 を アップデート
--> 依存性解決を終了しました。

依存性を解決しました

===========================================================================================================================================================================
 Package                                     アーキテクチャー                  バージョン                                      リポジトリー                           容量
===========================================================================================================================================================================
更新します:
 amazon-ssm-agent                            x86_64                            3.1.1732.0-1.amzn2                              amzn2-core                             24 M

トランザクションの要約
===========================================================================================================================================================================
更新  1 パッケージ

総ダウンロード容量: 24 M
Is this ok [y/d/N]: y
Downloading packages:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
amazon-ssm-agent-3.1.1732.0-1.amzn2.x86_64.rpm                                                                                                      |  24 MB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  更新します              : amazon-ssm-agent-3.1.1732.0-1.amzn2.x86_64                                                                                                 1/2
  整理中                  : amazon-ssm-agent-3.0.161.0-1.amzn2.x86_64                                                                                                  2/2
  検証中                  : amazon-ssm-agent-3.1.1732.0-1.amzn2.x86_64                                                                                                 1/2
  検証中                  : amazon-ssm-agent-3.0.161.0-1.amzn2.x86_64                                                                                                  2/2

更新:
  amazon-ssm-agent.x86_64 0:3.1.1732.0-1.amzn2

完了しました!

4. 再度 CloudWatchのMetadataNoToken を確認

CloudWatch の MetadataNoToken=0 になったので, IMDSv1 が利用されていないです.

CloudWatchで確認: MetaDataNoToken=0

5. EC2のインスタンスメタデータオプションの変更で IMDSv2 を Optional から必須に変更

下記のように, IMDSv2 を必須に変更し, v1 を使う事ができないように変更します.

IMDSv2への移行

まとめ

Security Hub の AWS 基礎セキュリティのベストプラクティスの一つである "EC2.8 EC2 インスタンスでは、Instance Metadata Service Version 2 (IMDSv2) を使用する必要があります" の対応について記載しました.

IMDSv2 への移行は言葉だけ聞くと難しそうに見えますが, 意外と簡単です.

セキュリティの品質改善は何かあってから対応しようという考えでいると, 痛い目にあうかもしれません.

せっかく AWS さんが"AWS 基礎セキュリティのベストプラクティス"を提示してくれているので,
これくらいやっておけばいいだろではなく, 理由がない場合は基本的に AWS 基礎セキュリティのベストプラクティスに則ってアーキテクチャ構築するようにしましょう!!

補足

なお IMDS へのアクセスは user-data で実施される場合もあります.(Name タグや hostname, EIP の設定のためにインスタンスIDを得る場合に使用されることがあります)
この場合, インスタンスの作成から長時間経過していると IMDS パケットアナライザーや CloudWatch のメトリクスのみでは確認しきれず見逃してしまうこともあります.

見逃すと次回インスタンスを再作成する際にエラーが発生することになりますので, 一度 user-data の確認も実施されることをオススメします.