A propos Compétences Expérience Services Blog Contact

L'ABAC en production : ce qui casse vraiment ABAC in production: what actually breaks

Les comparatifs RBAC contre ABAC remplissent des pages entières de résultats de recherche. Presque tous s'arrêtent au moment intéressant : la mise en production.

TL;DR : j'ai construit un système ABAC pour les droits applicatifs d'une plateforme à plus de 25 millions d'utilisateurs. En production, ce ne sont pas les policies qui cassent. Ce sont les attributs périmés, l'explosion des règles, les points d'application manquants et les décisions silencieuses. Quatre modes de défaillance, et les règles pour les contenir.

Cet article est pour les équipes qui dépassent les rôles simples et préparent le saut vers l'autorisation fine.

Le contexte

Deux définitions d'abord. Le RBAC donne des droits par rôles : admin, éditeur, lecteur. L'ABAC décide par attributs : qui demande, sur quelle ressource, dans quel contexte.

Sur la plateforme santé où je travaille, les droits applicatifs dépendent de l'utilisateur, de l'application et du site. Plus de 25 millions d'utilisateurs, plus de 1 000 sites.

Avec des rôles seuls, ce genre de matrice finit en explosion. Un rôle par combinaison, des centaines de rôles, personne ne sait plus qui peut quoi. C'est le chemin classique vers l'ABAC.

Mais l'ABAC ne supprime pas la complexité. Il la déplace : des rôles vers les attributs et les policies. Et c'est là que la production t'attend.

Le débat RBAC contre ABAC est terminé

Le match des modèles est plié depuis longtemps. En pratique, tout le monde finit hybride : du RBAC pour la base, de l'ABAC pour l'affinement.

L'outillage a mûri aussi. OpenFGA est devenu projet CNCF en incubation fin 2025. SpiceDB porte les permissions des connecteurs de ChatGPT Enterprise, via AuthZed. Le modèle Zanzibar de Google a fait des petits.

Choisir un modèle n'est donc plus le vrai problème. Le vrai problème, c'est ce qui casse ensuite. Et ça, presque personne ne l'écrit.

Défaillance n°1 : les attributs périmés

Une décision ABAC est aussi fraîche que son attribut le plus vieux.

Les attributs viennent d'ailleurs. Un annuaire, un référentiel de sites, un contrat. Ils se synchronisent, donc ils se périment.

Le piège est silencieux. Une policy parfaite, évaluée sur des attributs faux, rend des décisions fausses avec une confiance parfaite.

Mes règles. Chaque attribut a une source de vérité désignée. Chaque attribut a une fraîcheur maximale acceptée. Et un attribut absent ferme l'accès, jamais l'inverse.

Fail closed, toujours. Fail closed veut dire : en cas de doute ou de panne, refuser.

Défaillance n°2 : l'explosion des règles

Deuxième mode de défaillance : les policies s'accumulent.

Chaque cas particulier devient une règle. Personne n'ose supprimer une règle qu'il ne comprend plus. Deux règles finissent par se contredire, et l'ordre d'évaluation devient une superstition.

Mes règles. Chaque policy a un propriétaire nommé. Les policies se relisent à date fixe, et une policy sans propriétaire vivant se supprime.

Et surtout : des tests de décisions. Des cas d'or rejoués à chaque changement : cet utilisateur, cette ressource, ce contexte, ce verdict attendu. Une policy sans test de non-régression est une roulette.

Défaillance n°3 : les points d'application manquants

Le mode de défaillance le plus dangereux n'est pas une mauvaise policy. C'est un chemin de code qui ne pose jamais la question.

Un nouvel endpoint. Un job batch. Un export. Un outil d'admin. Chacun peut lire les données sans demander les droits.

Une policy sans point d'application est une opinion.

Mes règles. Une seule porte de décision, bibliothèque ou service, et tous les chemins passent par elle. Une deuxième barrière dans la base pour les données les plus sensibles.

Et des tests qui attaquent les chemins, pas les policies. Appelle l'endpoint sans le droit. Attends un refus. Chaque route doit savoir dire non.

Défaillance n°4 : les décisions silencieuses

Dernier mode : le silence. Un refus d'accès sans trace fabrique deux problèmes.

Le support ne peut pas répondre à « pourquoi je n'ai pas accès ? ». Et l'audit ne peut pas répondre à « qui a accédé à quoi ». Sur une plateforme santé, la deuxième question n'est pas optionnelle.

Mes règles. Journaliser chaque décision, accordée ou refusée, avec les attributs évalués. Attention au contenu du journal : des identifiants et des catégories, pas de données personnelles en clair.

Et un outil de rejeu pour le support. La même question, les mêmes attributs, la décision expliquée. Le « pourquoi » doit prendre une minute, pas une journée d'archéologie.

La checklist avant de passer à l'ABAC

Les quatre modes de défaillance ne dépendent pas de l'outil choisi. La checklist non plus.

  • Reste hybride : RBAC pour la base, ABAC là où la finesse paie
  • Donne à chaque attribut une source de vérité, une fraîcheur max, un fail closed
  • Nomme un propriétaire par policy, supprime les policies orphelines
  • Écris des cas d'or de décisions, rejoués à chaque changement
  • Une seule porte de décision, et tous les chemins passent par elle
  • Teste les chemins sans droit : chaque endpoint doit savoir refuser
  • Journalise chaque décision avec ses attributs, sans PII en clair
  • Outille le « pourquoi » : le support doit pouvoir rejouer une décision

Ce qu'il faut retenir

L'ABAC tient sa promesse : des droits fins qui suivent le métier. Mais sa fiabilité ne vit pas dans les policies. Elle vit dans les attributs, les points d'application et les journaux.

Si tu pars de zéro aujourd'hui, regarde OpenFGA ou SpiceDB avant d'écrire le tien. Les quatre modes de défaillance, eux, te suivront quel que soit l'outil.

Un système d'autorisation à concevoir ou à fiabiliser ? Parlons-en.

RBAC versus ABAC comparisons fill entire pages of search results. Almost all of them stop right at the interesting part: production.

TL;DR: I built an ABAC system for application-level permissions on a platform with more than 25 million users. In production, the policies are not what breaks. Stale attributes, rule explosion, missing enforcement points and silent decisions are. Four failure modes, and the rules that contain them.

This article is for teams outgrowing simple roles and preparing the jump to fine-grained authorization.

The setup

Two definitions first. RBAC grants rights through roles: admin, editor, viewer. ABAC decides through attributes: who is asking, on which resource, in which context.

On the healthcare platform I work on, application permissions depend on the user, the application and the site. More than 25 million users, more than 1,000 sites.

With roles alone, that kind of matrix ends in explosion. One role per combination, hundreds of roles, nobody knows who can do what anymore. That is the classic road to ABAC.

But ABAC does not remove complexity. It moves it: from roles to attributes and policies. And that is where production waits for you.

The RBAC versus ABAC debate is over

The model war ended a while ago. In practice everyone lands on hybrid: RBAC for the baseline, ABAC for the fine grain.

The tooling matured too. OpenFGA became a CNCF incubating project in late 2025. SpiceDB powers the permissions behind ChatGPT Enterprise connectors, through AuthZed. Google's Zanzibar model has many children now.

So picking a model is no longer the real problem. The real problem is what breaks afterwards. And almost nobody writes that part.

Failure mode 1: stale attributes

An ABAC decision is only as fresh as its oldest attribute.

Attributes come from elsewhere. A directory, a site registry, a contract. They synchronize, therefore they go stale.

The trap is silent. A perfect policy, evaluated on wrong attributes, returns wrong decisions with perfect confidence.

My rules. Every attribute has a designated source of truth. Every attribute has a maximum accepted age. And a missing attribute closes access, never the opposite.

Fail closed, always. Fail closed means: when in doubt or during an outage, deny.

Failure mode 2: rule explosion

Second failure mode: policies pile up.

Every edge case becomes a rule. Nobody dares delete a rule they no longer understand. Two rules end up contradicting each other, and evaluation order becomes superstition.

My rules. Every policy has a named owner. Policies get reviewed on a fixed schedule, and a policy without a living owner gets deleted.

Above all: decision tests. Golden cases replayed on every change: this user, this resource, this context, this expected verdict. A policy without regression tests is a roulette wheel.

Failure mode 3: missing enforcement points

The most dangerous failure mode is not a bad policy. It is a code path that never asks the question.

A new endpoint. A batch job. An export. An admin tool. Each one can read data without asking for permission.

A policy without an enforcement point is an opinion.

My rules. One decision gate, a library or a service, and every path goes through it. A second barrier in the database for the most sensitive data.

And tests that attack paths, not policies. Call the endpoint without the right. Expect a denial. Every route must know how to say no.

Failure mode 4: silent decisions

Last mode: silence. An access denial with no trace creates two problems.

Support cannot answer "why don't I have access?". And audit cannot answer "who accessed what". On a healthcare platform, the second question is not optional.

My rules. Log every decision, granted or denied, with the attributes that were evaluated. Watch the journal's content: identifiers and categories, no plaintext personal data.

And a replay tool for support. Same question, same attributes, the decision explained. "Why" should take a minute, not a day of archaeology.

The checklist before you adopt ABAC

The four failure modes do not depend on the tool you pick. Neither does this checklist.

  • Stay hybrid: RBAC for the baseline, ABAC where fine grain pays
  • Give every attribute a source of truth, a max age, and fail closed
  • Name an owner per policy, delete orphaned policies
  • Write golden decision cases, replayed on every change
  • One decision gate, and every path goes through it
  • Test the paths without the right: every endpoint must know how to deny
  • Log every decision with its attributes, no plaintext PII
  • Tool the "why": support must be able to replay a decision

What to remember

ABAC keeps its promise: fine-grained rights that follow the business. But its reliability does not live in the policies. It lives in the attributes, the enforcement points and the logs.

Starting from scratch today, look at OpenFGA or SpiceDB before writing your own. The four failure modes will follow you whatever the tool.

An authorization system to design or to harden? Let's talk.