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デプロイの要領でデプロイ完了しました。
最後までお読みいただきましてありがとうございました!
【PR】 「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。
【PR】 「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第2版」という本を書きました。
【PR】 「ポケットスタディ AWS認定 デベロッパーアソシエイト」という本を書きました。
【PR】 「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。
【PR】 「AWSではじめるLinux入門ガイド」という本を書きました。

開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
-
EC2 Linux ユーザーデータ実行ユーザーとカレントディレクトリの確認
きっと、rootなんだろうなあと認識してたのですが、自分の目で確認したことはなか …
-
-
2017年、このブログ(WordPress(Amazon EC2 + RDS))で対応してきたこと
Amazon Web Services Advent Calendar 2017 …
-
-
CUSTOMINEを使ってkintoneからAWS Lambdaを実行する(Cognito認証付き)
先日の記事「kintoneのカスタマイズ開発を超速にするCUSTOMINE」で書 …
-
-
AWS WAF Web ACLとルールをv1(Classic)からv2に自動移行しました
新しいものは、課題が解決されていたり、機能追加されたりするのでいいものです。 長 …
-
-
AWS Network Firewallの入門
公式のGetting started with AWS Network Fire …
-
-
Amazon Pollyを使って覚えたい資料を耳から身体に染み込ませる
Amazon Pollyを使うとソースコードを一切かかなくても、テキストを音声に …
-
-
DS18B20センサー+Raspberry Piで取得した温度をAmazon Kinesis FirehoseからS3へ格納してAthenaでクエリーしたのをQuickSightで可視化する
JAWS DAYS 2017でやりますハンズオンの「[IoTハンズオン] Ras …
-
-
S3バケットのデフォルト暗号化はデフォルトだったことを確認しました
S3バケットのデフォルト暗号化は名前のとおりだとデフォルトなので、暗号化を指定し …
-
-
AWSルートユーザーのパスワード復旧
AWSルートユーザーのパスワード最設定は、メールアドレスだけでいいのですね。 M …
-
-
AWS Wavelengthゾーンを有効にする
画面上で確認しておきたかったので有効にしておきました。 AWS Waveleng …