Autenticación (Authentication) y autorización (Authorization) en una arquitectura de microservicios
(microservices.io)Esta serie aborda cómo implementar autenticación (Authentication) y autorización (Authorization) en una arquitectura de microservicios.
Este artículo explica la visión general completa y las diferencias con una aplicación única (monolítica).
Aplicación de ejemplo: RealGuard.io
RealGuard.io es una plataforma de sistemas de seguridad comercial que gestiona el control y las alarmas de los equipos de seguridad.
Los usuarios pertenecen a empresas vendedoras, empresas clientes y proveedores de monitoreo, y cada uno tiene distintos permisos de acceso.
Autenticación y autorización en una arquitectura monolítica
Una estructura monolítica está compuesta por una sola aplicación y una base de datos, y la autenticación se implementa con un token de sesión.
La autorización se realiza con una estructura como la siguiente:
isAllowed(user, operation, resource)
Ejemplo:
isAllowed(user, "disarm", SecuritySystem(ID))
4 modelos de autorización
- RBAC: control de acceso basado en roles – determina los permisos según los roles asignados al usuario
- ReBAC: control de acceso basado en relaciones – determina el acceso según la relación entre el usuario y el recurso
- ABAC: control de acceso basado en atributos – determina el acceso según los atributos del usuario, el recurso y el entorno
- Modelo híbrido: permite implementar políticas complejas combinando los tres anteriores
Ejemplos de autorización y permisos por rol
| Operation | Required Role |
|---|---|
| getAlarmSystem() | SecuritySystemViewer |
| armSystem() | SecuritySystemArmer |
| disarmSystem() | SecuritySystemDisarmer |
| cancelSystem() | SecuritySystemAlarmCanceller |
Además de un rol específico, también pueden aplicarse condiciones adicionales como restricciones por horario laboral (ABAC) o si está incluido en la lista de notificaciones.
Dónde validar la autorización
- Infraestructura de red: se pueden hacer verificaciones simples de permisos en service mesh, ingress controller, etc.
- Handlers de la REST API: autorización coarse-grained a nivel de solicitud
- Lógica de dominio: autorización basada en condiciones complejas
- Capa de acceso a BD: filtrado de autorización dentro de SQL (efectivo para procesar grandes volúmenes)
Autorización en la UI
La UI no puede imponer la autorización, pero puede optimizar la UX mostrando o deshabilitando botones/funciones según los permisos del usuario.
Autenticación en una arquitectura de microservicios
El BFF (Backend For Frontend) se encarga del login y la gestión de sesión.
Como cada microservicio se ejecuta de forma independiente, no puede acceder directamente a la información del usuario desde la sesión, por lo que debe recibirla mediante tokens como JWT.
Autorización en una arquitectura de microservicios
La solicitud se transmite en el orden BFF → SecurityService, y la validación de autorización puede hacerse en estos tres puntos:
- BFF: puede hacer autorización a nivel de solicitud según la ruta y el método, con base en la información de sesión
- Red entre servicios: el service mesh realiza parte de la autorización basada en JWT
- Dentro de cada servicio: la autorización se realiza en la lógica de dominio y la capa de acceso a BD
Dificultades de la autorización distribuida
Como cada servicio no tiene en su propia base de datos toda la información que necesita, puede requerirse llamar a la API de otros servicios para autorizar.
También existe el enfoque de resolverlo con JWT, pero el tamaño del token y el costo de validación se vuelven un problema.
Resumen
- La autenticación verifica la identidad del usuario, la autorización determina sus permisos
- El patrón
isAllowed(user, operation, resource)es el núcleo de la autorización - Se implementa combinando los tres modelos de autorización: RBAC, ReBAC y ABAC
- En un monolito, la autorización es más sencilla gracias al acceso a una sola base de datos
- En microservicios, implementarla es más complejo porque los datos necesarios para autorizar están distribuidos
Aún no hay comentarios.