Chapitre 3.3 — Permissions Unix (rwx)
⏱️ TL;DR — Chaque fichier Linux porte des permissions qui disent qui peut le lire (
r), l’écrire (w) et l’exécuter (x). Ces trois droits s’appliquent à trois classes : le propriétaire (u), le groupe (g) et tous les autres (o). D’où la notation qu’on lit dansls -l:-rw-r--r--. On règle ces droits avecchmod, en octal (chmod 644 fichier, où chaque chiffre encoder=4 w=2 x=1) ou en symbolique (chmod u+x script.sh). On change le propriétaire avecchown user:group. Les nouveaux fichiers reçoivent des droits par défaut fixés par leumask. En prod, quelques réflexes sauvent : clés privées en 600, dossiers web en 755, fichiers en 644 — et jamais777, qui ouvre tout à tout le monde.
🎯 Objectifs
- Lire une ligne de
ls -let décoder-rw-r--r--/drwxr-xr-x. - Comprendre le modèle 3 classes × 3 droits et la conversion octal ↔ rwx.
- Régler les permissions avec
chmod(octal et symbolique) et la propriété avecchown. - Savoir pourquoi un script a besoin du bit exécutable et ce que fait le
umask. - Appliquer les bons droits en prod (clés en 600, dossiers 755, fichiers 644) et fuir le 777.
Le modèle : 3 droits, 3 classes
Le système de permissions d’Unix est d’une simplicité redoutable. Trois droits possibles sur un fichier :
r(read, lire) : lire le contenu du fichier — ou, pour un dossier, lister ce qu’il contient.w(write, écrire) : modifier le fichier — ou, pour un dossier, créer/supprimer/renommer des fichiers dedans.x(execute, exécuter) : lancer le fichier comme un programme — ou, pour un dossier, entrer dedans (le « traverser » aveccd).
Et trois classes de personnes à qui ces droits s’appliquent :
u(user) : le propriétaire du fichier.g(group) : les membres du groupe propriétaire.o(others) : tous les autres (le reste du monde).
Chaque fichier a donc 9 bits de permissions : rwx pour u, rwx pour g, rwx pour o. C’est tout. Comprendre ces neuf cases, c’est comprendre 90 % de la sécurité des fichiers sous Linux.
💡 Réflexe — Pour un dossier, le
xne veut pas dire « exécuter » mais « traverser ». Un dossier lisible (r) mais non traversable (xabsent) est presque inutile : tu peux voir la liste des noms mais pas entrer ni accéder aux fichiers. C’est pour ça que les dossiers ont besoin dexlà où les fichiers non exécutables n’en ont pas — d’où le classique 755 pour les dossiers et 644 pour les fichiers.
Lire un ls -l
La commande ls -l affiche les permissions en tête de chaque ligne, sous forme de dix caractères :
ls -l
# -rw-r--r-- 1 deploy deploy 1240 ... .env
# drwxr-xr-x 4 deploy www-data 4096 ... publicDécortiquons -rw-r--r-- :
- rw- r-- r--
│ │ │ └── others : r-- -> lecture seule
│ │ └─────── group : r-- -> lecture seule
│ └──────────── user : rw- -> lecture + écriture
└──────────────── type : "-" = fichier ordinaire ("d" = dossier, "l" = lien symbolique)Le premier caractère n’est pas une permission : c’est le type (- fichier, d dossier, l lien). Les neuf suivants se lisent par groupes de trois : d’abord le propriétaire, puis le groupe, puis les autres. Ainsi -rw-r--r-- veut dire : « fichier ; le propriétaire peut lire et écrire ; le groupe et les autres peuvent seulement lire ». Et drwxr-xr-x : « dossier ; propriétaire rwx (tout) ; groupe et autres r-x (lister + traverser, pas écrire) ».
🐚 Au terminal — Deux vues utiles :
ls -l # permissions détaillées, propriétaire et groupe
ls -la # idem + les fichiers cachés (ceux commençant par un point, ex. .env, .ssh)
stat monfichier # tout le détail : droits en rwx ET en octal, propriétaire, datesOctal : les permissions en chiffres
La notation rwx a un équivalent numérique très pratique, où chaque droit vaut une puissance de deux :
r= 4,w= 2,x= 1.
On additionne pour une classe, ce qui donne un chiffre de 0 à 7. On met bout à bout les trois classes (u, g, o) : un nombre à trois chiffres. Ainsi rwx = 4+2+1 = 7, rw- = 4+2 = 6, r-x = 4+1 = 5, r-- = 4.
| Octal | rwx | Signification | Usage typique |
|---|---|---|---|
| 7 | rwx | lire + écrire + exécuter | (rare sur o) |
| 6 | rw- | lire + écrire | fichiers modifiables |
| 5 | r-x | lire + exécuter | dossiers, scripts en lecture |
| 4 | r-- | lire seulement | fichiers en lecture seule |
| 0 | --- | aucun droit | tout fermé |
Donc les combinaisons qu’on croise sans arrêt :
| Octal | rwx complet | Pour quoi |
|---|---|---|
| 644 | rw-r--r-- | fichier normal : le proprio écrit, les autres lisent |
| 755 | rwxr-xr-x | dossier ou script : proprio tout, autres lisent/traversent |
| 600 | rw------- | privé : seul le proprio lit/écrit (clés, secrets) |
| 640 | rw-r----- | proprio écrit, groupe lit, autres rien |
| 750 | rwxr-x--- | proprio tout, groupe lit/traverse, autres rien |
chmod : changer les permissions
chmod (change mode) règle les droits. Deux syntaxes, les deux valent la peine de les connaître.
En octal — tu poses les droits absolus, d’un coup :
chmod 644 index.html # rw-r--r-- : proprio lit/écrit, le reste lit
chmod 755 deploy.sh # rwxr-xr-x : rend le script exécutable par tous
chmod 600 ~/.ssh/id_ed25519 # rw------- : clé privée, proprio SEUL
chmod 640 .env # rw-r----- : proprio écrit, groupe lit, autres rienEn symbolique — tu ajoutes (+), retires (-) ou fixes (=) un droit, sans toucher au reste. Pratique pour un ajustement ciblé :
chmod u+x deploy.sh # ajoute le droit d'exécution au PROPRIÉTAIRE
chmod go-w fichier # retire l'écriture au GROUPE et aux AUTRES (go = group+others)
chmod a+r fichier # ajoute la lecture à TOUS (a = all = u+g+o)
chmod -R 755 public/ # -R = récursif : applique à tout le contenu du dossier⚠️ Piège —
chmod -R(récursif) applique le même mode à tout, fichiers et dossiers confondus. Or les dossiers ont besoin dex(pour être traversés) que les fichiers n’ont pas. Unchmod -R 644sur une arborescence rend les dossiers intraversables (plus dex) et casse l’accès ; unchmod -R 755rend au contraire tous les fichiers exécutables, ce qui est inutile et suspect. La bonne méthode : traiter dossiers et fichiers séparément (par exemple avecfind … -type den 755 etfind … -type fen 644).
chown et chgrp : changer le propriétaire
chmod règle quels droits. chown (change owner) règle à qui appartient le fichier — propriétaire et/ou groupe :
sudo chown deploy fichier # change le PROPRIÉTAIRE -> deploy
sudo chown deploy:www-data fichier # change proprio -> deploy ET groupe -> www-data
sudo chown -R deploy:www-data /var/www/formacampus # récursif sur toute l'arbo
sudo chgrp www-data fichier # change SEULEMENT le groupeChanger le propriétaire d’un fichier requiert en général les droits root (sinon on pourrait « donner » ses fichiers à n’importe qui pour contourner les quotas ou brouiller les pistes) — d’où le sudo.
🧭 Sur FormaCampus — Le dossier de l’app est monté en
deploy:www-data. Le comptedeploypossède les fichiers (il déploie, il écrit), et le groupewww-data(celui de Nginx) peut les lire pour les servir. Concrètement :sudo chown -R deploy:www-data /var/www/formacampus, puis les dossiers en 755 et les fichiers en 644 — Nginx lit tout, mais ne peut rien modifier. Les fichiers de secrets (.envde l’API Symfony) sont eux en 640, propriétédeploy:formacampus, pour que seuls le déployeur et le service applicatif y accèdent, jamais le reste du monde.
Le bit exécutable et les scripts
Sous Linux, un fichier n’est pas exécutable parce qu’il finit par .sh — l’extension ne compte pas. Il est exécutable parce qu’il porte le bit x. Un script fraîchement écrit est un simple fichier texte (644) : pour le lancer directement, il faut lui ajouter x :
./deploy.sh # Permission denied : le bit x manque
chmod +x deploy.sh # on ajoute le droit d'exécution
./deploy.sh # ça marche maintenantC’est aussi ce bit x qui, combiné à la première ligne du script (le shebang #!/bin/bash), permet au système de savoir avec quel interpréteur l’exécuter.
umask : les permissions par défaut
Quand tu crées un fichier, il ne naît pas avec des droits arbitraires : ils sont dérivés du umask, un masque qui retire des permissions à la valeur de base. La base est 666 pour les fichiers (rw- pour tous) et 777 pour les dossiers ; le umask soustrait ce qu’il faut cacher.
umask # affiche le masque courant, ex. 0022
# Avec umask 022 : les fichiers naissent en 644, les dossiers en 755
# (022 retire le droit d'écriture au groupe et aux autres)Le umask 022 par défaut est raisonnable pour un usage courant. Pour des données sensibles, un umask 077 fait naître les fichiers en 600 (privés au propriétaire) — utile pour un compte qui manipule des secrets. On le comprend, on le laisse en général tel quel, et on ajuste explicitement au cas par cas avec chmod.
📚 La doc —
man chmod,man chown,man umask. Pour la mécanique complète (bits spéciauxsetuid/setgid/sticky bit, non couverts ici car rarement utiles à ce stade), lemanet la doc de ta distribution font autorité. Reste sur les cas courants tant que tu n’as pas un besoin précis.
Les bons réflexes en prod (et le danger du 777)
Quelques valeurs à connaître par cœur pour un serveur web :
- Clés privées SSH / TLS → 600 (
rw-------). Personne d’autre que le propriétaire ne doit pouvoir les lire. SSH refuse même de les utiliser si elles sont trop permissives. - Fichiers de secrets (
.env, mots de passe DB) → 600 ou 640 selon qu’un groupe doit lire. - Dossiers d’un site web → 755 (traversables et lisibles, non modifiables par les autres).
- Fichiers d’un site web (HTML, CSS, images) → 644 (lisibles par le serveur, modifiables par le seul proprio).
- Scripts à exécuter → 755 (ou 750 si le groupe suffit).
⚠️ Piège —
chmod 777: le réflexe désastreux du débutant qui « veut juste que ça marche ».777=rwxrwxrwx= tout le monde peut tout faire, y compris écrire et exécuter. Sur un serveur exposé, c’est une porte ouverte : n’importe quel processus (donc un attaquant qui a pris pied sur la machine) peut modifier ton code, y déposer un script malveillant et le lancer. Un « permission denied » ne se règle jamais par777— il se règle en trouvant le bon propriétaire et le bon droit minimal (souvent unchownvers le bon user, ou un 644/755). Si tu vois777quelque part, considère-le comme un bug de sécurité à corriger.
🔒 Sécurité — Le principe de moindre privilège s’applique aux fichiers comme aux comptes : chaque fichier ne doit être accessible qu’à ceux qui en ont besoin, et seulement pour ce qui est nécessaire (lecture seule si l’écriture n’est pas requise). Un secret lisible par « others » est un secret compromis dès qu’un autre compte de la machine est ouvert. Vérifie systématiquement les droits de tes
.envet de tes clés avecls -l.
✏️ Exercices
Exercice 1 — Décode et convertis. Traduis ces permissions dans l’autre notation, et dis en une phrase ce qu’elles autorisent : (a) rw-r----- en octal ; (b) 750 en rwx.
✅ Solution
(a) rw-r----- = 640. Le propriétaire lit et écrit (rw- = 6), le groupe lit seulement (r-- = 4), les autres n’ont aucun droit (--- = 0). Typique d’un fichier .env partagé avec un groupe.
(b) 750 = rwxr-x---. Le propriétaire a tout (rwx = 7), le groupe lit et traverse (r-x = 5), les autres rien (--- = 0). Typique d’un dossier ou d’un script réservé au proprio et à son groupe.
Exercice 2 — Répare une clé et un dossier web. Deux problèmes : (1) ssh refuse ta clé privée avec un avertissement « permissions too open » ; ls -l montre -rw-r--r-- id_ed25519. (2) Le dossier /var/www/formacampus appartient à root:root et Nginx (qui tourne en www-data) renvoie des erreurs de permission. Donne les commandes.
✅ Solution
(1) La clé privée est lisible par le groupe et les autres (644) : SSH exige qu’elle soit privée. On restreint à 600 :
chmod 600 ~/.ssh/id_ed25519 # rw------- : proprio seul(2) Nginx (www-data) doit pouvoir lire les fichiers. On donne la propriété au bon couple et on pose des droits sains :
sudo chown -R deploy:www-data /var/www/formacampus
sudo find /var/www/formacampus -type d -exec chmod 755 {} \; # dossiers traversables
sudo find /var/www/formacampus -type f -exec chmod 644 {} \; # fichiers lisiblesOn ne met surtout pas 777 : le bon couple deploy:www-data + 755/644 suffit et reste sûr.
🧠 Quiz de révision
1. Que valent r, w et x en octal, et combien font rwx, rw- et r-x ?
r = 4, w = 2, x = 1. On additionne : rwx = 4+2+1 = 7, rw- = 4+2 = 6, r-x = 4+1 = 5. Un mode comme 755 combine ces chiffres pour les trois classes (u, g, o).
2. Dans -rw-r—r—, que représente le tout premier caractère ?
Le type de fichier, pas une permission : - = fichier ordinaire, d = dossier, l = lien symbolique. Les neuf caractères suivants sont les vraies permissions, lues par groupes de trois (propriétaire, groupe, autres).
3. Pourquoi un dossier a-t-il besoin du droit x là où un fichier texte n’en a pas ?
Sur un dossier, x signifie « traverser » (entrer avec cd, accéder aux fichiers dedans), pas « exécuter ». Sans x, le dossier est inutilisable même s’il est lisible. D’où 755 pour les dossiers et 644 pour les fichiers non exécutables.
4. Quelle permission pour une clé privée SSH, et pourquoi ?
600 (rw-------) : lisible et modifiable par le seul propriétaire, personne d’autre. C’est un secret ; s’il est lisible par le groupe ou les autres, il est compromis. SSH refuse même d’utiliser une clé privée aux droits trop ouverts.
5. Pourquoi chmod 777 est-il un danger sur un serveur ?
777 = rwxrwxrwx : tout le monde peut lire, écrire et exécuter. Sur une machine exposée, ça permet à n’importe quel processus (donc un attaquant ayant pris pied) de modifier ton code ou d’y déposer et lancer un script malveillant. Un « permission denied » se règle par le bon chown / le bon droit minimal, jamais par 777.
Chapitre suivant : Processus & signaux — voir ce qui tourne, le suivre, et l’arrêter proprement.