以前、EC2インスタンスのメタデータ(IMDSv1)をPowerShellで一括出力してみるの記事にて、IMDCSv1
からメタデータを一括出力する方法を紹介しました。
本記事では、IMDSv2
で同様にメタデータを一括出力する方法を説明します。
そもそもIMDSv2って?
IMDS
はInstance Metadata Service
の略称となり。
EC2インスタンスのメタデータサービスを取り扱うサービスとなり、このv2がIMDSv2
となります。
IMDSv2
が出てきた経緯については、下記AWSブログに記載があります。
AWSジャパンのブログにも日本語訳での投稿があります。
EC2 インスタンスメタデータサービスの拡張により、オープンなファイアウォール、リバースプロキシ、SSRFの脆弱性に対する防御を強化しました
ざっくりまとめるとIMDSv1
については引き続きセキュアではありますが、それに比べて更に4種類の脆弱性に対して新しい保護を追加したのがIMDSv2
のようです。
環境の準備
EC2インスタンスについて、IMDS
に関するパラメータを指定してないで構築すると2023年2月現在。
IMDSv1
とIMDSv2
に両方アクセスできる状態で構築されます。
今回は折角なので、IMDSv2
だけ有効にしたWindows Serverで動作確認してみます。
対象のEC2インスタンスがどのバージョンのIMDS
が実行できるか確認するには、現在の所マネジメントコンソールでは確認するすべはなく、aws-cli
のdescribe-instances
コマンドで確認するしかないようです。
outputのHttpTokens
の所に下記のように記述があります。
なお下記aws-cli
を実行するとInstanceId
とHttpTokens
の一覧を取得できます。
aws ec2 describe-instances --query "Reservations[].Instances[].{InstanceId:InstanceId,HttpTokens:MetadataOptions.HttpTokens}"
今回、下記のようにHttpTokens
がrequired
となるインスタンスを構築してみました。
IMDSv2しか許可されていない環境でIMDSv1にアクセスするとどうなるか
許可されていませんとエラーになりました。
実行環境
- WindowsServer 2019 1809
- PowerShell 5.1.17763.1490
IMDSv2を一括出力してみる
function expand-awsmeta([string]$base , [string]$leaf , $tokenHeader ) {
if ($leaf.EndsWith("/")) {
(Invoke-RestMethod "$base$leaf" -Headers $tokenHeader ) -split "`n" | ForEach-Object { expand-awsmeta "$base$leaf" $_ $tokenHeader}
}
else {
try {
$value = Invoke-RestMethod "$base$leaf" -Headers $tokenHeader
Select-Object @{n = 'uri'; e = { "$base$leaf" } }, @{n = 'value'; e = { $value } } -InputObject ""
}
catch {
# public-keysだけ
# 169.254.169.254/latest/meta-data/public-keys/0/openssh-key といった形なので妥協
Select-Object @{n = 'uri'; e = { "$base" } }, @{n = 'value'; e = { $leaf } } -InputObject ""
}
}
}
$headers = @{ "X-aws-ec2-metadata-token-ttl-seconds" = 21600 }
$token = Invoke-RestMethod http://169.254.169.254/latest/api/token -Method Put -Headers $headers
$tokenHeader = @{ "X-aws-ec2-metadata-token" = $token }
expand-awsmeta "169.254.169.254/latest/" "meta-data/" $tokenHeader
expand-awsmeta "169.254.169.254/latest/" "dynamic/" $tokenHeader
IMDSv2
と特に代わり映えなく一括出力されました。
総評
IMDSv2
のPowerShellでメタデータを一括取得する際の参考になれば幸いです。