エージェンシー事業でリードデータエンジニアの大窄 直樹 (おおさこ)です.
最近は 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 の設定を行えていれば, 上記のような出来事は起きなかったですが, 多層防御するに越したことはありません.
IMDSv1 を無効化し IMDSv2 のみの利用に変更することで, リクエストの過程で PUT リクエストを用いてのトークン取得が必須になるため, 上記のように少々WAFに不備があったとしても IMDSv2 へのアクセスは困難になります.
IMDSv2 への移行 (v1を無効化してv2のみ使える状態)
IMDSv2 への移行手順
- CloudWatch の MetadataNoToken を確認
- MetadataNoToken=0 の場合
- IMDSv1 をすでに利用していないので, IMDSv1 の停止対応
- MetadataNoToken>0 の場合
- IMDS パケットアナライザーを用いてプロセスを特定し, IMDSv1 を使わないように対応
- MetadataNoToken=0 の場合
IMDSv2 への移行手順を実施
- 環境
- インスタンスファミリー: t2
- OS: Amazon Linux2
1. CloudWatch の MetadataNoToken を確認
MetadataNoToken は IMDSv1 の呼び出し回数を表しています.
値が 0 より大きいので, このインスタンスは IMDSv1 を利用しています.
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 が利用されていないです.
5. EC2のインスタンスメタデータオプションの変更で IMDSv2 を Optional から必須に変更
下記のように, IMDSv2 を必須に変更し, v1 を使う事ができないように変更します.
まとめ
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 の確認も実施されることをオススメします.