メタデータV2を使う理由
2019年7月29、米金融大手のCapital Oneにて不正アクセスにより、1億人以上の個人情報が漏洩。
AWS管理コンソールからもAPIからもメタデータV2を有効することができますが、ここでCLIやCFnを使ってメタデータV2だけを有効する方法を紹介します。
CLIでEC2を起動する時、メタデータV2だけを有効する方法
aws ec2 run-instances
--image-id ami-0abcdef1234567890
--instance-type c3.large
...
--metadata-options "HttpEndpoint=disabled"
既存インスタンスCLIでメタデータV2だけを有効に変更する方法
コマンド:
aws ec2 modify-instance-metadata-options \
--instance-id i-1234567898abcdef0 \
--http-tokens required \
--http-endpoint enabled
例:
#インスタンスIDの取得
INSTANCE_ID=$(curl http://169.254.169.254/latest/meta-data/instance-id)
#メタデータV2だけの有効
aws ec2 modify-instance-metadata-options \
--instance-id $INSTANCE_ID \
--http-tokens required \
--http-put-response-hop-limit 1 \
--http-endpoint enabled
#実行結果
{
"InstanceId": "i-064c12df5219b073a",
"InstanceMetadataOptions": {
"State": "pending",
"HttpTokens": "required",
"HttpPutResponseHopLimit": 1,
"HttpEndpoint": "enabled"
}
}
CloudFormationを使ってLaunchTemplateでEC2を起動する場合
構文
HttpEndpoint: String
HttpPutResponseHopLimit: Integer
HttpTokens: String
例:(インスタンスのメタデータV2だけを有効する)
HttpEndpoint: enabled
HttpPutResponseHopLimit: 1
HttpTokens: required
公式から抜粋
インスタンスメタデータリクエストのトークンの使用状況。パラメータがリクエストで指定されていない場合、デフォルトの状態は optional です。
状態が optional の場合、リクエストの署名付きトークンヘッダーの有無にかかわらず、インスタンスメタデータを取得するように選択できます。トークンを使用せずに IAM ロールの認証情報を取得すると、バージョン 1.0 のロール認証情報が返されます。有効な署名付きトークンを使用して IAM ロールの認証情報を取得すると、バージョン 2.0 のロール認証情報が返されます。
状態が required の場合、インスタンスメタデータ取得リクエストとともに署名付きトークンヘッダーを送信する必要があります。この状態では、IAM ロールの認証情報を取得すると、常にバージョン 2.0 の認証情報が返されます。バージョン 1.0 の認証情報は利用できません。
参考
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html