Aller au contenu

Utilisateurs et permissions

Sur ton ordinateur personnel, tu es probablement le seul à l’utiliser. Tu ouvres, modifies et supprimes n’importe quel fichier sans te poser de questions. Sous Linux — et particulièrement sur un serveur web — cette liberté totale serait dangereuse.

Linux est un système multi-utilisateurs : plusieurs personnes (ou programmes) peuvent l’utiliser simultanément, chacun avec son propre espace et ses propres droits. Le système doit savoir qui fait quoi pour protéger les fichiers des uns contre les erreurs (ou la curiosité) des autres.

Chaque action sur le système est exécutée au nom d’un utilisateur. Même quand tu lances une commande dans le terminal, Linux sait quel utilisateur tu es et vérifie si tu as le droit de faire ce que tu demandes.

Quand tu te connectes à un système Linux, tu le fais avec un nom d’utilisateur (username). En coulisses, Linux associe ce nom à un UID (User ID) — un numéro unique. C’est le UID que le système utilise réellement pour tout contrôle d’accès; le nom n’est qu’un alias lisible pour les humains.

Fenêtre de terminal
whoami # Affiche ton nom d'utilisateur
id # Affiche ton UID, ton GID et tes groupes
id <nom_utilisateur> # Affiche les infos d'un autre utilisateur

Chaque utilisateur possède aussi un répertoire personnel (home directory), typiquement /home/<nom_utilisateur>, où il stocke ses fichiers. C’est son espace privé.


Si root peut tout faire, pourquoi ne pas toujours travailler en tant que root? Parce qu’un pouvoir illimité rend chaque erreur catastrophique. Une faute de frappe comme rm -rf /etc/ssh/ en tant qu’utilisateur normal te renverra un Permission denied — le système te protège. En tant que root, le dossier est effacé immédiatement, et ton serveur SSH ne fonctionne plus.

La solution de Linux : tu travailles avec un compte ordinaire au quotidien, et tu élèves tes privilèges uniquement quand c’est nécessaire, grâce à sudo.

Fenêtre de terminal
apt update # ❌ Permission refusée — tu n'es pas root
sudo apt update # ✅ Exécuté avec les privilèges root

sudo (superuser do) te permet d’exécuter une seule commande avec les privilèges de root, sans changer d’utilisateur. Le système te demande ton propre mot de passe pour confirmer que c’est bien toi.

Un groupe est un ensemble d’utilisateurs qui partagent les mêmes droits d’accès sur certaines ressources. Plutôt que d’accorder des permissions fichier par fichier à chaque utilisateur, on les accorde au groupe — et on ajoute les utilisateurs concernés au groupe.

Fenêtre de terminal
groups # Affiche les groupes de l'utilisateur courant
groups <nom_utilisateur> # Affiche les groupes d'un autre utilisateur

Chaque compte utilisateur est défini par plusieurs informations stockées dans le fichier /etc/passwd :

  • Nom d’utilisateur — l’identifiant de connexion (alice, bob, www-data)
  • UID — le numéro unique qui identifie l’utilisateur pour le système
  • GID — le numéro du groupe principal
  • Répertoire personnel — l’espace de travail (/home/<nom_utilisateur>)
  • Shell — le programme lancé à la connexion (/bin/bash, /bin/zsh)
/bin/bash
grep <nom_utilisateur> /etc/passwd
# Exemple : grep alice /etc/passwd

Les mots de passe ne sont pas dans /etc/passwd (malgré le nom). Ils sont stockés sous forme de hash dans /etc/shadow, un fichier avec des permissions restrictives (640 root:shadow) qui le rend inaccessible aux utilisateurs ordinaires. Cette séparation est une mesure de sécurité : /etc/passwd doit être lisible par tous (les programmes en ont besoin pour associer les UID aux noms), mais les hashs de mots de passe doivent rester protégés — seuls root et les quelques services système du groupe shadow (comme login ou sshd) peuvent les lire.


Sans les groupes, la gestion des permissions serait un cauchemar. Imagine un projet web avec trois développeurs qui doivent tous modifier les fichiers dans /var/www/<nom_site>. Sans groupes, tu aurais deux options :

  • Rendre les fichiers accessibles à tout le monde — dangereux.
  • Accorder les droits un par un à chaque utilisateur — fastidieux et fragile.

Avec les groupes, la solution est propre :

  1. Créer un groupe (webdev par exemple).
  2. Ajouter les trois développeurs au groupe.
  3. Donner au groupe les droits de lecture et d’écriture sur le répertoire du site.
  4. Un quatrième développeur rejoint l’équipe? On l’ajoute au groupe — il a immédiatement les bons droits.

Chaque utilisateur appartient à exactement un groupe principal (primary group), créé automatiquement à la création du compte avec le même nom que l’utilisateur. C’est ce qui apparaît dans gid quand tu fais id.

En plus du groupe principal, un utilisateur peut appartenir à plusieurs groupes supplémentaires (supplementary groups). Ceux-ci apparaissent dans groups.

Fenêtre de terminal
id
# uid=1001(alice) gid=1001(alice) groups=1001(alice),27(sudo),100(webdev)
# ^^ groupe principal ^^ groupes supplémentaires

Ici, le groupe principal d’alice est alice. Elle appartient aussi aux groupes supplémentaires sudo et webdev.

Quand le système vérifie si tu as accès à un fichier, il évalue les règles dans cet ordre précis :

  1. Es-tu le propriétaire du fichier? → applique les permissions u (propriétaire).
  2. Sinon, es-tu membre du groupe associé au fichier (qu’il soit ton groupe principal ou un de tes groupes supplémentaires)? → applique les permissions g (groupe).
  3. Sinon → applique les permissions o (autres).

Le point important : la règle s’arrête dès qu’une catégorie correspond. Même si tes permissions « autres » étaient plus généreuses, tu es bloqué aux permissions « groupe » si le fichier est dans un de tes groupes.

Si les groupes supplémentaires donnent accès aux fichiers, à quoi sert d’avoir un groupe principal? Son rôle : c’est le groupe qui sera assigné par défaut aux nouveaux fichiers que tu crées.

Fenêtre de terminal
id -gn # Affiche ton groupe principal (actif)
touch mon_fichier.txt
ls -l mon_fichier.txt
# -rw-rw-r-- 1 alice alice 0 jan 15 10:30 mon_fichier.txt
# ^^^^^ groupe principal d'alice, par défaut

Mais tu peux changer temporairement ton groupe actif avec newgrp :

Fenêtre de terminal
newgrp <nom_groupe_supplémentaire>
# Exemple : newgrp webdev
touch autre_fichier.txt
ls -l autre_fichier.txt
# -rw-rw-r-- 1 alice webdev 0 jan 15 10:31 autre_fichier.txt
# ^^^^^^ groupe actif temporaire

La commande adduser crée un compte complet : elle génère le UID, crée le répertoire personnel, copie les fichiers de configuration par défaut et demande un mot de passe.

Fenêtre de terminal
sudo adduser <nom_utilisateur>
# Exemple :
sudo adduser bob

Plusieurs commandes permettent de « devenir » un autre utilisateur, mais elles ne sont pas équivalentes. Le choix dépend de ce que tu veux faire et du mot de passe que tu connais.

Fenêtre de terminal
su - <nom_utilisateur>
# Exemple :
su - bob
  • Demande le mot de passe de l’utilisateur cible (bob).
  • Charge l’environnement complet de bob : $HOME, $PATH, $PWD, variables de son .bashrc.
  • Équivaut à une connexion fraîche — comme si bob venait de se connecter.
  • Le tiret (-) est essentiel : sans lui, tu gardes l’environnement de l’utilisateur précédent.

Pour sortir et revenir à ton utilisateur précédent :

Fenêtre de terminal
exit # ou Ctrl+D
Fenêtre de terminal
sudo deluser <nom_utilisateur> # Conserve le répertoire personnel
sudo deluser --remove-home <nom_utilisateur> # Supprime tout

Fenêtre de terminal
sudo addgroup <nom_groupe>
# Exemple :
sudo addgroup webdev
Fenêtre de terminal
sudo usermod -aG <nom_groupe> <nom_utilisateur>
# Exemple :
sudo usermod -aG webdev alice

L’ajout à un groupe via usermod -aG modifie la base de données des utilisateurs immédiatement, mais ta session en cours ne le voit pas. La liste des groupes actifs dans une session a été figée au moment de la connexion.

Trois manières d’activer le nouveau groupe :

Fenêtre de terminal
# 1. Se déconnecter et se reconnecter (propre, mais pas toujours pratique)
exit
# 2. Activer le groupe dans la session courante
newgrp <nom_groupe>
# Exemple : newgrp webdev
# 3. Vérifier les groupes tels que stockés (indépendamment de ta session)
groups <nom_utilisateur>
Fenêtre de terminal
groups <nom_utilisateur> # Liste les groupes d'un utilisateur
getent group <nom_groupe> # Liste les membres d'un groupe

Chaque fichier et répertoire sous Linux est associé à trois niveaux d’accès :

  • Propriétaire (user, u) — l’utilisateur qui possède le fichier
  • Groupe (group, g) — le groupe associé au fichier
  • Autres (others, o) — tous les autres utilisateurs du système

Pour chaque niveau, trois types de permissions sont possibles :

  • r (read) — lire le contenu
  • w (write) — modifier le contenu
  • x (execute) — exécuter (fichier) ou traverser (répertoire)
Fenêtre de terminal
ls -l <chemin_fichier>
# Exemple :
ls -l index.js
# -rwxr-xr-- 1 alice webdev 2048 jan 15 10:30 index.js

Propriétaire (alice)

rwx — peut lire, modifier et exécuter le fichier.

Groupe (webdev)

r-x — peut lire et exécuter, mais pas modifier.

Autres

r-- — peut seulement lire. Pas de modification ni d’exécution.

Sur un répertoire, les permissions ont un sens légèrement différent :

  • r — lister le contenu du répertoire (ls)
  • w — créer, renommer ou supprimer des fichiers dans le répertoire
  • x — accéder au répertoire (cd) et à ses sous-éléments

Chaque permission correspond à une valeur numérique : r = 4, w = 2, x = 1. On additionne les valeurs pour chaque niveau :

PermissionCalculValeur
rwx4 + 2 + 17
r-x4 + 0 + 15
r--4 + 0 + 04
rw-4 + 2 + 06
---0 + 0 + 00

Ainsi, rwxr-xr-- s’écrit 754 en notation octale.


Une question subtile : quand un fichier est créé, déplacé ou copié, d’où viennent ses permissions et son groupe? Les règles ne sont pas uniformes, et elles sont à l’origine de nombreux problèmes en production.

Quand tu crées un fichier avec touch, echo >, un éditeur de texte ou n’importe quelle autre méthode :

  • Propriétaire — c’est toi, l’utilisateur qui exécute la commande.
  • Groupe — c’est ton groupe principal par défaut. Exception : si le répertoire parent a le bit setgid, le fichier hérite du groupe du parent.
  • Permissions — calculées à partir de 666 (fichier) ou 777 (répertoire) moins la valeur de ton umask. Avec umask 0002 (défaut Ubuntu), les nouveaux fichiers ont donc 664 (rw-rw-r--) et les nouveaux répertoires ont 775.
Fenêtre de terminal
umask # Affiche ton umask courant
umask 0002 # Modifie umask pour la session

Les deux opérations ont des effets très différents sur les permissions et le groupe. Cette distinction est une source classique de bogues.

cp crée un nouveau fichier à destination. Les règles de création standard s’appliquent :

  • Nouveau propriétaire = toi
  • Nouveau groupe = ton groupe principal (ou celui du parent si setgid)
  • Nouvelles permissions = calculées selon ton umask
Fenêtre de terminal
cp source.txt /dossier_avec_setgid/copie.txt
# copie.txt appartient à TOI, groupe du dossier (setgid s'applique)

Tu peux préserver les attributs originaux avec cp -p (ou cp --preserve).

Modifier les permissions d’un dossier n’affecte pas les fichiers qu’il contient :

Fenêtre de terminal
chmod 700 /dossier # Change les permissions du dossier
ls -l /dossier/fichier.txt # Le fichier garde ses permissions d'origine

Pour appliquer des permissions à un dossier et à tout son contenu, utilise -R (récursif) :

Fenêtre de terminal
chmod -R 755 <chemin_dossier>

chmod (change mode) modifie les permissions d’un fichier ou répertoire. Deux syntaxes sont possibles :

On spécifie qui (u, g, o, a pour tous), l’opération (+ ajouter, - retirer, = définir) et quelle permission (r, w, x).

Fenêtre de terminal
chmod <cible><opération><permissions> <chemin>
# Exemples :
chmod u+x script.sh # Ajoute l'exécution pour le propriétaire
chmod g+rw fichier.txt # Ajoute lecture + écriture pour le groupe
chmod o-rwx secret.key # Retire tout pour les autres
chmod a+r public.html # Ajoute la lecture pour tout le monde

chown (change owner) modifie le propriétaire et/ou le groupe d’un fichier.

Fenêtre de terminal
sudo chown <nouveau_propriétaire> <chemin> # Propriétaire seulement
sudo chown <nouveau_propriétaire>:<nouveau_groupe> <chemin> # Les deux
sudo chown :<nouveau_groupe> <chemin> # Groupe seulement
sudo chown -R <propriétaire>:<groupe> <chemin_dossier> # Récursif

Exemples :

Fenêtre de terminal
sudo chown alice fichier.txt
sudo chown alice:webdev fichier.txt
sudo chown :webdev fichier.txt
sudo chown -R alice:webdev /var/www/monsite

chgrp (change group) modifie uniquement le groupe associé à un fichier. C’est un raccourci pour chown :<groupe>.

Fenêtre de terminal
sudo chgrp <nom_groupe> <chemin> # Un fichier
sudo chgrp -R <nom_groupe> <chemin_dossier> # Récursif

Exemples :

Fenêtre de terminal
sudo chgrp webdev index.js
sudo chgrp -R webdev /var/www/monsite

Voici un scénario complet qui combine toutes les commandes. Tu configures les permissions d’un site web pour que l’équipe de développement puisse modifier les fichiers, et que le serveur web (www-data) puisse les lire pour les servir aux visiteurs.

Dans cet exemple, les développeurs s’appellent alice et bob, leur groupe est webdev, et le site est dans /var/www/monsite. Adapte ces noms à ton cas.

Avant de parler permissions, il faut que le dossier existe. /var/www/ est le répertoire standard pour les sites web sous Debian/Ubuntu (créé par défaut à l’installation d’Apache ou Nginx). On y ajoute un sous-dossier pour notre site :

Fenêtre de terminal
sudo mkdir -p /var/www/monsite
ls -ld /var/www/monsite
# drwxr-xr-x 2 root root 4096 ... /var/www/monsite

Par défaut, le dossier appartient à root:root avec permissions 755. C’est notre point de départ — on va tout reconfigurer.

Un groupe dédié va regrouper toutes les personnes autorisées à modifier le site :

Fenêtre de terminal
sudo addgroup webdev

Vérifie que le groupe existe :

Fenêtre de terminal
getent group webdev
# webdev:x:1002:

Le numéro de GID peut varier selon ton système — ce qui compte, c’est que la ligne apparaisse.

Fenêtre de terminal
sudo usermod -aG webdev alice
sudo usermod -aG webdev bob

Vérifie que chaque développeur est bien dans le groupe :

Fenêtre de terminal
groups alice
# alice : alice sudo webdev
groups bob
# bob : bob webdev

Étape 4 — Définir le propriétaire et le groupe

Section intitulée « Étape 4 — Définir le propriétaire et le groupe »

On donne la propriété du site à alice (par exemple) et le groupe à webdev :

Fenêtre de terminal
sudo chown -R alice:webdev /var/www/monsite

Le -R (récursif) applique le changement au dossier et à tout son contenu — important si tu as déjà des fichiers dedans.

Vérifie :

Fenêtre de terminal
ls -ld /var/www/monsite
# drwxr-xr-x 2 alice webdev 4096 ... /var/www/monsite
# ^^^^^ ^^^^^^ propriétaire et groupe corrects

On passe le dossier à 2775 : rwxrwxr-x + bit setgid. Tout est fait en une seule commande sur une seule cible :

Fenêtre de terminal
sudo chmod 2775 /var/www/monsite

Vérifie :

Fenêtre de terminal
ls -ld /var/www/monsite
# drwxrwsr-x 2 alice webdev 4096 ... /var/www/monsite
# ^^^ le 's' dans la position groupe confirme que setgid est actif

Le s à la place du x dans la section groupe indique que setgid est bien appliqué. Les nouveaux fichiers créés dans ce dossier hériteront automatiquement du groupe webdev.

Crée un fichier en tant qu’alice et vérifie que tout fonctionne :

Fenêtre de terminal
sudo -u alice bash -c 'echo "<h1>Mon site</h1>" > /var/www/monsite/index.html'
ls -l /var/www/monsite/index.html
# -rw-rw-r-- 1 alice webdev 19 ... index.html
# ^^^^^^^^ ^^^^^^ groupe webdev grâce à setgid
# permissions 664 grâce à umask 002

Deux vérifications importantes :

  • Le groupe affiché est webdev (et non alice) → setgid fonctionne.
  • Les permissions sont rw-rw-r-- (664) → l’umask par défaut d’Ubuntu (0002) a fait son travail : écriture pour le groupe, lecture pour les autres.

Bob pourra donc modifier ce fichier, et www-data pourra le lire. La configuration est complète.

Introduction
1/13

L'utilisateur en Linux

Linux est un système multi-utilisateurs. Chaque action est exécutée au nom d'un utilisateur, et le système vérifie si cet utilisateur a le droit de la faire.

Sur un serveur web, ton application Node.js, Nginx et la base de données tournent chacun sous un utilisateur dédié avec des droits restreints. C'est le principe du moindre privilège.

Notes
Plus de 80% des serveurs web tournent sous Linux. Le modèle de permissions que tu apprends ici est celui que tu utiliseras en production.
Serveur multi-utilisateurs
Principe du moindre privilège
Chaque processus ne reçoit que les droits strictement nécessaires à son fonctionnement.