CIAM 102: Autorización y Control de Acceso basado en Roles
La Organización y el Inquilino son geniales para agrupar Identidades, pero conducen a una democracia absoluta: todos pueden hacer cualquier cosa en este sistema. Mientras que la utopía aún es un misterio, echemos un vistazo a la gobernanza del acceso: Autorización (AuthZ).
Antecedentes
En el artículo anterior, introdujimos el concepto de autenticación (AuthN) y autorización (AuthZ), junto con algunos términos dolorosos de cabeza: Identidad, Organización, Inquilino, etc.
La Organización y el Inquilino son geniales para agrupar Identidades, pero conducen a una democracia absoluta: todos pueden hacer cualquier cosa en este sistema. Mientras que la utopía aún es un misterio, echemos un vistazo a la gobernanza del acceso: Autorización (AuthZ).
¿Por qué necesitamos autorización?
Notion es un gran ejemplo. Para cada página que posees, puedes elegir mantenerla privada, accesible solo para ti, o compartirla con amigos, o incluso con el público.
O, para una librería en línea, quieres que todos puedan ver todos los libros, pero que los clientes solo puedan ver sus propios pedidos, y que los vendedores solo puedan gestionar los libros en sus tiendas.
AuthZ y AuthN son componentes esenciales de un modelo de negocio complejo. A menudo van de la mano; AuthZ verifica el acceso de un usuario, mientras que AuthN autentica las identidades. Ambos son necesarios para un sistema seguro.
El modelo básico de autorización
Aquí está uno de los modelos AuthZ más comunes: Si IDENTIDAD realiza ACCIÓN en RECURSO, entonces ACEPTAR o DENEGAR.
En el ejemplo de Notion, el modelo es PERSONA realiza VER en PAGINA.
Si la página es privada:
- Recibirás ACEPTAR al realizar VER en tu PAGINA.
- Todos los demás deberían recibir DENEGAR al realizar VER en tu PAGINA.
Basado en el consenso, la industria desarrolló varias tecnologías de autorización, como el Control de Acceso basado en Roles (RBAC), el Control de Acceso basado en Atributos (ABAC). Hoy nos centraremos en el modelo RBAC de NIST Nivel 1: RBAC Plano.
Control de Acceso basado en Roles
Ampliemos el ejemplo de la librería. Digamos que tenemos muchos clientes, pero solo un vendedor:
- Los clientes pueden ver y pedir libros, así como ver sus propios pedidos.
- El vendedor puede ver, crear, y eliminar libros, y gestionar los pedidos de los clientes.
Definir recursos
En Logto, un recurso (es decir, Recurso de API) generalmente representa un conjunto de entidades o ítems, dado que se requiere usar una URL válida como indicador. Por lo tanto, definimos dos recursos:
- Libros:
https://api.bookstore.io/books
- Pedidos:
https://api.bookstore.io/orders
Una de las ventajas de hacer cumplir el formato de URL es que puede asignar a una dirección real de su servicio de API, lo que mejora la legibilidad y reconocibilidad al integrarse con otros componentes en el sistema.
Definir permisos
Ya que introdujimos el concepto de recurso, en Logto, también hacemos cumplir que los permisos deben pertenecer a un recurso, a la inversa, los recursos pueden tener permisos.
Añadamos algunos permisos a los recursos:
- Libros:
leer
,crear
,eliminar
- Pedidos:
leer
,leer:yo
,crear:yo
,eliminar
Aunque no hay requisito del nombre de un permiso, tenemos la convención como abajo:
While <acción>
es requerido para describir un permiso, :<objetivo>
puede ser ignorado para describir un objetivo general, es decir, a todas las entidades o ítems en el recurso. Por ejemplo:
- El permiso
leer
en el recurso Libros significa la acción de leer libros arbitrarios. - El permiso
crear:yo
en el recurso Pedidos significa la acción de crear pedidos que pertenecen al usuario actual.
Definir roles
En resumen, un rol es un grupo de permisos. Creemos dos roles cliente
y vendedor
y asignemos permisos a ellos como se muestra a continuación:
Puedes notar que la asignación permiso-rol es relaciones de muchos-a-muchos.
Asignar roles a usuarios
Al igual que la asignación de roles-permisos, la asignación de usuarios-roles también es una relación de muchos a muchos. Por lo tanto, puedes asignar múltiples roles a un solo usuario, y un solo rol puede ser asignado a múltiples usuarios.
Conectar los puntos
Aquí hay un diagrama completo de relaciones para el modelo RBAC de Nivel 1 en Logto:
En el modelo RBAC, los permisos siempre son "positivos", lo que significa que el juicio de autorización es simple: si un usuario tiene el permiso, entonces acepta; de lo contrario, rechaza.
Supongamos que Alice tiene el rol de vendedor
, Bob y Carol tienen el rol de cliente
. Describiremos acciones en lenguaje natural primero, y las transcribiremos al formato estándar de autorización: IDENTIDAD realiza ACCIÓN en RECURSO, finalmente dando la conclusión.
- Alice quiere agregar un nuevo libro para vender:
- El usuario Alice realiza
crear
en el recurso Libros (https://api.bookstore.io/books
). - Como a Alice se le ha asignado el permiso de
crear
Libros según su rol devendedor
, el resultado es ✅ ACEPTAR.
- El usuario Alice realiza
- Alice quiere ver todos los pedidos para ver si la venta cumple con sus expectativas:
- El usuario Alice realiza
leer
en el recurso Pedidos (https://api.bookstore.io/orders
). - Como a Alice se le ha asignado el permiso de
leer
los Pedidos según su rol devendedor
, el resultado es ✅ ACEPTAR.
- El usuario Alice realiza
- Bob quiere navegar por la lista de libros para ver si hay algún libro que quiera comprar.
- El usuario Bob realiza
leer
en el recurso Libros (https://api.bookstore.io/books
). - Como a Bob se le ha asignado el permiso de
leer
los Libros según su rol decliente
, el resultado es ✅ ACEPTAR.
- El usuario Bob realiza
- Bob quiere ver el pedido de Carol.
- Como es el pedido de otra persona, el permiso
leer:yo
dePedidos
no funciona aquí. - El usuario Bob realiza
leer
en el recurso Pedidos (https://api.bookstore.io/order
). - Como Bob no tiene permiso de
leer
los Pedidos, el resultado es ❌ DENEGAR.
- Como es el pedido de otra persona, el permiso
Otros niveles RBAC
Hay cuatro niveles en el modelo RBAC de NIST:
- RBAC Plano
- RBAC Jerárquico
- RBAC Restringido
- RBAC Simétrico
Ve el documento para detalles si estás interesado.
Logto ahora tiene la implementación del Nivel 1 y avanzará a niveles superiores basado en la retroalimentación de la comunidad. ¡No dudes en hacernos saber si un nivel superior se ajusta a tus necesidades!
En la práctica
Además de la teoría, aún tenemos trabajos técnicos pesados para completar con el fin de hacer que el modelo funcione como se espera:
- Desarrollo de servidor de autenticación y cliente
- Diseño de base de datos para RBAC
- Validación a través de diferentes servicios
- Cumplimiento de seguridad y estándares abiertos
- Gestión de roles, permisos, recursos y asignación
No entres en pánico. Hemos tomado esto en cuenta y añadimos soporte fuera de la caja para cubrir todo lo anterior. Consulta la 🔐 Receta RBAC para aprender cómo usar RBAC en Logto.
Notas finales
RBAC es un poderoso modelo de gestión de acceso para la mayoría de los casos, pero no hay una solución única para todos. Todavía tenemos algunas preguntas:
- ¿Necesito niveles altos de RBAC?
- ¿Cómo se compara RBAC con otros modelos de autorización?
- ¿Cómo definir el modelo de autorización entre diferentes Organizaciones?