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
GlobalPanel: Configuración → Seguridad → Interruptor de modo sombra. SDK: client.tenants.update({ shadowMode: false })
Por agentePanel: Agentes → [agente] → Configuración → Interruptor de modo sombra. SDK: client.agents.update(agentId, { shadowMode: false })
Por vínculoPanel: Agentes → [agente] → Servidores MCP → [servidor] → Modo sombra. SDK: client.agents.updateBinding(agentId, mcpServerId, { 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

typescript
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:

  1. 1Ve a Políticas en la barra lateral izquierda para ver la lista completa de reglas de tu tenant.
  2. 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.
  3. 3Usa la barra de búsqueda y filtros para encontrar políticas por nombre de herramienta, acción o agente.
  4. 4Haz clic en cualquier fila de política para editarla o eliminarla. Los cambios se recargan en caliente en el proxy automáticamente.
  5. 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

Crear una regla de políticaPanel: Políticas → Nueva política. SDK: client.policies.create({ toolName, action, ... })
Listar todas las políticasPanel: página Políticas. SDK: client.policies.list() — filtra por agentId para un agente concreto
Actualizar una políticaPanel: Políticas → clic en fila → editar. SDK: client.policies.update(policyId, { ... })
Eliminar una políticaPanel: Políticas → clic en fila → Eliminar. SDK: client.policies.delete(policyId)
Forzar recarga en caliente inmediataPanel: Políticas → Invalidar caché. SDK: client.policies.invalidateCache()

Plantillas de políticas

Listar todas las plantillasPanel: Políticas → pestaña Plantillas. SDK: client.policyTemplates.list()
Crear una plantilla personalizadaPanel: Políticas → Plantillas → Nueva plantilla. SDK: client.policyTemplates.create({ name, rules, ... })
Actualizar una plantilla personalizadaPanel: Políticas → Plantillas → clic en fila → editar. SDK: client.policyTemplates.update(templateId, { ... })
Aplicar una plantillaPanel: Políticas → Plantillas → clic en fila → Aplicar. SDK: client.policyTemplates.apply(templateId)

Ejemplo — Crear una política

typescript
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

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