Elastic Compute Service (ECS) インスタンスで実行されているアプリケーションは、メタデータサービスを介して、インスタンス ID や IP アドレスなどのインスタンスメタデータを動的にクエリできます。これにより、この情報をハードコーディングすることを回避できます。サーバーサイドリクエストフォージェリ (SSRF) 攻撃によるメタデータの漏洩を防ぐため、セキュリティ強化モードを使用してメタデータにアクセスすることを推奨します。このモードでは、まずアクセストークンを取得する必要があります。インスタンスをこのモードでのみアクセスを許可するように構成することで、通常モードに関連するセキュリティリスクを効果的に軽減できます。
インスタンスメタデータの取得
インスタンスメタデータは、インスタンス ID、ネットワーク環境、アクセス認証情報などの主要なプロパティを含む、インスタンス属性のコレクションです。
方法 1: セキュリティ強化モード (推奨)
セキュリティ強化モードでメタデータにアクセスするには、まず一時的なアクセストークンを取得する必要があります。その後、リクエストにトークンを含めてメタデータを取得できます。
Linux
インスタンスにログオンします。
一時的なトークンを取得します。
TOKEN=`curl -X PUT "http://100.100.100.200/latest/api/token" -H "X-aliyun-ecs-metadata-token-ttl-seconds:21600"`X-aliyun-ecs-metadata-token-ttl-seconds パラメーターは、トークンの生存時間 (TTL) を秒単位で指定します。値の範囲は 1 から 21600 です。
リクエストにトークンを含めてメタデータを取得します。
curl -H "X-aliyun-ecs-metadata-token: $TOKEN" http://100.100.100.200/latest/meta-data/instance-idコマンドの末尾にある
instance-idはインスタンス ID を取得します。これを、取得する必要がある他のメタデータ項目 (MAC アドレスを取得する mac やホスト名を取得する hostname など) に置き換えることができます。コマンドが成功すると、ターミナルにはインスタンス ID 文字列のみが出力されます。例:
i-bp1******。
Windows
インスタンスにログオンします。
一時的なトークンを取得します。
$token = Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://100.100.100.200/latest/api/tokenX-aliyun-ecs-metadata-token-ttl-seconds パラメーターは、トークンの TTL を秒単位で指定します。値の範囲は 1 から 21600 です。
リクエストにトークンを含めてメタデータを取得します。
Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token" = $token} -Method GET -Uri http://100.100.100.200/latest/meta-data/instance-idコマンドの末尾にある
instance-idはインスタンス ID を取得します。これを、取得する必要がある他のメタデータ項目 (MAC アドレスを取得する mac やホスト名を取得する hostname など) に置き換えることができます。コマンドが成功すると、ターミナルにはインスタンス ID 文字列のみが出力されます。例:
i-bp1******。
方法 2: 通常モード
通常モードは安全でないアクセス方法であり、推奨されません。
Linux:
# GET リクエストを送信してインスタンス ID を取得します。 curl http://100.100.100.200/latest/meta-data/instance-idWindows:
# GET リクエストを送信してインスタンス ID を取得します。 Invoke-RestMethod -Uri http://100.100.100.200/latest/meta-data/instance-id -Method Get
セキュリティ強化モードでのみアクセスを有効にする
深刻なセキュリティリスクを防ぐため、ECS インスタンスで [セキュリティ強化モード] を有効にしてください。このモードを有効にすると、セキュリティ強化モードでのみメタデータにアクセスできます。通常モードでメタデータにアクセスしようとすると、403 - Forbidden エラーが返されます。デフォルトでは、ECS インスタンスはトークンなしでのメタデータへのアクセス (通常モード) を許可しており、これは SSRF 攻撃の高いリスクをもたらします。
典型的な攻撃シナリオでは、外部 URL からイメージをダウンロードするなどのアプリケーション機能を悪用します。攻撃者は、サーバーを騙して内部のメタデータサービスに代理でアクセスさせる悪意のあるリクエストを作成できます。これを利用して、インスタンスにアタッチされた RAM ロールの一時的なアクセス認証情報を盗むことができます。ロールに高いレベルの権限がある場合、攻撃者はクラウドリソースを制御したり、Alibaba Cloud アカウント全体を乗っ取ったりする可能性があります。
新しいインスタンスを作成するときにセキュリティ強化モードを有効にする
コンソール
インスタンスを作成する際に、 を [セキュリティ強化モード] に設定します。
カスタムイメージからインスタンスを作成する際に [セキュリティ強化モード] オプションが利用できない場合は、イメージを アップグレード する必要があります。
CLI
RunInstances または CreateInstance 操作を呼び出してインスタンスを作成する際、HttpEndpoint=enabled と HttpTokens=required を設定することで、インスタンスのメタデータアクセスモードをセキュリティ強化モードに設定できます。以下にコマンドの例を示します。
このコマンドは、セキュリティ強化モードでのみ実行される Linux インスタンスを作成します。
aliyun ecs RunInstances \
--region cn-hangzhou \
--RegionId 'cn-hangzhou' \
--ImageId 'aliyun_3_x64_20G_alibase_20250629.vhd' \
--InstanceType 'ecs.g7.large' \
--VSwitchId 'vsw-bp1******trg' \
--SecurityGroupId 'sg-bp1******dgl' \
--SystemDisk.Size 40 \
--SystemDisk.Category cloud_essd \
--HttpEndpoint enabled \
--HttpTokens requiredAPI
RunInstances または CreateInstance 操作を呼び出してインスタンスを作成する際、HttpEndpoint=enabled と HttpTokens=required を設定することで、インスタンスのメタデータアクセスポリシーをセキュリティ強化モードに設定します。
既存のインスタンスをセキュリティ強化モードにアップグレードする
適用性
Windows インスタンス: [セキュリティ強化モード] をサポートしていません。このモードを強制すると、インスタンスの初期化に失敗し、ホスト名の変更や KMS のアクティベーションなどの主要な機能に影響が出ます。
Linux インスタンス: これらのインスタンスはアップグレードをサポートしています。ただし、アップグレードを実行する前に、以下のセクションで説明する依存関係のチェックと変更を完了する必要があります。
ステップ 1: コードと依存関係の確認とアップグレード
[セキュリティ強化モード] に切り替える前に、インスタンスとそれにデプロイされているすべてのアプリケーションは、以下の要件を満たす必要があります。
Cloud-init のバージョンが 23.2.2 以降であることを確認してください。インスタンスにログインし、
cloud-init --versionコマンドを実行して現在のバージョンを確認できます。バージョンが 23.2.2 より前の場合、セキュリティ強化モードに切り替えた後にインスタンスの起動に失敗します。まず、Cloud-init をバージョン 23.2.2 以降にアップグレードする必要があります。すべてのアプリケーションコードとスクリプトは、方法 1: セキュリティ強化モードを使用してインスタンスメタデータにアクセスする必要があります。
重要アプリケーションコードが Credentials ライブラリに依存して SDK 構成用のセキュリティトークンサービス (STS) トークンを取得する場合、Credentials の依存関係をセキュリティ強化モードをサポートするバージョンにアップグレードしてください。
アップグレードが完了したら、ECS インスタンスが通常モードでアクセスされているかどうかを確認します。詳細については、「ECS インスタンスが通常モードでアクセスされているかどうかを検出するにはどうすればよいですか?」をご参照ください。通常モードのアクセスが存在しないことを確認した後、インスタンスの [セキュリティ強化モード] を有効にします。
ステップ 2: セキュリティ強化モードへの切り替え
コンソール
ECS コンソール - インスタンス ページに移動し、リージョンとリソースグループを選択します。
[アクション] 列で、 をクリックします。
[インスタンスメタデータアクセスチャネルを有効にする] スイッチをオンにし、[インスタンスメタデータアクセスモード] を [セキュリティ強化モード] に設定してから、[OK] をクリックします。

CLI
ModifyInstanceMetadataOptions 操作を呼び出し、HttpEndpoint=enabled と HttpTokens=required を設定して、インスタンスのメタデータアクセスモードを [セキュリティ強化モード] に切り替えます。以下にコマンドの例を示します。
aliyun ecs ModifyInstanceMetadataOptions \
--region cn-hangzhou \
--RegionId 'cn-hangzhou' \
--InstanceId 'i-bp1******ke' \
--HttpEndpoint enabled \
--HttpTokens requiredAPI
ModifyInstanceMetadataOptions 操作を呼び出し、HttpEndpoint=enabled と HttpTokens=required を設定して、インスタンスのメタデータアクセスモードを [セキュリティ強化モード] に切り替えます。
モードを切り替えた後、インスタンスのメタデータアクセスとアプリケーションのステータスを継続的に監視して、業務継続性を確保します。これにより、変更されていないアプリケーションによるサービスの中断を防ぐことができます。問題が発生した場合は、[通常モードとセキュリティ強化モード] に切り替えて、サービスの回復を優先します。その後、ステップ 1: コードと依存関係の確認とアップグレードを再度実行します。
インスタンスメタデータの詳細
インスタンスメタデータは、レベルごとにアクセスできるディレクトリのような階層構造に編成されています。メタデータディレクトリにアクセスすると、次のレベルのメタデータエントリまたはサブディレクトリが返されます。たとえば、meta-data/instance/ にアクセスすると、instance-name や instance-type などの情報が返されます。
カテゴリ | メタデータ | 説明 | 例 |
基本的なインスタンス情報 |
| インスタンス ID。 |
|
| インスタンス名。 |
| |
| インスタンスのホスト名。 |
| |
| インスタンスタイプ。 |
| |
| インスタンスのシリアル番号。 |
| |
| インスタンスが存在するリージョンの ID。 |
| |
| インスタンスが存在するゾーン。 |
| |
| インスタンス所有者の Alibaba Cloud アカウント ID。 |
| |
| インスタンスの指定されたタグの値を取得します。 この機能を使用するには、ModifyInstanceMetadataOptions 操作を呼び出し、 |
| |
イメージ情報 |
| インスタンスの作成に使用されたイメージの ID。 |
|
| Alibaba Cloud Marketplace イメージのプロダクトコード。 |
| |
| Alibaba Cloud Marketplace イメージの課金方法。 |
| |
| Linux インスタンスのパッケージマネージャが更新を取得するために使用する、yum や apt ソースなどのイメージリポジトリアドレス。 |
| |
基本的なネットワーク構成 |
| ネットワークタイプ。 VPC タイプのインスタンスのみがサポートされます。 |
|
| インスタンスが存在する VPC の ID。 |
| |
| インスタンスが存在する VPC の CIDR ブロック。 |
| |
| インスタンスが存在する vSwitch の ID。 |
| |
| インスタンスが存在する vSwitch の CIDR ブロック。 |
| |
| インスタンスタイプの最大アウトバウンド内部帯域幅。単位: Kbit/s。 |
| |
| インスタンスの DNS 構成。 |
| |
| NTP サーバーアドレス。 |
| |
プライマリ ENI の IP アドレス |
| インスタンスの MAC アドレス。 インスタンスに複数の NIC がある場合、eth0 の MAC アドレスのみが表示されます。 |
|
| インスタンスのプライマリ ENI のプライベート IPv4 アドレス。 |
| |
| インスタンスのプライマリ ENI のパブリック IPv4 アドレス。 |
| |
| インスタンスの静的パブリック IPv4 アドレス、またはプライマリ ENI にアタッチされている EIP。 |
| |
Elastic Network Interface の詳細 |
| ENI の ID。 [mac] パラメーターをインスタンスの MAC アドレスに置き換えます。 MAC アドレスは、mac メタデータ項目から取得できます。 以下の項目についても同様です。 |
|
| ENI が存在する VPC の ID。 |
| |
| ENI が存在する vSwitch の ID。 |
| |
| ENI のプライマリプライベート IP アドレス。 |
| |
| ENI に割り当てられているプライベート IPv4 アドレスのリスト。 |
| |
| ENI に割り当てられているプライベート IPv4 プレフィックスのリスト。 |
| |
| ENI のサブネットマスク。 |
| |
| ENI の IPv4 ゲートウェイアドレス。 |
| |
| ENI が存在する vSwitch の IPv4 CIDR ブロック。 |
| |
| ENI が存在する VPC の IPv4 CIDR ブロック。 |
| |
| ENI に割り当てられている IPv6 アドレスのリスト。 このパラメーターは、IPv6 が構成されている VPC タイプのインスタンスでのみサポートされます。 |
| |
| ENI に割り当てられている IPv6 プレフィックスのリスト。 |
| |
| ENI が存在する VPC の IPv6 ゲートウェイアドレス。 |
| |
| ENI が存在する vSwitch の IPv6 CIDR ブロック。 このパラメーターは、IPv6 が構成されている VPC タイプのインスタンスでのみサポートされます。 |
| |
| ENI が存在する VPC の IPv6 CIDR ブロック。 このパラメーターは、IPv6 が構成されている VPC タイプのインスタンスでのみサポートされます。 |
| |
ディスク情報 |
| ディスクのシリアル番号。 |
|
| ディスク ID。 |
| |
| ディスク名。 |
| |
セキュリティと認証情報 |
| 公開鍵。 このパラメーターは、インスタンスの起動時に公開鍵が提供された場合にのみ使用できます。 |
|
| インスタンスに関連付けられている RAM ロールの一時的なセキュリティ認証情報。 [role-name] を RAM ロールの名前に置き換えます。 認証情報は、Expiration フィールドで指定された時刻に有効期限が切れます。 新しい認証情報を取得するには、操作を再度呼び出す必要があります。 | | |
高度なインスタンス属性 |
| ECS 仮想化ソリューション。 Virt 1.0 と Virt 2.0 がサポートされています。 |
|
| 内部ビルド番号。 |
| |
| プリエンプティブルインスタンスに対してオペレーティングシステムによって設定された停止およびリリース時間。 時刻は UTC+0 で、フォーマットは yyyy-MM-ddThh:mm:ssZ です。 |
| |
Windows 固有の構成 |
| Windows インスタンス用の KMS アクティベーションサーバー。 |
|
| Windows インスタンス用の更新サーバー。 |
| |
| Windows インスタンス用の更新ステータス監視サーバー。 |
|
よくある質問
SSRF 攻撃とは何ですか。また、セキュリティ強化モードはどのようにして SSRF 攻撃から防御しますか。
SSRF は、攻撃者がサーバーをだまして不正なネットワークリクエストを行わせるセキュリティの脆弱性です。これは、メタデータサービスやデータベースなどの保護された内部システムにアクセスするために使用される可能性があります。たとえば、攻撃者は
http://100.100.100.200/latest/meta-data/を含む URL を送信して、アプリケーションをだましてメタデータから機密情報を取得して返させることができます。これにより、データ侵害が発生します。デフォルトでは、ECS インスタンスはメタデータへのトークンなしのアクセス (通常モード) を許可します。セキュリティ強化モードを有効にすると、トークン検証メカニズムが強制されます。クライアントは、まず PUT リクエストを送信して一時的なトークンを取得し、その後、後続の GET リクエストにそのトークンを含める必要があります。SSRF 攻撃は PUT リクエストを簡単に開始できないため、トークンを取得できません。これにより、アクセスが効果的にブロックされ、メタデータのセキュリティが向上します。
セキュリティ強化モードでコマンドを使用してインスタンスメタデータにアクセスできません。どうすれば修正できますか。
以下のコマンドエラーが一般的です:
インスタンスメタデータアクセス資格情報の TTL が範囲外です (400 - Missing or Invalid Parameters)
インスタンスメタデータアクセス資格情報の TTL は 1~21,600 秒です。値がこの制限を超えると、400 - Missing or Invalid Parameters エラーが返されます。
curl -X PUT "http://100.100.100.200/latest/api/token" -H "X-aliyun-ecs-metadata-token-ttl-seconds: 21700"リクエストに X-Forwarded-For ヘッダーが含まれています (403 - Forbidden)
curl -X PUT "http://100.100.100.200/latest/api/token" -H "X-Forwarded-For: www.ba****.com"指定されたインスタンスメタデータアクセス資格情報が無効です (401 - Unauthorized)
curl -H "X-aliyun-ecs-metadata-token: aaa" -v http://100.100.100.200/latest/meta-data/
メタデータサービスへの高頻度のアクセスがスロットリングされた場合はどうすればよいですか。
メタデータサービスにはアクセス頻度の制限があります。ベストプラクティスは、instance-id など、ほとんど変更されないメタデータ項目をアプリケーションの起動時に一度取得することです。その後、それらをローカルメモリまたはファイルに、妥当な生存時間でキャッシュします。
インスタンスメタデータのアクセスモードをセキュリティ強化モードに変更した後、アプリケーションが動作しなくなりました。この問題をトラブルシューティングするにはどうすればよいですか。
インスタンス上のアプリケーションまたはスクリプトがまだ通常モードを使用している可能性があります。「既存のインスタンスをセキュリティ強化モードにアップグレードする」の手順に従って、通常モードを使用するアプリケーションを確認し、アップグレードしてください。
ローカルホストからメタデータアドレスにアクセスできますか。
いいえ、できません。アドレス
100.100.100.200は、ECS インスタンス内からその仮想ネットワークインターフェースを介してのみ到達可能なリンクローカルアドレスです。インスタンスの外部からこのアドレスに送信されたリクエストはルーティングできません。これは、メタデータのセキュリティを確保するための基本的な設計原則です。カスタムイメージからインスタンスを作成するときにセキュリティ強化モードを選択できない場合はどうすればよいですか。
カスタム Linux イメージから ECS インスタンスを作成するときに、[セキュリティ強化モード] を選択または有効にできない場合があります。これは通常、イメージがこのセキュリティ機能の要件を満たしていないことを意味します。この問題を解決するには、次のようにイメージをアップグレードします:
一時インスタンスの作成: アップグレードしたいカスタムイメージを使用して、診断と変更のための一時的な ECS インスタンスを作成します。
一時インスタンスの変更: ステップ 1 で作成した一時インスタンスで、次の変更を実行します。詳細については、「既存のインスタンスをセキュリティ強化モードにアップグレードする」をご参照ください。
Cloud-init のアップグレード: Cloud-init をバージョン 23.2.2 以降にアップグレードします。
アプリケーションとスクリプトの変更: 通常モードを使用するすべてのアプリケーションまたはスクリプトを変更して、セキュリティ強化モードに適応させます。
新しいイメージの作成と属性の変更: 変更が完了したら、インスタンスから新しいカスタムイメージを作成します。次に、ModifyImageAttribute 操作を呼び出して、イメージの
Features.ImdsSupport属性を `v2` に設定します。リソースのリリース: 新しいイメージが作成されたら、コストを節約するために一時インスタンスを速やかにリリースします。
どのバージョンの Credentials ツールがセキュリティ強化モードをサポートしていますか。
以前のバージョンの Credentials は、セキュリティ強化モードでのメタデータへのアクセスをサポートしていません。セキュリティ強化モードに切り替えると、これらのバージョンは通常モードでメタデータから STS トークンを取得して SDK を初期化することができません。これにより、サービスが中断されます。
モードを切り替える前に、Credentials の依存関係をセキュリティ強化モードをサポートするバージョンにアップグレードしてください。バージョンの要件は次のとおりです:
Java: credentials-java バージョン >=
0.3.10。Node.js: credentials バージョン >=
2.3.1。PHP: credentials バージョン >=
1.2.0。Python: alibabacloud_credentials バージョン >=
0.3.6。Go: credentials-go バージョン >=
1.3.10。
ECS インスタンスが通常モードでアクセスされているかどうかを検出するにはどうすればよいですか。
通常モードを使用するインスタンス上のアプリケーションコードを確認する場合、次の方法を使用して特定のプロセスを検出し、特定することができます。これは、必要なアップグレードを実行するのに役立ちます。
方法 1: CloudMonitor を使用して通常モードのアクセスを確認する
CloudMonitor コンソールで ECS メタデータのモニタリングデータを確認して、インスタンスが最近通常モードでアクセスされたかどうかを迅速に確認できます。
CloudMonitor コンソールにログインします。
左側のナビゲーションウィンドウで、 を選択します。次に、[ECS メタデータ] モニタリングページを検索して移動します。
対象インスタンスの [通常モードでのアクセス成功] メトリックを表示します。
このメトリックの値が 0 でない場合、インスタンスは通常モードでアクセスされています。このモードを使用するアプリケーションを見つけて、セキュリティ強化モードを使用するようにアップグレードする必要があります。
方法 2: クラウドアシスタントプラグインを使用して特定のプロセスを特定する
クラウドアシスタントプラグインを使用して、インスタンス内で通常モードを使用してメタデータにアクセスしているプロセスを正確に特定できます。
サポートされているオペレーティングシステム
Alibaba Cloud Linux 3
Alibaba Cloud Linux 3 Pro
Anolis OS 8
CentOS Stream 8/9
CentOS 8
Ubuntu: 20/24
Debian:10,11,12
Fedora 35+
AlmaLinux 8/9
Rocky Linux 8/9
Red Hat Enterprise Linux 8/9
Red Hat の場合、RPM パッケージをダウンロードして「クラウドアシスタントクライアントのインストール」を行う必要があります。
SUSE 15.1/15.2/15.3/15.4/15.5/15.6
OpenSuse 15.2/15.3/15.4/15.5/15.6
プロシージャ
クラウドアシスタントプラグインのインストールと有効化
ECS インスタンスにログインし、次のコマンドを実行してモニタリングサービスをインストールして開始します。このサービスを有効にすると、インスタンスリソースが消費されます。
# モニタリングサービスをデプロイします。 sudo acs-plugin-manager --exec --plugin ACS-ECS-ImdsPacketAnalyzer # モニタリングサービスのステータスを確認します。 sudo systemctl status imds_tracer_tool
問題のあるプロセスの特定 コマンドを実行して、どのプロセスがまだ通常モードでメタデータにアクセスしているかを確認します。ログには、関連するプロセスのプロセス ID (PID) が表示されます。
cat /var/log/imds/imds-trace.* | grep WARNING
分析と変更 ログの PID に基づいて、対応するアプリケーションまたはスクリプトを見つけ、セキュリティ強化モードでメタデータにアクセスするようにアップグレードします。