¿Buscas nuestro logo?
Aquí te dejamos una copia, pero si necesitas más opciones o quieres conocer más, visita nuestra área de marca.
Conoce nuestra marca.¿Buscas nuestro logo?
Aquí te dejamos una copia, pero si necesitas más opciones o quieres conocer más, visita nuestra área de marca.
Conoce nuestra marca.dev
Sergio David Morel 28/10/2024 Cargando comentarios…
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:
El diagrama muestra una arquitectura de autenticación y autorización utilizando Keycloak, OpenFGA y la aplicación de ejemplo.
En este escenario, básicamente, se estaría implementando una combinación de RBAC y GBAC, lo que demuestra la flexibilidad de OpenFGA.
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:
A continuación se deberán definir los usuarios, grupos y roles como se indica aquí:
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 |
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
model
schema 1.1
type group
relations
define assignee: [user]
Lo que se traduce a que un grupo puede asignar usuarios.
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.
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.
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:
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.
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.
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.
Al acceder a la aplicación, el usuario es recibido por la página de inicio con el botón de Log in.
Al iniciar el proceso de autenticación, es redirigido al portal de Keycloak donde debe introducir sus credenciales.
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.
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.
Sin embargo, Diana no cuenta con el rol edit-product, por lo que no podrá publicar nuevos productos.
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.
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.
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.
Cuéntanos qué te parece.