Aller au contenu
Sécurité medium

Durcir et journaliser sudo (sudoers)

8 min de lecture

sudo est la porte d'élévation de privilèges de vos serveurs : c'est à la fois un point de contrôle et une cible. Mal configuré, il accorde trop, journalise trop peu, et laisse passer des contournements. Ce guide montre comment journaliser sudo de façon exploitable (avec enregistrement de session rejouable), durcir les Defaults sans casser l'automatisation, et limiter les privilèges proprement. L'approche suit CIS 5.3 et les recommandations R38 à R44 d'ANSSI-BP-028 v2.0.

  • Journaliser sudo dans un fichier dédié et enregistrer les sessions
  • Éditer sudoers en sécurité avec visudo
  • Durcir les Defaults (use_pty, !visiblepw, délais) sans footgun
  • Limiter les privilèges : groupe dédié, négations bannies, arguments précisés
  • Rejouer une session sudo avec sudoreplay pour l'investigation

Chaque règle sudoers est une délégation de pouvoir. Deux risques :

  • Trop de privilèges : un ALL=(ALL) ALL ou des commandes mal cadrées permettent une élévation complète, parfois par contournement (un éditeur autorisé qui lance un shell, une négation ! contournable).
  • Pas de traçabilité : par défaut, sudo ne consigne que dans syslog. Sans journal dédié ni enregistrement, vous ne savez pas qui a fait quoi lors d'un incident.

Durcir sudo, c'est donc réduire ce qui est accordé et rendre tout traçable.

  • Un serveur Linux (Debian, Ubuntu, RHEL, AlmaLinux, Rocky)
  • Un accès root (ou un sudo fonctionnel) et un second accès de secours
  • De préférence une VM de test : une erreur sudoers peut couper l'accès admin

Regardez les Defaults déjà en place :

Fenêtre de terminal
sudo grep -hE '^Defaults' /etc/sudoers /etc/sudoers.d/* 2>/dev/null

Sur une Debian 12, vous trouverez en général :

Defaults env_reset
Defaults mail_badpass
Defaults secure_path="..."
Defaults use_pty

Bonne nouvelle : use_pty est déjà activé par défaut sur les versions récentes. Mauvaise nouvelle : aucun journal dédié n'est configuré, sudo ne consigne que dans syslog.

C'est le cœur du durcissement : rendre chaque usage de sudo exploitable. Créez /etc/sudoers.d/10-hardening :

  1. Définir un journal dédié et l'enregistrement de session

    Defaults logfile="/var/log/sudo.log"
    Defaults log_input, log_output
    Defaults iolog_dir="/var/log/sudo-io"
  2. Valider puis poser les bons droits

    Fenêtre de terminal
    sudo visudo -cf /etc/sudoers.d/10-hardening
    sudo chmod 0440 /etc/sudoers.d/10-hardening
  3. Vérifier que tout est capturé

    Après une commande sudo id lancée par un utilisateur, le journal dédié contient l'essentiel :

    Jun 25 07:34:44 : alice : PWD=/home/alice ; USER=root ; TSID=01 ;
    COMMAND=/usr/bin/id

    Et la session complète est enregistrée :

    Fenêtre de terminal
    sudo ls /var/log/sudo-io/
    sudo sudoreplay -l # lister les sessions
    sudo sudoreplay 01 # rejouer la session TSID 01

sudoreplay rejoue la session à l'identique (frappes et sortie), un atout majeur pour l'investigation après incident.

Ajoutez au même fichier les options qui réduisent les abus :

Defaults use_pty
Defaults !visiblepw
Defaults passwd_timeout=1
Defaults timestamp_timeout=5
OptionEffet
use_ptyExécute la commande dans un pseudo-terminal : empêche une tâche lancée via sudo de détourner le terminal réel
!visiblepwRefuse sudo si la saisie du mot de passe serait visible (terminal sans masquage)
passwd_timeoutDélai (minutes) pour saisir le mot de passe
timestamp_timeoutDurée (minutes) avant de redemander le mot de passe

Au-delà des Defaults, ce sont les règles qui comptent.

  • Un groupe dédié (ANSSI R38) : accordez sudo via un groupe (%sudo sur Debian, %wheel sur RHEL), jamais à des utilisateurs en direct.

    %sudo ALL=(ALL:ALL) ALL
  • Bannir les négations (R42) : une règle du type ALL, !/bin/su est contournable (chemins alternatifs, copies du binaire). Listez ce qui est autorisé, pas ce qui est interdit.

  • Préciser les arguments (R43) : alice ALL=(root) /usr/bin/systemctl restart nginx est bien plus sûr que /usr/bin/systemctl tout court, qui permettrait systemctl edit et donc un shell root.

  • Éviter les commandes qui ouvrent un shell : vi, less, find, awk autorisés sans restriction permettent de sortir vers un shell root. Cadrez ou utilisez NOEXEC.

Quelques contrôles rapides :

Fenêtre de terminal
# La configuration globale est-elle valide ?
sudo visudo -c
# Quelles règles s'appliquent à un utilisateur ?
sudo -lU alice
# Le journal dédié grossit-il à chaque sudo ?
sudo tail -f /var/log/sudo.log
  • Garder un accès de secours : avant de durcir, gardez une session root ou une console ouverte. Une erreur sudoers se corrige depuis cet accès.
  • Protéger les journaux : /var/log/sudo.log et /var/log/sudo-io doivent être en accès root uniquement, et idéalement déportés vers un collecteur (un attaquant qui obtient root effacerait les logs locaux).
  • Tracer les changements de sudoers : couplez avec auditd, qui surveille /etc/sudoers et /etc/sudoers.d/ (clé scope).
  • Revoir régulièrement : sudo -lU <user> pour auditer les droits réels, pas seulement la théorie des fichiers.
SymptômeCause probableSolution
Plus aucun sudo ne fonctionneErreur de syntaxe écrite sans visudoCorriger depuis l'accès root de secours, valider avec visudo -c
Le cron ou un script sudo échouerequiretty poséRetirer requiretty, garder use_pty
Rien dans /var/log/sudo.loglogfile absent ou fichier non rechargéVérifier /etc/sudoers.d/, droits 0440, relancer une commande
sudoreplay ne trouve rienlog_output non activéAjouter log_input, log_output et iolog_dir
Une règle « tout sauf X » est contournéeUsage de négations !Lister les commandes autorisées explicitement
  • Toujours visudo : jamais d'édition directe de sudoers
  • Journal dédié (logfile) + enregistrement de session (log_input/log_output) rejouable avec sudoreplay
  • use_pty (souvent déjà par défaut) et !visiblepw ; jamais requiretty (casse le non-interactif)
  • Groupe dédié (R38), pas de négations (R42), arguments précisés (R43)
  • Protéger les journaux sudo (root only, déportés) car ils contiennent des traces sensibles
  • Référentiels : CIS 5.3 et ANSSI-BP-028 R38 à R44

Ce site vous est utile ?

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

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn