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 que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »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.
Authentification vs Autorisation
Section intitulée « Authentification vs Autorisation »Ces deux concepts sont souvent confondus. Pourtant, ils répondent à des questions différentes et interviennent à des moments distincts du flux de sécurité.
| Étape | Question | Ré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.
Les modèles d’autorisation
Section intitulée « Les modèles d’autorisation »RBAC : Role-Based Access Control
Section intitulée « RBAC : Role-Based Access Control »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)
Quand utiliser RBAC
Section intitulée « Quand utiliser RBAC »| Situation | RBAC 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 |
ABAC : Attribute-Based Access Control
Section intitulée « ABAC : Attribute-Based Access Control »Le ABAC décide selon des attributs :
| Type d’attribut | Exemples |
|---|---|
| Sujet | département, niveau de clearance, fonction |
| Ressource | classification, propriétaire, date création |
| Action | read, write, delete, approve |
| Contexte | heure, IP, géolocalisation, device |
Exemple de règle ABAC :
ALLOW read documentWHERE subject.department == resource.departmentAND resource.classification <= subject.clearanceAND context.time BETWEEN 08:00 AND 18:00AND 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 ?”)
ReBAC : Relationship-Based Access Control
Section intitulée « ReBAC : Relationship-Based Access Control »Le ReBAC modélise les permissions comme des relations entre objets.
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
Comparatif des modèles
Section intitulée « Comparatif des modèles »| Critère | RBAC | ABAC | ReBAC |
|---|---|---|---|
| Complexité | Faible | Élevée | Moyenne-Élevée |
| Flexibilité | Faible | Très élevée | Élevée |
| Contexte dynamique | ❌ | ✅ | Partiel |
| Auditabilité | ✅ Facile | ⚠️ Complexe | ⚠️ Graphe |
| Cas d’usage | Apps métier classiques | Défense, santé, finance | Collaboration, SaaS multi-tenant |
| Exemples systèmes | AWS IAM, Kubernetes RBAC | XACML, OPA | Google Zanzibar, OpenFGA |
Architecture PDP / PEP
Section intitulée « Architecture PDP / PEP »Pour découpler l’autorisation du code métier, utilisez l’architecture PEP + PDP :
| Composant | Rô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 d’une décision
Section intitulée « Flux d’une décision »Avantages du découplage
Section intitulée « Avantages du découplage »| Avantage | Description |
|---|---|
| Cohérence | Une 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 |
Policy-as-Code avec OPA
Section intitulée « Policy-as-Code avec OPA »OPA (Open Policy Agent) est un moteur de politiques générique. Les politiques sont écrites en Rego.
Exemple de politique Rego
Section intitulée « Exemple de politique Rego »package authz
# Permet aux admins de tout faireallow { input.user.roles[_] == "admin"}
# Permet aux owners de modifier leurs ressourcesallow { input.action == "write" input.resource.owner == input.user.id}
# Lecture autorisée si même départementallow { input.action == "read" input.user.department == input.resource.department}Évaluation d’une requête
Section intitulée « Évaluation d’une requête »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)
Tester les politiques
Section intitulée « Tester les politiques »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 :
opa test policy.rego policy_test.regoKubernetes RBAC : exemple concret
Section intitulée « Kubernetes RBAC : exemple concret »Kubernetes utilise un RBAC natif pour contrôler l’accès à l’API.
Composants
Section intitulée « Composants »| Ressource | Description |
|---|---|
| Role | Permissions dans un namespace |
| ClusterRole | Permissions cluster-wide |
| RoleBinding | Lie un Role à un sujet (user, group, SA) |
| ClusterRoleBinding | Lie un ClusterRole cluster-wide |
Exemple : read-only sur un namespace
Section intitulée « Exemple : read-only sur un namespace »# Role : permissions de lectureapiVersion: rbac.authorization.k8s.io/v1kind: Rolemetadata: namespace: production name: pod-readerrules:- apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch"]
# RoleBinding : lie le role à AliceapiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata: namespace: production name: alice-pod-readersubjects:- kind: User name: alice apiGroup: rbac.authorization.k8s.ioroleRef: kind: Role name: pod-reader apiGroup: rbac.authorization.k8s.ioVérification
Section intitulée « Vérification »# Tester si Alice peut lister les podskubectl auth can-i list pods --namespace production --as alice# yes
# Tester si Alice peut supprimer les podskubectl auth can-i delete pods --namespace production --as alice# noErreurs fréquentes
Section intitulée « Erreurs fréquentes »Explosion de rôles (RBAC)
Section intitulée « Explosion de rôles (RBAC) »Problème : Vous créez un rôle pour chaque combinaison de permissions.
admin-us-east-project-alphaadmin-us-west-project-alphaviewer-eu-project-betaeditor-apac-project-gamma...Solution : Passez à ABAC pour les dimensions dynamiques (région, projet), gardez RBAC pour les niveaux (admin, editor, viewer).
Politiques trop permissives
Section intitulée « Politiques trop permissives »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
Attributs non fiables
Section intitulée « Attributs non fiables »Problème : L’attribut vient du client, sans vérification.
# DANGEREUX : le client peut mentir sur son rôleallow { input.user_claims.role == "admin"}Solution :
- Les attributs doivent venir de sources fiables (IdP, base interne)
- Valider les claims du token avec le PIP
Pas de logging des décisions
Section intitulée « Pas de logging des décisions »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
Checklist de conception
Section intitulée « Checklist de conception »-
Identifier les sujets
Qui demande l’accès ? Users, services, machines, groupes.
-
Identifier les ressources
Sur quoi porte l’accès ? APIs, documents, base de données, environnements.
-
Identifier les actions
Que peut-on faire ? CRUD, approve, deploy, transfer…
-
Choisir le modèle
RBAC si simple, ABAC si contexte dynamique, ReBAC si hiérarchies/sharing.
-
Définir les politiques
Règles explicites, deny by default, versionned.
-
Implémenter PEP/PDP
Découpler la décision de l’enforcement.
-
Tester
Tests unitaires pour chaque politique, cas nominaux et limites.
-
Auditer
Logs, revues régulières, alertes sur anomalies.