Amazon EC2 インスタンスメタデータサービス(IMDS) v2のみにしました
2021/08/18
今さらながらですが、EC2 インスタンスメタデータサービス(IMDS) v2を確認しました。
目次
実行確認
デフォルトで使えるのでひとまず実行確認してみました。
ユーザーガイドインスタンスメタデータサービスの設定記載のとおりに実行しました。
1 2 |
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` |
トークンをPUTリクエストを発行して、
1 2 |
curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/ |
実行する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
* Trying 169.254.169.254... * TCP_NODELAY set * Connected to 169.254.169.254 (169.254.169.254) port 80 (#0) > GET /latest/meta-data/ HTTP/1.1 > Host: 169.254.169.254 > User-Agent: curl/7.61.1 > Accept: */* > X-aws-ec2-metadata-token: AQAEAKJ0MwhMLzNX6aiKDxlRMK12W0bjfRzLeY6s-GBYG59hLc0rCQ== > < HTTP/1.1 200 OK < X-Aws-Ec2-Metadata-Token-Ttl-Seconds: 21591 < Content-Type: text/plain < Accept-Ranges: none < Last-Modified: Wed, 04 Aug 2021 09:51:13 GMT < Content-Length: 318 < Date: Wed, 04 Aug 2021 10:43:39 GMT < Server: EC2ws < Connection: close < 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 * Closing connection 0 |
トークンは期限切れになったら再利用できないし、EC2インスタンスごとに個別発行ですと。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/public-ipv4 * Trying 169.254.169.254... * TCP_NODELAY set * Connected to 169.254.169.254 (169.254.169.254) port 80 (#0) > GET /latest/meta-data/public-ipv4 HTTP/1.1 > Host: 169.254.169.254 > User-Agent: curl/7.61.1 > Accept: */* > X-aws-ec2-metadata-token: AQAEAKJ0MwhMLzNX6aiKDxlRMK12W0bjfRzLeY6s-GBYG59hLc0rCQ== > < HTTP/1.1 200 OK < X-Aws-Ec2-Metadata-Token-Ttl-Seconds: 21434 < Content-Type: text/plain < Accept-Ranges: none < Last-Modified: Wed, 04 Aug 2021 09:51:13 GMT < Content-Length: 13 < Date: Wed, 04 Aug 2021 10:46:16 GMT < Server: EC2ws < Connection: close < * Closing connection 0 13.208.223.98 |
パブリックIPアドレスももちろん取得できました。
IMDSv2のメリット
Add defense in depth against open firewalls, reverse proxies, and SSRF vulnerabilities with enhancements to the EC2 Instance Metadata Serviceを日本語翻訳すると、こんなことが書いてありました。
- オープンなサードパーティWAFからの保護
設定次第では、脆弱性のあるサードパーティWAFでは、IMDSv1のようなGETリクエストが実行されてしまう可能性があるそうです。
なので、サードパーティWAFのほとんどがサポートしないPUTリクエストでトークンを取得することで保護できると。 -
オープンリバースプロキシからの保護
Apache httpdやSquidなどのオープンリバースプロキシも誤った設定によってIMDSv1のようなGETリクエストが実行される可能性があるとのことです。
オープンリバースプロキシが通常送信するX-Forwarded-ForHTTPヘッダーを含んでいた場合、IMDSv2はトークン発行しないとのことです。 -
SSRF脆弱性からの保護
PUTリクエストでトークンを発行して、そのトークンを使ってリクエストを実行するという方法が、SSRF脆弱性の大部分から保護することができるとのことです。 -
オープンレイヤー3ファイアウォールおよびNATからの保護
EC2インスタンスがオープンルーター、レイヤー3ファイアウォール、VPN、トンネル、またはNATデバイスとして誤って構成されている場合に、インスタンス外にパケットが転送される場合があります。
IMDSv2の応答はTTL0なので、インスタンスを離れる前に応答が破棄されるとのことです。
IMDSv1の実行状況確認
CLIやSDKはIAMロールの認証情報はv2で取得がデフォルトになっているとのことです。
該当のEC2インスタンスでは、Systems Managerエージェント、CloudWatch LogsやS3へのアップロードとかが実行されているので、IMDSv1を無効化して問題が発生しては困ります。
IMDSv2のリリースに伴って、IMDSv1の使用状況がメトリクスに追加されていました。
さすが、気が効いてますね。
過去1週間で7/31に9回実行されてますが、それ以外はないです。
きっと問題ないです。
IMDSv1の無効化設定
既存の起動中インスタンスは、コンソールには変更メニューがなく、CLIからのみ実行可能なようです。
1 2 3 4 5 |
aws ec2 modify-instance-metadata-options \ --instance-id i-1234567898abcdef0 \ --http-tokens required \ --http-endpoint enabled |
設定後、curlコマンドで確認したらエラーも何もなく、何もレスポンスがありませんでした。
1 2 |
curl http://169.254.169.254/latest/meta-data |
起動テンプレートも変更して、WordPress、プラグインのアップデートしてBlue/Greenデプロイの要領でデプロイ完了しました。
最後までお読みいただきましてありがとうございました!
「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。

「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。

「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。

「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。

「AWSではじめるLinux入門ガイド」という本を書きました。


開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
-
iPad ProのWorking CopyでAWS CodeCommitのリポジトリを使う
iPad Proを導入しましたので、原稿執筆や校正でフル活用しようと思いまして。 …
-
-
Route53でドメインを新規取得してDNSレコードを設定する
Elastic IPをAWSで発行しているのですから、DNSの設定も同じようにマ …
-
-
DynamoDB IAMポリシーで特定項目だけを許可する
検証記録です。 対象テーブル 書籍のサンプルで作ったこちらです。 所属バンドの楽 …
-
-
VPCピア接続した先のVPCインターフェイスエンドポイントを使用する
VPC1とVPC2でピア接続しています。 VPC2にはKMSのインターフェイスエ …
-
-
Amazon VPCにオンプレミス検証環境想定プライベートDNSサーバー(BIND)をEC2で起動する
オンプレミス想定の検証で使うために、Amazon VPCにプライベート向けDNS …
-
-
AWS Cloud9で環境を共有する
(特にリモート環境では)画面共有をしたり、リポジトリを共有したり、コーディング環 …
-
-
Cloud9のデフォルト設定での権限確認(AWS managed temporary credentials)
Cloud9の環境を作成した際のデフォルトアクセス権限は、環境を作成したIAMユ …
-
-
Cloud9環境を共有した際の環境認証
Cloud9を環境を構築したIAMユーザー以外に共有したとき、その環境から実行す …
-
-
Amazon Pollyを使って覚えたい資料を耳から身体に染み込ませる
Amazon Pollyを使うとソースコードを一切かかなくても、テキストを音声に …
-
-
CloudFormationスタックポリシーでスタック更新を防止する
CloudFormationのスタックにスタックポリシーを設定することによって、 …