Aller au contenu
medium

RBAC, ABAC et politiques d'autorisation

11 min de lecture

L’autorisation détermine ce qu’un utilisateur authentifié peut faire. Trois modèles dominent : RBAC (rôles), ABAC (attributs contextuels) et ReBAC (relations entre objets). Le bon choix dépend de votre cas : RBAC suffit pour “admin/éditeur/lecteur”, ABAC permet des règles dynamiques (“accès si même département + heures ouvrées”), ReBAC gère les partages complexes (“éditeurs de ce document”).

Ce guide vous donne les clés pour modéliser l’autorisation dans vos systèmes. À la fin, vous saurez :

  • Distinguer RBAC, ABAC et ReBAC — et quand utiliser chaque modèle
  • Concevoir une architecture PDP/PEP découplée
  • Écrire des politiques testables avec Policy-as-Code
  • Éviter les erreurs classiques (explosion de rôles, ABAC trop complexe)

Prérequis : avoir lu Les bases de l’IAM et OAuth 2.x.

Ces deux concepts sont souvent confondus. Pourtant, ils répondent à des questions différentes et interviennent à des moments distincts du flux de sécurité.

ÉtapeQuestionRésultat
Authentification (AuthN)Qui es-tu ?Identité vérifiée
Autorisation (AuthZ)Que peux-tu faire ?Permissions accordées ou refusées

L’authentification vient avant l’autorisation. Vous ne pouvez pas autoriser quelqu’un que vous ne connaissez pas.

Le RBAC attribue des permissions via des rôles.

Utilisateur → Rôle → Permissions
├── "admin" → [read, write, delete]
├── "editor" → [read, write]
└── "viewer" → [read]

Avantages :

  • Simple à comprendre et implémenter
  • Facile à auditer (qui a quel rôle ?)
  • Bien supporté par tous les systèmes

Inconvénients :

  • Explosion de rôles : admin-us, admin-eu, admin-project-x, admin-project-y-read-only
  • Pas de contexte dynamique (heure, localisation, sensibilité des données)
SituationRBAC adapté ?
Permissions statiques par fonction métier✅ Oui
Équipe < 100 personnes✅ Oui
Multi-tenant avec isolation stricte⚠️ Peut marcher
Accès contextuel (heure, geo, risque)❌ Non

Le ABAC décide selon des attributs :

Type d’attributExemples
Sujetdépartement, niveau de clearance, fonction
Ressourceclassification, propriétaire, date création
Actionread, write, delete, approve
Contexteheure, IP, géolocalisation, device

Exemple de règle ABAC :

ALLOW read document
WHERE subject.department == resource.department
AND resource.classification <= subject.clearance
AND context.time BETWEEN 08:00 AND 18:00
AND context.geo IN ['FR', 'DE', 'ES']

Avantages :

  • Très flexible, gère les cas complexes
  • Pas d’explosion de rôles
  • Décisions contextuelles

Inconvénients :

  • Plus complexe à implémenter et débugger
  • Collecte des attributs peut être coûteuse
  • Difficile à auditer (“pourquoi cet accès ?”)

Le ReBAC modélise les permissions comme des relations entre objets.

Graphe ReBAC : Alice est owner de doc-123, Bob est viewer, Team-X contient Bob, doc-123 est dans folder-A

Règle : “Les viewers d’un dossier peuvent lire les documents qu’il contient”

Les systèmes ReBAC (Google Zanzibar, OpenFGA, SpiceDB) traversent le graphe de relations pour calculer les permissions.

Avantages :

  • Naturel pour les hiérarchies (org, dossiers, projets)
  • Permissions héritées automatiquement
  • Modèle puissant pour le sharing/collaboration

Inconvénients :

  • Complexité du graphe
  • Performance (traversée de graphe)
  • Moins intuitif que RBAC
CritèreRBACABACReBAC
ComplexitéFaibleÉlevéeMoyenne-Élevée
FlexibilitéFaibleTrès élevéeÉlevée
Contexte dynamiquePartiel
Auditabilité✅ Facile⚠️ Complexe⚠️ Graphe
Cas d’usageApps métier classiquesDéfense, santé, financeCollaboration, SaaS multi-tenant
Exemples systèmesAWS IAM, Kubernetes RBACXACML, OPAGoogle Zanzibar, OpenFGA

Pour découpler l’autorisation du code métier, utilisez l’architecture PEP + PDP :

ComposantRôle
PEP (Policy Enforcement Point)Intercepte la requête, demande une décision, applique le résultat
PDP (Policy Decision Point)Évalue la politique, retourne ALLOW/DENY
PAP (Policy Administration Point)Interface d’administration des politiques
PIP (Policy Information Point)Fournit les attributs (user, resource, context)

Flux de décision PDP/PEP : le Client envoie une requête au PEP, qui interroge le PDP pour obtenir une décision ALLOW/DENY basée sur les attributs du PIP

AvantageDescription
CohérenceUne seule source de vérité pour les politiques
TestabilitéPolitiques testées indépendamment du code
ÉvolutivitéChanger les règles sans redéployer l’app
AuditabilitéLog centralisé des décisions

OPA (Open Policy Agent) est un moteur de politiques générique. Les politiques sont écrites en Rego.

package authz
# Permet aux admins de tout faire
allow {
input.user.roles[_] == "admin"
}
# Permet aux owners de modifier leurs ressources
allow {
input.action == "write"
input.resource.owner == input.user.id
}
# Lecture autorisée si même département
allow {
input.action == "read"
input.user.department == input.resource.department
}

Input (JSON) :

{
"user": {
"id": "alice",
"roles": ["user"],
"department": "engineering"
},
"action": "read",
"resource": {
"id": "doc-123",
"department": "engineering",
"owner": "bob"
}
}

Résultat : allow = true (même département)

OPA permet d’écrire des tests unitaires :

package authz
test_admin_allowed {
allow with input as {
"user": {"roles": ["admin"]},
"action": "delete",
"resource": {}
}
}
test_user_cannot_delete {
not allow with input as {
"user": {"roles": ["user"]},
"action": "delete",
"resource": {}
}
}
test_owner_can_write {
allow with input as {
"user": {"id": "alice", "roles": ["user"]},
"action": "write",
"resource": {"owner": "alice"}
}
}

Exécution :

Fenêtre de terminal
opa test policy.rego policy_test.rego

Kubernetes utilise un RBAC natif pour contrôler l’accès à l’API.

RessourceDescription
RolePermissions dans un namespace
ClusterRolePermissions cluster-wide
RoleBindingLie un Role à un sujet (user, group, SA)
ClusterRoleBindingLie un ClusterRole cluster-wide
# Role : permissions de lecture
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: production
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
# RoleBinding : lie le role à Alice
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
namespace: production
name: alice-pod-reader
subjects:
- kind: User
name: alice
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
Fenêtre de terminal
# Tester si Alice peut lister les pods
kubectl auth can-i list pods --namespace production --as alice
# yes
# Tester si Alice peut supprimer les pods
kubectl auth can-i delete pods --namespace production --as alice
# no

Problème : Vous créez un rôle pour chaque combinaison de permissions.

admin-us-east-project-alpha
admin-us-west-project-alpha
viewer-eu-project-beta
editor-apac-project-gamma
...

Solution : Passez à ABAC pour les dimensions dynamiques (région, projet), gardez RBAC pour les niveaux (admin, editor, viewer).

Problème : “On verra plus tard” → allow = true partout.

Solution :

  • Deny by default : aucun accès sauf règle explicite
  • Revue régulière des politiques
  • Tests automatisés

Problème : L’attribut vient du client, sans vérification.

# DANGEREUX : le client peut mentir sur son rôle
allow {
input.user_claims.role == "admin"
}

Solution :

  • Les attributs doivent venir de sources fiables (IdP, base interne)
  • Valider les claims du token avec le PIP

Problème : “Pourquoi Bob a-t-il pu accéder ?” → aucune trace.

Solution :

  • Logger chaque décision (entrée, résultat, politique matchée)
  • Conserver les logs pour l’audit
  1. Identifier les sujets

    Qui demande l’accès ? Users, services, machines, groupes.

  2. Identifier les ressources

    Sur quoi porte l’accès ? APIs, documents, base de données, environnements.

  3. Identifier les actions

    Que peut-on faire ? CRUD, approve, deploy, transfer…

  4. Choisir le modèle

    RBAC si simple, ABAC si contexte dynamique, ReBAC si hiérarchies/sharing.

  5. Définir les politiques

    Règles explicites, deny by default, versionned.

  6. Implémenter PEP/PDP

    Découpler la décision de l’enforcement.

  7. Tester

    Tests unitaires pour chaque politique, cas nominaux et limites.

  8. Auditer

    Logs, revues régulières, alertes sur anomalies.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.