Qué decide cada uno
| Situación | Con roles y GRANT | Con Vericto delante |
|---|---|---|
| Un DELETE o UPDATE sin WHERE | Se ejecuta si el rol tiene el privilegio DELETE o UPDATE sobre la tabla. | Se bloquea por defecto, antes de llegar a la base de datos. |
| DROP o TRUNCATE | Se ejecuta si el rol es dueño de la tabla o tiene el privilegio correspondiente. | Se bloquea por defecto. |
| Leer una columna con datos personales | Privilegios por columna o vistas, que hay que mantener para cada rol. | La columna se etiqueta como sensible: la query se bloquea, se marca o devuelve el valor enmascarado (Postgres y MySQL). |
| Limitar un agente a ciertas tablas | Un rol por agente, con sus GRANT. | Una allowlist por agente, de tablas y columnas, evaluada sobre el AST. |
| Saber qué intentó ejecutar el agente | Los logs de la base de datos, si están activados. | Cada decisión en el audit trail, con la regla y el nodo del AST; exportaciones firmadas. |
| Probar un cambio de política | Se prueba en otro entorno. | El simulador lo evalúa contra el tráfico real, y el modo observación marca sin bloquear. |
Por qué un rol de solo lectura no siempre alcanza
Muchos agentes necesitan escribir: crear un registro, actualizar un estado, correr una migración. Darles solo lectura los deja sin poder hacer su trabajo; darles escritura les da también la sentencia destructiva. La base de datos evalúa permisos, no la forma de la sentencia: UPDATE orders SET status = 'paid' WHERE id = 42 y el mismo UPDATE sin WHERE requieren exactamente el mismo privilegio.
Y aun con solo lectura, un SELECT email, card_number FROM customers lleva datos personales y de pago al contexto de un LLM.
Lo que Vericto no reemplaza
- Los roles con mínimo privilegio, los privilegios por columna, las vistas y el row-level security siguen siendo la primera línea. Vericto es defensa en profundidad.
- Solo el proxy TCP está entre la query y la base de datos. La API, la CLI y MCP informan el veredicto; para que sea un control, el agente debe llegar a los datos a través del proxy.
- Por defecto, una query que no se puede parsear pasa y queda registrada (fail-open); el workspace puede cambiar a fail-closed.
Cómo usarlos juntos
- Un rol por aplicación o por agente, con los privilegios mínimos que necesita.
- Vericto delante, con el proxy, para las reglas sobre la sentencia: sin WHERE, DROP, TRUNCATE, columnas sensibles y la allowlist del agente.
- El modo observación primero, para ver qué se bloquearía antes de bloquear.