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 Idira

Use o Idira Secure Workload Access (SWA) para fazer chamadas à API da OpenAI sem armazenar uma chave de API da OpenAI. O SWA atribui um ID SPIFFE à sua carga de trabalho e emite um JWT-SVID, um token assinado que representa essa identidade. O SDK da OpenAI troca esse token por um token de acesso da OpenAI de curta duração, com as permissões da conta de serviço mapeada.

Este guia explica como configurar a API da OpenAI. Para usar o Codex, siga as etapas deste guia para disponibilizar o token e depois siga as instruções em Como usar a identidade de carga de trabalho com o Codex.

Antes de começar

Você precisa de:

  • Uma implantação do SWA com um domínio de confiança e uma política de atestação que atribua o ID SPIFFE esperado à sua carga de trabalho.
  • Acesso, a partir da carga de trabalho, ao socket da Workload API do agente do SWA.
  • Permissão para gerenciar provedores de identidade de carga de trabalho, mapeamentos de contas de serviço, projetos e contas de serviço na sua organização da OpenAI.
  • Um SDK da OpenAI compatível com credenciais de identidade de carga de trabalho.

Conclua a configuração da infraestrutura do SWA seguindo os pré-requisitos do guia do Idira para integração com a OpenAI.

Obtenha o emissor e as chaves de assinatura

Obtenha os valores de jwt.discovery_endpoints.oidc_discovery_url e jwt.discovery_endpoints.jwks_uri do seu domínio de confiança. Para encontrá-los, siga as instruções do Idira para configurar o OIDC.

A OpenAI precisa conseguir acessar o documento de descoberta e o JWKS via HTTPS sem credenciais. O emissor é a URL HTTPS indicada no campo iss do token. O ID SPIFFE em sub identifica sua carga de trabalho.

Escolha um público específico para o acesso à OpenAI, como https://api.openai.com/v1. Use o mesmo valor ao solicitar o JWT-SVID e ao configurar o provedor na OpenAI. O público identifica o destinatário previsto do token. Ele não define o endpoint de troca de tokens.

Por padrão, o SWA usa RS512 para assinar tokens com uma chave RSA de 4096 bits. O verificador de JWT da OpenAI aceita essa combinação. Para conhecer outras opções de assinatura do SWA, consulte os requisitos de JWT do Idira.

Disponibilize um JWT-SVID atualizado para a carga de trabalho

Instale o spiffe-helper no ambiente da carga de trabalho para solicitar e renovar um JWT-SVID junto ao agente do SWA. Salve a configuração a seguir como helper.conf. O utilitário grava o token em /var/run/spiffe/openai.jwt, caminho usado nos exemplos compartilhados de uso do SPIFFE com o SDK:

agent_address = "/tmp/swa-agent/public/api.sock"
cert_dir      = "/var/run/spiffe"
daemon_mode   = true

jwt_svids = [{
  jwt_audience       = "https://api.openai.com/v1"
  jwt_svid_file_name = "openai.jwt"
}]

No Kubernetes, execute o utilitário como um sidecar no pod da carga de trabalho. Compartilhe um volume emptyDir em memória no caminho /var/run/spiffe e monte o diretório que contém o socket do SWA, /tmp/swa-agent/public, no contêiner do utilitário. Em máquinas virtuais, use /run/swa-agent/api.sock como valor de agent_address e mantenha o diretório do token em um sistema de arquivos em memória. Siga as instruções de implantação do Idira para configurar o acesso ao socket e a atestação.

Antes de iniciar o utilitário, crie o diretório do token e conceda ao utilitário permissão de escrita nesse diretório. Inicie o utilitário com essa configuração no sidecar ou no serviço da máquina virtual:

spiffe-helper -config helper.conf

Restrinja o acesso ao arquivo do token e ao socket do agente aos processos que precisam deles. Mantenha o utilitário em execução para que ele substitua o token antes que expire.

Se a sua linguagem tiver um cliente para a Workload API do SPIFFE, você pode, como alternativa, obter um JWT-SVID atualizado diretamente no provedor de tokens de sujeito. Consulte a opção de acesso direto à Workload API no guia de integração do Idira.

Inspecione o token

No ambiente da carga de trabalho, carregue o token em uma variável de ambiente para que o decodificador local possa lê-lo:

export TOKEN="$(cat /var/run/spiffe/openai.jwt)"
const parts = process.env.TOKEN?.split(".") ?? [];
if (parts.length !== 3) {
  throw new Error("Expected a compact JWT with three segments");
}

const decode = (segment) => {
  if (!/^[A-Za-z0-9_-]+$/.test(segment) || segment.length % 4 === 1) {
    throw new Error("JWT segment is not valid Base64URL");
  }
  const bytes = Buffer.from(segment, "base64url");
  if (bytes.toString("base64url") !== segment) {
    throw new Error("JWT segment is not valid Base64URL");
  }
  const decoded = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
  const value = JSON.parse(decoded);
  if (value === null || Array.isArray(value) || typeof value !== "object") {
    throw new Error("JWT segment is not a JSON object");
  }
  return decoded;
};

console.log("Header:");
console.log(decode(parts[0]));
console.log("\nPayload:");
console.log(decode(parts[1]));

Confira estes campos antes de criar o provedor na OpenAI:

Campo Valor esperado
Campo alg do cabeçalho O algoritmo de assinatura configurado, como RS512.
Campo kid do cabeçalho O ID de uma chave de assinatura presente no JWKS público do domínio de confiança.
iss A URL HTTPS do emissor do domínio de confiança.
sub O ID SPIFFE atribuído a esta carga de trabalho.
aud Contém o público que você escolheu para acessar a OpenAI.
iat e exp Os horários de emissão e expiração do token. Use um token que ainda esteja válido.

O decodificador lê os campos do token sem verificar a assinatura. Não registre o token em logs nem o cole em um decodificador online. Após a inspeção, remova a variável de ambiente TOKEN.

Configure a federação de identidades de carga de trabalho na OpenAI

Crie o provedor de identidade de carga de trabalho

Acesse Configurações da organização > Segurança > Provedor de identidade de carga de trabalho e crie um provedor com as seguintes configurações:

Configuração Valor
Nome Um nome exclusivo, como idira-prod.
Descrição O aplicativo e o ambiente que usam este provedor.
URL do emissor OIDC O valor de iss do JWT-SVID.
Público O público solicitado pelo utilitário, como https://api.openai.com/v1.
Usar o JWKS enviado para verificar tokens Mantenha esta opção desativada para usar a descoberta OIDC.
Transformações de atributos Deixe em branco se o mapeamento usar diretamente o valor de sub.

Na troca de tokens da API da OpenAI, a comparação das URLs do emissor ignora as barras finais. Por exemplo, https://issuer.example.com e https://issuer.example.com/ são equivalentes. Todos os demais caracteres devem coincidir, inclusive os do esquema e do caminho. Os valores do público devem coincidir exatamente. Para manter a configuração consistente, copie a URL do emissor exatamente como aparece no token.

Se a OpenAI não conseguir acessar o documento de descoberta ou o JWKS, siga as orientações gerais de configuração do provedor para usar um JWKS público enviado por upload. Atualize as chaves enviadas quando o SWA fizer a rotação das chaves de assinatura.

Mapeie o ID SPIFFE para uma conta de serviço

  1. Crie um mapeamento de conta de serviço no provedor e dê a ele um nome, como idira-production-workload.
  2. Em Chave, insira sub. Em Valor, insira o ID SPIFFE exatamente como aparece no token da carga de trabalho, por exemplo, spiffe://prod.example.com/k8s-nodegroup/ns/my-namespace/sa/my-service-account.
  3. Selecione o Projeto e a Conta de serviço que a carga de trabalho pode usar.
  4. Selecione as Permissões de que a carga de trabalho precisa, como api.model.request para fazer solicitações a modelos. Essas permissões podem restringir o acesso concedido à conta de serviço, mas não podem ampliá-lo. Se você deixar o campo de permissões em branco, o mapeamento não acrescentará nenhuma restrição específica da federação de identidades de carga de trabalho (WIF).

Use uma conta de serviço separada para cada aplicativo e ambiente. Prefira o ID SPIFFE exato. Use um curinga no final do ID somente se todas as identidades com esse prefixo precisarem receber o mesmo acesso. Evite mapeamentos sobrepostos. Para mais detalhes, consulte Mapeamentos de contas de serviço com SPIFFE.

Use o token no código

Defina os IDs do provedor da OpenAI e da conta de serviço selecionada no ambiente da carga de trabalho:

export OPENAI_IDENTITY_PROVIDER_ID="<workload identity provider ID>"
export OPENAI_SERVICE_ACCOUNT_ID="<service account ID>"

Os exemplos compartilhados de uso do SPIFFE a seguir leem o arquivo /var/run/spiffe/openai.jwt. O provedor de tokens de sujeito retorna o token atual sempre que o SDK precisa trocá-lo por um token de acesso da OpenAI ou renovar esse token de acesso. O SWA e o utilitário renovam o JWT-SVID externo. O SDK da OpenAI gerencia o token de acesso da OpenAI.

Autentique-se com um JWT-SVID do SPIFFE emitido pelo Idira
import { readFile } from "node:fs/promises";
import OpenAI from "openai";

const tokenPath = "/var/run/spiffe/openai.jwt";
const identityProviderId = process.env.OPENAI_IDENTITY_PROVIDER_ID;
const serviceAccountId = process.env.OPENAI_SERVICE_ACCOUNT_ID;

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

function spiffeJwtSvidProvider(path) {
  return {
    tokenType: "jwt",
    getToken: async () => {
      const token = (await readFile(path, "utf8")).trim();
      if (!token) {
        throw new Error("The SPIFFE JWT-SVID file is empty.");
      }
      return token;
    },
  };
}

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

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

console.log(response.output_text);

Verifique o funcionamento e solucione problemas

Execute o exemplo na carga de trabalho atestada, com a variável OPENAI_API_KEY indefinida. Se a solicitação for bem-sucedida, o exemplo exibirá a resposta do modelo. Confirme que as solicitações continuam funcionando depois que o utilitário substitui o JWT-SVID e o SDK renova o token de acesso da OpenAI.

Sintoma O que verificar
O utilitário não recebe nenhuma identidade Verifique se a carga de trabalho atende aos critérios da política de atestação do SWA e consegue acessar o socket do agente. Faça essas verificações no contexto da carga de trabalho.
O arquivo do token não existe, está vazio ou contém um token expirado Verifique se o utilitário está em execução, se o volume compartilhado e o caminho do arquivo correspondem aos configurados e se a carga de trabalho consegue ler o arquivo. Mantenha os relógios dos hosts sincronizados.
A verificação do token falha Confira os valores de iss, aud e kid, a validade do token e se a OpenAI consegue acessar o documento de descoberta e o JWKS. Aplique a regra de comparação do emissor descrita anteriormente.
Nenhum mapeamento de conta de serviço corresponde ao token Confira o ID do provedor, o ID da conta de serviço, o mapeamento habilitado e o valor exato de sub.
Mais de um mapeamento corresponde ao token Restrinja ou desative os mapeamentos sobrepostos para que apenas um mapeamento habilitado corresponda ao token.
A troca de tokens funciona, mas a API rejeita a solicitação Confira o projeto e as permissões da conta de serviço mapeada, além das políticas de acesso à API aplicáveis.

Para diagnosticar problemas na implantação do SWA, consulte as orientações do Idira para solucionar problemas de integração.