Skip to Content

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-2024

Relació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:

  • document puede tener relaciones: owner, editor, viewer
  • folder puede tener relaciones: owner, viewer
  • organization puede 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:charlie

El 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 owner

Tipos de reescritura

Unión (or): La relación es válida si alguna de las condiciones se cumple.

define viewer: [user] or editor

Intersección (and): La relación es válida si todas las condiciones se cumplen.

define paid_viewer: viewer and subscriber

Exclusión (but not): La relación es válida excepto cuando otra condición se cumple.

define viewer: [user] but not banned

Herencia transitiva

type folder relations define owner: [user] define viewer: [user] or owner type document relations define parent: [folder] define viewer: [user] or viewer from parent

Esto 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

  1. Busca tuples directos: document:readme#editor@user:alice
  2. Evalúa las reescrituras: ¿es Alice un owner? Los owners son también editors.
  3. Expande los usersets: ¿es Alice miembro de algún grupo que sea editor?
  4. 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.