Chapitre 916 minIntermédiaire
Contrôle d'accès : RBAC, ABAC et principe du moindre privilège
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- distinguer DAC, MAC, RBAC et ABAC ;
- appliquer le moindre privilège, le besoin d'en connaître et la séparation des tâches ;
- corriger un contrôle d'accès défaillant dans une API ;
- calculer un droit effectif entre partage et NTFS.
5 exercices corrigés1 schéma
Le contrôle d'accès décide, à chaque demande, si un utilisateur authentifié peut effectuer une action sur une ressource. Le modèle le plus utilisé en entreprise est le RBAC (Role-Based Access Control), où les droits sont attribués à des rôles et les rôles aux personnes ; l'ABAC (Attribute-Based Access Control) affine la décision avec des attributs et le contexte. Quel que soit le modèle, le principe du moindre privilège s'applique : chaque compte ne reçoit que les droits strictement nécessaires à sa mission.
Les modèles de contrôle d'accès
| Modèle | Qui décide | Principe | Où tu le croises |
|---|---|---|---|
| DAC (discrétionnaire) | Le propriétaire de la ressource | Le créateur d'un fichier choisit qui peut le lire ou le modifier | Permissions NTFS, droits Linux rwx, partage d'un document en ligne |
| MAC (obligatoire) | Une politique centrale, que les utilisateurs ne peuvent pas modifier | Chaque ressource et chaque personne ont un niveau ; on ne lit pas au-dessus de son niveau | Systèmes militaires, SELinux, AppArmor |
| RBAC (par rôles) | L'organisation, à travers les rôles | Les droits vont aux rôles, les rôles aux personnes | Applications métier, groupes Active Directory, rôles MySQL |
| ABAC (par attributs) | Des règles qui combinent des attributs | Attributs de la personne, de la ressource, de l'action et du contexte (heure, lieu, appareil) | Accès conditionnel, applications qui filtrent par région ou par service |
Le RBAC en détail
Dans le RBAC, on ne donne jamais un droit directement à une personne. On définit des rôles qui correspondent à des fonctions (comptable, technicien, responsable de service), on attribue des permissions aux rôles, puis on affecte les utilisateurs aux rôles.
Les avantages sont immédiats : une arrivée ou un départ se traite en ajoutant ou en retirant un rôle ; un audit consiste à relire une dizaine de rôles plutôt que des centaines de droits individuels ; la matrice d'habilitations se traduit directement en rôles (chapitre 11).
Deux dérives à surveiller :
- l'explosion des rôles : à force de créer un rôle pour chaque exception (« comptable mais qui voit aussi les notes de frais du commercial »), on finit avec plus de rôles que de salariés ;
- le rôle fourre-tout : un rôle « utilisateur avancé » qui cumule des droits sans rapport, donné à tout le monde pour éviter les demandes.
L'ABAC : quand le rôle ne suffit pas
Certaines règles ne s'expriment pas avec des rôles :
- un commercial ne voit que les clients de sa région ;
- un responsable valide les notes de frais de son équipe, pas celles des autres ;
- l'accès à la paie n'est possible que depuis un poste géré, en heures ouvrées.
L'ABAC évalue une règle sur des attributs : de la personne (service, région, niveau), de la ressource (propriétaire, classification), de l'action (lecture, suppression) et du contexte (heure, adresse IP, état du poste). Il est plus fin, mais plus difficile à auditer. En pratique, on combine les deux : le RBAC donne les droits de base, des règles ABAC les restreignent.
Les principes à citer dans une copie
| Principe | Énoncé | Exemple |
|---|---|---|
| Moindre privilège | Chaque compte reçoit les droits strictement nécessaires à sa mission, et pour la durée nécessaire | L'application de tickets se connecte à MySQL avec un compte qui n'a ni DROP ni DELETE |
| Besoin d'en connaître | On n'accède à une information que si sa mission l'exige, même si son niveau le permettrait | Une technicienne n'ouvre pas le dossier RH d'un salarié pour dépanner son poste |
| Séparation des tâches | Une même personne ne réalise pas seule une opération sensible de bout en bout | Celui qui crée un fournisseur dans le logiciel n'est pas celui qui valide son paiement |
| Refus par défaut | Tout ce qui n'est pas explicitement autorisé est interdit | Un nouveau compte n'a aucun droit tant qu'on ne lui en a pas donné |
| Défense en profondeur | Plusieurs contrôles successifs, pour qu'une erreur ne suffise pas | Contrôle dans l'interface, dans l'API, et droits restreints du compte de base de données |
| Contrôle côté serveur | Le serveur vérifie les droits à chaque requête, sans faire confiance au client | Masquer un bouton ne protège rien : la requête peut être envoyée directement |
Côté SLAM : le contrôle d'accès défaillant
Le contrôle d'accès défaillant (Broken Access Control) est en tête du Top 10 de l'OWASP, édition 2025 comme édition 2021. Il prend trois formes :
- l'élévation verticale : un utilisateur ordinaire accède à une fonction d'administration (
/admin/utilisateursrépond sans vérifier le rôle) ; - l'élévation horizontale : un utilisateur accède aux données d'un autre utilisateur de même niveau ;
- la référence directe non sécurisée (IDOR, Insecure Direct Object Reference) : l'application utilise un identifiant fourni par le client sans vérifier qu'il appartient bien à l'utilisateur.
GET /api/notes-de-frais/1043renvoie la note 1043, quel que soit son propriétaire ; il suffit de changer le nombre.
Le sujet SLAM de 2024 (U6) en donnait un exemple : dans l'API d'une application de formations, aucune route ne vérifiait l'utilisateur appelant, seul le code de l'application cliente le faisait avant d'appeler l'API. Conséquence : quiconque connaît l'adresse de l'API peut l'appeler directement, avec Postman ou curl, et lire ou modifier les données sans aucun contrôle.
La correction se fait côté serveur, en deux étages. D'abord le rôle, avec un middleware (ici en Express, après le middleware proteger du chapitre 5 qui a vérifié le jeton) :
// Fabrique de middleware : n'autorise que les rôles listés
export const autoriser = (...rolesAutorises) => (req, res, next) => {
if (!req.utilisateur) {
return res.status(401).json({ erreur: 'Non authentifié' });
}
if (!rolesAutorises.includes(req.utilisateur.role)) {
return res.status(403).json({ erreur: 'Accès interdit' });
}
next();
};
// Seul un comptable valide une note de frais
app.post('/api/notes-de-frais/:id/validation', proteger, autoriser('comptable'), validerNote);
Ensuite la propriété de la donnée, que le rôle ne suffit pas à garantir : la requête SQL filtre sur l'utilisateur connecté, pris dans le jeton vérifié, jamais dans la requête du client.
// Un salarié ne lit que SES notes de frais : le filtre porte sur l'identifiant du jeton
app.get('/api/notes-de-frais/:id', proteger, async (req, res) => {
const [lignes] = await db.execute(
'SELECT * FROM note_frais WHERE id = ? AND id_salarie = ?',
[req.params.id, req.utilisateur.id],
);
if (lignes.length === 0) {
return res.status(404).json({ erreur: 'Note introuvable' }); // ne révèle pas qu'elle existe
}
res.json(lignes[0]);
});
Dans le sujet de 2025 (cas Casterman), les droits étaient stockés par fonction, table par table et opération par opération (sélection, ajout, modification, suppression), et il fallait écrire en Java la méthode possedeDroit(uneTable, uneOperation) de la classe Utilisateur. Une écriture possible, en supposant que la fonction de l'utilisateur expose sa liste de droits :
/** Vrai si la fonction de l'utilisateur autorise l'opération sur la table. */
public boolean possedeDroit(String uneTable, String uneOperation) {
for (Droit d : saFonction.getLesDroits()) {
if (d.getTable().equals(uneTable) && d.getOperation().equals(uneOperation)) {
return true;
}
}
return false; // refus par défaut : aucun droit trouvé
}
Le return false final est le refus par défaut : une table ou une opération oubliée dans la configuration est interdite, pas autorisée. Les droits du compte de base de données utilisé par l'application complètent ce contrôle (GRANT et les rôles MySQL).
Côté SISR : les droits sur les fichiers et les serveurs
Sur un serveur de fichiers Windows, deux couches de droits s'appliquent à un dossier partagé :
- les autorisations de partage, vérifiées quand on accède par le réseau (
\\srv-fichiers\Compta) ; - les autorisations NTFS, vérifiées dans tous les cas, en local comme par le réseau.
Le droit effectif par le réseau est le plus restrictif des deux. Au sein de NTFS, les autorisations des différents groupes d'un utilisateur s'additionnent, mais un refus explicite l'emporte sur une autorisation. Une pratique courante : des autorisations de partage larges (Modification pour les utilisateurs authentifiés) et tous les réglages fins en NTFS, donnés à des groupes de domaine local selon AGDLP (chapitre 7). On évite les refus explicites, difficiles à suivre, et on désactive l'héritage seulement quand c'est nécessaire.
| Autorisation NTFS | Permet |
|---|---|
| Lecture | Ouvrir les fichiers, lister le dossier |
| Lecture et exécution | Lecture, plus lancer des programmes |
| Écriture | Créer des fichiers et des dossiers |
| Modification | Lecture, écriture et suppression |
| Contrôle total | Tout, y compris modifier les autorisations et prendre possession |
Sur un serveur Linux, les droits rwx du propriétaire, du groupe et des autres (chmod 750 /srv/compta : tout pour le propriétaire, lecture et accès pour le groupe, rien pour les autres), les ACL pour les cas plus fins (setfacl -m g:compta:rx /srv/archives), et sudo pour les privilèges : on autorise une commande précise à un groupe précis plutôt que de donner le mot de passe de root.
# /etc/sudoers.d/techniciens : les techniciens redémarrent le serveur web, rien d'autre
%techniciens ALL=(root) /usr/bin/systemctl restart apache2
Le cours Administration Linux détaille les droits et sudo.
Comment l'E7 l'interroge
- SLAM : identifier un contrôle d'accès défaillant dans un extrait de code (IDOR, rôle lu dans la requête, route sans contrôle) ; écrire une méthode qui vérifie un droit (
possedeDroit, sujet 2025) ; expliquer l'intérêt de rôles applicatifs différents au niveau de la connexion à la base (sujet 2023) ; écrire des tests unitaires qui vérifient qu'un rôle ne peut pas faire une action. - SISR : calculer un droit effectif (partage et NTFS) ; proposer une organisation des groupes ; restreindre les privilèges d'un compte de service ; configurer
sudopour une tâche précise. - Tronc commun : définir le moindre privilège, le besoin d'en connaître, la séparation des tâches, et les appliquer au contexte.
Pour aller plus loin. Le contrôle d'accès défaillant est la première catégorie de l'OWASP Top 10 : le chapitre Contrôle d'accès défaillant (A01) du cours Sécurité applicative détaille les IDOR et leurs corrections.
Exercices
Exercice 1 sur 5 Quel modèle ? Réussi À revoir
Associe chaque situation au modèle de contrôle d'accès qu'elle illustre (DAC, MAC, RBAC, ABAC).
- Julie partage un fichier de son espace en ligne avec Karim, en lecture seule.
- Dans le logiciel de paie, les droits viennent du profil « gestionnaire de paie ».
- Un responsable d'agence ne voit les contrats que de son agence, et seulement depuis un poste de l'entreprise.
- Un document classé « confidentiel défense » ne peut pas être ouvert par une personne habilitée au niveau inférieur, même si son propriétaire le voulait.
Voir la réponseMasquer la réponse de l'exercice 1
- DAC : la propriétaire décide elle-même.
- RBAC : les droits sont portés par un rôle.
- ABAC : la décision combine un attribut de la personne (son agence), de la ressource (l'agence du contrat) et du contexte (le poste).
- MAC : une politique centrale, avec des niveaux, que personne ne peut contourner.
Tu avais trouvé ?
Exercice 2 sur 5 Le droit effectif Réussi À revoir
Le dossier partagé Compta a ces autorisations. Partage : Utilisateurs authentifiés en Lecture. NTFS : DL_Compta_Modification en Modification. Paul Martin est membre (par AGDLP) de DL_Compta_Modification.
- Quel est le droit effectif de Paul quand il ouvre
\\srv-fichiers\Comptadepuis son poste ? - Et s'il ouvre le dossier en session locale sur le serveur ?
- Que faut-il changer pour qu'il puisse travailler par le réseau ?
Voir la réponseMasquer la réponse de l'exercice 2
- Lecture : par le réseau, on retient le plus restrictif entre le partage (Lecture) et NTFS (Modification).
- Modification : en local, seules les autorisations NTFS s'appliquent.
- Passer l'autorisation de partage à Modification (ou plus) pour les utilisateurs authentifiés, et laisser NTFS faire le tri : seuls les membres de
DL_Compta_Modificationpourront écrire.
Tu avais trouvé ?
Exercice 3 sur 5 La note de frais 1043 Réussi À revoir
Une API répond à GET /api/notes-de-frais/:id par SELECT * FROM note_frais WHERE id = ?, après avoir vérifié que l'utilisateur est authentifié.
- Nomme la vulnérabilité et décris une exploitation.
- Corrige la requête.
- Que doit renvoyer l'API quand la note existe mais appartient à un autre salarié ?
Voir la réponseMasquer la réponse de l'exercice 3
- Une référence directe non sécurisée (IDOR), forme de contrôle d'accès défaillant (A01 de l'OWASP). Un salarié authentifié remplace son numéro de note par d'autres (1042, 1044…) et lit les notes de frais de ses collègues : montants, lieux, données personnelles.
SELECT * FROM note_frais WHERE id = ? AND id_salarie = ?, avec l'identifiant du salarié pris dans la session ou le jeton vérifié. Un comptable, qui doit voir toutes les notes, passe par une autre route protégée par son rôle.- 404 (introuvable) plutôt que 403 : l'API ne confirme pas l'existence d'une note que l'utilisateur n'a pas le droit de voir. Un 403 reste acceptable s'il est cohérent dans toute l'API ; l'essentiel est de ne renvoyer aucune donnée.
Tu avais trouvé ?
Exercice 4 sur 5 Séparation des tâches Réussi À revoir
Dans le logiciel comptable de Sorbier Logistique, Karim Morel, responsable comptable, peut créer un fournisseur, saisir ses factures et valider les paiements. Quel principe n'est pas respecté ? Quel risque cela crée-t-il, et comment le corriger avec des rôles ?
Voir la réponseMasquer la réponse de l'exercice 4
La séparation des tâches : une seule personne peut réaliser toute la chaîne d'un paiement. Elle pourrait créer un faux fournisseur avec son propre IBAN, saisir une fausse facture et la payer, sans qu'aucun contrôle ne l'arrête (fraude interne, ou compte piraté utilisé de la même façon). Correction : séparer les rôles, par exemple « gestion des fournisseurs » et « saisie des factures » pour les comptables, « validation des paiements » pour le responsable, avec la règle qu'un utilisateur ne peut pas valider un paiement vers un fournisseur qu'il a créé ou modifié récemment, et la journalisation de ces actions.
Tu avais trouvé ?
Exercice 5 sur 5 Le compte de l'application Réussi À revoir
L'application de tickets de Sorbier Logistique se connecte à MySQL avec le compte root. Explique le risque en une phrase, puis propose les droits du compte applicatif, sachant que l'application lit toute la base parc, crée et modifie des tickets, et ajoute des interventions.
Voir la réponseMasquer la réponse de l'exercice 5
Si l'application est compromise (injection SQL, mot de passe trouvé dans le code), l'attaquant obtient tous les droits sur tout le serveur : il peut lire, modifier ou supprimer toutes les bases, créer des comptes. Droits proposés, selon le moindre privilège :
CREATE USER 'app_tickets'@'10.0.1.20' IDENTIFIED BY 'Phrase-de-passe-longue-et-unique-2026';
GRANT SELECT ON parc.* TO 'app_tickets'@'10.0.1.20';
GRANT INSERT, UPDATE ON parc.ticket TO 'app_tickets'@'10.0.1.20';
GRANT INSERT ON parc.intervention TO 'app_tickets'@'10.0.1.20';
Aucun DELETE, aucun droit de structure (CREATE, ALTER, DROP), connexion limitée à l'adresse du serveur applicatif.
Tu avais trouvé ?