For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Navegação principal
Theme

Como configurar a federação de identidades de carga de trabalho para o Microsoft Azure

Use o Microsoft Azure como provedor de identidades de carga de trabalho em um destes cenários:

  • Identidade gerenciada do Azure: troque um token de acesso do Microsoft Entra ID emitido para uma identidade gerenciada por um token de acesso da OpenAI de curta duração.
  • AKS: troque um token projetado de conta de serviço do Azure Kubernetes Service (AKS) por um token de acesso da OpenAI de curta duração.

Identidade gerenciada do Azure

Com as identidades gerenciadas do Azure, as cargas de trabalho hospedadas no Azure podem solicitar tokens do Microsoft Entra sem armazenar segredos de longa duração. Na federação de identidades de carga de trabalho da OpenAI, o token da identidade gerenciada é o token do sujeito que a OpenAI valida antes de emitir um token de acesso da OpenAI.

Configurar a identidade gerenciada do Azure

Crie ou use um registro de aplicativo do Microsoft Entra que represente o público do token em que a OpenAI deve confiar. Configure o URI da ID do aplicativo. Esse URI é o valor de resource que a carga de trabalho especifica na solicitação ao Serviço de Metadados de Instância do Azure (IMDS) e aparece na declaração aud do token emitido. Para seguir as etapas de configuração da Microsoft, consulte o guia do Microsoft Entra sobre como criar um novo aplicativo do Entra ID e uma entidade de serviço.

O URI da ID do aplicativo configurado no Microsoft Entra ID, o parâmetro resource do IMDS, a declaração aud do token emitido e o público do provedor de identidades de carga de trabalho da OpenAI devem ter o mesmo valor.

Crie uma identidade gerenciada e atribua essa identidade ao recurso do Azure que executa seu aplicativo, como uma máquina virtual. O recurso precisa conseguir fazer solicitações ao IMDS em tempo de execução. Para saber mais sobre a configuração no Azure, consulte a visão geral das identidades gerenciadas da Microsoft e as instruções de atribuição de identidade na documentação do recurso do Azure que você usa.

Obter um token de identidade gerenciada do Azure

No recurso do Azure ao qual você atribuiu a identidade gerenciada, solicite um token ao IMDS usando o URI da ID do aplicativo como parâmetro resource. Esse é o token do sujeito que a OpenAI troca por um token de acesso que ela mesma emite.

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

Se o recurso tiver várias identidades gerenciadas atribuídas pelo usuário, adicione o parâmetro de consulta client_id, object_id ou msi_res_id correspondente à identidade gerenciada que você quer usar. A Microsoft descreve os parâmetros da solicitação de token ao IMDS em Usar identidades gerenciadas em uma máquina virtual para obter um token de acesso.

Verificar o token

Antes de configurar a federação de identidades de carga de trabalho, exporte o token do Microsoft Entra como TOKEN e execute o script a seguir localmente para examinar as declarações do 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);

Esse comando decodifica o conteúdo do JWT sem verificar a assinatura do token. Use um decodificador local para tokens de produção e evite colá-los em ferramentas de terceiros.

Um token de identidade gerenciada do Microsoft Entra ID, depois de decodificado, terá conteúdo semelhante ao deste exemplo:

{
  "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
}

Confira as declarações que você pretende configurar na OpenAI:

  • iss: use o valor exato do emissor que aparece no token. O emissor pode ser https://login.microsoftonline.com/<tenant-id>/v2.0, mas não presuma que ele tenha esse sufixo.
  • aud: deve corresponder ao URI da ID do aplicativo, ao parâmetro resource do IMDS e ao público do provedor de identidades de carga de trabalho da OpenAI.
  • tid: é a ID do locatário do Microsoft Entra.
  • appid: quando presente, indica a ID do aplicativo (ID do cliente) da identidade gerenciada.
  • iat e exp: verifique o tempo de vida total do token, exp - iat, em segundos.

Para o Codex, defina max_assertion_lifetime_seconds do provedor como um limite aprovado que cubra toda a faixa de duração esperada para os tokens desse emissor. Não use o tempo de validade restante do token nem presuma que todo token do Entra dure uma hora. A Microsoft documenta a duração variável dos tokens de acesso e não oferece suporte à configuração do tempo de vida dos tokens de identidade gerenciada.

Os tokens de identidade gerenciada também podem conter declarações como azp, oid, sub ou xms_mirid. Use o token decodificado como referência e escolha declarações que identifiquem com precisão a identidade gerenciada e o conjunto de recursos em que você confia.

Use o conteúdo decodificado para comparar o token recebido com o emissor, o público e os valores de mapeamento configurados na OpenAI. Antes de trocar o token, você pode identificar a maioria dos problemas de configuração nas declarações iss, aud, tid e nas declarações da identidade gerenciada.

Configurar a federação de identidades de carga de trabalho

Crie um provedor de identidades de carga de trabalho na OpenAI para o emissor do Microsoft Entra ID. Em seguida, adicione um mapeamento de conta de serviço que corresponda a declarações estáveis do token de identidade gerenciada.

Configure primeiro o provedor de identidades de carga de trabalho e depois crie o mapeamento de conta de serviço.

Configurar o provedor de identidades de carga de trabalho

  1. Crie o provedor de identidades de carga de trabalho. Em Nome, insira um valor exclusivo, como azure-managed-identity-prod. Em Descrição, insira um texto como Production Azure managed identity workloads para ajudar os administradores a identificar o provedor.

  2. Defina o emissor e o público. Em URL do emissor OIDC, insira o valor exato da declaração iss do token. Para isso, primeiro obtenha um token de identidade gerenciada de exemplo e examine suas declarações. O emissor pode ser, por exemplo, https://login.microsoftonline.com/<tenant-id>/v2.0. Em Público, insira o URI da ID do aplicativo que você configurou no Microsoft Entra, como api://<application-client-id>. Esse valor deve corresponder à declaração aud do token.

  3. Use a verificação de tokens do Microsoft Entra. Deixe a opção Usar JWKS carregado para verificar o token desativada. A OpenAI usa os metadados e o JWKS do emissor do Microsoft Entra para verificar o token de identidade gerenciada.

  4. Adicione transformações de atributos se precisar de atributos derivados para o mapeamento. Por exemplo, insira managed_identity_client_id com a expressão assertion.appid para criar openai.managed_identity_client_id a partir da declaração que contém a ID do aplicativo (ID do cliente) da identidade gerenciada. O painel aplica o prefixo openai. automaticamente. As declarações originais do token que já começam com openai. são ignoradas nas chaves de mapeamento com o prefixo openai., a menos que você configure uma transformação correspondente.

Configurar o mapeamento de conta de serviço

  1. Crie um mapeamento de conta de serviço. Em Nome, insira um valor exclusivo nesse provedor de identidades de carga de trabalho, como vm-openai-wif. Em Descrição, insira um texto como Production VM Azure managed identity workload para indicar qual carga de trabalho pode usar o mapeamento.

  2. Configure a correspondência com declarações estáveis da identidade gerenciada. Adicione uma linha com Chave e Valor para cada declaração que precisa corresponder ao valor configurado. Se o token contiver appid, defina Chave como appid e Valor como a ID do cliente da identidade gerenciada. A declaração appid identifica a ID do aplicativo (ID do cliente) da identidade gerenciada e costuma ser a declaração mais estável para vincular um mapeamento a uma identidade gerenciada específica. Se o token não contiver appid, use outra declaração estável do token decodificado, como azp, oid, sub ou xms_mirid. Para vincular o mapeamento a um único locatário, defina também Chave como tid e Valor como a ID do locatário do Microsoft Entra. Decodifique um token de exemplo obtido do IMDS e use declarações estáveis para a identidade gerenciada e o recurso em que você confia.

  3. Escolha o destino na OpenAI. Em Projeto, selecione o projeto da OpenAI ao qual pertence a conta de serviço de destino. Em Conta de serviço, selecione a conta de serviço da OpenAI que a carga de trabalho do Azure pode usar, como azure-managed-identity-prod-openai-wif.

  4. Restrinja as permissões da API, se necessário. Em Permissões, selecione permissões adequadas, como api.model.request e api.vector_store.read, para restringir ainda mais o acesso concedido pelos tokens emitidos com esse mapeamento. Deixe as permissões em branco se quiser evitar uma restrição de escopo específica da federação de identidades de carga de trabalho (WIF). O token continua autorizando o acesso com as permissões da conta de serviço mapeada.

Usar o token no código

Configure o cliente do SDK da OpenAI para solicitar ao IMDS um token de identidade gerenciada do Azure e trocá-lo por um token de acesso emitido pela OpenAI.

Defina OPENAI_WIF_AUDIENCE como o URI da ID do aplicativo do Microsoft Entra configurado como público do provedor de identidades de carga de trabalho. O SDK solicita um token de identidade gerenciada para esse público, troca esse token por um token de acesso emitido pela OpenAI e usa o token da OpenAI para autenticar as solicitações à API.

Autenticar com um token de identidade gerenciada do Azure
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);

Boas práticas para o Microsoft Azure

  • Use identidades gerenciadas sempre que possível. Elas oferecem um modelo de autenticação mais simples e seguro do que a distribuição manual de credenciais.
  • Use identidades gerenciadas, aplicativos do Microsoft Entra e mapeamentos da OpenAI distintos para diferentes aplicativos e ambientes. Evite compartilhar uma identidade entre cargas de trabalho de desenvolvimento, homologação e produção.
  • Restrinja os públicos aceitos. Configure apenas os públicos necessários para a federação de identidades de carga de trabalho da OpenAI.
  • Use aplicativos dedicados do Microsoft Entra ID para delimitar os domínios de segurança. Manter os aplicativos separados facilita a identificação dos responsáveis, a auditoria e o gerenciamento de acesso.
  • Prefira mapeamentos específicos para cada carga de trabalho. Use declarações específicas da carga de trabalho como critérios de correspondência em vez de atributos que se apliquem a todo o locatário.
  • Revise regularmente as configurações de credenciais federadas. Credenciais federadas obsoletas podem continuar concedendo acesso indevido muito tempo depois que as cargas de trabalho forem desativadas.
  • Separe as identidades de produção das usadas em outros ambientes. As cargas de trabalho de produção devem se autenticar com identidades federadas e contas de serviço da OpenAI próprias.