For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Navegación principal
Theme

Configurar la federación de identidades de cargas de trabajo para Idira

Usa Idira Secure Workload Access (SWA) para llamar a la API de OpenAI sin almacenar una clave de API de OpenAI. SWA asigna un ID de SPIFFE a tu carga de trabajo y emite un JWT-SVID, un token firmado que representa esa identidad. El SDK de OpenAI intercambia ese token por un token de acceso de OpenAI de corta duración con los permisos de la cuenta de servicio asociada.

Esta guía describe cómo configurar la API de OpenAI. Para Codex, sigue los pasos de esta guía para entregar el token y luego sigue las instrucciones de Usar la identidad de la carga de trabajo con Codex.

Antes de empezar

Necesitas lo siguiente:

  • Un despliegue de SWA con un dominio de confianza y una política de atestación que asigne el ID de SPIFFE esperado a tu carga de trabajo.
  • Acceso desde la carga de trabajo al socket de la Workload API del agente de SWA.
  • Permiso para administrar proveedores de identidad de cargas de trabajo, asignaciones de cuentas de servicio, proyectos y cuentas de servicio en tu organización de OpenAI.
  • Un SDK de OpenAI compatible con credenciales de identidad de cargas de trabajo.

Completa la configuración de la infraestructura de SWA según los requisitos previos de la guía de Idira para la integración con OpenAI.

Obtener el emisor y las claves de firma

Obtén los valores de jwt.discovery_endpoints.oidc_discovery_url y jwt.discovery_endpoints.jwks_uri de tu dominio de confianza. Para encontrarlos, sigue las instrucciones de Idira para configurar OIDC.

OpenAI debe poder acceder al documento de descubrimiento y al conjunto de claves JWKS por HTTPS sin credenciales. El emisor es la URL HTTPS que aparece en el campo iss del token. El ID de SPIFFE del campo sub identifica tu carga de trabajo.

Elige una audiencia exclusiva para el acceso a OpenAI, como https://api.openai.com/v1. Usa el mismo valor al solicitar el JWT-SVID y al configurar el proveedor en OpenAI. La audiencia identifica al destinatario previsto del token. El punto de acceso para el intercambio de tokens se define por separado.

De forma predeterminada, SWA usa RS512 para firmar con una clave RSA de 4096 bits. El verificador de JWT de OpenAI acepta esta combinación. Para conocer otras opciones de firma de SWA, consulta los requisitos de Idira para los JWT.

Entregar un JWT-SVID vigente a la carga de trabajo

Instala spiffe-helper en el entorno de la carga de trabajo para solicitar un JWT-SVID al agente de SWA y renovarlo. Guarda la siguiente configuración como helper.conf. El proceso auxiliar escribe el token en /var/run/spiffe/openai.jwt, la ruta que usan los ejemplos compartidos de SPIFFE para el 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"
}]

En Kubernetes, ejecuta el proceso auxiliar en un contenedor sidecar dentro del pod de la carga de trabajo. Comparte un volumen emptyDir en memoria en /var/run/spiffe y monta el directorio que contiene el socket de SWA, /tmp/swa-agent/public, en el contenedor auxiliar. En máquinas virtuales, usa /run/swa-agent/api.sock como valor de agent_address y mantén el directorio del token en un sistema de almacenamiento en memoria. Sigue las instrucciones de despliegue de Idira para el acceso al socket y la atestación.

Antes de iniciar el proceso auxiliar, crea el directorio del token y dale al proceso permiso de escritura. Inicia el proceso auxiliar con esta configuración en el sidecar o en el servicio de la máquina virtual:

spiffe-helper -config helper.conf

Restringe el acceso al archivo del token y al socket del agente a los procesos que los necesitan. Mantén el proceso auxiliar en ejecución para que reemplace el token antes de que venza.

Si tu lenguaje cuenta con un cliente de la SPIFFE Workload API, también puedes obtener un JWT-SVID nuevo desde el proveedor de tokens de sujeto. Consulta la opción de acceso directo a la Workload API en la guía de integración de Idira.

Inspeccionar el token

Desde la carga de trabajo, lee el token y guárdalo en una variable de entorno para que el decodificador local pueda acceder a él:

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]));

Verifica estos campos antes de crear el proveedor en OpenAI:

Campo Valor esperado
Campo alg del encabezado El algoritmo de firma configurado, como RS512.
Campo kid del encabezado El ID de una clave de firma del JWKS público del dominio de confianza.
iss La URL HTTPS del emisor del dominio de confianza.
sub El ID de SPIFFE asignado a esta carga de trabajo.
aud Contiene la audiencia que elegiste para el acceso a OpenAI.
iat y exp Las marcas de tiempo de emisión y vencimiento del token. Usa un token vigente.

El decodificador lee los campos del token sin verificar la firma. No guardes el token en los registros ni lo pegues en un decodificador web. Elimina la variable de entorno TOKEN después de inspeccionar el token.

Configurar la federación de identidades de cargas de trabajo en OpenAI

Crear el proveedor de identidad de cargas de trabajo

Ve a Configuración de la organización > Seguridad > Proveedor de identidad de cargas de trabajo y crea un proveedor con estos ajustes:

Ajuste Valor
Nombre Un nombre único, como idira-prod.
Descripción La aplicación y el entorno que usan este proveedor.
URL del emisor OIDC El valor de iss del JWT-SVID.
Audiencia La audiencia que solicita el proceso auxiliar, como https://api.openai.com/v1.
Usar el JWKS cargado para verificar los tokens Mantén esta opción desactivada para usar el descubrimiento OIDC.
Transformaciones de atributos Deja este campo vacío si la asignación se basa directamente en sub.

Al intercambiar tokens, la API de OpenAI ignora las barras finales al comparar las URL del emisor. Por ejemplo, https://issuer.example.com y https://issuer.example.com/ coinciden. Todos los demás caracteres deben coincidir, incluidos los del esquema y la ruta. Los valores de audiencia deben coincidir exactamente. Para mantener la coherencia de la configuración, copia el valor del emisor tal como aparece en el token.

Si OpenAI no puede acceder al documento de descubrimiento o al JWKS, sigue las instrucciones generales de configuración del proveedor para cargar un JWKS público. Actualiza las claves cargadas cuando SWA rote sus claves de firma.

Asignar el ID de SPIFFE a una cuenta de servicio

  1. Crea una asignación de cuenta de servicio en el proveedor y dale un nombre, como idira-production-workload.
  2. En Clave, ingresa sub y, en Valor, ingresa el ID de SPIFFE exacto que figura en el token de la carga de trabajo, como spiffe://prod.example.com/k8s-nodegroup/ns/my-namespace/sa/my-service-account.
  3. Selecciona el Proyecto y la Cuenta de servicio que puede usar la carga de trabajo.
  4. Selecciona los Permisos que necesita la carga de trabajo, como api.model.request para las solicitudes a modelos. Estos permisos solo pueden restringir el acceso que ya tiene la cuenta de servicio. Si dejas el campo de permisos vacío, no se agrega ninguna restricción específica de la federación de identidades de cargas de trabajo.

Usa una cuenta de servicio distinta para cada aplicación y entorno. De preferencia, usa un ID de SPIFFE exacto. Usa un comodín al final solo si todas las identidades con ese prefijo deben tener el mismo acceso. Evita las asignaciones que se superpongan. Para obtener más información, consulta Asignaciones de cuentas de servicio para SPIFFE.

Usar el token en el código

En el entorno de la carga de trabajo, configura el ID de tu proveedor de OpenAI y el de la cuenta de servicio seleccionada:

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

Los siguientes ejemplos compartidos de SPIFFE leen /var/run/spiffe/openai.jwt. El proveedor de tokens de sujeto devuelve el token vigente cada vez que el SDK necesita intercambiarlo por un token de acceso de OpenAI o renovar ese token de acceso. SWA y el proceso auxiliar renuevan el JWT-SVID externo. El SDK de OpenAI administra el token de acceso de OpenAI.

Autenticación con un JWT-SVID de SPIFFE emitido por 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);

Verificar la configuración y solucionar problemas

Ejecuta el ejemplo dentro de la carga de trabajo atestada, sin definir la variable OPENAI_API_KEY. Si la solicitud se completa correctamente, se imprime la respuesta del modelo. Confirma que las solicitudes sigan completándose correctamente después de que el proceso auxiliar reemplace el JWT-SVID y el SDK renueve su token de acceso de OpenAI.

Síntoma Qué verificar
El proceso auxiliar no recibe ninguna identidad Verifica que la carga de trabajo cumpla con la política de atestación de SWA y pueda acceder al socket del agente. Ejecuta las comprobaciones en el contexto de la carga de trabajo.
El archivo del token no existe, está vacío o contiene un token vencido Verifica que el proceso auxiliar esté en ejecución, que el volumen compartido y la ruta del archivo coincidan con los configurados y que la carga de trabajo pueda leer el archivo. Mantén sincronizados los relojes de los hosts.
Falla la verificación del token Verifica los valores de iss, aud y kid, el vencimiento del token y el acceso al documento de descubrimiento y al JWKS. Aplica la regla de comparación del emisor descrita anteriormente.
No coincide ninguna asignación de cuenta de servicio Verifica el ID del proveedor, el ID de la cuenta de servicio, la asignación habilitada y el valor exacto de sub.
Coincide más de una asignación Restringe o desactiva las asignaciones que se superpongan para que coincida exactamente una asignación habilitada.
El intercambio se completa correctamente, pero la API rechaza la solicitud Verifica el proyecto y los permisos de la cuenta de servicio asociada, así como las políticas de acceso a la API que correspondan.

Para diagnosticar problemas con el despliegue de SWA, consulta las instrucciones de Idira para solucionar problemas de integración.