0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

EC2インスタンスのメタデータ(IMDSv2)をPowerShellで一括出力してみる

Posted at

以前、EC2インスタンスのメタデータ(IMDSv1)をPowerShellで一括出力してみるの記事にて、IMDCSv1からメタデータを一括出力する方法を紹介しました。

本記事では、IMDSv2で同様にメタデータを一括出力する方法を説明します。

そもそもIMDSv2って?

IMDSv2 の使用

IMDSInstance Metadata Serviceの略称となり。
EC2インスタンスのメタデータサービスを取り扱うサービスとなり、このv2がIMDSv2となります。

IMDSv2が出てきた経緯については、下記AWSブログに記載があります。

Add defense in depth against open firewalls, reverse proxies, and SSRF vulnerabilities with enhancements to the EC2 Instance Metadata Service

AWSジャパンのブログにも日本語訳での投稿があります。

EC2 インスタンスメタデータサービスの拡張により、オープンなファイアウォール、リバースプロキシ、SSRFの脆弱性に対する防御を強化しました

ざっくりまとめるとIMDSv1については引き続きセキュアではありますが、それに比べて更に4種類の脆弱性に対して新しい保護を追加したのがIMDSv2のようです。

環境の準備

EC2インスタンスについて、IMDSに関するパラメータを指定してないで構築すると2023年2月現在。
IMDSv1IMDSv2に両方アクセスできる状態で構築されます。

今回は折角なので、IMDSv2だけ有効にしたWindows Serverで動作確認してみます。

対象のEC2インスタンスがどのバージョンのIMDSが実行できるか確認するには、現在の所マネジメントコンソールでは確認するすべはなく、aws-clidescribe-instancesコマンドで確認するしかないようです。

describe-instances

outputのHttpTokensの所に下記のように記述があります。

image.png

なお下記aws-cliを実行するとInstanceIdHttpTokensの一覧を取得できます。

aws ec2 describe-instances --query "Reservations[].Instances[].{InstanceId:InstanceId,HttpTokens:MetadataOptions.HttpTokens}"

今回、下記のようにHttpTokensrequiredとなるインスタンスを構築してみました。

image.png

IMDSv2しか許可されていない環境でIMDSv1にアクセスするとどうなるか

image.png

許可されていませんとエラーになりました。

実行環境

  • 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と特に代わり映えなく一括出力されました。

image.png

総評

IMDSv2のPowerShellでメタデータを一括取得する際の参考になれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?