Autorización de Grano Fino (Modelo Zanzibar)
El Control de Acceso Basado en Roles (RBAC) es suficiente para muchas aplicaciones: los usuarios tienen roles, los roles tienen permisos, compruebas si un usuario tiene el permiso correcto. Pero RBAC se rompe cuando necesitas control de acceso a nivel de recurso — “Alice puede editar el documento 42, pero no el documento 43.”
Auris implementa un motor de Autorización de Grano Fino (FGA) compatible con Zanzibar para gestionar estos escenarios.
¿Qué es Zanzibar?
Zanzibar es el sistema de autorización global de Google, publicado en un paper de investigación en 2019. Gestiona el control de acceso para Gmail, Drive, Docs, Maps y docenas de otros productos de Google — manejando billones de comprobaciones de autorización por segundo con latencia en milisegundos.
La idea central de Zanzibar es modelar la autorización como relaciones entre objetos y sujetos, almacenadas como tuples. Las preguntas de autorización se convierten en problemas de recorrido de grafos: “¿Existe un camino desde el sujeto user:alice hasta el objeto document:readme a través de la relación viewer?”
Conceptos principales
Objeto
Un objeto es cualquier recurso que quieras proteger. Los objetos tienen un tipo y un ID:
document:readme
folder:engineering
organization:acme-corp
report:q4-2024Relación
Una relación es un arco con nombre en el grafo de autorización. Las relaciones se definen por tipo de objeto en el modelo:
documentpuede tener relaciones:owner,editor,viewerfolderpuede tener relaciones:owner,viewerorganizationpuede tener relaciones:admin,member
Sujeto
Un sujeto es quien tiene una relación con un objeto. Los sujetos pueden ser:
- Un usuario:
user:alice - Un conjunto de usuarios (relación de otro objeto):
group:engineering#member(todos los miembros del grupo de ingeniería)
Tuple
Un tuple es un hecho almacenado: “este sujeto tiene esta relación con este objeto.”
Formato: object#relation@subject
Ejemplos:
document:readme#viewer@user:alice
document:readme#editor@user:bob
document:readme#viewer@group:engineering#member
folder:engineering#owner@user:charlieEl DSL de Auris
Auris usa un lenguaje específico de dominio (DSL) compatible con OpenFGA para definir modelos de autorización.
Estructura básica
type user
type document
relations
define owner: [user]
define editor: [user] or owner
define viewer: [user] or editor or ownerTipos de reescritura
Unión (or): La relación es válida si alguna de las condiciones se cumple.
define viewer: [user] or editorIntersección (and): La relación es válida si todas las condiciones se cumplen.
define paid_viewer: viewer and subscriberExclusión (but not): La relación es válida excepto cuando otra condición se cumple.
define viewer: [user] but not bannedHerencia transitiva
type folder
relations
define owner: [user]
define viewer: [user] or owner
type document
relations
define parent: [folder]
define viewer: [user] or viewer from parentEsto significa: un usuario que puede ver una carpeta puede automáticamente ver todos los documentos en esa carpeta.
Comprobación de autorización
Para comprobar si un usuario tiene una relación con un objeto:
const result = await auris.fga.check({
user: 'user:alice',
relation: 'editor',
object: 'document:readme',
})
if (result.allowed) {
// Alice puede editar el documento
}El algoritmo de comprobación
- Busca tuples directos:
document:readme#editor@user:alice - Evalúa las reescrituras: ¿es Alice un
owner? Los owners son también editors. - Expande los usersets: ¿es Alice miembro de algún grupo que sea editor?
- Recorre los tipos de contenedor: ¿es la carpeta padre visible para Alice?
El algoritmo es recursivo con detección de ciclos para prevenir bucles infinitos.
Operaciones de listado
Además de la comprobación binaria, Auris FGA admite:
// Listar todos los objetos a los que Alice tiene acceso
const objects = await auris.fga.listObjects({
user: 'user:alice',
relation: 'viewer',
type: 'document',
})
// Listar todos los usuarios con acceso a un objeto específico
const users = await auris.fga.listUsers({
object: 'document:readme',
relation: 'editor',
})Depurador visual
La Consola de administración de Auris incluye un depurador visual de FGA donde puedes:
- Visualizar el grafo de autorización
- Ejecutar comprobaciones de forma interactiva
- Trazar por qué se concede o deniega el acceso
- Probar los cambios del modelo antes de desplegarlos
Consulta la guía de Autorización de Grano Fino para instrucciones de configuración completas, patrones de modelado para escenarios comunes y ejemplos de integración con el SDK.