For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
メインナビゲーション

Microsoft Azure 向けワークロード ID フェデレーションの構成

次のいずれかのシナリオで、Microsoft Azure をワークロード ID プロバイダーとして使用できます。

  • Azure マネージド ID: マネージド ID に対して発行された Microsoft Entra ID アクセストークンを、有効期間の短い OpenAI アクセストークンと交換します。
  • AKS: 投影された Azure Kubernetes Service (AKS) サービスアカウントトークンを、有効期間の短い OpenAI アクセストークンと交換します。

Codex で使用する場合は、このページの手順で Microsoft Entra トークンを取得し、内容を確認します。その後、Codex のワークロード ID を構成して、トークンをファイルに書き込み、Codex がそのファイルを参照するようにします。このページのサービスアカウントマッピングと SDK の例は、OpenAI API 向けです。

Azure マネージド ID

Azure マネージド ID を使用すると、Azure でホストされるワークロードは、長期間有効なシークレットを保存せずに Microsoft Entra トークンをリクエストできます。OpenAI のワークロード ID フェデレーションでは、マネージド ID トークンがサブジェクトトークンとなり、OpenAI はこれを検証してから OpenAI アクセストークンを発行します。

Azure マネージド ID のセットアップ

OpenAI が信頼するトークンのオーディエンスを表す Microsoft Entra アプリケーション登録を作成するか、既存の登録を使用します。その アプリケーション ID URI を構成します。この URI は、ワークロードが Azure Instance Metadata Service (IMDS) にリクエストする際の resource の値であり、発行されたトークンの aud クレームにも含まれます。Microsoft 側のセットアップ手順については、Microsoft Entra のガイド「新しい Entra ID アプリケーションとサービスプリンシパルの作成」を参照してください。

Microsoft Entra ID に構成したアプリケーション ID URI、IMDS の resource パラメーター、 発行されたトークンの aud クレーム、および OpenAI ワークロード ID プロバイダーのオーディエンスは、 すべて一致している必要があります。

マネージド ID を作成し、仮想マシンなど、アプリケーションを実行する Azure リソースにそのマネージド ID を割り当てます。そのリソースは、実行時に IMDS を呼び出せる必要があります。Azure のセットアップの詳細については、Microsoft の「マネージド ID の概要」と、ID の割り当てに関する該当 Azure リソースのドキュメントを参照してください。

Azure マネージド ID トークンの取得

マネージド ID が割り当てられた Azure リソースから、アプリケーション ID URI を resource パラメーターに指定して IMDS にトークンをリクエストします。このトークンが、OpenAI によって OpenAI 発行のアクセストークンと交換されるサブジェクトトークンです。

APPLICATION_ID_URI="api://<application-client-id>"

TOKEN=$(curl -sS -G -H "Metadata: true" \
  "http://169.254.169.254/metadata/identity/oauth2/token" \
  --data-urlencode "api-version=2018-02-01" \
  --data-urlencode "resource=${APPLICATION_ID_URI}" \
  | jq -r .access_token)
export TOKEN

リソースに複数のユーザー割り当てマネージド ID がある場合は、使用するマネージド ID の client_idobject_id、または msi_res_id クエリパラメーターを追加します。IMDS のトークンリクエストパラメーターについては、Microsoft の「仮想マシンでマネージド ID を使用してアクセストークンを取得する」を参照してください。

トークンの確認

ワークロード ID フェデレーションを構成する前に、Microsoft Entra トークンを環境変数 TOKEN としてエクスポートし、次のスクリプトをローカルで実行してクレームを確認します。

const parts = process.env.TOKEN?.split(".") ?? [];
if (parts.length !== 3) {
  throw new Error("Expected a compact JWT with three segments");
}
if (!/^[A-Za-z0-9_-]+$/.test(parts[1]) || parts[1].length % 4 === 1) {
  throw new Error("JWT payload is not valid Base64URL");
}

const bytes = Buffer.from(parts[1], "base64url");
if (bytes.toString("base64url") !== parts[1]) {
  throw new Error("JWT payload is not valid Base64URL");
}
const decoded = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
const claims = JSON.parse(decoded);
if (claims === null || Array.isArray(claims) || typeof claims !== "object") {
  throw new Error("JWT payload is not a JSON object");
}
console.log(decoded);

このコマンドは、トークンの署名を検証せずに JWT ペイロードをデコードします。本番環境のトークンにはローカルのデコーダーを使用し、サードパーティー製のツールへの貼り付けは避けてください。

デコードされた Microsoft Entra ID のマネージド ID トークンは、次のようになります。

{
  "iss": "https://login.microsoftonline.com/11111111-2222-3333-4444-555555555555/v2.0",
  "aud": "api://00000000-1111-2222-3333-444444444444",
  "tid": "11111111-2222-3333-4444-555555555555",
  "appid": "22222222-3333-4444-5555-666666666666",
  "oid": "33333333-4444-5555-6666-777777777777",
  "sub": "33333333-4444-5555-6666-777777777777",
  "xms_mirid": "/subscriptions/<subscription-id>/resourcegroups/my-resource-group/providers/Microsoft.Compute/virtualMachines/openai-wif-vm",
  "iat": 1716235422,
  "exp": 1716239022
}

OpenAI に構成する予定のクレームを確認します。

  • iss:トークンに含まれる発行者の値をそのまま使用します。発行者は https://login.microsoftonline.com/<tenant-id>/v2.0 の場合もありますが、このサフィックスが付くとは限りません。
  • aud:アプリケーション ID URI、IMDS の resource パラメーター、および OpenAI ワークロード ID プロバイダーのオーディエンスと一致している必要があります。
  • tid:Microsoft Entra のテナント ID
  • appid:マネージド ID のアプリケーション ID/クライアント ID(このクレームが存在する場合)
  • iatexp:トークンの発行から失効までの有効期間である exp - iat を秒単位で確認します。

Codex で使用する場合は、プロバイダーの max_assertion_lifetime_seconds に、 発行者が想定するトークン有効期間の範囲をカバーする、承認済みの上限値を設定します。 トークンの残り有効期間を使用したり、すべての Entra トークンが 1 時間有効だと想定したりしないでください。 Microsoft は、アクセストークンの有効期間が 変動することを説明しており、 マネージド ID トークンの有効期間の 構成はサポートしていません。 管理 API によるプロバイダーの 設定例を参照してください。

マネージド ID トークンには、azpoidsubxms_mirid などのクレームが含まれる場合もあります。デコードしたトークンを正確な情報源として、信頼するマネージド ID とリソースの境界を厳密に識別できるクレームを選択してください。

デコードしたペイロードを使用して、受け取ったトークンを、OpenAI に構成した発行者、オーディエンス、マッピングの値と比較します。ほとんどの構成上の問題は、トークンを交換する前に、issaudtid、およびマネージド ID のクレームで確認できます。

ワークロード ID フェデレーションのセットアップ

Microsoft Entra ID の発行者に対応するワークロード ID プロバイダーを OpenAI に作成し、マネージド ID トークンの安定したクレームに一致するサービスアカウントマッピングを追加します。

最初にワークロード ID プロバイダーを構成し、その後でサービスアカウントマッピングを作成します。

ワークロード ID プロバイダーのセットアップ

  1. ワークロード ID プロバイダーを作成します。 名前 には、azure-managed-identity-prod などの一意の値を設定します。管理者がプロバイダーを識別しやすいように、 説明には Production Azure managed identity workloads などを入力します。

  2. 発行者とオーディエンスを設定します。 OIDC 発行者 URL に、トークンの iss クレームの値をそのまま設定します。まず、サンプルのマネージド ID トークンを取得してクレームを確認してください。たとえば、発行者の値は https://login.microsoftonline.com/<tenant-id>/v2.0 の場合があります。 オーディエンス には、api://<application-client-id> など、Microsoft Entra で構成したアプリケーション ID URI を設定します。この値は、トークンの aud クレームと一致している必要があります。

  3. Microsoft Entra のトークン検証を使用します。 アップロードした JWKS をトークン検証に使用 は無効のままにします。OpenAI は Microsoft Entra の発行者メタデータと JWKS を使用して、マネージド ID トークンを検証します。

  4. 派生したマッピング属性が必要な場合は、属性変換を追加します。 たとえば、managed_identity_client_id を入力し、式に assertion.appid を指定すると、マネージド ID のアプリケーション ID/クライアント ID クレームから openai.managed_identity_client_id を作成できます。ダッシュボードは openai. プレフィックスを自動的に付加します。元のトークンクレームがすでに openai. で始まっている場合、対応する変換が構成されていない限り、openai. マッピングキーではそのクレームが無視されます。

サービスアカウントマッピングのセットアップ

  1. サービスアカウントマッピングを作成します。 名前 には、vm-openai-wif など、そのワークロード ID プロバイダー内で一意の値を設定します。 説明には Production VM Azure managed identity workload などを入力し、どのワークロードがこのマッピングを使用できるかを示します。

  2. マネージド ID の安定したクレームを照合します。 一致が必要なクレームごとに、 キー の行を 1 行追加します。トークンに appid が含まれる場合は、 キーappid を、 にマネージド ID のクライアント ID を設定します。appid クレームはマネージド ID のアプリケーション ID/クライアント ID を識別するもので、通常、マッピングを特定のマネージド ID に紐付けるうえで最も安定したクレームです。トークンに appid が含まれない場合は、デコードしたトークンから、azpoidsubxms_mirid など、別の安定したクレームを使用します。マッピングを 1 つのテナントに紐付けるには、さらに キーtid を、 に Microsoft Entra のテナント ID を設定します。IMDS から取得したサンプルトークンをデコードし、信頼するマネージド ID とリソースに対して安定したクレームを使用してください。

  3. OpenAI 側の対象を選択します。 プロジェクト には、対象のサービスアカウントを所有する OpenAI プロジェクトを設定します。 サービスアカウント には、azure-managed-identity-prod-openai-wif など、Azure ワークロードが使用できる OpenAI サービスアカウントを設定します。

  4. 必要に応じて API 権限を制限します。 api.model.requestapi.vector_store.read など、適切な 権限 を選択し、このマッピングから発行されるアクセストークンの権限をさらに制限します。WIF 固有のスコープ制限を追加しない場合は、権限を空欄のままにします。その場合も、トークンはマッピング先のサービスアカウントとして認可されます。

コードでのトークンの使用

IMDS に Azure マネージド ID トークンをリクエストし、それを OpenAI 発行のアクセストークンと交換するように、OpenAI SDK クライアントを構成します。

OPENAI_WIF_AUDIENCE に、ワークロード ID プロバイダーのオーディエンスとして構成した Microsoft Entra のアプリケーション ID URI を設定します。SDK は、そのオーディエンスに対するマネージド ID トークンをリクエストし、OpenAI 発行のアクセストークンと交換して、OpenAI トークンで API リクエストを認証します。

Azure マネージド ID トークンを使用した認証
import OpenAI from "openai";

const imdsEndpoint = "http://169.254.169.254/metadata/identity/oauth2/token";

const identityProviderId = process.env.OPENAI_IDENTITY_PROVIDER_ID;
const serviceAccountId = process.env.OPENAI_SERVICE_ACCOUNT_ID;
const audience = process.env.OPENAI_WIF_AUDIENCE;

if (!identityProviderId || !serviceAccountId || !audience) {
  throw new Error(
    "Set OPENAI_IDENTITY_PROVIDER_ID, OPENAI_SERVICE_ACCOUNT_ID, and OPENAI_WIF_AUDIENCE"
  );
}

function azureManagedIdentityTokenProvider(resource) {
  return {
    tokenType: "jwt",
    getToken: async () => {
      const url = new URL(imdsEndpoint);
      url.searchParams.set("api-version", "2018-02-01");
      url.searchParams.set("resource", resource);

      const clientId = process.env.AZURE_CLIENT_ID;
      if (clientId) {
        url.searchParams.set("client_id", clientId);
      }

      const response = await fetch(url, {
        headers: { Metadata: "true" },
      });

      if (!response.ok) {
        throw new Error(
          `Azure IMDS token request failed with status ${response.status}.`
        );
      }

      const body = await response.json();
      if (!body.access_token) {
        throw new Error("Azure IMDS did not return an access token.");
      }

      return body.access_token;
    },
  };
}

const client = new OpenAI({
  workloadIdentity: {
    identityProviderId,
    serviceAccountId,
    provider: azureManagedIdentityTokenProvider(audience),
  },
});

const response = await client.responses.create({
  model: "gpt-5.6-terra",
  input: "Say hello from Azure managed identity workload identity federation.",
});

console.log(response.output_text);

Microsoft Azure のベストプラクティス

  • 可能な限りマネージド ID を使用します。マネージド ID は、認証情報を手動で配布する方法よりもシンプルで安全な認証モデルを提供します。
  • アプリケーションや環境ごとに、マネージド ID、Microsoft Entra アプリケーション、OpenAI マッピングを分けます。開発、ステージング、本番環境のワークロード間で 1 つの ID を共有しないでください。
  • 受け入れるオーディエンスを制限します。OpenAI のワークロード ID フェデレーションに必要なオーディエンスのみを設定します。
  • セキュリティ境界ごとに専用の Microsoft Entra ID アプリケーションを使用します。アプリケーションを分けることで、所有者、監査、アクセス管理がより明確になります。
  • ワークロード固有のマッピングを優先します。テナント全体にわたる広範な属性ではなく、ワークロード固有のクレームを使って照合します。
  • フェデレーション資格情報の設定を定期的にレビューします。使われなくなったフェデレーション資格情報が残っていると、ワークロードの廃止から長期間が経過しても、意図せずアクセスを許可し続ける可能性があります。
  • 本番環境と非本番環境の ID を分離します。本番環境のワークロードは、専用のフェデレーション ID と OpenAI サービスアカウントを使って認証する必要があります。