Motor de políticas
Reglas granulares que controlan qué herramientas MCP pueden invocar los agentes, bajo qué condiciones y si las infracciones se aplican o se observan silenciosamente en modo sombra.
Cómo funciona
El motor de políticas se sitúa en la Etapa 2 del pipeline del proxy de ShieldAgent, evaluado después de la autenticación y antes del escáner de seguridad. Cada solicitud tools/call se compara con el conjunto de reglas de tu tenant. Otros métodos MCP (tools/list, resources/read, etc.) pasan sin comprobaciones de políticas.
Predeterminado: denegación implícita. Si ninguna regla de política coincide con una solicitud (agentId, toolName) el motor la deniega. Las herramientas sin reglas de permiso explícitas quedan bloqueadas por defecto, sin necesidad de configuración adicional para mantenerse seguro.
Esquema de política
Cada política vincula un nombre de herramienta a una acción y opcionalmente añade condiciones que deben satisfacerse todas para que la regla se active.
| Campo | Tipo | Descripción |
|---|---|---|
| toolName | string | El nombre de la herramienta MCP a la que aplica esta regla (p. ej. bash, read_file, query_database) |
| action | allow | deny | shadow | Qué hacer cuando la regla coincide |
| agentId | UUID | null | Limitar a un agente específico. null = aplica a todos los agentes del tenant |
| conditions | array | null | Array de objetos de condición (lógica AND). Si se omite, la regla coincide incondicionalmente |
Acciones
| Acción | Comportamiento |
|---|---|
| allow | Permite la llamada a la herramienta. Las condiciones siguen siendo comprobadas. |
| deny | Bloquea la llamada y devuelve un error al agente. |
| shadow | Utilizado por el sistema de plantillas. Excluido del conjunto de reglas activo — el modo sombra se controla por separado mediante la cascada (ver más abajo). |
Alcance y precedencia
Las reglas específicas de agente (agentId no nulo) tienen prioridad sobre las reglas de todo el tenant (agentId: null). Dentro del mismo nivel de especificidad, las reglas de denegación se ejecutan antes que las de permiso y las reglas condicionales antes que las incondicionales.
Tipos de condición
Las condiciones son predicados opcionales en una regla. Cuando hay múltiples condiciones, todas deben coincidir (lógica AND). Si alguna condición falla, la regla se omite y la evaluación continúa con la siguiente regla.
param_contains — Coincidencia de subcadena
Comprueba si un parámetro de solicitud contiene una subcadena dada (sensible a mayúsculas). Usa notación de punto para acceder a campos anidados como arguments.command.
// Deny any bash call where the command contains "rm -rf"
{
"toolName": "bash",
"action": "deny",
"conditions": [
{
"type": "param_contains",
"param": "arguments.command",
"value": "rm -rf"
}
]
}param_matches — Coincidencia de expresión regular
Comprueba si un parámetro de solicitud coincide con una expresión regular ECMAScript. Útil para listas de rutas permitidas o patrones de valor estructurado.
// Allow read_file only for paths under /app/data/
{
"toolName": "read_file",
"action": "allow",
"conditions": [
{
"type": "param_matches",
"param": "arguments.path",
"pattern": "^\/app\/data\/"
}
]
}time_window — Restricción de horas UTC
Restringe el acceso a la herramienta a horas UTC específicas usando un rango semiabierto [inicio, fin). Combínalo con otras condiciones para imponer acceso solo en horario laboral.
// Allow query_database only during business hours (09:00–17:00 UTC)
{
"toolName": "query_database",
"action": "allow",
"conditions": [
{
"type": "time_window",
"allowedHours": [9, 17]
}
]
}rate_limit — Límite de invocaciones
Declara una tasa máxima de invocaciones para la herramienta. El evaluador de políticas registra el umbral; la aplicación la gestiona la etapa dedicada de límite de tasa del proxy.
// Cap send_email to 10 calls per minute
{
"toolName": "send_email",
"action": "allow",
"conditions": [
{
"type": "rate_limit",
"maxPerMinute": 10
}
]
}Modo sombra
El modo sombra permite implementar nuevas políticas de forma segura. Cuando está habilitado, el motor evalúa cada solicitud normalmente pero no la bloquea aunque coincida una regla de denegación. La decisión se registra en el registro de auditoría con outcome: 'shadow' and a shadowDeny: true para que puedas revisar el impacto antes de aplicarlo.
Cascada de tres niveles
El modo sombra se resuelve de más específico a menos específico — el primer valor no nulo tiene precedencia:
| Nivel | Cómo configurar |
|---|---|
| Global | Desactiva el modo sombra en Configuración → Seguridad para aplicar en todos los casos |
| Por agente | PATCH /tenants/:tenantId/agents/:agentId con {"shadowMode": false} |
| Por vínculo | PATCH /tenants/:tenantId/agents/:agentId/mcp-bindings/:mcpServerId con {"shadowMode": false} |
shadow mode = off una vez que todos los agentes estén confirmados como limpios.Plantillas de políticas
Las plantillas son conjuntos de reglas preconfigurados que puedes aplicar a un tenant en una sola llamada a la API. Al aplicar una plantilla se crea un registro de política por regla, con alcance de todo el tenant. ShieldAgent incluye plantillas del sistema para escenarios comunes de seguridad, cumplimiento y desarrollo; también puedes crear plantillas personalizadas para conjuntos de reglas específicos de tu organización.
| Tipo | Editable | Descripción |
|---|---|---|
| Sistema | Solo lectura | Incluidas con ShieldAgent. Presets de seguridad, cumplimiento y desarrollo. |
| Personalizado | CRUD completo | Creadas por tu equipo. Conjuntos de reglas específicos de la organización para tu cadena de herramientas. |
Crear y aplicar una plantilla personalizada
# Create a custom template
curl -s -X POST https://api.shieldagent.io/tenants/:tenantId/policy-templates \
-H 'Authorization: Bearer <token>' \
-H 'Content-Type: application/json' \
-d '{
"name": "Restrict destructive tools",
"description": "Deny dangerous shell commands for production agents",
"category": "security",
"rules": [
{
"toolName": "bash",
"action": "deny",
"conditions": [{"type": "param_contains", "param": "arguments.command", "value": "rm -rf"}]
},
{
"toolName": "bash",
"action": "deny",
"conditions": [{"type": "param_contains", "param": "arguments.command", "value": "DROP TABLE"}]
}
]
}'
# Apply a template (creates one policy per rule)
curl -s -X POST https://api.shieldagent.io/tenants/:tenantId/policy-templates/:templateId/apply \
-H 'Authorization: Bearer <token>'Arquitectura de recarga en caliente
Los cambios de política surten efecto sin reiniciar el proxy. El proxy mantiene un conjunto de reglas compilado en memoria por tenant y lo actualiza automáticamente.
Hidratación al arrancar: Al iniciar, el cargador lee de Redis (cuando está configurado) para disponibilidad inmediata de políticas, sin esperar la primera consulta periódica.
Consulta periódica: Cada intervalo de recarga configurado (por defecto 30 s), el cargador obtiene GET /tenants/:tenantId/policies/compiled para cada tenant activo.
Detección de cambios: Las reglas se hashean antes de activar la recompilación. Las consultas sin cambios tienen coste cero.
Invalidación push: Para cambios críticos (p. ej. una nueva regla de denegación), llama a POST /tenants/:tenantId/policies/invalidate para forzar una recarga inmediata sin esperar la consulta periódica.
| Configuración | Valor predeterminado | Descripción |
|---|---|---|
| Hot-reload | true | Establece false para deshabilitar la recarga en caliente completamente |
| Reload interval | 30000 | Intervalo de consulta en milisegundos |
| API URL | — | URL base de la API de gestión. Necesaria para habilitar la recarga en caliente |
Referencia de API
Todos los endpoints de políticas requieren un token bearer. Consulta Autenticación para más detalles.
Políticas
policy:write—Crear una regla de políticapolicy:read—Listar todas las políticas. Filtra con ?agentId= para un agente concretopolicy:read—Obtener una políticapolicy:write—Actualizar una política (parcial — incluye solo los campos modificados)policy:delete—Eliminar una políticapolicy:read—Conjunto de reglas compilado usado por el proxy. Excluye reglas de acción shadowpolicy:write—Forzar recarga en caliente inmediata en el proxyPlantillas de políticas
policy:read—Listar plantillas del sistema y plantillas personalizadas de tu tenantpolicy:read—Obtener una plantillapolicy:write—Crear una plantilla personalizadapolicy:write—Actualizar una plantilla personalizada (las de sistema son de solo lectura)policy:write—Eliminar una plantilla personalizadapolicy:write—Aplicar una plantilla — crea una política por regla, todas con alcance de todo el tenantEjemplo — Crear una política
curl -s -X POST https://api.shieldagent.io/tenants/:tenantId/policies \
-H 'Authorization: Bearer <token>' \
-H 'Content-Type: application/json' \
-d '{
"toolName": "bash",
"action": "deny",
"agentId": null,
"conditions": [
{
"type": "param_contains",
"param": "arguments.command",
"value": "rm -rf"
}
]
}'Permisos requeridos
| Permiso | Otorga |
|---|---|
| policy:read | Ver políticas, plantillas y reglas compiladas |
| policy:write | Crear/actualizar políticas y plantillas, invalidar caché, aplicar plantillas |
| policy:delete | Eliminar políticas y plantillas personalizadas |
Registro de auditoría
Cada evaluación de política se añade al registro de auditoría inmutable. Campos clave en cada evento:
| Campo | Valor / significado |
|---|---|
| outcome | allowed, denied, human_review_required o shadow |
| matchedRuleId | UUID de la primera regla coincidente; null para denegación implícita |
| shadowDeny | true cuando el modo sombra convirtió una denegación en permiso |
| reason | Explicación legible de la decisión |