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
- Les processus Windows et leur arborescence normale
- Comptes, SID et droits sous Windows
- Lire les journaux Windows
- La persistance sous Windows
- Linux : utilisateurs, permissions et processus
- 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 :
| Dossier | Contenu |
|---|---|
/etc | Configuration du système (comptes, services, réseau) |
/var/log | Journaux |
/home | Dossiers personnels des utilisateurs (/root pour root) |
/tmp, /dev/shm | Fichiers temporaires, écriture pour tous |
/proc | Informations sur les processus en cours, générées par le noyau |
/usr/bin, /usr/sbin | Programmes |
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)
| Droit | Valeur | Sur un fichier | Sur un dossier |
|---|---|---|---|
| r | 4 | Lire le contenu | Lister les noms des fichiers |
| w | 2 | Modifier le contenu | Créer, supprimer, renommer des fichiers dedans |
| x | 1 | Exécuter | Traverser (entrer et accéder aux fichiers) |
On additionne les valeurs : 7 = rwx, 6 = rw-, 5 = r-x, 4 = r--.
| Notation | Droits | Usage typique |
|---|---|---|
755 | rwxr-xr-x | Programmes, dossiers publics |
644 | rw-r—r— | Fichiers de configuration lisibles |
600 | rw------- | Clés privées SSH, fichiers sensibles |
700 | rwx------ | 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
| Bit | Valeur | Effet | Exemple légitime |
|---|---|---|---|
| SUID | 4000 | Le programme s’exécute avec les droits de son propriétaire | /usr/bin/passwd (doit modifier /etc/shadow) |
| SGID | 2000 | Avec les droits du groupe (sur un dossier : les fichiers créés héritent du groupe) | Dossiers partagés |
| Sticky bit | 1000 | Sur 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/shmou/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