Fine-Grained Authorization (Modèle Zanzibar)
Le Role-Based Access Control (RBAC) est suffisant pour de nombreuses applications : les utilisateurs ont des rôles, les rôles ont des permissions, on vérifie si un utilisateur a la bonne permission. Mais RBAC ne suffit pas quand on a besoin d’un contrôle d’accès au niveau ressource — “Alice peut modifier le document 42, mais pas le 43”, ou “Bob peut voir tous les documents de son équipe.”
Auris implémente un moteur FGA compatible Zanzibar (Fine-Grained Authorization) pour gérer ces scénarios.
Qu’est-ce que Zanzibar ?
Zanzibar est le système d’autorisation global de Google, publié dans un paper de recherche en 2019. Il gère le contrôle d’accès pour Gmail, Drive, Docs, Maps et des dizaines d’autres produits Google — traitant des trillions de vérifications d’autorisation par seconde avec une latence milliseconde.
L’intuition centrale de Zanzibar est de modéliser l’autorisation comme des relations entre objets et sujets, stockées comme des tuples. Les questions d’autorisation deviennent des problèmes de traversée de graphe : “Existe-t-il un chemin du sujet user:alice vers l’objet document:readme via la relation viewer ?”
Auris implémente un moteur FGA compatible Zanzibar avec :
- Un DSL compatible OpenFGA pour définir les modèles d’autorisation
- Un tuple store sur PostgreSQL (via Prisma)
- Un algorithme de vérification récursif avec détection de cycles
- Opérations de requête Expand et list-objects
- Un débogueur visuel dans la Console Auris
Concepts Core
Objet
Un objet est toute ressource que tu veux protéger. Les objets ont un type et un ID :
document:readme
folder:engineering
organization:acme-corp
report:q4-2024Le type est défini dans le modèle d’autorisation. L’ID est toute chaîne identifiant l’instance spécifique.
Relation
Une relation est un arc nommé dans le graphe d’autorisation — un type de rapport qu’un objet peut avoir avec les sujets. Les relations sont définies par type d’objet dans le modèle :
documentpeut avoir des relations :owner,editor,viewerfolderpeut avoir des relations :owner,viewerorganizationpeut avoir des relations :admin,member
Sujet
Un sujet est qui (ou quoi) a une relation avec un objet. Les sujets peuvent être :
- Un utilisateur :
user:alice - Un userset (la relation d’un autre objet) :
group:engineering#member(tous les membres du groupe engineering)
Tuple
Un tuple est un fait stocké : “ce sujet a cette relation avec cet objet.”
Format : object#relation@subject
Exemples :
document:readme#viewer@user:alice
document:readme#editor@user:bob
document:readme#viewer@group:engineering#member
folder:engineering#owner@user:charlieL’exemple avant-dernier signifie : “tous les membres du groupe engineering sont viewers du document readme.” C’est un userset — un groupe de sujets défini par une autre relation.
Le DSL Auris
Auris utilise un domain-specific language compatible OpenFGA pour définir les modèles d’autorisation. Le DSL spécifie les types d’objets et leurs relations, incluant comment les relations sont dérivées d’autres relations.
Structure de Base
type user
type group
relations
define member: [user]
type folder
relations
define owner: [user]
define viewer: [user, group#member] or owner
type document
relations
define parent: [folder]
define owner: [user] or owner from parent
define editor: [user, group#member] or owner
define viewer: [user, group#member] or editorChaque bloc type définit un type d’objet. relations liste les relations nommées pour ce type, avec les règles sur comment elles sont dérivées.
Lire les Définitions de Relation
define viewer: [user, group#member] or editorCela signifie : “Un sujet est viewer d’un document si :
- Le sujet est un type
userET il existe un tuple directdocument:X#viewer@user:Y, OU - Le sujet est un
group#member(un membre de quelque groupe) ET il existe un tuple directdocument:X#viewer@group:Z, OU - Le sujet est un
editordu document (calculé récursivement).”
Les Six Types de Réécriture
Le moteur d’autorisation supporte six types de règles de réécriture. Ils peuvent être composés pour modéliser presque tout schéma d’accès.
1. this — Assignation Directe
La règle la plus simple : la relation vaut si un tuple existe directement dans le store.
define owner: [user]2. computedUserset — Héritage depuis une autre Relation
La relation vaut si le sujet a une relation différente avec le même objet.
define editor: [user] or owner3. tupleToUserset — Suivre une Relation vers un autre Objet
C’est la règle la plus puissante. Elle suit une relation depuis l’objet courant vers un autre objet, puis vérifie une relation sur cet autre objet.
define owner: [user] or owner from parent“L’utilisateur Alice est owner de document:X si il existe un tuple owner direct pour elle, OU si il existe un tuple document:X#parent@folder:Y ET Alice est owner de folder:Y.”
C’est le fonctionnement de l’héritage dans Google Drive : les documents héritent les permissions du dossier parent.
4. union — Combinaison OR
Une union de deux règles de réécriture ou plus. La relation vaut si n’importe quelle des sous-règles correspond.
5. intersection — Combinaison AND
Toutes les sous-règles doivent valoir. Utile pour exiger plusieurs conditions simultanément.
define restricted_viewer: [user] and approved6. exclusion — Différence d’Ensembles (A MAIS PAS B)
La relation vaut pour les sujets dans le premier ensemble mais pas dans le second. Utile pour les deny lists.
define viewer: [user] but not blockedL’Algorithme de Vérification
Quand on appelle POST /api/fga/check, le moteur évalue si objectType:objectId#relation@subjectType:subjectId vaut.
L’algorithme utilise un set visited pour prévenir les boucles infinies dans les modèles avec des références de relation circulaires. La profondeur maximale de récursion est limitée à 25.
Mode Explain
Quand on passe explain: true à POST /api/fga/check, le moteur retourne un arbre de résolution montrant exactement quelle règle a correspondu (ou échoué), jusqu’au tuple spécifique trouvé (ou non trouvé). C’est précieux pour déboguer les problèmes de contrôle d’accès.
Patterns de Modélisation
Modèle Google Drive
Utilisateurs et groupes ont accès aux documents directement ou en l’héritant du dossier parent :
type user
type group
relations
define member: [user]
type folder
relations
define owner: [user]
define editor: [user, group#member] or owner
define viewer: [user, group#member] or editor
type document
relations
define parent: [folder]
define owner: [user] or owner from parent
define editor: [user, group#member] or owner or editor from parent
define viewer: [user, group#member] or editor or viewer from parentModèle SaaS Multi-Tenant
type user
type organization
relations
define admin: [user]
define member: [user] or admin
type project
relations
define parent_org: [organization]
define owner: [user] or admin from parent_org
define contributor: [user, organization#member] or owner
define viewer: [user, organization#member] or contributorMigration de RBAC vers FGA
Il n’est pas nécessaire de choisir l’un ou l’autre. Auris supporte l’utilisation conjointe de RBAC et FGA :
- RBAC gère : Accès coarse-grained aux fonctionnalités (
view:invoices,manage:users) - FGA gère : Accès fine-grained au niveau ressource (
document:X#editor@user:Y)
Débogage avec la Console
La Console Auris fournit un débogueur FGA visuel dans Administration → Fine-Grained Authorization → Débogueur. Il supporte trois opérations :
- Check : Saisis un objet, relation et sujet — vois si la vérification passe ou échoue, avec l’arbre de résolution complet
- Expand : Saisis un objet et relation — vois tous les sujets qui ont cette relation
- List Objects : Saisis un sujet et relation — vois tous les objets d’un certain type accessibles au sujet
L’arbre de résolution visuel utilise un codage couleur :
- Nœuds verts : règle évaluée comme vraie
- Nœuds rouges : règle évaluée comme fausse
- Nœuds bleus : usersets calculés intermédiaires
Concepts Associés
- Guide Fine-Grained Authorization — Guide pratique d’implémentation FGA
- Rôles & Permissions — Comment RBAC et FGA travaillent ensemble
- FGA Débogueur — Teste les vérifications d’autorisation dans la Console
- API Fine-Grained Authorization — Modèles, tuples, check, expand et list-objects
- JavaScript SDK —
client.fga.check()et gestion des tuples