Module 3 · 3.1
Français
Utilisateurs, groupes et droits sur les fichiers
Module 3: Utilisateurs, droits et sudo · Temps de lecture : 12 minutes
Objectif pédagogique : À l'issue de cette leçon, vous saurez créer et consulter des utilisateurs et des groupes, lire les droits d'un fichier ou d'un dossier dans ls -l, et les corriger avec chmod et chown sans tout ouvrir à tout le monde.
Notions clés : root (UID 0), utilisateur ordinaire, utilisateur système, /etc/passwd, /etc/shadow, groupe, adduser, id, rwx, propriétaire, groupe, autres, octal (644, 755, 600), chmod, chown, umask, setuid, 777
Chacun est un numéro
Linux a été conçu dès le départ pour plusieurs utilisateurs sur une même machine. Chaque processus en cours d'exécution tourne au nom d'un utilisateur, et chaque fichier a un propriétaire. Pour le système, un utilisateur est avant tout un numéro, l'UID :
- root a l'UID 0. Root peut tout faire : lire et modifier n'importe quel fichier, arrêter n'importe quel service, créer n'importe quel utilisateur. Il n'y a pas de « êtes-vous sûr ? ».
- Les utilisateurs ordinaires, comme
anna, reçoivent sur Debian et Ubuntu un UID à partir de 1000. Ils peuvent écrire dans leur propre dossier personnel, et pas grand-chose d'autre. - Les utilisateurs système ont un numéro bas et, le plus souvent, ni mot de passe ni shell. Les services tournent sous un tel utilisateur : nginx sous
www-data, PostgreSQL souspostgres. Si un tel service est piraté, l'intrus n'obtient que les droits de cet utilisateur, et non ceux de root.
Pour savoir qui vous êtes, utilisez id :
anna@web1:~$ id
uid=1000(anna) gid=1000(anna) groups=1000(anna),27(sudo),100(users)Anna a l'UID 1000, son propre groupe anna, et fait aussi partie des groupes sudo et users.
Où se trouvent les utilisateurs
La liste des utilisateurs se trouve dans /etc/passwd, une ligne par utilisateur :
anna@web1:~$ grep -E '^(root|www-data|anna):' /etc/passwd
root:x:0:0:root:/root:/bin/bash
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
anna:x:1000:1000:Anna,,,:/home/anna:/bin/bashLes champs, séparés par des deux-points : nom, x (le mot de passe est stocké ailleurs), UID, groupe principal, description, dossier personnel, shell. Pour www-data, le shell est /usr/sbin/nologin : impossible de se connecter.
Les mots de passe eux-mêmes sont stockés, chiffrés (hachés), dans /etc/shadow. Seul root peut lire ce fichier. Un ! ou un * au début du champ du mot de passe signifie : la connexion par mot de passe est impossible. C'est ainsi que root est verrouillé par défaut sur Ubuntu, et sur Debian si vous n'avez pas indiqué de mot de passe root lors de l'installation.
Créer des utilisateurs et des groupes
Sur Debian et Ubuntu, vous utilisez la commande conviviale adduser :
root@web1:~# adduser anna
info: Adding user `anna' ...
info: Adding new group `anna' (1000) ...
info: Adding new user `anna' (1000) with group `anna (1000)' ...
info: Creating home directory `/home/anna' ...
info: Copying files from `/etc/skel' ...
New password:
Retype new password:
...adduser crée l'utilisateur, un groupe personnel du même nom et un dossier personnel, puis demande un mot de passe. La commande de plus bas niveau useradd existe aussi (et c'est la commande habituelle sur AlmaLinux et Rocky Linux), mais sans options elle en fait moins : pas de mot de passe et, sur certains systèmes, pas de dossier personnel.
Un groupe permet d'accorder des droits à plusieurs utilisateurs à la fois. Pour ajouter un utilisateur à un groupe :
root@web1:~# adduser anna www-data
root@web1:~# usermod -aG www-data anna # identique, fonctionne partoutAttention au -a dans usermod : sans -a, vous remplacez tous les groupes supplémentaires de l'utilisateur par ce seul groupe. Un nouveau groupe ne prend effet qu'après une nouvelle connexion.
Pour bloquer un compte sans le supprimer (par exemple celui d'un ancien collègue) :
root@web1:~# usermod -L -e 1 jan-L verrouille le mot de passe, -e 1 fait expirer le compte. Attention : un mot de passe verrouillé n'empêche pas toujours la connexion par clé SSH. Supprimez donc aussi les clés dans /home/jan/.ssh/authorized_keys (leçon 2.3) ; en revanche, sshd refuse bien un compte expiré (-e 1).
Lire les droits
anna@web1:~$ ls -l /var/www/example.com
total 12
-rw-r--r-- 1 anna www-data 1520 Nov 9 10:12 index.html
-rw-r----- 1 anna www-data 412 Nov 9 10:14 config.php
drwxr-xr-x 2 anna www-data 4096 Nov 9 10:15 images
drwxrwxr-x 2 www-data www-data 4096 Nov 9 10:20 uploadsLe premier bloc de dix caractères est la clé de tout :
- Caractère 1 : le type.
-est un fichier ordinaire,dun dossier (directory),lun raccourci (symlink). - Caractères 2 à 4 : ce que le propriétaire peut faire.
- Caractères 5 à 7 : ce que le groupe peut faire.
- Caractères 8 à 10 : ce que les autres (tout le monde) peuvent faire.
Viennent ensuite le nombre de liens, le propriétaire, le groupe, la taille et la date.
Pour un fichier, les lettres signifient :
| Lettre | Signification pour un fichier |
|---|---|
r | lire |
w | modifier |
x | exécuter comme programme ou script |
Et pour un dossier, c'est légèrement différent :
| Lettre | Signification pour un dossier |
|---|---|
r | afficher les noms des fichiers du dossier |
w | créer, renommer et supprimer des fichiers dans le dossier |
x | entrer dans le dossier et ouvrir les fichiers qu'il contient |
Ce dernier point surprend beaucoup de monde. Sans x sur un dossier, vous n'accédez pas aux fichiers qu'il contient, même s'ils sont eux-mêmes lisibles. Et quiconque a w sur un dossier peut y supprimer des fichiers, même s'ils appartiennent à quelqu'un d'autre.
Dans l'exemple : index.html est lisible par tous ; config.php (avec le mot de passe de la base de données) peut être lu et modifié par Anna, seulement lu par le groupe www-data (donc le serveur web), et rien du tout par les autres. Dans uploads, le serveur web peut écrire, car c'est là qu'arrivent les fichiers envoyés par les visiteurs.
Les droits sous forme de nombre
Les droits s'écrivent souvent sous forme de trois chiffres, le nombre octal. Chaque lettre a une valeur : r = 4, w = 2, x = 1. Additionnez-les pour chaque catégorie :
| Droits | Nombre | Usage |
|---|---|---|
rw-r--r-- | 644 | fichier ordinaire lisible par tous |
rw-r----- | 640 | fichier pour le propriétaire et le groupe, comme une configuration contenant un mot de passe |
rw------- | 600 | fichier secret, comme authorized_keys ou une clé privée |
rwxr-xr-x | 755 | dossier ou programme utilisable par tous |
rwx------ | 700 | dossier privé, comme ~/.ssh |
Modifier les droits : chmod et chown
anna@web1:~$ chmod 640 /var/www/example.com/config.php
anna@web1:~$ chmod g+w /var/www/example.com/uploads
root@web1:~# chown anna:www-data /var/www/example.com/config.phpchmod modifie les droits, avec un nombre ou avec des lettres (u, g, o pour propriétaire, groupe, autres ; + ou - suivi de la lettre). chown eigenaar:groep modifie le propriétaire et le groupe ; seul root peut le faire. Avec -R, les deux commandes s'appliquent à tout un dossier, et c'est souvent là que les choses tournent mal : chmod -R 644 sur un dossier rend tous les sous-dossiers inutilisables, car les dossiers ont besoin de x. Pour toute une arborescence, utilisez plutôt find :
root@web1:~# find /var/www/example.com -type d -exec chmod 755 {} +
root@web1:~# find /var/www/example.com -type f -exec chmod 644 {} +Jamais 777
« Ça ne marchait pas, alors j'ai mis 777. » 777 signifie : tout le monde sur le serveur peut lire, modifier et exécuter ceci. Si un jour un seul service ou un seul site de votre serveur est compromis, l'intrus peut écrire partout où il y a 777, y compris dans vos fichiers PHP. Le vrai problème est presque toujours le propriétaire ou le groupe : donnez au serveur web, via le groupe, exactement le droit dont il a besoin, et uniquement sur le dossier où il en a besoin.
Droits par défaut et bits spéciaux
Les nouveaux fichiers reçoivent leurs droits via l'umask. Avec l'umask courant 022, les nouveaux fichiers sont en 644 et les nouveaux dossiers en 755. Vous voyez votre umask avec la commande umask.
Vous verrez parfois un s à la place d'un x, comme pour /usr/bin/passwd (-rwsr-xr-x). C'est le bit setuid : le programme s'exécute avec les droits de son propriétaire (root), même si c'est un utilisateur ordinaire qui le lance. C'est nécessaire pour quelques programmes système, mais ne le placez jamais vous-même sur un script. Un fichier setuid inattendu est un signe connu d'intrusion ; avec find / -perm -4000 -type f 2>/dev/null, vous les voyez tous.
Sur AlmaLinux et Rocky Linux
adduser y est un autre nom de useradd ; utilisez useradd -m anna puis passwd anna. Pour ajouter des groupes, utilisez usermod -aG. SELinux ajoute une couche supplémentaire en plus des droits vus dans cette leçon : un fichier avec les bons droits peut tout de même être refusé s'il porte le mauvais label SELinux (ls -Z l'affiche).
Résumé
- Chaque utilisateur a un UID ; root (0) peut tout faire, les services tournent sous leurs propres utilisateurs système, sans shell.
- Les utilisateurs se trouvent dans
/etc/passwd, les hachages des mots de passe dans/etc/shadow. Créez les utilisateurs avecadduseret ajoutez des groupes avecusermod -aG. ls -laffiche le type, les droits du propriétaire, du groupe et des autres, puis le propriétaire et le groupe. Pour un dossier,xsignifie entrer etwcréer et supprimer des fichiers.- Nombres courants : 644 et 755 pour ce qui est public, 640 pour une configuration contenant des secrets, 600 et 700 pour ce qui est privé. Jamais 777.
- Utilisez
findpour définir les droits sur toute une arborescence ; surveillez les fichiers setuid.
Quiz
Exercice
Exercice Z3.1 : Lire les droits. Ouvrez le fichier d'exemple rechten-1.txt : la sortie de id pour trois utilisateurs et de ls -l dans un dossier web. Pour chaque question, indiquez qui peut faire quoi (par exemple : « le serveur web peut-il modifier config.php ? », « quel fichier a des droits trop larges ? », « quel nombre correspond à .env ? »). Le programme compare vos réponses à la clé de correction et explique pour chaque question pourquoi.
Pour aller plus loin
Les étapes décrites dans ces articles s'appliquent aux offres d'hébergement et aux VPS de WebOké ; chez d'autres fournisseurs, le fonctionnement est comparable.
- Interdit (403) : vous n'avez pas l'autorisation d'accéder à / sur ce serveur
- Se connecter à votre VPS en SSH (et créer une clé SSH)
- Dans la formation WordPress : leçon 7.4 « Renforcer le site : droits, en-têtes et extensions de sécurité »
- Manuel Debian d'adduser : https://manpages.debian.org/trixie/adduser/adduser.8.en.html
- Manuel Debian de chmod : https://manpages.debian.org/trixie/coreutils/chmod.1.en.html
