Retour au cours

cyber / cybersecurite-fondamentale

Principe du moindre privilège et contrôle d'accès

Leçon 41 exercice

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èleQui décideExemple concret
RBAC (rôles)L'organisation, via des rôles prédéfinisadmin / éditeur / lecteur sur Technologik
ABAC (attributs)Une règle calculée selon le contexteAccès autorisé seulement depuis le réseau interne, en journée
DAC (discrétionnaire)Le propriétaire de la ressourcePartager un fichier Google Drive avec qui on veut
MAC (obligatoire)Une politique centrale rigideSELinux, 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.

text
# 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)
python
# 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"))):
    ...
sql
-- 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
bash
# 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
bash
# 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
text
# 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ège

Ré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.
  • NoNewPrivileges et ProtectSystem durcissent un service systemd sans effort.
  • Les revues d'accès périodiques évitent l'accumulation silencieuse de privilèges.

Exercices pratiques

1 disponible
1

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.

Résoudre l’exercice →