cyber / cybersecurite-fondamentale
Principe du moindre privilège et contrôle d'accès
Explication
Ce que vous allez apprendre
- Appliquer le principe du moindre privilège à un utilisateur, un compte de service et un processus système
- Distinguer RBAC, ABAC, DAC et MAC et savoir pourquoi RBAC domine en entreprise
- Repérer le piège du compte root "temporaire" qui devient permanent en production
- Restreindre un compte applicatif en base de données aux seules opérations dont il a besoin
- Mettre en place une revue périodique des accès pour éviter l'accumulation silencieuse de privilèges
Dans quel contexte ?
Un audit de sécurité externe découvre que le compte utilisé par l'API backend d'une entreprise a les droits SUPERUSER sur toute la base PostgreSQL, alors qu'il n'a besoin que de lire et écrire dans trois tables. Un attaquant qui exploiterait une simple injection SQL pourrait alors supprimer des tables d'audit ou créer de nouveaux comptes administrateurs. Le principe du moindre privilège consiste précisément à empêcher ce genre de scénario, même en cas de faille ailleurs dans l'application.
Première étape : l'idée en une phrase. Chaque utilisateur, service ou processus ne devrait avoir accès qu'à ce dont il a strictement besoin pour faire son travail, ni plus. Un stagiaire n'a pas besoin des clés du coffre-fort pour photocopier des documents, même si l'entreprise fait globalement confiance à ses employés.
Deuxième étape : pourquoi ce principe ne suppose pas la méfiance. Il ne s'agit pas de penser que les gens sont malveillants, mais de limiter les dégâts en cas d'erreur ou de compromission. Si un compte applicatif n'a que les droits SELECT, INSERT et UPDATE sur trois tables précises, un attaquant qui vole ses identifiants ne peut ni supprimer toute la base, ni toucher aux tables d'audit.
Troisième étape : comment organiser concrètement les accès. Plusieurs modèles répondent à la même question : qui a le droit de faire quoi, et qui décide de cette règle ?
| Modèle | Qui décide | Exemple concret |
|---|---|---|
| RBAC (rôles) | L'organisation, via des rôles prédéfinis | admin / éditeur / lecteur sur Technologik |
| ABAC (attributs) | Une règle calculée selon le contexte | Accès autorisé seulement depuis le réseau interne, en journée |
| DAC (discrétionnaire) | Le propriétaire de la ressource | Partager un fichier Google Drive avec qui on veut |
| MAC (obligatoire) | Une politique centrale rigide | SELinux, classifications gouvernementales |
Pourquoi RBAC est le plus utilisé en entreprise ? Simplement parce qu'il est facile à auditer : il suffit de regarder la liste des rôles et ce que chacun permet, plutôt que de recalculer des règles complexes pour chaque personne.
Piège fréquent
Pendant le développement, on utilise souvent un compte root ou superuser par simplicité. Le problème, c'est que ce compte "temporaire" finit trop souvent par être utilisé aussi en production. Cette dette de sécurité reste invisible jusqu'au jour où ce compte est compromis, et l'attaquant récupère alors tous les droits d'un seul coup.
Cinquième étape : pourquoi il faut aussi revoir les accès dans le temps. Le moindre privilège n'est pas qu'une mise en place initiale. Les privilèges ont tendance à seulement s'accumuler : un employé change de poste mais garde ses anciens accès. Sans revue périodique, l'organisation se retrouve avec des accès "fantômes" que plus personne ne surveille vraiment.
Bonne pratique
Planifiez une revue d'accès trimestrielle : lister tous les comptes privilégiés, vérifier que chaque droit est encore justifié, et révoquer systématiquement ce qui n'a pas été utilisé depuis plus de 90 jours.
Maintenant qu'on sait limiter qui a accès à quoi, il reste une autre question tout aussi centrale : comment protéger la donnée elle-même, même si quelqu'un parvient à y accéder ou à intercepter sa transmission ? C'est exactement ce que la cryptographie, à partir de la prochaine leçon, permet de faire.
Commandes & code
Principe du moindre privilège et contrôle d'accès
Un utilisateur, service ou processus ne doit disposer que des permissions strictement nécessaires à sa fonction, ni plus ni moins.
# Modèles de contrôle d'accès
RBAC (Role-Based Access Control) : permissions liées à un rôle (admin, editor, viewer)
ABAC (Attribute-Based Access Control) : permissions calculées selon des attributs (département, heure, IP)
DAC (Discretionary Access Control) : le propriétaire de la ressource décide qui y accède
MAC (Mandatory Access Control) : politique centrale imposée (SELinux, labels de classification)# RBAC minimal avec FastAPI : dépendance de vérification de rôle
from fastapi import Depends, HTTPException, status
from enum import Enum
class Role(str, Enum):
ADMIN = "admin"
EDITOR = "editor"
VIEWER = "viewer"
ROLE_PERMISSIONS = {
Role.ADMIN: {"read", "write", "delete", "manage_users"},
Role.EDITOR: {"read", "write"},
Role.VIEWER: {"read"},
}
def require_permission(permission: str):
def dependency(current_user=Depends(get_current_user)): # get_current_user extrait le user du JWT
user_permissions = ROLE_PERMISSIONS.get(current_user.role, set())
if permission not in user_permissions:
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Permission refusée")
return current_user
return dependency
@app.delete("/courses/{course_id}")
async def delete_course(course_id: int, user=Depends(require_permission("delete"))):
...-- Moindre privilège au niveau base de données : ne jamais utiliser un compte "root" pour l'application
-- Créer un rôle applicatif restreint en PostgreSQL
CREATE ROLE app_backend LOGIN PASSWORD 'change_me_with_a_secret_manager';
-- Accorder UNIQUEMENT les droits nécessaires sur le schéma applicatif
GRANT CONNECT ON DATABASE technologik TO app_backend;
GRANT USAGE ON SCHEMA public TO app_backend;
GRANT SELECT, INSERT, UPDATE, DELETE ON courses, lessons, users TO app_backend;
-- Interdire explicitement les opérations DDL (structure) et les tables sensibles
REVOKE ALL ON audit_logs FROM app_backend;
GRANT SELECT, INSERT ON audit_logs TO app_backend; -- écriture seule, pas de suppression de traces# Moindre privilège au niveau système Linux : un service ne doit jamais tourner en root
# /etc/systemd/system/technologik-api.service
cat <<'EOF' > /etc/systemd/system/technologik-api.service
[Unit]
Description=Technologik API
After=network.target
[Service]
User=technologik # utilisateur dédié, non-root
Group=technologik
NoNewPrivileges=true # empêche l'escalade de privilèges via setuid
ProtectSystem=strict # système de fichiers en lecture seule sauf exceptions
ProtectHome=true
ReadWritePaths=/var/lib/technologik
ExecStart=/opt/technologik/venv/bin/uvicorn app.main:app --host 127.0.0.1 --port 8000
[Install]
WantedBy=multi-user.target
EOF# Créer l'utilisateur système dédié sans shell interactif (réduit la surface d'attaque)
useradd --system --no-create-home --shell /usr/sbin/nologin technologik
chown -R technologik:technologik /var/lib/technologik# Revue périodique des accès (access review)
1. Lister tous les comptes/rôles avec accès privilégié
2. Vérifier que chaque privilège est encore justifié (départ d'employé, changement de poste)
3. Révoquer les accès inutilisés depuis > 90 jours
4. Auditer les comptes de service (souvent oubliés, jamais expirés)
5. Documenter chaque exception au principe du moindre privilègeRésumé
- RBAC/ABAC structurent qui peut faire quoi ; le principe reste "juste assez, jamais plus".
- Les comptes applicatifs (DB, services systemd) doivent être dédiés et restreints, jamais root/superuser.
NoNewPrivilegesetProtectSystemdurcissent un service systemd sans effort.- Les revues d'accès périodiques évitent l'accumulation silencieuse de privilèges.
Exercices pratiques
Mission : l'audit du compte SUPERUSER de l'API
Objectif : Corriger un compte applicatif surprivilégié et concevoir un service systemd durci selon le moindre privilège.
Contexte
Un audit externe découvre que le compte PostgreSQL utilisé par l'API backend de Technologik possède le rôle SUPERUSER, alors qu'il n'a besoin que de lire et écrire dans les tables courses, lessons et users, et de journaliser (sans jamais supprimer) dans audit_logs.