Metadata v2 を使用する

Prev Next

VPC環境で利用できます。

概要

Metadata v1の SSRF脆弱性を補うために、Metadata v2方式の呼び出し方式を使用できます。

  • Metadata v1 - リクエスト/レスポンス方式
  • Metadata v2 - セッション指向方式

サーバインスタンスの設定によって v1、v2方式をすべて使用するか、v2方式のみを使用するように変更できます。

Metadata v1 のセキュリティ脆弱性

Metada v1方式を使用可能なサーバインスタンスでサービスを運用したり、ソフトウェアを駆動する場合、
meta data(serverorrole data)の露出を防ぐための追加措置や注意が必要になることがあります。
もし運用中のサービスに SSRF脆弱性が存在し、これを認知していない場合、外部からサーバインスタンスの Metadata APIを呼び出して
meta dataを取得できます。
このようなセキュリティ脆弱性をブロックするためには、サーバインスタンスの Metadataバージョン設定を v2のみ使用できるように変更する必要があります。
Metadata v2方式は PUTメソッドを通じてトークンを発行し、Metadata API呼び出しに対してトークン認証を行い、
SSRF脆弱性による meta dataの露出を保護できます。

サーバインスタンスの Metadataバージョン設定

サーバインスタンス作成後、コンソールによる設定変更のみ可能です。

  1. サーバコンソールへアクセス [Services > Compute > Server]
  2. [サーバ管理および設定変更 > Metadata API管理] メニューを通じてバージョンを選択
  • v1および v2
    • v1、v2バージョンすべて使用可能
    • Metadata API呼び出し時、トークンヘッダ伝達有無によって v1、v2方式を区分
    • トークンヘッダを入力しない場合、認証手続きなしでリクエストを実行
    • トークンヘッダ入力時に伝達されたヘッダ値の認証を含めてリクエストを実行
  • v2(トークン必須)
    • v2バージョンのみ使用可能
    • Metadata API呼び出し時にトークンヘッダ値を必ず入力

  • Header
    • X-NCP-METADATA-TOKEN-TTL-SECONDS: トークン発行時のセッション期間(秒)を設定するためのヘッダ(1~21600秒)
    • X-NCP-METADATA-TOKEN: Metadata API呼び出し時に発行されたトークンを伝達するためのヘッダ

別途コマンド

[roor@test-server ~]# TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-NCP-METADATA-TOKEN-TTL-SECONDS: 21600"`
[root@test-server ~]# curl -H "X-NCP-METADATA-TOKEN: $TOKEN" http://169.254.169.254/latest/meta-data

結合コマンド

[root@test-server ~]# TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-NCP-METADATA-TOKEN-TTL-SECONDS: 21600"` \
&& curl -H "X-NCP-METADATA-TOKEN: $TOKEN" http://169.254.169.254/latest/meta-data


参考
トークンが正常に発行されていない場合、エラーメッセージが変数に保存されることがあります。
この場合、Metadata API呼び出しが正常に動作しません。

認証のエラーレスポンス

[root@test-server ~]# curl -H "X-NCP-METADATA-TOKEN: wrong-token" -i http://169.254.169.254/latest/meta-data
HTTP/1.1 401 401
Date: Tue, 11 Apr 2023 02:42:02 GMT
Server: Apache
Referrer-Policy: unsafe-url
Connection: close
Transfer-Encoding: chunked
Content-Type: text/plain;charset=UTF-8

Unauthorized.
[root@test-server ~]#