Elouan

Linux : utilisateurs, permissions et processus

Comment Linux gère les comptes, les droits sur les fichiers, les bits spéciaux comme SUID, et les processus. Les bases pour comprendre une élévation de privilèges.

Elouan

Série Systèmes Windows et Linux · article 5 sur 6
  1. Les processus Windows et leur arborescence normale
  2. Comptes, SID et droits sous Windows
  3. Lire les journaux Windows
  4. La persistance sous Windows
  5. Linux : utilisateurs, permissions et processus
  6. Linux : journaux et persistance

Linux fait tourner la majorité des serveurs, des équipements réseau et du cloud. Son modèle de sécurité est plus ancien et plus simple que celui de Windows : des utilisateurs, des groupes, et trois droits sur chaque fichier. C’est justement cette simplicité qui rend les erreurs de configuration si faciles à exploiter.

Tout est fichier

Sous Linux, presque tout est représenté comme un fichier : les documents, mais aussi les périphériques (/dev), les informations sur les processus (/proc) ou la configuration (/etc). Quelques dossiers à connaître :

DossierContenu
/etcConfiguration du système (comptes, services, réseau)
/var/logJournaux
/homeDossiers personnels des utilisateurs (/root pour root)
/tmp, /dev/shmFichiers temporaires, écriture pour tous
/procInformations sur les processus en cours, générées par le noyau
/usr/bin, /usr/sbinProgrammes

Les comptes

Chaque utilisateur a un UID (identifiant numérique) et appartient à un groupe principal (GID) et éventuellement à d’autres groupes. Le noyau ne connaît que ces numéros.

  • root a l’UID 0 : il a tous les droits.
  • Les comptes système (services) ont des UID bas, en général inférieurs à 1000, et souvent un shell /usr/sbin/nologin.
  • Les utilisateurs humains commencent en général à 1000.

/etc/passwd

alice:x:1000:1000:Alice Martin:/home/alice:/bin/bash
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin

Les champs : nom, x (le mot de passe est ailleurs), UID, GID, commentaire, dossier personnel, shell. Ce fichier est lisible par tous.

/etc/shadow

C’est là que sont les empreintes des mots de passe, lisibles par root seulement.

alice:$y$j9T$Dh2u…$Kq8…:19820:0:99999:7:::

Le préfixe indique l’algorithme : $y$ (yescrypt, par défaut sur les distributions récentes), $6$ (SHA-512 crypt), $1$ (MD5 crypt, obsolète). Un ! ou un * à la place de l’empreinte signifie que la connexion par mot de passe est désactivée.

Un second root

Le noyau ne regarde que l’UID. Un compte nommé backup avec l’UID 0 est un root à part entière. C’est une persistance classique, invisible si l’on ne cherche que le nom « root ». awk -F: '$3 == 0' /etc/passwd doit ne renvoyer que root.

Les permissions

Chaque fichier a un propriétaire, un groupe, et trois séries de droits : pour le propriétaire (u), le groupe (g) et les autres (o).

-rwxr-x---  1 alice  devs  4096  script.sh
 │└┬┘└┬┘└┬┘
 │ u  g  o
 └─ type (- fichier, d dossier, l lien)
DroitValeurSur un fichierSur un dossier
r4Lire le contenuLister les noms des fichiers
w2Modifier le contenuCréer, supprimer, renommer des fichiers dedans
x1ExécuterTraverser (entrer et accéder aux fichiers)

On additionne les valeurs : 7 = rwx, 6 = rw-, 5 = r-x, 4 = r--.

NotationDroitsUsage typique
755rwxr-xr-xProgrammes, dossiers publics
644rw-r—r—Fichiers de configuration lisibles
600rw-------Clés privées SSH, fichiers sensibles
700rwx------Dossier ~/.ssh

Et root ?

root contourne les permissions classiques. Des droits 000 ne l’empêchent pas de lire un fichier. Pour le restreindre, il faut d’autres mécanismes : SELinux, AppArmor, attributs (chattr +i), chiffrement.

Les bits spéciaux

BitValeurEffetExemple légitime
SUID4000Le programme s’exécute avec les droits de son propriétaire/usr/bin/passwd (doit modifier /etc/shadow)
SGID2000Avec les droits du groupe (sur un dossier : les fichiers créés héritent du groupe)Dossiers partagés
Sticky bit1000Sur un dossier : on ne peut supprimer que ses propres fichiers/tmp (droits 1777)

Le SUID est le plus sensible. Un binaire SUID root qui permet d’exécuter une commande ou d’ouvrir un shell, c’est une élévation de privilèges immédiate. Un attaquant qui est déjà root peut aussi poser un shell SUID comme porte dérobée.

# Lister les binaires SUID et SGID
find / -perm -4000 -type f 2>/dev/null
find / -perm -2000 -type f 2>/dev/null

Il faut comparer le résultat avec ce qui est normal pour la distribution : passwd, sudo, su, mount, ping sur certaines… mais pas bash, find, vim ou python.

sudo

sudo permet à un utilisateur de lancer certaines commandes en root, selon les règles du fichier /etc/sudoers (et /etc/sudoers.d/).

sudo -l      # ce que l'utilisateur courant peut faire avec sudo

Une règle sudo dangereuse

alice ALL=(root) NOPASSWD: /usr/bin/vim semble anodin : Alice peut éditer des fichiers en root. Mais depuis vim, la commande :!sh ouvre un shell… en root. Le site GTFOBins recense des centaines de programmes qui permettent ce genre de détournement (vim, less, find, awk, python, tar…).

Les processus

Comme sous Windows, chaque processus a un PID, un PPID et un utilisateur. Le PID 1 est le premier processus lancé par le noyau, aujourd’hui presque toujours systemd.

ps auxf                 # tous les processus, en arborescence
ps -ef --forest
ls -l /proc/1234/exe    # quel binaire tourne vraiment
cat /proc/1234/cmdline | tr '\0' ' '   # ligne de commande
ss -tulpn               # ports en écoute et processus associés

Quelques signaux d’alerte :

  • un processus dont l’exécutable est marqué (deleted) dans /proc/<PID>/exe : le fichier a été supprimé du disque mais tourne encore ;
  • un processus lancé depuis /tmp, /dev/shm ou /var/tmp ;
  • un shell (bash, sh) dont le parent est un serveur web (apache2, nginx, php-fpm) : web shell probable ;
  • un processus qui ouvre une connexion sortante vers une IP inconnue avec un shell attaché (reverse shell).

Le dernier article de la série passe aux journaux Linux et aux mécanismes de persistance.

L'essentiel

  • Sous Linux, root a l'UID 0. C'est l'UID qui compte, pas le nom : un second compte avec l'UID 0 est un second root.
  • /etc/passwd liste les comptes (nom:x:UID:GID:commentaire:dossier:shell). Les empreintes de mots de passe sont dans /etc/shadow, lisible par root seulement.
  • Permissions : lecture (r = 4), écriture (w = 2), exécution (x = 1), pour le propriétaire, le groupe et les autres. 755 = rwxr-xr-x, 644 = rw-r--r--, 600 = rw-------.
  • Sur un dossier, x permet de le traverser, r de lister son contenu, w d'y créer ou supprimer des fichiers.
  • SUID (4000) : le programme s'exécute avec les droits de son propriétaire. Un binaire SUID root mal choisi est une élévation de privilèges directe. Recherche : find / -perm -4000 2>/dev/null.
  • sudo -l montre ce qu'un utilisateur peut lancer en root. Les règles trop larges (un éditeur, un interpréteur, find…) sont un classique de l'élévation de privilèges (GTFOBins).

Idées reçues

root peut-il lire un fichier dont les permissions sont 000 ?

L'erreur courante. Répondre non, puisque personne n'a de droit.

En réalité. Oui. root contourne les permissions classiques des fichiers (capacité CAP_DAC_OVERRIDE). Les permissions 000 n'arrêtent que les autres utilisateurs. Pour restreindre root lui-même, il faut d'autres mécanismes (SELinux, AppArmor, attribut immuable, chiffrement).

Un dossier a les droits rw- pour un utilisateur, mais pas x. Peut-il ouvrir un fichier dedans ?

L'erreur courante. Répondre oui, puisqu'il a la lecture.

En réalité. Non. Sur un dossier, x est le droit de traverser. Sans x, on ne peut ni entrer dans le dossier ni accéder aux fichiers qu'il contient, même en connaissant leur nom. r seul permet de lister les noms, sans plus.

Pourquoi un compte autre que root avec l'UID 0 est-il grave ?

L'erreur courante. Penser que seul le nom root est privilégié.

En réalité. Le noyau ne connaît que les UID. Un compte « backup » avec l'UID 0 a exactement les droits de root. C'est une technique de persistance connue, qui passe inaperçue si l'on ne cherche que le nom. Vérification : `awk -F: '$3 == 0' /etc/passwd`.

Pourquoi /tmp a-t-il les droits 1777 ?

L'erreur courante. Ne pas savoir à quoi sert le 1.

En réalité. Le 1 est le sticky bit. Tout le monde peut écrire dans /tmp (777), mais grâce au sticky bit, chacun ne peut supprimer ou renommer que ses propres fichiers. Les dossiers en écriture pour tous comme /tmp et /dev/shm restent des endroits favoris pour déposer des outils.

Un processus apparaît avec un exécutable marqué « (deleted) ». Qu'est-ce que ça signifie ?

L'erreur courante. Penser que le processus est arrêté.

En réalité. Le fichier exécutable a été supprimé du disque, mais le processus tourne toujours en mémoire. C'est une technique fréquente pour compliquer l'analyse. On peut encore récupérer le binaire avec `cp /proc/<PID>/exe /chemin/sauvegarde`.

Tester ses connaissances

Références

  • How Linux Works (3e éd.)Brian Ward · No Starch Press
  • The Linux Command Line (2e éd.)William Shotts · No Starch Press

Textes de référence en ligne