Seguridad

Escrito para que lo revise su equipo de sistemas

Aquí no va a leer que la seguridad es nuestra prioridad. Va a leer qué mecanismo protege qué cosa, con qué número, y al final una lista de lo que todavía no está construido.

  • 23 tablas con seguridad a nivel de fila en modo FORCE
  • 4 capas de aislamiento independientes entre empresas
  • 55 suites de pruebas que corren en cada cambio
  • 20 s de vida máxima para la jaula donde corre el código

Aislamiento entre empresas

Cuatro capas que no dependen unas de otras

La pregunta que hace todo responsable de sistemas es si el vecino puede leer sus documentos. La respuesta corta es no. La larga es que hay que romper cuatro cosas distintas para conseguirlo.

01

La consulta lleva la empresa adentro

Cada fila que pertenece a una empresa carga su identificador, y la empresa activa se toma de la cabecera verificada de la sesión, nunca del cuerpo de la petición. Las dos piernas de la búsqueda, la semántica y la de término exacto, llevan la condición de empresa dentro del SQL. No es un filtro que se aplica al resultado.

02

La base de datos lo vuelve a comprobar

PostgreSQL aplica seguridad a nivel de fila en modo FORCE sobre las 33 tablas que llevan identificador de empresa. El identificador se fija dentro de la transacción, y ese alcance es transaccional, así que una conexión reutilizada del pool no puede arrastrar el valor a la petición siguiente. Una prueba revisa que toda tabla nueva con identificador de empresa tenga la política activa, y rompe la integración si alguien la olvida.

03

El sistema de archivos separa las carpetas

Una carpeta por empresa, creada en modo 0700 y propiedad del usuario del servicio. Aunque el código de la aplicación se equivocara, el sistema operativo no permite leer el contenido de una empresa desde otra. Las carpetas se reconcilian de forma idempotente en cada instalación.

04

El grafo tiene su propio espacio de nombres

Un espacio por identificador de empresa, con el UUID y no con el nombre corto, así que renombrar una empresa nunca deja su grafo huérfano. El cliente nunca envía consultas al grafo: el servicio las construye y valida cualquier ruta contra los documentos de la propia empresa antes de tocar nada.

Una suite dedicada intenta cruzar esos límites en cada cambio, con peticiones concurrentes intercaladas entre empresas. Es la prueba que más nos interesa que siga fallando el día que alguien rompa algo.

Autenticación y superficie expuesta

Lo aburrido, hecho

Ninguna de estas líneas es novedosa. Todas son las que se descubren ausentes cuando ya pasó algo.

Identidad y sesión

  1. Las contraseñas se guardan con argon2.
  2. Token de acceso de quince minutos y token de refresco de siete días, firmados con secretos distintos.
  3. El refresco lleva un número de versión: cerrar sesión invalida al instante todas las sesiones vivas de esa cuenta.
  4. Límite por IP contra fuerza bruta en el inicio de sesión y en el refresco.
  5. El registro público está desactivado. Las cuentas las crea una persona.
  6. Un administrador solo puede tocar roles estrictamente por debajo del suyo, y el último propietario activo no se puede degradar ni eliminar.

Superficie HTTP

  1. helmet y hpp en el arranque, no como plan a futuro.
  2. CORS con lista explícita de orígenes permitidos, sin comodín.
  3. Cuerpo de petición limitado a 100 kb.
  4. Validación global que rechaza los campos desconocidos en lugar de ignorarlos en silencio.
  5. Cien peticiones por minuto de límite general, más límites por empresa en las rutas del agente y de búsqueda.
  6. Los errores llevan un identificador de correlación y no devuelven la traza de la excepción.

Tres puertas separadas

  1. La aplicación del producto, la consola de administración de la empresa y la consola de plataforma son tres entradas distintas.
  2. La consola de plataforma exige además la marca de administrador de plataforma: una cuenta de empresa perfectamente válida es rechazada ahí y se la remite a su propio acceso.
  3. Un administrador de plataforma llega a los datos de una empresa solo entrando explícitamente en ella.
  4. Una misma persona puede pertenecer a varias empresas con un solo correo, y cambiar de una a otra es un clic que rehace el alcance completo de la sesión.

Secretos de la empresa

  1. Se guardan cifrados con pgcrypto y se descifran solo dentro del proceso.
  2. Ningún endpoint devuelve el valor. La lista es de nombres, y la interfaz muestra Valor oculto.
  3. La pestaña es exclusiva del propietario de la empresa.
  4. Se inyectan a una ejecución en jaula únicamente cuando la herramienta lo pide de forma explícita. Por defecto no se inyecta ninguno.
  5. Un filtro de ingesta bloquea archivos .env, .pem, .key, credenciales e identidades SSH antes de indexar, así que un secreto no llega ni a la bóveda ni al índice.

El agente

Hasta dónde llega y dónde ejecuta

Un agente que escribe archivos es útil justamente por lo que puede hacer. Lo que su equipo de sistemas necesita poder señalar es dónde termina.

Su frontera es el montaje de su departamento

Cada chat del agente trabaja dentro del subárbol de archivos de su propio proyecto. Los proyectos padre y los proyectos conectados no se montan: el agente los conoce por el resumen que le inyectamos, con la descripción, la memoria, las tareas abiertas y un listado de archivos. Lo decimos así, y no como permiso archivo por archivo, porque eso es lo que hoy aplica el sistema.

Un caso real que corregimos

Una sesión sin ruta asignada caía al directorio raíz de la empresa, y ahí un chat de un departamento podía leer archivos de otro. Hoy una ruta que no se puede resolver devuelve un directorio aislado por empresa, nunca la raíz de la bóveda. Lo contamos porque es exactamente el tipo de fallo que un proveedor prefiere no mencionar.

Cada herramienta queda en una cadena de hashes

Cada vez que el agente despacha una herramienta se escribe una fila con el hash de los argumentos, si terminó bien, cuánto tardó, y el hash de la fila anterior encadenado con el de esta. Editar o borrar una fila rompe la cadena y se nota. Los argumentos crudos no se guardan nunca, solo su hash. Aparte de eso, cada llamada de IA deja una línea en una bitácora mensual en disco que registra el tamaño del texto cubierto, jamás el contenido.

La jaula del código

Cuando el agente ejecuta Python, corre en un contenedor rootless que nace para esa ejecución y muere al terminar.

El permiso se comprueba antes de crear el contenedor, así que la petición de alguien sin rol suficiente no llega a levantar nada.

Red
Ninguna. El contenedor arranca sin interfaz de red.
Sistema de archivos raíz
Solo lectura.
Espacio temporal
64 MB, sin ejecución y sin setuid.
Capacidades del kernel
Todas eliminadas.
Escalada de privilegios
Bloqueada.
Usuario
Sin privilegios, fuera de cualquier grupo del sistema.
Memoria
512 MB, sin espacio de intercambio.
CPU
Uno.
Procesos
128 como máximo.
Vida máxima
20 segundos de reloj, y se mata.
Montajes
Uno solo, de lectura.

Operación

Qué pasa cuando algo sale mal

La parte que nadie mira en la demostración y todos miran el primer día malo.

Si prefiere que nada de esto corra en nuestra infraestructura, el nivel Corporativo instala la plataforma completa en su servidor, con los mismos respaldos y el mismo proxy. Ver planes

Respaldo diario, rotación de catorce días

A las 03:30 se vuelcan las dos bases con pg_dump más los roles globales. Se conservan catorce días.

Fotos de la bóveda por enlaces duros

Los archivos que no cambiaron quedan enlazados a la foto del día anterior, así que cada día en disco cuesta solo lo que se movió.

Nada escucha hacia afuera

Todos los servicios se atan a 127.0.0.1. Lo único alcanzable es el proxy inverso, y su configuración viaja dentro del repositorio.

Un comando reinstala la plataforma

Base de datos, servidor de embeddings, caché, grafo y temporizadores de respaldo se levantan con un solo comando idempotente. Correrlo dos veces no rompe nada.

Borrar una empresa la borra entera

Bitácoras de uso, permisos, sesiones, mensajes, notificaciones, secretos e hilos se van con ella. Hay pruebas que verifican que no queda ningún huérfano.

Un vigilante cada 45 segundos

Un sondeo de salud reinicia únicamente el servicio que dejó de responder, que es el caso que un supervisor de procesos no detecta porque el proceso padre sigue vivo.

Sin adornos

Lo que no tenemos

Su equipo de sistemas va a preguntar por esta lista, y si no la publicamos la va a encontrar de todas formas. Es más barato para los dos que esté aquí.

  1. No tenemos certificaciones

    Ni SOC 2, ni ISO 27001, ni una auditoría de seguridad hecha por un tercero. Las pruebas de intrusión que corremos son nuestras y no sustituyen a un auditor externo. Si su proceso de compras exige un informe firmado por alguien de afuera, hoy no lo tenemos.

  2. El aislamiento del agente es un contenedor, no una microVM

    Rootless, sin red, con la raíz en solo lectura y sin capacidades, que es una frontera seria. Pero comparte el núcleo del anfitrión, y quien evalúa esto conoce la diferencia frente a una máquina virtual ligera. Hay un diseño escrito para llegar ahí. No está construido, y hasta que lo esté no aparece en esta página como si lo estuviera.

  3. El agente sale a internet sin lista de destinos permitidos

    La ejecución de Python corre sin red, eso es literal. Pero la caja donde corre el agente sí tiene salida y todavía no filtramos a dónde. Son dos cosas distintas y mezclarlas sería vender humo.

  4. Los documentos no están cifrados por la aplicación en reposo

    Hay TLS en tránsito, secretos cifrados con pgcrypto en la base y el cifrado que ofrezca el disco del servidor. Decir que todo está cifrado en reposo sería falso: la bóveda son archivos Markdown legibles para quien tenga acceso al sistema de archivos del servidor, y ese acceso lo controla el modo 0700 y quien administre la máquina.

  5. Las escrituras del agente se acotan por montaje, no por archivo

    La comprobación permiso por permiso existe en la superficie de herramientas y está probada, incluido el caso de un lector al que se le niega escribir. No está en el camino activo por defecto, así que la frontera real de hoy es la carpeta del departamento montada en el contenedor.

  6. No garantizamos residencia de datos

    Depende de dónde esté alojada la instalación y del proveedor del modelo. Si su empresa necesita que los datos no salgan de una jurisdicción, el único camino honesto es el autoalojamiento, y con gusto le confirmamos por escrito qué cumple la instalación administrada antes de que firme.

  7. El corte automático de presupuesto no está conectado

    La comprobación previa está escrita y probada, pero ninguna ruta del agente la llama todavía. Usted ve exactamente cuánto gastó y le avisamos, y eso es lo que podemos prometer hoy.

Si algo de esta lista es un requisito duro en su empresa, dígalo en la primera conversación. Preferimos perder la venta a que lo descubra durante una auditoría. ventas@ofivia.com

Las de siempre

Preguntas de seguridad

Las cinco que aparecen en cada revisión, con la respuesta corta.

Todas las preguntas
¿Otra empresa puede ver mis datos?
No, y está bloqueado en cuatro capas independientes. Cada fila lleva el identificador de su empresa. PostgreSQL aplica seguridad a nivel de fila en modo FORCE sobre 23 tablas, con el identificador tomado de la sesión verificada y nunca del cuerpo de la petición. La carpeta de su empresa está en modo 0700. Y el grafo usa un espacio de nombres por empresa. Hay una batería de pruebas dedicada a intentar cruzar esos límites, y corre en cada cambio.
¿Tienen SOC 2 o ISO 27001?
No, y preferimos decirlo. No tenemos SOC 2, ni ISO 27001, ni una auditoría externa de terceros. Lo que sí tenemos se puede revisar: aislamiento por empresa en cuatro capas, contraseñas con argon2, revocación inmediata de sesiones al cerrar sesión, secretos cifrados que ningún endpoint devuelve, ejecución de código en contenedores sin red y con capacidades eliminadas, y 55 suites de pruebas que corren en cada cambio, una de ellas dedicada a intentar romper el aislamiento entre empresas.
¿Cómo protegen las contraseñas y las sesiones?
Las contraseñas se guardan con argon2. La sesión usa un token de acceso corto, de quince minutos, y uno de refresco de siete días, firmados con secretos distintos. El token de refresco lleva un número de versión, así que cerrar sesión invalida al instante todas las sesiones abiertas de esa cuenta. El inicio de sesión y el refresco tienen límite por IP contra fuerza bruta, y el registro público está desactivado.
¿Dónde se ejecuta el código que corre el agente?
En un contenedor rootless que nace para esa ejecución y muere al terminar. Sin red, con el sistema de archivos raíz en solo lectura, todas las capacidades eliminadas, sin posibilidad de escalar privilegios, 512 MB de memoria, un CPU, tope de procesos, usuario sin privilegios y muerte por reloj a los veinte segundos. Un lector o un colaborador sin permiso ni siquiera llega a arrancar el contenedor: la petición se rechaza antes.
¿Puedo revisar lo que hizo el agente?
Sí. Cada herramienta que despacha el agente deja una fila con el hash de sus argumentos, si terminó bien, cuánto tardó, y el hash de la fila anterior encadenado con el de esta. Editar o borrar una fila rompe la cadena y queda a la vista. Los argumentos crudos no se guardan, solo su hash. Aparte, cada llamada de IA deja una línea en una bitácora mensual en disco que usted puede descargar.

Traiga a la persona que va a decir que no

Si su responsable de sistemas tiene una objeción, prefiere tenerla antes de la migración. Nos sentamos con ella.

  • Sin certificaciones que no tenemos
  • Autoalojamiento disponible
  • Sus archivos se los lleva