Skip to main content
Sign in →

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.

Solicitud → Autenticación → Política → Escaneo de seguridad → Límite de tasa → Servidor MCP upstreamPolicy

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.

CampoTipoDescripción
toolNamestringEl nombre de la herramienta MCP a la que aplica esta regla (p. ej. bash, read_file, query_database)
actionallow | deny | shadowQué hacer cuando la regla coincide
agentIdUUID | nullLimitar a un agente específico. null = aplica a todos los agentes del tenant
conditionsarray | nullArray de objetos de condición (lógica AND). Si se omite, la regla coincide incondicionalmente

Acciones

AcciónComportamiento
allowPermite la llamada a la herramienta. Las condiciones siguen siendo comprobadas.
denyBloquea la llamada y devuelve un error al agente.
shadowUtilizado 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.

json
// 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.

json
// 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.

json
// 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.

json
// 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:

1. Por vínculo (set per agent-to-server connection, nullable)
↓ si nulo
2. Por agente (set per agent, default true)
↓ si nulo
3. Global Shadow mode (tenant default) (default true)
NivelCómo configurar
GlobalDesactiva el modo sombra en Configuración → Seguridad para aplicar en todos los casos
Por agentePATCH /tenants/:tenantId/agents/:agentId con {"shadowMode": false}
Por vínculoPATCH /tenants/:tenantId/agents/:agentId/mcp-bindings/:mcpServerId con {"shadowMode": false}
Recommended rollout: Implementación recomendada: comienza globalmente en modo sombra (el predeterminado), ajusta por agente a medida que validas el tráfico de cada agente, luego establece 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.

TipoEditableDescripción
SistemaSolo lecturaIncluidas con ShieldAgent. Presets de seguridad, cumplimiento y desarrollo.
PersonalizadoCRUD completoCreadas por tu equipo. Conjuntos de reglas específicos de la organización para tu cadena de herramientas.

Crear y aplicar una plantilla personalizada

bash
# 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.

1.

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.

2.

Consulta periódica: Cada intervalo de recarga configurado (por defecto 30 s), el cargador obtiene GET /tenants/:tenantId/policies/compiled para cada tenant activo.

3.

Detección de cambios: Las reglas se hashean antes de activar la recompilación. Las consultas sin cambios tienen coste cero.

4.

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ónValor predeterminadoDescripción
Hot-reloadtrueEstablece false para deshabilitar la recarga en caliente completamente
Reload interval30000Intervalo de consulta en milisegundos
API URLURL 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

POST/tenants/:tenantId/policies·policy:writeCrear una regla de política
GET/tenants/:tenantId/policies·policy:readListar todas las políticas. Filtra con ?agentId= para un agente concreto
GET/tenants/:tenantId/policies/:policyId·policy:readObtener una política
PUT/tenants/:tenantId/policies/:policyId·policy:writeActualizar una política (parcial — incluye solo los campos modificados)
DELETE/tenants/:tenantId/policies/:policyId·policy:deleteEliminar una política
GET/tenants/:tenantId/policies/compiled·policy:readConjunto de reglas compilado usado por el proxy. Excluye reglas de acción shadow
POST/tenants/:tenantId/policies/invalidate·policy:writeForzar recarga en caliente inmediata en el proxy

Plantillas de políticas

GET/policy-templates·policy:readListar plantillas del sistema y plantillas personalizadas de tu tenant
GET/policy-templates/:templateId·policy:readObtener una plantilla
POST/tenants/:tenantId/policy-templates·policy:writeCrear una plantilla personalizada
PUT/tenants/:tenantId/policy-templates/:templateId·policy:writeActualizar una plantilla personalizada (las de sistema son de solo lectura)
DELETE/tenants/:tenantId/policy-templates/:templateId·policy:writeEliminar una plantilla personalizada
POST/tenants/:tenantId/policy-templates/:templateId/apply·policy:writeAplicar una plantilla — crea una política por regla, todas con alcance de todo el tenant

Ejemplo — Crear una política

bash
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

PermisoOtorga
policy:readVer políticas, plantillas y reglas compiladas
policy:writeCrear/actualizar políticas y plantillas, invalidar caché, aplicar plantillas
policy:deleteEliminar 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:

CampoValor / significado
outcomeallowed, denied, human_review_required o shadow
matchedRuleIdUUID de la primera regla coincidente; null para denegación implícita
shadowDenytrue cuando el modo sombra convirtió una denegación en permiso
reasonExplicación legible de la decisión
Motor de políticas