従来のマシンツーマシン (M2M) 通信は、有効期間の長い client_secret 値に依存しており、ハードコーディングされた認証情報の漏洩、キーのローテーションの困難さ、粗い粒度の権限などのセキュリティリスクをもたらします。これらのリスクを解消するため、このソリューションでは Elastic Compute Service (ECS) インスタンスの PKCS#7 アイデンティティ署名を動的なフェデレーション認証情報として使用します。EIAM Cloud Identity Service (IDaaS) は署名を検証し、それを有効期間の短いアクセストークンと交換します。その後、このアクセストークンを Resource Access Management (RAM) に提示して Security Token Service (STS) トークンを取得します。このアプローチにより、ECS インスタンス上に静的キーを保存する必要がなくなります。
前提条件
-
IDaaS インスタンス:M2M 管理が有効になっており、Apps Remaining の数が 2 以上であること。このソリューションでは、2 つの新しい M2M アプリケーションが必要です。
-
ネットワーク環境:ECS インスタンスが IDaaS インスタンスのパブリックエンドポイント (
https://<Instance ID>.aliyunidaas.com) にアクセスできる必要があります。 -
アカウント権限:Alibaba Cloud アカウント (root ユーザー) または RAM 管理者権限が必要です。
背景情報
従来、マシンツーマシン (M2M) アプリケーションは、ID プロバイダー (IdP) からアクセストークンをリクエストするために client_id と client_secret を必要とします。しかし、client_secret は有効期間の長い静的認証情報であり、次のようなセキュリティリスクをもたらします。
-
漏洩リスク:キーはコード、設定ファイル、または環境変数にハードコーディングされることが多く、ソースコードの漏洩やログレコードを通じて漏洩する可能性があります。
-
ローテーションの困難さ:キーを手動でローテーションするのは複雑なプロセスであり、サービスの中断を引き起こす可能性があります。
-
粗い粒度のアクセス制御:特定の物理インスタンスにきめ細かなアクセス制御を適用することは困難です。
このソリューションでは、Alibaba Cloud ECS インスタンスのインスタンスアイデンティティ (PKCS#7 署名形式) をフェデレーション認証情報として使用します。ランタイムに、ECS インスタンスは自身の ID 情報を含む署名を動的に取得します。IDaaS は、事前に信頼された Alibaba Cloud のルート証明書を使用して署名の信頼性を検証します。このプロセスにより、ECS インスタンス上に静的キーを保存する必要がなくなり、パスワードレスアクセスによるセキュリティ強化が実現します。
ソリューションアーキテクチャ
このソリューションは、ECS、EIAM、および RAM を統合し、OpenID Connect (OIDC) プロトコルを使用してパスワードレス認証のための信頼チェーンを確立します。
主要なワークフロー
-
インスタンスアイデンティティ署名の取得:ECS インスタンス上のアプリケーションは、ECS メタデータサービスから PKCS#7 形式のインスタンスアイデンティティ署名をリクエストします。この署名にはインスタンスの ID 情報が含まれており、Alibaba Cloud の公式ルート証明書によって発行されるため、信頼性があり偽造不可能です。
-
署名と EIAM アクセストークンの交換:アプリケーションは、この PKCS#7 署名をクライアントアサーション (
client_assertion) として EIAM トークンエンドポイントに送信し、アクセストークンをリクエストします。EIAM は、Alibaba Cloud のルート証明書を信頼するよう事前に設定されたフェデレーション認証情報プロバイダーを使用して、署名の信頼性を検証します。検証が完了すると、EIAM は特定の M2M アプリケーションに対して有効期間の短いアクセストークンを発行します。 -
アクセストークンと RAM STS トークンの交換:アプリケーションは RAM の
AssumeRoleWithOIDCAPI オペレーションを呼び出し、前のステップで取得した EIAM アクセストークンを渡します。RAM は、事前に設定された OIDC ID プロバイダーを使用してこのアクセストークンを検証し、そのクレームが信頼ポリシーで定義された条件を満たしているかどうかを確認します。 -
Alibaba Cloud リソースへのアクセス:検証に成功すると、RAM は
AccessKeyId、AccessKeySecret、およびSecurityTokenを含む有効期間の短い STS トークンを発行します。アプリケーションは、この STS トークンを使用して他の Alibaba Cloud サービス API を安全に呼び出します。
主要コンポーネントの役割
-
ECS:インスタンスアイデンティティ署名を動的に生成する、信頼できるコンピューティング環境として機能します。
-
EIAM Cloud Identity Service (IDaaS):フェデレーション ID プロバイダーとして機能します。
-
M2M クライアントアプリケーション:ECS インスタンス上のアプリケーションを表し、認証リクエストを開始します。
-
M2M サーバーアプリケーション:OIDC プロバイダーとして機能し、RAM に発行されるアクセストークンのオーディエンスとスコープを定義します。
-
-
RAM:サービスプロバイダーとして機能し、EIAM との OIDC 信頼を確立し、信頼ポリシーに基づいて最終的な STS トークンを発行します。
ステップ 1:フェデレーション認証情報プロバイダーと M2M アプリケーションの設定
このステップでは、EIAM でフェデレーション認証情報プロバイダーと 2 つの M2M アプリケーションを作成します。このプロセスにより、ECS インスタンスアイデンティティの信頼を確立し、OIDC フェデレーションの準備をします。
PKCS#7 フェデレーション認証情報プロバイダーの作成
EIAM はこのフェデレーション認証情報プロバイダーを使用して、ECS インスタンスからの PKCS#7 アイデンティティ署名を検証します。
-
IDaaS コンソールにログインし、上部で対象のリージョンに切り替えます。左側のナビゲーションウィンドウで、EIAM を選択します。
-
ページの右側で対象の EIAM インスタンスを見つけ、Actions 列で Console をクリックして管理コンソールを開きます。
-
EIAM インスタンス管理コンソールの左側のナビゲーションウィンドウで、Sign-In をクリックし、 を選択します。
-
表示されるパネルで [PKCS#7] を選択し、Next をクリックします。次のパラメーターを設定し、Confirm をクリックします。詳細については、「フェデレーション認証情報プロバイダー管理」をご参照ください。
パラメーター
説明
設定例
Federated Credential Provider
Federated Credential Provider をカスタマイズします。
test-ecs-credential-source
Trust Source
Alibaba Cloud を選択します。
Alibaba Cloud
Fill in Verification Certificate
Obtain Cloud Certificate をクリックして、[検証証明書] と Account ID フィールドに自動的に入力します。
-
M2M クライアントアプリケーションの作成
このアプリケーションは、ECS インスタンス上のビジネスアプリケーションを表し、認証リクエストを開始します。
-
EIAM インスタンス管理コンソールの左側のナビゲーションウィンドウで、 を選択します。
-
Add Application をクリックし、Application Name を「M2M Client」に設定し、Add をクリックします。
-
Client Permission Management タブで、Custom Permissions スイッチをオンにします。
-
General タブで、 を選択します。次のパラメーターを設定し、Confirm をクリックします。詳細については、「フェデレーション認証情報の作成」をご参照ください。
パラメーター
説明
設定例
Federated Credential Provider
前のステップで作成した Federated Credential Provider を選択します。
test-ecs-credential-source
Application Federated Credential Name
Application Federated Credential Name をカスタマイズします。
test-ecs-credential
Verification
Cloud Serverを選択します。
Cloud Server
Instance ID
既存の ECS インスタンスのインスタンス ID を指定します。右側にある
アイコンをクリックして、複数のインスタンス ID を追加できます。i-bp1******wfkx
M2M サーバーアプリケーションの作成
このアプリケーションは OIDC プロバイダーとして、RAM に発行されるアクセストークンのオーディエンス (aud) とスコープ (scope) を定義します。
-
EIAM インスタンス管理コンソールの左側のナビゲーションウィンドウで、 を選択します。
-
Add Application をクリックし、Application Name を「M2M Server」に設定し、Add をクリックします。
-
Server Permission Control タブの Authorized application で、Server Permission Control スイッチをオンにします。表示されるパネルで、ResourceServer Identifier を設定し、Confirm をクリックします。
説明ResourceServer Identifier を
cloud:idaas:sts:alibabacloud:<account-id>に設定することを推奨します。<account-id>をご利用の Alibaba Cloud アカウント ID に置き換えてください。 -
を選択し、次のパラメーターを設定して、Confirm をクリックします。
-
Scope Name:カスタムのスコープ名を入力します。例:
assume-role -
Scope Value:カスタムのスコープ値。これを
role:assumeに設定することを推奨します。
-
-
Authorized Applications で、M2M Client スイッチを有効にし、Permission リストで前のステップで追加した権限 (例:
assume-role) を選択し、Confirm をクリックします。
ステップ 2:RAM での IDaaS の信頼確立
OIDC ID プロバイダーと、このプロバイダーを信頼する RAM ロールを作成します。
OIDC ID プロバイダーの作成
-
RAM コンソールで、ID プロバイダーページに移動し、[OIDC] タブを選択して、[IdP の作成] をクリックします。
-
[IdP の作成] ページで、次のパラメーターを設定し、[IdP の作成] をクリックします。詳細については、「OIDC ID プロバイダーの管理」をご参照ください。
パラメーター
説明
値の例
IdP 名
ご利用の Alibaba Cloud アカウント内で一意である必要があります。
test-oidc-provider
発行者 URL
M2M サーバーアプリケーションの詳細ページで、 セクションから [発行者] の URL をコピーします。
https://8******n.aliyunidaas.com/api/v2/iauths_system/oauth2
指紋
[発行者 URL] を入力した後、[指紋の取得] をクリックします。Alibaba Cloud が自動的に指紋を計算して表示します。
-
クライアント ID
M2M サーバーアプリケーションの詳細ページで、 セクションから ResourceServer Identifier の値をコピーします。
cloud:idaas:sts:alibabacloud:13******76
RAM ロールの作成
-
RAM コンソールの [ロール] ページに移動し、[ロールの作成] をクリックします。詳細については、「OIDC ID プロバイダーの RAM ロールを作成する」をご参照ください。
-
[ロールの作成] ページの右上隅にある [ポリシーエディターに切り替え] をクリックし、[ビジュアルエディター] を選択します。
-
[プリンシパル] を設定します。
-
[ID プロバイダー] を選択します。
-
[ID プロバイダー] の下にある [編集] をクリックします。[プリンシパルの追加] パネルで、[ID プロバイダータイプ] を [OIDC] に、[ID プロバイダー] を前のステップで作成したプロバイダー (例:
test-oidc-provider) に設定し、[OK] をクリックします。
-
-
条件 を設定します。
[条件の追加] をクリックし、[キー] を
oidc:subに、[演算子] をStringEqualsに、[値] を M2M クライアントアプリケーションの client_id に設定し、[OK] をクリックします。説明M2M クライアントアプリケーションの詳細ページで、client_id は の下にあります。
-
ページ下部の [OK] をクリックします。次に、[ロール名] を設定し、[OK] をクリックします。
-
ロールの詳細ページで、 をクリックします。必要に応じて [ポリシー] を設定し (例:
AliyunOSSReadOnlyAccess)、[OK] をクリックします。
ステップ 3:IDaaS アクセストークンの取得
ECS インスタンスでスクリプトを実行してインスタンスアイデンティティ署名を取得し、それを IDaaS アクセストークンと交換します。
ECS インスタンスアイデンティティ署名の取得
この例では Linux オペレーティングシステムを使用します。
-
ECS インスタンスにログインします。詳細については、「ECS インスタンスへの接続方法の選択」をご参照ください。
-
サーバーターミナルで次のスクリプトを実行します。スクリプトの出力は ECS インスタンスアイデンティティ署名です。詳細については、「インスタンスアイデンティティドキュメントまたは署名の取得」をご参照ください。
# <IDaaS Instance ID> をご利用の IDaaS インスタンス ID (例: idaas_xxx) に置き換えます IDAAS_INSTANCE_ID="<IDaaS Instance ID>" # 1. ECS アクセス認証情報を取得します。有効期間を設定します。X-Forwarded-For ヘッダーは含めません。 TOKEN=$(curl -s -X PUT "http://100.100.100.200/latest/api/token" -H "X-aliyun-ecs-metadata-token-ttl-seconds:1200") # 2. 完全な URL を構築します。注意: audience パラメーターの値は URL エンコードされた JSON 文字列です。 # 現在の UNIX タイムスタンプを秒単位で取得します。 SIGNING_TIME=$(date +%s) URL="http://100.100.100.200/latest/dynamic/instance-identity/pkcs7?audience=%7B%22aud%22%3A%22$IDAAS_INSTANCE_ID%22%2C%22signingTime%22%3A$SIGNING_TIME%7D" # 3. ECS インスタンスアイデンティティ署名を取得します。 curl -s -w '\n' -H "X-aliyun-ecs-metadata-token: $TOKEN" "$URL"audience パラメーター値の生成:
ECS インスタンスアイデンティティ署名を取得する際、リクエストには
audienceフィールドを含める必要があります。その値は次のように生成します。-
audienceパラメーターの元のコンテンツを JSON 文字列として構築します。各フィールドの説明は次のとおりです。-
aud:IDaaS インスタンス ID である必要があります。 -
signingTime:署名が生成されたときの UNIX タイムスタンプ (秒単位)。
# URI エンコード前 (JSON 文字列) {"aud":"idaas_xxx","signingTime":1750131608} -
-
JSON 文字列を URI エンコードします。エンコードされた結果が
audienceパラメーターの最終的な値になります。# URI エンコード後 (audience パラメーターの値として) %7B%22aud%22%3A%22idaas_xxx%22%2C%22signingTime%22%3A1750131608%7D
-
M2M アクセストークンの取得
次のスクリプトで変数とパラメーターを設定し、サーバーターミナルで実行します。詳細については、「PKCS#7 署名認証」をご参照ください。
curl -s --request POST \
--url '<M2M クライアントアプリケーションのトークンエンドポイント>' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode 'client_id=app_xxx' \
--data-urlencode 'client_assertion_type=urn:cloud:idaas:params:oauth:client-assertion-type:pkcs7-bearer' \
--data-urlencode 'client_assertion=xxx' \
--data-urlencode 'scope=xxx|xxx' \
--data-urlencode 'application_federated_credential_name=xxx'
-
<M2M クライアントアプリケーションの Token Endpoint>
M2M クライアントアプリケーションの詳細ページに移動します。Token Endpoint URL は の下にあります。例:
https://8******n.aliyunidaas.com/api/v2/iauths_system/oauth2/token -
リクエストパラメーター
パラメーター
説明
grant_type
client_credentialsである必要があります。client_id
M2M クライアントアプリケーションのIDです。例:
app_nfb******dzq。M2M クライアントアプリケーションの詳細ページに移動します。ID は にあります。
client_assertion_type
urn:cloud:idaas:params:oauth:client-assertion-type:pkcs7-bearerである必要があります。client_assertion
前のステップで取得したECS インスタンスアイデンティティ署名です。
scope
フォーマット:
ResourceServer Identifier (<a baseurl="t3202873_v1_0_0.xdita" data-node="6289826" data-root="56554" data-tag="xref" href="#792e950861jt0" id="153a2d2a14qi7">M2M サーバーアプリケーション</a>の)|Scope Value (M2M サーバーアプリケーションの)。例:
cloud:idaas:sts:alibabacloud:62******39|role:assume。application_federated_credential_name
M2M クライアントアプリケーションのApplication Federated Credential Nameです。例:
test-ecs-credential。 -
レスポンス
{ "token_type": "Bearer", "access_token": "eyJraQ******E13GvA", "expires_in": 3600, "expires_at": 1766063256 }パラメーター
説明
token_type
Bearerである必要があります。access_token
IDaaS によって発行されたアクセストークン。アプリケーションはこのトークンを使用して RAM から STS トークンを取得できます。
expires_in
access_tokenの有効期間 (秒単位)。expires_at
access_tokenの有効期限 (UNIX タイムスタンプ、秒単位)。
ステップ 4:RAM STS トークンの取得
-
RAM API オペレーションの
AssumeRoleWithOIDCを呼び出してロールを引き受け、一時的な認証情報 (STS トークン) を取得します。詳細については、「ロールを引き受けるための一時的な認証情報の取得」をご参照ください。OpenAPI Explorer を使用してこのオペレーションをテストできます。テストが成功すると、SDK コード例が自動的に生成されます。-
リクエストパラメーター
パラメーター
説明
設定例
OIDCProviderArn
前のステップで作成した OIDC ID プロバイダーの ARN。詳細については、「OIDC ID プロバイダーに関する情報の表示」をご参照ください。
acs:ram::13******76:oidc-provider/test-idaas-providerRoleArn
前のステップで作成したロールの ARN。詳細については、「RAM ロールの ARN を表示する方法」をご参照ください。
acs:ram::13******76:role/test-idaas-roleOIDCToken
「M2M アクセストークンの取得」ステップで取得した
access_token。eyJraQ******E13GvARoleSessionName
カスタムのセッション名。
TestSession
-
レスポンスパラメーター
レスポンスでは、
SecurityToken、AccessKeyId、AccessKeySecretの値が STS トークンを構成します。以下に例を示します。{ "RequestId": "9518******49FB", "OIDCTokenInfo": { "Issuer": "https://******.aliyunidaas.com/api/v2/iauths_system/oauth2", "IssuanceTime": "2025-12-18T13:52:35Z", "VerificationInfo": "Success", "ExpirationTime": "2025-12-18T14:52:35Z", "Subject": "app_nfb******dzq", "ClientIds": "cloud:idaas:sts:alibabacloud:13******76" }, "AssumedRoleUser": { "Arn": "acs:ram::13******76:role/test-idaas-role/TestSession", "AssumedRoleId": "300******402:TestSession" }, "Credentials": { "SecurityToken": "CAISyg******d5diAA", "AccessKeyId": "STS.NXYh******A5R", "AccessKeySecret": "FpdgA******2eoN", "Expiration": "2025-12-18T15:20:33Z" } }
-
-
STS トークンを使用してクラウドサービス API を呼び出します。
-
API を呼び出すときは、3 つのパラメーター (
SecurityToken、AccessKeyId、AccessKeySecret) をすべて渡す必要があります。STS の AccessKey ID を対応するセキュリティトークンなしで使用すると、リクエストは認証に失敗します。 -
API 呼び出しは、ロール (前のステップで作成したロール) の [権限ポリシー] によって許可されている必要があります。そうでない場合、リクエストは拒否されます。
たとえば、RAM ロールを作成し、
AliyunOSSReadOnlyAccess[権限ポリシー] をロールにアタッチした場合、STS トークンを使用してすべての OSS 読み取り API オペレーションを呼び出すことができます。-
REST API:リクエストに
security-tokenパラメーター (URL 署名用) またはx-oss-security-tokenリクエストヘッダー (ヘッダー署名用) を含めます。 -
OSS SDK:クライアントを初期化する際に、セキュリティトークンを明示的に渡します。たとえば、Java SDK の
DefaultCredentialProviderのsecurityTokenパラメーターなどです。
-
本番環境
このソリューションを本番環境にデプロイする際は、コスト、可用性、リスク防止を考慮してください。
-
ベストプラクティス:
-
認証情報管理:
client_idなどの機密情報をスクリプトやコードにハードコーディングしないでください。Nacos などの設定センターや環境変数を使用して管理します。 -
トークンのキャッシュ:レイテンシーを削減し、API 呼び出しを最小限に抑えるために、アプリケーションはアクセストークンと STS トークンをメモリにキャッシュする必要があります。
-
トークンの更新:有効期間の 10% が残っている場合、または有効期限が切れる前の固定されたタイムウィンドウ (5 分など) 内に、トークンを非同期で更新します。これにより、トークンの有効期限切れによるサービスの中断を防ぎます。
-
同時実行制御:マルチスレッドまたは複数インスタンスの環境では、トークンの有効期限が近づいたときに同時にトークンが更新されるのを防ぐために、ロックメカニズムを使用します。これにより、IDaaS および RAM サービスへの不要な負荷を回避します。
-
-
リスク防止:
-
ネットワーク依存関係:このソリューションでは、ECS インスタンスが IDaaS のパブリックエンドポイントにアクセスする必要があります。ECS インスタンスがパブリックネットワーク出口のない VPC にある場合、このソリューションは利用できません。
-
設定リスク:このソリューションでは、ECS、IDaaS、RAM の 3 つのプロダクトの設定を調整する必要があります。この複数ステップのプロセスでは、コンポーネント ID、URL、ARN を正確に一致させる必要があります。設定を誤ると、認証が失敗する可能性があります。
-
課金
-
EIAM:このソリューションでは、IDaaS インスタンスを購入し、M2M アプリケーションクォータを 2 以上に維持する必要があります。料金の詳細については、「M2M アプリケーションの課金」をご参照ください。
-
その他の Alibaba Cloud サービス:STS トークンを使用して OSS や SLS などの他の Alibaba Cloud サービスにアクセスする場合、それらのサービスの標準的な課金が適用されます。
よくある質問
M2M アクセストークンの取得失敗
次の項目を確認してください。
-
ネットワーク接続:ECS インスタンスで、コマンド
curl -v https://<EIAM instance ID>.aliyunidaas.comを実行して、EIAM のパブリックドメイン名にアクセスできるかどうかを確認します。 -
メタデータサービス:
curl http://100.100.100.200/latest/meta-data/を実行して、インスタンスメタデータサービスにアクセスできるかどうかを確認します。 -
スクリプト変数:スクリプト内の
IDAAS_INSTANCE_ID、TOKEN_ENDPOINT、CLIENT_IDなどの変数が正しく設定されていることを確認します。 -
ECS インスタンスの権限付与:EIAM M2M クライアントアプリケーションで設定されている「ECS インスタンス ID」が、スクリプトを実行している ECS インスタンスの ID であることを確認します。
EIAM が invalid_scope エラーを返す
このエラーは、scope パラメーターのフォーマットが正しくないために発生します。次の項目を確認してください。
-
区切り文字の確認:EIAM では、
scopeパラメーター内の複数の値を、OAuth 2.0 標準で定義されているスペースではなく、縦棒|で区切る必要があります。フォーマットが<M2M サーバーの ResourceServer Identifier>|<M2M サーバーの Scope Value>になっていることを確認してください。 -
権限付与の確認:M2M サーバーアプリケーションの「承認済みアプリケーション」タブで M2M クライアントアプリケーションが承認されており、必要な権限が選択されていることを確認します。
AssumeRoleWithOIDC を呼び出すと RAM が InvalidIdentityToken エラーを返す
このエラーは通常、OIDC ID プロバイダーの設定と EIAM アプリケーションの設定が一致しないことが原因で発生します。RAM OIDC ID プロバイダーの「[発行者 URL]」と「[クライアント ID]」が、EIAM M2M サーバーアプリケーションの「Issuer URL」と「ResourceServer Identifier」と完全に一致していることを確認してください。
AssumeRoleWithOIDC を呼び出すと RAM が AccessDenied エラーを返す
このエラーは、リクエストが RAM ロールの信頼ポリシーの条件を満たしていないことを示します。次の項目を確認してください。
-
oidc:subの確認:RAM ロールの信頼ポリシーのConditionにあるoidc:subの値が、EIAM M2M クライアントアプリケーションの client_id であることを確認します。ここで M2M サーバーアプリケーションの ID を入力するのはよくある間違いです。 -
oidc:audの確認:Conditionにあるoidc:audの値が、RAM OIDC ID プロバイダーの「[クライアント ID]」と一致していることを確認します。