Propriétaire (alice)
rwx — peut lire, modifier et exécuter le fichier.
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.
whoami # Affiche ton nom d'utilisateurid # Affiche ton UID, ton GID et tes groupesid <nom_utilisateur> # Affiche les infos d'un autre utilisateurChaque 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.
apt update # ❌ Permission refusée — tu n'es pas rootsudo apt update # ✅ Exécuté avec les privilèges rootsudo (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.
groups # Affiche les groupes de l'utilisateur courantgroups <nom_utilisateur> # Affiche les groupes d'un autre utilisateurChaque compte utilisateur est défini par plusieurs informations stockées dans le fichier /etc/passwd :
alice, bob, www-data)/home/<nom_utilisateur>)/bin/bash, /bin/zsh)grep <nom_utilisateur> /etc/passwd# Exemple : grep alice /etc/passwdLes 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 :
Avec les groupes, la solution est propre :
webdev par exemple).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.
id# uid=1001(alice) gid=1001(alice) groups=1001(alice),27(sudo),100(webdev)# ^^ groupe principal ^^ groupes supplémentairesIci, 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 :
u (propriétaire).g (groupe).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.
id -gn # Affiche ton groupe principal (actif)touch mon_fichier.txtls -l mon_fichier.txt# -rw-rw-r-- 1 alice alice 0 jan 15 10:30 mon_fichier.txt# ^^^^^ groupe principal d'alice, par défautMais tu peux changer temporairement ton groupe actif avec newgrp :
newgrp <nom_groupe_supplémentaire># Exemple : newgrp webdev
touch autre_fichier.txtls -l autre_fichier.txt# -rw-rw-r-- 1 alice webdev 0 jan 15 10:31 autre_fichier.txt# ^^^^^^ groupe actif temporaireLa 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.
sudo adduser <nom_utilisateur># Exemple :sudo adduser bobPlusieurs 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.
su - <nom_utilisateur># Exemple :su - bob$HOME, $PATH, $PWD, variables de son .bashrc.-) est essentiel : sans lui, tu gardes l’environnement de l’utilisateur précédent.sudo -u <nom_utilisateur> <commande># Exemple :sudo -u bob ls /home/bob$PWD, ton $PATH, etc.).sudo -i -u <nom_utilisateur># Exemple :sudo -i -u bobsu -).ssh <nom_utilisateur>@<serveur># Exemple :ssh bob@serveur.exemple.comPour sortir et revenir à ton utilisateur précédent :
exit # ou Ctrl+Dsudo deluser <nom_utilisateur> # Conserve le répertoire personnelsudo deluser --remove-home <nom_utilisateur> # Supprime toutsudo addgroup <nom_groupe># Exemple :sudo addgroup webdevsudo usermod -aG <nom_groupe> <nom_utilisateur># Exemple :sudo usermod -aG webdev aliceL’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 :
# 1. Se déconnecter et se reconnecter (propre, mais pas toujours pratique)exit
# 2. Activer le groupe dans la session courantenewgrp <nom_groupe># Exemple : newgrp webdev
# 3. Vérifier les groupes tels que stockés (indépendamment de ta session)groups <nom_utilisateur>groups <nom_utilisateur> # Liste les groupes d'un utilisateurgetent group <nom_groupe> # Liste les membres d'un groupeChaque fichier et répertoire sous Linux est associé à trois niveaux d’accès :
u) — l’utilisateur qui possède le fichierg) — le groupe associé au fichiero) — tous les autres utilisateurs du systèmePour chaque niveau, trois types de permissions sont possibles :
r (read) — lire le contenuw (write) — modifier le contenux (execute) — exécuter (fichier) ou traverser (répertoire)ls -l <chemin_fichier># Exemple :ls -l index.js# -rwxr-xr-- 1 alice webdev 2048 jan 15 10:30 index.jsProprié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épertoirex — accéder au répertoire (cd) et à ses sous-élémentsChaque permission correspond à une valeur numérique : r = 4, w = 2, x = 1. On additionne les valeurs pour chaque niveau :
| Permission | Calcul | Valeur |
|---|---|---|
rwx | 4 + 2 + 1 | 7 |
r-x | 4 + 0 + 1 | 5 |
r-- | 4 + 0 + 0 | 4 |
rw- | 4 + 2 + 0 | 6 |
--- | 0 + 0 + 0 | 0 |
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 :
setgid, le fichier hérite du groupe du parent.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.umask # Affiche ton umask courantumask 0002 # Modifie umask pour la sessioncp ou d’un mvLes 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 :
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).
mv déplace le fichier existant. Les attributs sont conservés :
mv source.txt /dossier_avec_setgid/deplace.txt# deplace.txt garde son propriétaire et groupe D'ORIGINEAttention : un mv ne ré-applique pas setgid, ce qui peut briser les permissions d’un espace partagé.
Modifier les permissions d’un dossier n’affecte pas les fichiers qu’il contient :
chmod 700 /dossier # Change les permissions du dossierls -l /dossier/fichier.txt # Le fichier garde ses permissions d'originePour appliquer des permissions à un dossier et à tout son contenu, utilise -R (récursif) :
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).
chmod <cible><opération><permissions> <chemin># Exemples :chmod u+x script.sh # Ajoute l'exécution pour le propriétairechmod g+rw fichier.txt # Ajoute lecture + écriture pour le groupechmod o-rwx secret.key # Retire tout pour les autreschmod a+r public.html # Ajoute la lecture pour tout le mondeOn donne directement les trois chiffres correspondant aux permissions du propriétaire, du groupe et des autres.
chmod <octal> <chemin># Exemples :chmod 755 script.sh # rwxr-xr-x — script exécutable standardchmod 644 index.html # rw-r--r-- — fichier web lisible par touschmod 600 id_rsa # rw------- — clé SSH privéechmod 700 deploy.sh # rwx------ — script privéchown (change owner) modifie le propriétaire et/ou le groupe d’un fichier.
sudo chown <nouveau_propriétaire> <chemin> # Propriétaire seulementsudo chown <nouveau_propriétaire>:<nouveau_groupe> <chemin> # Les deuxsudo chown :<nouveau_groupe> <chemin> # Groupe seulementsudo chown -R <propriétaire>:<groupe> <chemin_dossier> # RécursifExemples :
sudo chown alice fichier.txtsudo chown alice:webdev fichier.txtsudo chown :webdev fichier.txtsudo chown -R alice:webdev /var/www/monsitechgrp (change group) modifie uniquement le groupe associé à un fichier. C’est un raccourci pour chown :<groupe>.
sudo chgrp <nom_groupe> <chemin> # Un fichiersudo chgrp -R <nom_groupe> <chemin_dossier> # RécursifExemples :
sudo chgrp webdev index.jssudo chgrp -R webdev /var/www/monsiteVoici 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 :
sudo mkdir -p /var/www/monsitels -ld /var/www/monsite# drwxr-xr-x 2 root root 4096 ... /var/www/monsitePar 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 :
sudo addgroup webdevVérifie que le groupe existe :
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.
sudo usermod -aG webdev alicesudo usermod -aG webdev bobVérifie que chaque développeur est bien dans le groupe :
groups alice# alice : alice sudo webdevgroups bob# bob : bob webdevOn donne la propriété du site à alice (par exemple) et le groupe à webdev :
sudo chown -R alice:webdev /var/www/monsiteLe -R (récursif) applique le changement au dossier et à tout son contenu — important si tu as déjà des fichiers dedans.
Vérifie :
ls -ld /var/www/monsite# drwxr-xr-x 2 alice webdev 4096 ... /var/www/monsite# ^^^^^ ^^^^^^ propriétaire et groupe correctsOn passe le dossier à 2775 : rwxrwxr-x + bit setgid. Tout est fait en une seule commande sur une seule cible :
sudo chmod 2775 /var/www/monsiteVérifie :
ls -ld /var/www/monsite# drwxrwsr-x 2 alice webdev 4096 ... /var/www/monsite# ^^^ le 's' dans la position groupe confirme que setgid est actifLe 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 :
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 002Deux vérifications importantes :
webdev (et non alice) → setgid fonctionne.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.