WindowsインスタンスでのEC2インスタンスメタデータサービスv2対応について

しばたです。
先日EC2インスタンスメタデータサービスv2がリリースされ、弊社臼田による解説記事も公開されました。

[待望のアプデ]EC2インスタンスメタデータサービスv2がリリースされてSSRF脆弱性等への攻撃に対するセキュリティが強化されました!

こちらの記事ではEC2インスタンスメタデータサービスv2(IMDSv2)をLinuxインスタンスで試していますが、もちろんWindowsインスタンスでもIMDSv2は利用できます。

本記事ではWindowsインスタンスにおけるIMDSv2へのアクセス方法とCLI周りの対応状況について紹介します。

AWS Tools for PowerShellのIMDSv2対応状況

先述の臼田の記事で紹介されていますが、本日(2019年11月21日)時点で最新のAWS CLIであればIMDSv2の設定を行えます。
もちろんWindows版のAWS CLIでも利用可能です。

ではAWS Tools for PowerShellの対応状況はどうかというと、残念ながら本日時点の最新バージョン(Ver.3.3.618.1)ではまだIMDSv2に対応していません。

AWS Tools for PowerShellは内部でAWS SDK for .NETを使っているのですが、AWS SDK for .NETは2019年11月19日にリリースされたばかりのVer.3.3.634.1でIMDSv2に対応しており、このバージョンのSDKが組み込まれるまではAWS Tools for PowerShellでIMDSv2を利用できずもう少し待つ必要があります。

AWS Tools for PowerShellは概ね2週間~1ヶ月に一度の間隔でバージョンアップしており、最速で来月初旬のリリースで対応されるんじゃないかなぁと勝手に予想しています。(予想が外れたらすいません...)

対応したバージョンがリリースされたら本記事を更新するか新たに記事を起こしたいと思います。

WindowsインスタンスでのIMDSv2へのアクセス方法

IMDSv2では事前にTokenを取得してからメタデータにアクセスします。
AWS Security Blogと先述の記事ではこの様なシェルスクリプトのコードが例示されました。

# シェルスクリプトでの実行例
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
curl http://169.254.169.254/latest/meta-data/profile -H "X-aws-ec2-metadata-token: $TOKEN"

これをWindows PowerShell(Ver.3.0以降)で実行可能なコードに直すと以下になります。

# Windows PowerShell 3.0以降で実行可能
$token = Invoke-RestMethod 'http://169.254.169.254/latest/api/token' -Method Put -Headers @{ "X-aws-ec2-metadata-token-ttl-seconds" = 21600 }
Invoke-RestMethod 'http://169.254.169.254/latest/meta-data/' -Headers @{ "X-aws-ec2-metadata-token" = $token }

検証環境として適当に用意したWindows Server 2016(Windows PowerShell 5.1)環境で実行すると下図の通りきちんとメタデータを取得できます。

Windows環境でIMDSv2にアクセスする場合の参考にしてください。