En la primera parte de OpenFGA repasamos conceptos básicos de autenticación, autorización, modelos de autorización y herramientas como Keycloak y OpenFGA. En esta segunda parte veremos un escenario donde se implementa el modelo ReBAC con una aplicación de ejemplo.

Utilizaremos como aplicación de ejemplo un catálogo de una tienda online. Consideremos una tienda online llamada “Best eMarket” con los siguientes elementos:

Arquitectura

El diagrama muestra una arquitectura de autenticación y autorización utilizando Keycloak, OpenFGA y la aplicación de ejemplo.

Capa de autorización: keycloack, openfga. Capa de aplicación: usuarios, app, api

Componentes

  1. Usuarios:
  1. Capa de aplicación:
  1. Capa de autorización:

Flujo de datos

  1. Autenticación con Keycloak:
  1. Interacción con la aplicación:
  1. Autorización con OpenFGA:

Sistema ReBAC

  1. Usuarios:
  1. Recursos:
  1. Relaciones:

Modelo de relaciones

  1. Relación de rol asignado:
  1. Relación de grupos:

En este escenario, básicamente, se estaría implementando una combinación de RBAC y GBAC, lo que demuestra la flexibilidad de OpenFGA.

Configuración de Keycloak

Una vez desplegado Keycloak, es necesario configurar el cliente, los usuarios, roles y grupos. Creamos el cliente con Client ID: portal según se muestra en las capturas de pantalla:

Pantalla donde se crea un nuevo cliente con su client type, id, name, description en los settings generales
crear cliente capability config, donde se asigna el authentication flow
Pantalla de crear cliente donde se asigna el login settings con root url, home url, valid redirect urls, valid post logout redirect urls y web origins
Pantalla de manage clients

A continuación se deberán definir los usuarios, grupos y roles como se indica aquí:

Lista de roles y grupos

Rol Roles asociados Usuarios
admin-catalog view-product
edit-product
ana
audit-catalog view-product
view-product
edit-product
Grupo Roles asociados Usuarios
audit-group audit-catalog diana
employee-group admin-catalog bruno

Una vez definidos todos los usuarios, roles y grupos, en OpenFGA se podrá comprobar las tuplas de relación generadas.

Usuario Relación Objeto
role:admin-catalog parent role:view-product
group:audit-group parent_group role:audit-catalog
role:audit-catalog parent role:view-product
role:admin-catalog parent role:view-product
role:admin-catalog parent role:view-product
ana assignee role:admin-catalog
bruno assignee group:employee-group
diana assignee group:audit-group

Modelo de autorización

En este ejemplo, se utilizará un modelo de autorización sencillo con el objetivo de cubrir las necesidades de la aplicación.

OpenFGA permite definir los modelos de autorización utilizando su lenguaje de dominio específico (DSL). En la documentación oficial se explican los conceptos del modelo. Básicamente, permite definir cualquier tipo de relación (directas, indirectas o dinámicas) entre objetos y usuarios, lo que permite definir modelos de autorización tan simples o complejos como lo requiera la aplicación.

Definición de tipos y relaciones

El modelo utilizado en este escenario es el siguiente:

model
  schema 1.1
type group
  relations
    define assignee: [user]
type role
  relations
    define assignee: [user] or assignee from parent or assignee from parent_group
    define parent: [role]
    define parent_group: [group]
type user
  1. Las primeras dos líneas especifican la versión del esquema de OpenFGA a utilizar.
model
  schema 1.1
  1. Las siguientes tres líneas contienen la definición de un tipo grupo y las relaciones que puede tener.
type group
  relations
    define assignee: [user]

Lo que se traduce a que un grupo puede asignar usuarios.

  1. Las siguientes cinco líneas definen un “role” y las posibles relaciones que puede tener.
type role
  relations
    define assignee: [user] or assignee from parent or assignee from parent_group
    define parent: [role]
    define parent_group: [group]

La relación asignee indica que un usuario puede tener un rol de manera directa o heredada a través de un rol padre o de un grupo padre.

La relación parent permite definir jerarquías de roles, donde un rol puede tener otro rol como su padre.

La relación parent_group asocia un rol con un grupo, permitiendo que los miembros del grupo hereden los roles asignados al grupo.

  1. La última línea define el tipo usuario que representa a los usuarios de la aplicación.
type user

Definición de tuplas de relaciones

Una vez definido el modelo, el siguiente paso sería definir las tuplas de relaciones.

OpenFGA almacena la información de autorización en este formato, debe incluir los siguientes campos:

El resultado sería algo como:

{
  user: 'user:ana',
  relation: 'member',
  object: 'document:project_x',
} 

En cualquier implementación de OpenFGA, la carga de tuplas puede suponer un proceso tedioso y propenso a fallos, por lo que se recomienda automatizarlo mediante el uso de la CLI o SDK.

EventPublisher

Este componente, desarrollado como una extensión de Keycloak y utilizando las Service Provider Interfaces (SPI), permite:

De este modo conseguimos tener una integración completa entre Keycloak, que se encarga de gestionar la autenticación de usuarios y donde definiremos usuarios, grupos y roles, y OpenFGA, que se encargará de almacenar el modelo de autorización y comprobar en todo momento la relación entre usuarios y objetos en la aplicación.

Una vez instalado, es necesario activarlo en la configuración del Realm, en la lista de Events Listener.

realm event listener

Integración con la aplicación en desarrollo

En la documentación oficial de OpenFGA se encuentran ejemplos de integración con aplicaciones en Node.js (framework Fastlify) y Go (framework Fiber).

Los pasos necesarios para integrar una aplicación con OpenFGA serían:

  1. Instalación y configuración de una librería que permita gestionar tokens JWT.
  2. Definir una función encargada de la autenticación y obtener el identificador del usuario una vez autenticado.
  3. Definir función encargada de comprobar la autorización contra OpenFGA.
  4. Utilizar el identificador de usuario para comprobar que el mismo cuenta una relación al rol requerido para ejecutar la operación (lectura, escritura, borrado, etc).
  5. Integrar la función de autorización para que se ejecute antes de cada operación que requiera acceso a un recurso protegido.

Comprobaciones en OpenFGA

En el playground de OpenFGA se podrá observar el modelo de autorización, las relaciones posibles en forma de gráfico y las tuplas creadas para esta versión del modelo.

playground types previewer

Además, se podrán realizar consultas de prueba para comprobar los permisos efectivos que se aplican a cada usuario. Esto se logra en el apartado de Tuple Queries, el playground otorga facilidades como sugerencias y autocompletado.

Tuple queries

Según el modelo que hemos definido, la lista de permisos efectivos sería la siguiente:

Comprobación Resultado
is user:ana related to role:edit:product as assignee? True
is user:ana related to role:view:product as assignee? True
is user:bruno related to role:edit:product as assignee? True
is user:bruno related to role:view:product as assignee? True
is user:carlos related to role:edit:product as assignee? False
is user:carlos related to role:view:product as assignee? False
is user:diana related to role:edit:product as assignee? False
is user:diana related to role:view:product as assignee? True

Una vez definido el modelo de autorización en OpenFGA, creados los usuarios, grupos y roles en Keycloak y comprobado que las tuplas de relación se han generado correctamente en OpenFGA, se cumplen las condiciones necesarias para que la aplicación realice consultas de autorización.

Demostración

Al acceder a la aplicación, el usuario es recibido por la página de inicio con el botón de Log in.

Pantalla de log in del ejemplo que vamos a utilizar

Al iniciar el proceso de autenticación, es redirigido al portal de Keycloak donde debe introducir sus credenciales.

pantalla de sign in en keycloak del ejemplo

Una vez autenticado, es redirigido de vuelta a la aplicación. En este punto se comprueban los permisos del usuario.

En el caso de Carlos, al ser un empleado nuevo, aún no cuenta con permisos de acceso, por lo que vería la siguiente página.

Pantalla de falta de permisos de acceso

Sin embargo, alguien como Diana, que se encuentra en el grupo audit-group, de forma heredada, cuenta con el rol audit-catalog que, a su vez, es padre del rol view-product, por lo que podrá ver la lista de productos.

Listado de productos accesible por los permisos

Sin embargo, Diana no cuenta con el rol edit-product, por lo que no podrá publicar nuevos productos.

error de edición por falta de permisos

Pero Ana, que cuenta con el rol admin-catalog y que tiene como roles hijos a view-product y edit-product, podrá publicar los nuevos productos.

esta usuaria tiene permisos de edición

Conclusiones

Como se ha podido observar en este ejercicio, OpenFGA es una solución robusta y flexible que permite implementar modelos de control de acceso avanzados. Su capacidad para manejar relaciones complejas y definir políticas detalladas lo hace adecuado para entornos empresariales que requieren una gestión precisa de permisos de acceso.

Como ventajas, se pueden identificar:

Sin embargo, su implementación en un entorno productivo hoy en día cuenta con algunos desafíos como pueden ser

La implementación de OpenFGA en un entorno productivo puede ofrecer numerosos beneficios en términos de flexibilidad, escalabilidad y seguridad en la gestión de permisos de acceso. Sin embargo, también presenta una serie de desafíos que deben ser valorados antes de tomar la decisión de hacerlo.

Cuéntanos qué te parece.

Los comentarios serán moderados. Serán visibles si aportan un argumento constructivo. Si no estás de acuerdo con algún punto, por favor, muestra tus opiniones de manera educada.

Suscríbete