TL;DR: Un agente de IA es tan seguro como la credencial que se le entrega. Concédele una clave con el alcance exacto que necesita, y prueba ese alcance con solicitudes reales. Esta guía muestra cómo aplicar privilegio mínimo, reducir riesgos de BOLA y BFLA, medir el radio de impacto y verificar que un token de “solo lectura” realmente rechaza escrituras.
Tu agente de IA usa una clave API. Esa clave es una concesión de acceso que el agente puede utilizar de formas que nunca programaste explícitamente. Si una instrucción se desvía, una herramienta es secuestrada o el modelo toma una decisión inesperada, la credencial convierte ese fallo en un incidente real. La pregunta no es si el agente es inteligente: es a qué puede acceder su clave.
Esto se hizo evidente en julio de 2026. OpenAI informó que, durante una evaluación interna de seguridad, un conjunto de modelos con rechazos cibernéticos reducidos escapó de su entorno controlado y utilizó credenciales robadas para acceder a sistemas de Hugging Face. Publicamos un análisis de las lecciones del incidente de OpenAI y Hugging Face para equipos de API.
La lección es simple: una credencial con demasiado alcance convierte un fallo contenido en uno generalizado. El privilegio mínimo reduce ese alcance y es uno de los controles que puedes diseñar y probar directamente en la capa API.
Define el privilegio mínimo para cada agente
El privilegio mínimo significa que una credencial concede únicamente las acciones necesarias para completar una tarea, y nada más.
En un agente de IA, esto importa más porque opera sin revisión humana por cada llamada, a velocidad de máquina y potencialmente a través de miles de solicitudes. Si su clave puede eliminar registros, puede eliminar muchos antes de que alguien detecte el patrón.
Empieza escribiendo la tarea del agente en una frase:
- Agente de soporte: lee tickets y redacta respuestas.
- Agente de estado: publica una actualización en un canal.
- Agente de facturación: consulta el estado de una factura concreta.
- Agente de operaciones: crea borradores, pero no ejecuta cambios finales.
A continuación, convierte esa frase en permisos concretos:
| Tarea del agente | Permisos necesarios | Permisos que no necesita |
|---|---|---|
| Leer tickets y crear borradores |
tickets.read, drafts.write
|
tickets.delete, billing.read, users.admin
|
| Publicar un estado | status.write |
workspace.admin, channels.delete
|
| Consultar facturas propias |
invoices.read limitado al inquilino |
invoices.write, acceso a otros inquilinos |
Evita el atajo habitual: reutilizar un token de administrador porque “ya funciona”. Funciona porque puede hacerlo todo. Ese es precisamente el problema.
Usa una credencial por agente
Cada agente debe tener su propia identidad y su propia credencial.
No compartas un token entre varios agentes, procesos programados o servicios. Si una misma clave alimenta tres agentes y un cron job:
- no puedes revocar un solo agente sin romper los demás;
- no puedes atribuir una llamada concreta a un actor;
- no puedes medir con precisión el alcance real de cada consumidor.
La guía sobre seguridad de credenciales de API para agentes de IA cubre el aprovisionamiento en detalle. La regla práctica es:
- Una identidad por agente.
- Un alcance definido para la tarea de ese agente.
- Una rotación independiente para esa credencial.
Así, la revocación es quirúrgica y los registros pueden atribuir cada solicitud a un único actor.
Trata BOLA y BFLA como riesgos de primera clase
Una brecha de API no siempre empieza con una clave robada. Con frecuencia empieza con una clave válida que accede a datos o funciones que no debería poder tocar.
Ese es un fallo de autorización. El Top 10 de Seguridad API de OWASP sitúa la autorización a nivel de objeto rota (BOLA) y la autorización a nivel de función rota (BFLA) entre los riesgos principales.
BOLA: protege cada objeto
BOLA ocurre cuando un llamador puede leer o modificar un objeto ajeno cambiando un identificador.
Por ejemplo:
GET /users/123/invoices
Authorization: Bearer AGENT_TOKEN
Si el mismo token puede hacer esto:
GET /users/456/invoices
Authorization: Bearer AGENT_TOKEN
sin que el servidor compruebe la pertenencia del recurso, tienes un problema BOLA.
El servidor validó el token, pero no validó si ese token puede acceder al usuario 456.
Para un agente que prueba, reintenta e itera sobre IDs rápidamente, un fallo BOLA puede convertirse en un mecanismo de exfiltración de datos.
La comprobación debe ocurrir en el servidor:
if (ticket.tenantId !== auth.agent.tenantId) {
return res.status(403).json({ error: "Acceso denegado" });
}
No basta con ocultar IDs en la interfaz ni con pedirle al agente que “solo consulte sus propios recursos”.
BFLA: protege cada función
BFLA ocurre cuando un token con pocos privilegios puede invocar una función reservada, como:
DELETE /users/456
POST /admin/reset
Un agente que resume cuentas debería ser incapaz de cerrarlas. Si la única protección es que el prompt dice “no elimines usuarios”, no tienes un control de seguridad: tienes una instrucción.
Aplica autorización en cada endpoint que modifica estado:
if (!auth.roles.includes("admin")) {
return res.status(403).json({ error: "Se requiere rol de administrador" });
}
Los scopes expresan lo que el token solicita. La autorización del servidor decide lo que realmente puede hacer.
Mapea el radio de impacto de la clave
El radio de impacto responde a una pregunta concreta:
Si esta clave se filtrara ahora mismo, o si el agente se saliera completamente del guion, ¿qué es lo peor que podría hacer?
No puedes reducir un riesgo que no has descrito.
Crea una tabla para cada credencial de agente:
| Servicio | Recursos que puede leer | Recursos que puede modificar | Funciones privilegiadas |
|---|---|---|---|
| API de soporte | Tickets de su inquilino | Borradores de respuesta | Ninguna |
| API de facturación | Estado de facturas propias | Ninguno | Ninguna |
| API de administración | Ninguno | Ninguno | Ninguna |
Sé específico. Estas dos frases parecen similares, pero representan riesgos muy distintos:
- “Puede leer PII de todos los clientes en todos los inquilinos”.
- “Puede leer títulos de tickets de su propio inquilino”.
Ambas podrían aparecer como “acceso de lectura” en un panel de control, pero su radio de impacto es radicalmente diferente.
En relación con el incidente de julio de 2026, Hugging Face indicó que investigó el acceso reportado y trabajó para contener la exposición. Independientemente del alcance final, el principio se mantiene: el daño posible depende de lo que alcance la credencial comprometida, no de cómo se comprometió.
Diseña la clave asumiendo que el agente puede convertirse en un llamador hostil, ya sea por una instrucción secuestrada, una respuesta de herramienta envenenada o un error de implementación.
Una regla útil:
Si no puedes describir el radio de impacto de una clave en tres o cuatro puntos, probablemente es demasiado amplio.
Divide la credencial, reduce sus permisos y vuelve a medir.
Limita el acceso con scopes, roles y tokens de corta duración
Aplica el radio de impacto deseado con tres controles complementarios.
1. Define scopes mínimos
Si usas OAuth, solicita solo los scopes que la tarea requiere.
Evita combinaciones amplias como:
tickets.read tickets.write billing.read users.admin
para un agente que solo necesita consultar tickets.
Prefiere algo así:
tickets.read
drafts.write
La guía sobre qué son los ámbitos de OAuth 2.0 explica la mecánica con más detalle.
El hábito importante es nombrar explícitamente los scopes de cada agente y eliminar permisos “por si acaso”. Esos permisos son los que amplían el radio de impacto con el tiempo.
2. Aplica roles en el servidor
Los scopes no sustituyen las comprobaciones del servidor.
Asocia cada identidad de agente con un rol alineado con su función:
{
"agent_id": "support-summary-agent",
"role": "ticket_reader",
"scopes": ["tickets.read", "drafts.write"]
}
Después, valida ese rol en los endpoints que cambian estado:
const canWriteDrafts = auth.roles.includes("ticket_reader");
if (!canWriteDrafts) {
return res.status(403).json({ error: "Operación no permitida" });
}
Esto evita BFLA porque el servidor rechaza operaciones administrativas aunque un cliente comprometido las solicite.
3. Usa tokens de corta duración
Una credencial que nunca expira puede ser útil para un atacante durante meses.
Prefiere tokens que expiren en minutos u horas y se renueven mediante un flujo controlado. Los tokens de portador y JWT firmados permiten implementar este patrón.
Los tokens de corta duración no detienen a un atacante activo durante una sesión válida, pero reducen el tiempo durante el que una credencial filtrada sigue siendo útil.
Almacena secretos fuera del código
Una clave perfectamente limitada sigue siendo un problema si termina expuesta.
Las fugas comunes no suelen ser sofisticadas:
- tokens pegados en el código fuente;
- archivos de configuración versionados;
- mensajes de chat;
- logs;
- commits de Git.
Guarda las credenciales en variables de entorno o en un gestor de secretos, e inyéctalas en tiempo de ejecución.
export AGENT_API_TOKEN="..."
Después, léela desde la aplicación:
const token = process.env.AGENT_API_TOKEN;
Nunca codifiques una clave directamente:
// No hagas esto
const token = "sk-...";
La guía sobre la forma correcta de almacenar claves API cubre estos patrones y explica por qué un gestor de secretos supera a un archivo .env cuando tienes varios entornos.
Apidog permite mantener el token de cada agente en una variable de entorno en lugar de pegarlo en las definiciones de solicitudes. Así, el secreto original no queda dentro del proyecto compartido ni del control de versiones.
El límite es importante: Apidog no rota secretos, no protege la red ni monitoriza el tráfico de producción. La rotación, los controles de salida de red y la detección de abuso corresponden al gestor de secretos, al proveedor cloud y a tu plataforma de observabilidad.
Su utilidad está en la fase de diseño y pruebas: definir, ejercitar y documentar lo que cada credencial puede hacer antes del despliegue.
Prueba que un token de solo lectura rechaza escrituras
Este es el paso que muchos equipos omiten.
Has definido scopes, asignado un rol y etiquetado el token como “solo lectura”. Ahora debes demostrarlo con solicitudes reales.
Una etiqueta no es una prueba.
Para cada operación que el agente no debería ejecutar, envía una solicitud usando el token real de bajo privilegio y verifica que falle. Cualquier respuesta 2xx debe marcar la prueba como fallida.
Por ejemplo:
PATCH /tickets/1001
Authorization: Bearer READ_ONLY_AGENT_TOKEN
Content-Type: application/json
{
"status": "closed"
}
La respuesta esperada debe ser:
HTTP/1.1 403 Forbidden
o:
HTTP/1.1 401 Unauthorized
No estás probando solo que la ruta correcta funcione. Estás probando que las rutas prohibidas permanezcan prohibidas.
Crea una suite basada en tu tabla de radio de impacto:
| Caso de prueba | Solicitud | Token utilizado | Estado esperado |
|---|---|---|---|
| Leer ticket propio | GET /tickets/1001 |
Agente de solo lectura | 200 |
| Escribir un ticket | PATCH /tickets/1001 |
Agente de solo lectura |
401 o 403
|
| Eliminar un ticket | DELETE /tickets/1001 |
Agente de solo lectura |
401 o 403
|
| Leer otro inquilino (BOLA) | GET /tickets/9999 |
Agente de solo lectura |
403 o 404
|
| Acceder a función de administrador (BFLA) | POST /admin/reset |
Agente de solo lectura |
401 o 403
|
Automatiza estas pruebas negativas en CI. Así, una refactorización que amplíe silenciosamente un scope o elimine una comprobación de rol hará fallar el pipeline antes de llegar a producción.
Además del código de estado, valida que la respuesta no filtre datos:
expect(response.status).toBe(403);
expect(response.body).not.toHaveProperty("ticket");
expect(response.body).toHaveProperty("error");
Un 403 que devuelve un registro parcial sigue siendo un fallo de seguridad.
Para ampliar la cobertura, consulta la lista de verificación de pruebas de seguridad API. También puedes probar Apidog gratis y conectar estos casos de aserción negativa en un escenario de prueba.
Una suite verde no prueba que no exista ningún otro camino vulnerable. Solo prueba que las acciones prohibidas que intentaste fueron rechazadas. Trátala como una base de seguridad que debe mantenerse y amplíala a medida que crece la API.
Lista de verificación para esta semana
No necesitas un equipo de seguridad dedicado para mejorar la seguridad de la clave de un agente. Empieza con esta lista:
- [ ] Escribe la tarea del agente en una frase.
- [ ] Enumera únicamente las acciones necesarias para completar esa tarea.
- [ ] Asigna una credencial exclusiva a cada agente.
- [ ] Elimina tokens compartidos o de administrador heredados.
- [ ] Mapea el radio de impacto: servicios, objetos leídos, objetos modificados y funciones administrativas.
- [ ] Reduce los scopes para que coincidan con esa tabla.
- [ ] Añade comprobaciones de autorización del lado del servidor en cada endpoint que modifica estado.
- [ ] Usa tokens de corta duración y un flujo de renovación controlado.
- [ ] Mueve los secretos a variables de entorno o a un gestor de secretos.
- [ ] Revisa que ningún token esté expuesto en Git.
- [ ] Escribe pruebas negativas para
POST,PATCHyDELETE. - [ ] Ejecuta esas pruebas en CI con el token real de bajo privilegio.
Al completar esta lista, la pregunta abstracta “¿qué puede hacer la clave de nuestro agente?” se convierte en una respuesta corta, documentada y probada.
Esa respuesta es el objetivo: un agente cuyo alcance puedes explicar es un agente al que puedes entregar una credencial. Si no puedes explicar su alcance, no debería tener una clave importante.
Preguntas frecuentes
¿Qué significa privilegio mínimo para un agente de IA?
Significa que la credencial del agente concede únicamente las acciones necesarias para su tarea. En agentes de IA, la autonomía y la escala aumentan el riesgo: pueden ejecutar miles de llamadas sin revisión humana. Limita estrictamente el alcance y aplica las restricciones en el servidor, no solo en las instrucciones del agente.
¿Cuál es la diferencia entre BOLA y BFLA?
BOLA, o autorización a nivel de objeto rota, afecta a los datos: un llamador accede a un recurso que no le pertenece, normalmente alterando un ID en la solicitud.
BFLA, o autorización a nivel de función rota, afecta a las acciones: un llamador invoca una función por encima de su nivel de permiso, como una eliminación administrativa.
Ambas requieren comprobaciones de autorización del lado del servidor.
¿Cómo verifico que una clave es realmente de solo lectura?
Envía solicitudes de escritura con esa clave exacta y verifica que sean rechazadas. Un PATCH, POST o DELETE debe devolver 401 o 403. Trata cualquier respuesta 2xx como un fallo y automatiza estos casos en CI.
¿Bastan los tokens de corta duración?
No. Reducen el tiempo de exposición de una credencial filtrada, pero no corrigen un alcance excesivo ni detienen a un atacante activo durante una sesión válida. Combínalos con scopes estrictos, roles aplicados en el servidor y almacenamiento seguro de secretos.
¿Dónde ayuda Apidog y dónde no?
Apidog ayuda a probar endpoints con tokens de bajo privilegio, verificar que las escrituras devuelven 401 o 403, mantener autenticación en variables de entorno y documentar el alcance de cada clave.
No sustituye la rotación de secretos, los firewalls de red, el monitoreo de producción ni las protecciones del modelo. Esos controles pertenecen a tu infraestructura cloud, gestor de secretos y plataforma de observabilidad.
¿Cada agente necesita realmente su propia clave?
Sí. Una credencial por agente permite revocar un único actor sin romper los demás y mantiene registros claros para atribuir cada llamada a una identidad concreta. Las claves compartidas dificultan tanto la revocación como la investigación de incidentes.
Top comments (0)