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 | Panel: Configuración → Seguridad → Interruptor de modo sombra. SDK: client.tenants.update({ shadowMode: false }) |
| Por agente | Panel: Agentes → [agente] → Configuración → Interruptor de modo sombra. SDK: client.agents.update(agentId, { shadowMode: false }) |
| Por vínculo | Panel: Agentes → [agente] → Servidores MCP → [servidor] → Modo sombra. SDK: client.agents.updateBinding(agentId, mcpServerId, { 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
import ShieldAgent from '@shieldagent/sdk';
const client = new ShieldAgent();
// Create a custom template
const template = await client.policyTemplates.create({
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)
await client.policyTemplates.apply(template.id);Actualizaciones de políticas en vivo
Los cambios de política surten efecto automáticamente — no se necesita reinicio ni redespliegue. Cuando creas, actualizas o eliminas una política en el panel o vía la API, el cambio es recogido por el proxy en segundos. Para cambios urgentes (como añadir una nueva regla de denegación), puedes forzar una actualización inmediata desde el panel o la API.
Gestión de políticas en el panel
El panel es la forma recomendada de crear, revisar y gestionar políticas:
- 1Ve a Políticas en la barra lateral izquierda para ver la lista completa de reglas de tu tenant.
- 2Haz clic en Nueva política para crear una regla: establece el nombre de herramienta, la acción, el alcance de agente opcional y las condiciones.
- 3Usa la barra de búsqueda y filtros para encontrar políticas por nombre de herramienta, acción o agente.
- 4Haz clic en cualquier fila de política para editarla o eliminarla. Los cambios se recargan en caliente en el proxy automáticamente.
- 5Ve a Configuración → Seguridad para activar o desactivar el modo sombra globalmente para el tenant.
SDK y Panel
Todas las operaciones de políticas requieren autenticación. Consulta Autenticación para más detalles.
Políticas
Plantillas de políticas
Ejemplo — Crear una política
import ShieldAgent from '@shieldagent/sdk';
const client = new ShieldAgent();
await client.policies.create({
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 |