Ingeniería de software
Arquitectura multiempresa y conexión segura entre tenants
Separar bien los datos de cada organización es solo la mitad del trabajo. Las plataformas empresariales acaban necesitando que unas organizaciones compartan información con otras, o que la plataforma hable con sistemas instalados en cada cliente. Esta guía explica cómo diseñar esas conexiones para que sean explícitas, acotadas, auditables y revocables.
- Publicado
- Revisado
- Lectura
- 6 min
- Por
- colectivedata
Del aislamiento a la conexión controlada
En la guía sobre SaaS multitenant comparamos los modelos para aislar los datos de cada cliente: base de datos por tenant, esquema por tenant o tablas compartidas con políticas de fila. Aquí partimos de que ese aislamiento ya existe y funciona. La pregunta es otra: cómo se abre, de forma deliberada y limitada, una puerta entre dos organizaciones o entre la plataforma y la red de un cliente.
Los casos son frecuentes. Un fabricante quiere que sus subcontratistas vean las órdenes que les afectan y suban sus certificados de material. Una gestoría trabaja sobre los datos de decenas de empresas clientes. Un grupo empresarial quiere informes consolidados de filiales que funcionan como tenants separados. Una aplicación en la nube necesita leer pedidos de un ERP instalado en las oficinas del cliente. En todos, la solución fácil (una cuenta compartida, una contraseña en un fichero, un permiso de administrador global) es también la más peligrosa.
Conexiones entre organizaciones: patrones posibles
Lo primero es convertir la relación en un objeto del sistema. Una conexión entre el tenant A y el tenant B debería existir como registro propio, con estado, alcance, fecha de alta, quién la aprobó en cada lado y cuándo caduca. Sobre esa base hay varios patrones:
| Patrón | Cómo funciona | Ventaja | Precaución |
|---|---|---|---|
| Compartición por registro | El propietario comparte documentos u órdenes concretos con otra organización | Alcance mínimo y fácil de explicar | Muchos permisos individuales que gestionar |
| Espacio compartido | Ambas organizaciones colaboran en un área común con datos propios de ese espacio | Claro para proyectos conjuntos | Definir de quién es cada dato al cerrar el espacio |
| Acceso delegado | Usuarios de B actúan dentro de A con un rol limitado | No duplica datos | B ve la interfaz de A; los permisos deben ser muy precisos |
| Publicación y copia | A publica un conjunto de datos que se copia al tenant de B | B trabaja con su copia sin depender de A | Qué ocurre con la copia al revocar |
No hay un patrón mejor en abstracto. La elección depende de si los datos deben seguir bajo control de su propietario, de si el receptor necesita trabajar sobre ellos y de qué debe pasar el día que la relación termine.
Conectores autenticados con sistemas de cada cliente
Cuando la plataforma necesita intercambiar datos con un sistema instalado en la red de un cliente, un patrón habitual es un conector: un pequeño servicio desplegado en la infraestructura del cliente que inicia conexiones salientes hacia la plataforma. Así no hay que abrir puertos de entrada en el cortafuegos del cliente, y es el propio cliente quien decide qué sistemas locales puede leer el conector.
- Identidad propia por conector: cada instalación tiene sus credenciales, ligadas a un único tenant. Nunca una credencial común para todos los clientes.
- Autenticación entre máquinas: el marco OAuth 2.0 (RFC 6749) describe el flujo de credenciales de cliente para que una aplicación obtenga un token con sus propias credenciales, sin usuario final. Puede reforzarse con certificados de cliente en la conexión.
- Alcance acotado: el token del conector solo debe permitir las operaciones necesarias. En OAuth 2.0 esto se expresa con el parámetro scope, y el servidor puede conceder menos de lo pedido.
- Rotación y caducidad: credenciales con vida limitada y procedimiento probado para renovarlas sin cortar el servicio.
- Separación de lectura y escritura: un conector que solo debe leer pedidos no necesita permiso para modificar el ERP.
Las conexiones entre tenants dentro de la plataforma pueden seguir la misma lógica: cada conexión tiene su identidad técnica y sus permisos, separados de los de cualquier usuario concreto. Si una persona deja la empresa, la integración no debería romperse; y si la integración se revoca, ningún usuario debería conservar el acceso que proporcionaba.
Permisos delegados: quién autoriza qué
El principio que evita la mayoría de problemas es simple: los datos compartidos siguen bajo las reglas de su propietario. El tenant A decide qué comparte, con quién y durante cuánto tiempo; el tenant B decide qué usuarios suyos pueden usar lo que A le ha abierto. Eso lleva a un esquema de doble autorización:
- Un administrador de A crea o acepta la conexión y fija su alcance: qué tipos de datos, qué operaciones, qué centros o proyectos.
- Un administrador de B acepta la conexión y asigna qué usuarios o roles de B pueden ejercerla.
- El permiso efectivo de un usuario de B sobre datos de A es la intersección de ambos: nunca más de lo que A concedió ni de lo que B asignó.
- Los cambios de alcance que amplían el acceso requieren de nuevo la aprobación de A.
El personal de la propia plataforma es un caso aparte. Su acceso de soporte a una conexión entre clientes debería pedirse para un caso concreto, limitarse en el tiempo y quedar visible para ambas organizaciones.
Auditoría a ambos lados
En una conexión entre organizaciones, cada parte necesita poder responder a la pregunta «quién de la otra empresa ha visto o cambiado mis datos». Por eso el registro de auditoría tiene que ser visible para el propietario de los datos, no solo para quien accede.
- Eventos de la conexión: alta, aceptación, cambios de alcance, suspensión y revocación, con la persona que los hizo.
- Accesos y operaciones: qué usuario o conector, de qué organización, sobre qué registro y con qué resultado.
- Sincronizaciones: qué se copió, cuándo y con qué versión de los datos.
- Accesos de soporte de la plataforma, con su justificación.
El registro debe estar protegido frente a modificaciones por las mismas cuentas que generan los eventos y conservarse el tiempo que se haya acordado. Una vista sencilla por conexión, que cada administrador pueda consultar sin pedir nada al proveedor, resuelve buena parte de las dudas antes de que se conviertan en incidencias.
Revocación: diseñar el final desde el principio
Una conexión que no se puede cerrar limpiamente es un riesgo permanente. La revocación debe poder iniciarla cualquiera de las dos partes y tener efecto inmediato y comprobable. Técnicamente implica varias acciones:
- Invalidar las credenciales y tokens asociados. La especificación OAuth 2.0 Token Revocation (RFC 7009) define cómo un cliente indica al servidor que un token ya no es necesario y recomienda que, al revocar un token de actualización, se invaliden también los de acceso del mismo grant si el servidor lo admite.
- Comprobar los permisos en cada petición frente al estado actual de la conexión, en lugar de confiar en datos de sesión antiguos.
- Cortar las sincronizaciones pendientes y vaciar las colas de esa conexión.
- Aplicar la política acordada sobre copias: borrarlas, anonimizarlas o conservarlas como históricas de solo lectura si el contrato lo permite.
- Avisar a los administradores de ambos lados y dejar constancia en la auditoría.
La revocación también debe probarse como cualquier otra función: tras revocar, una batería automática intenta todas las operaciones que la conexión permitía y verifica que fallan.
Un ejemplo hipotético
Imagina una plataforma de calidad para fabricantes. El fabricante es un tenant y cada uno de sus subcontratistas, otro. El fabricante crea una conexión con un subcontratista limitada a las órdenes de un proyecto, con permiso para leer especificaciones y subir certificados. El subcontratista acepta y asigna a dos personas de su departamento de calidad. Los certificados quedan en el tenant del fabricante; el subcontratista conserva una copia de solo lectura de lo que subió. Al terminar el proyecto, el fabricante revoca la conexión: los tokens se invalidan, las dos personas dejan de ver las órdenes y ambos tenants conservan en su auditoría el historial completo.
Criterios de decisión
- ¿Existe la conexión como objeto propio, con estado, alcance y aprobaciones de ambos lados?
- ¿Tiene cada conector o integración su propia identidad, ligada a un solo tenant y con alcance mínimo?
- ¿El permiso efectivo es la intersección de lo que concede el propietario y lo que asigna el receptor?
- ¿Puede cada organización ver quién de la otra ha accedido a sus datos?
- ¿Está definido qué pasa con los datos copiados al revocar, y se prueba la revocación de forma automática?
Estas decisiones condicionan el modelo de datos y conviene tomarlas antes de la primera integración, no cuando un cliente pide conectar con su proveedor. Si estás diseñando un producto SaaS con relaciones entre organizaciones, podemos ayudarte a definir el modelo de conexiones y permisos desde el análisis inicial.
Fuentes
- RFC 6749: The OAuth 2.0 Authorization Framework — IETF / RFC Editor
- RFC 7009: OAuth 2.0 Token Revocation — IETF / RFC Editor
Contenido informativo elaborado por colectivedata. No sustituye un análisis específico de tu caso.
Relacionado
- CapacidadIntegración de sistemasConexiones entre aplicaciones que mueven datos con reglas claras, detectan errores y permiten saber qué versión de cada dato es la buena.
- ServicioDesarrollo de productos SaaSDiseñamos y construimos aplicaciones para empresas que quieren lanzar su propio producto digital.
Más sobre ingeniería de software
Todo el conocimiento- Arquitectura híbrida para fábricas y ubicaciones con conectividad limitadaEn una planta, una cantera o una estación remota, la conexión a internet se corta, se satura o simplemente no llega.
- Cómo diseñar trazabilidad de piezas por número de serieLa trazabilidad por número de serie consiste en poder contar la historia completa de cada pieza: de qué está hecha, por dónde pasó, quién intervino y qué se midió.
- Cuándo conviene modernizar un software legacyQue un programa sea antiguo no es motivo suficiente para sustituirlo: muchos sistemas veteranos funcionan bien y concentran años de conocimiento del negocio.
¿Tienes un proyecto parecido? Cuéntanos qué necesitas.