Droits d'accès Linux : chmod, chown et sudo avec des exemples
Les droits d'accès Linux sont trois ensembles rwx — pour le propriétaire, le groupe et les autres ; on les modifie avec chmod en forme symbolique (chmod u+x) ou numérique (chmod 755, avec r=4, w=2, x=1). Le propriétaire se change avec chown, et les actions d'administrateur passent par sudo ; l'erreur Permission denied signifie presque toujours que votre utilisateur n'a pas le droit voulu sur le fichier ou sur un répertoire de son chemin.
Les droits d'accès Linux répondent à la question « qui peut faire quoi avec un fichier ». Chaque fichier possède un propriétaire, un groupe et trois ensembles de droits : pour le propriétaire, pour le groupe et pour les autres. On les modifie avec chmod, on change le propriétaire avec chown, et les actions d'administrateur s'exécutent avec sudo. Voyons comment lire les droits, les modifier et corriger l'erreur Permission denied.
Comment voir les droits d'un fichier
Les droits apparaissent dans la sortie de ls -l :
$ ls -l
-rw-r--r-- 1 alice developers 1204 Oct 10 14:02 notes.txt
-rwxr-xr-x 1 alice developers 356 Oct 10 14:05 deploy.sh
drwxr-x--- 2 alice developers 4096 Oct 10 13:50 secrets
Les dix premiers caractères se lisent ainsi :
- Le premier caractère indique le type :
-un fichier ordinaire,dun répertoire,lun lien symbolique. - Les caractères 2 à 4 sont les droits du propriétaire (user).
- Les caractères 5 à 7 sont les droits du groupe (group).
- Les caractères 8 à 10 sont les droits des autres (others).
Viennent ensuite le nombre de liens physiques, le propriétaire (alice), le groupe (developers), la taille, la date et le nom. Pour un seul fichier, la commande stat est pratique :
$ stat -c '%A %a %U:%G %n' deploy.sh
-rwxr-xr-x 755 alice:developers deploy.sh
Ce que signifient r, w et x
La signification des droits diffère pour les fichiers et pour les répertoires — c'est la principale source de confusion.
| Droit | Pour un fichier | Pour un répertoire |
|---|---|---|
r (read) | lire le contenu | voir la liste des fichiers (ls) |
w (write) | modifier le contenu | créer, supprimer et renommer les fichiers qu'il contient |
x (execute) | l'exécuter comme programme | entrer dans le répertoire (cd) et accéder aux fichiers par leur chemin |
Remarque : vous pouvez supprimer un fichier si vous avez w et x sur le répertoire, même si vous n'avez pas le droit d'écrire dans le fichier lui-même. Et sans x sur un répertoire, vous ne pouvez pas ouvrir un fichier qu'il contient, même si les droits du fichier autorisent la lecture.
Le système vérifie les droits dans cet ordre : si vous êtes le propriétaire, ce sont les droits du propriétaire qui s'appliquent ; sinon, si vous faites partie du groupe du fichier, ce sont les droits du groupe ; sinon, les droits des autres. L'utilisateur root contourne les contrôles de lecture et d'écriture.
Forme numérique : 755, 644, 600
Chaque droit a un poids : r = 4, w = 2, x = 1. La somme des poids donne un chiffre de 0 à 7 pour chacun des trois ensembles.
| Chiffre | Droits | Calcul |
|---|---|---|
| 7 | rwx | 4+2+1 |
| 6 | rw- | 4+2 |
| 5 | r-x | 4+1 |
| 4 | r-- | 4 |
| 0 | --- | 0 |
Quelques combinaisons typiques qu'il faut connaître par cœur :
| Mode | Forme | Où on l'utilise |
|---|---|---|
644 | rw-r--r-- | fichiers ordinaires, configurations, HTML |
755 | rwxr-xr-x | répertoires, scripts et programmes |
600 | rw------- | clés SSH privées, fichiers contenant des mots de passe |
700 | rwx------ | le répertoire ~/.ssh, répertoires personnels |
640 | rw-r----- | configurations que doit lire le groupe du service |
777 | rwxrwxrwx | tout à tout le monde — presque jamais nécessaire |
La commande chmod : modifier les droits
Mode numérique
La forme numérique fixe les droits en une fois :
chmod 644 index.html
chmod 755 deploy.sh
chmod 600 ~/.ssh/id_ed25519
Mode symbolique
La forme symbolique modifie les droits de façon ciblée, sans toucher aux autres. À qui : u propriétaire, g groupe, o autres, a tous. Action : + ajouter, - retirer, = fixer exactement.
chmod +x deploy.sh # autoriser le lancement
chmod u+x,g-w fichier # le propriétaire peut l'exécuter, retirer l'écriture au groupe
chmod o-rwx secrets/ # rien pour les autres
chmod g=rx app/ # le groupe a exactement la lecture et l'accès au répertoire
Récursivement : fichiers et répertoires séparément
L'option -R applique les droits à toute l'arborescence. Mais chmod -R 755 rend tous les fichiers exécutables, ce qui n'est en général pas souhaitable. Il vaut mieux séparer fichiers et répertoires avec find :
find /srv/site -type d -exec chmod 755 {} +
find /srv/site -type f -exec chmod 644 {} +
Il existe aussi une variante plus courte : la majuscule X ajoute le droit d'exécution uniquement aux répertoires et aux fichiers qui l'ont déjà.
chmod -R u=rwX,go=rX /srv/site
La commande chown : changer le propriétaire et le groupe
Seul root peut changer le propriétaire d'un fichier, c'est pourquoi chown est presque toujours lancé avec sudo.
sudo chown alice rapport.txt # propriétaire
sudo chown alice:developers rapport.txt # propriétaire et groupe
sudo chown :www-data index.html # groupe seulement
sudo chown -R www-data:www-data /var/www/site
Pour changer seulement le groupe, il existe la commande chgrp : sudo chgrp developers rapport.txt. Vos groupes sont affichés par id ou groups.
$ id
uid=1000(alice) gid=1000(alice) groups=1000(alice),27(sudo),1001(developers)
Pour ajouter un utilisateur à un groupe, utilisez sudo usermod -aG developers bob. L'option -a est indispensable : sans elle, l'utilisateur est retiré de tous ses autres groupes secondaires. Un nouveau groupe prend effet après une nouvelle connexion.
sudo : actions en tant qu'administrateur
sudo exécute une seule commande avec les droits de root (ou d'un autre utilisateur) et demande votre mot de passe, pas celui de root. Chaque appel est consigné dans le journal, on sait donc qui a fait quoi.
sudo apt update
sudo systemctl restart nginx
sudo -u postgres psql # sous l'utilisateur postgres
sudo -i # shell root interactif
sudo -l # ce qui m'est autorisé
Qui peut faire quoi est décrit dans /etc/sudoers et dans les fichiers du répertoire /etc/sudoers.d/. Modifiez-les uniquement avec sudo visudo : il vérifie la syntaxe, et une erreur dans le fichier ne vous privera pas de sudo. Sous Ubuntu, les droits sudo sont accordés par l'appartenance au groupe sudo, sur les systèmes de type RHEL par le groupe wheel.
# /etc/sudoers.d/deploy — l'utilisateur deploy peut seulement redémarrer nginx
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx
Pourquoi sudo echo > fichier ne fonctionne pas
Un piège fréquent :
$ sudo echo "127.0.0.1 test.local" >> /etc/hosts
bash: /etc/hosts: Permission denied
La redirection >> est effectuée par votre shell, pas par sudo : le fichier est donc ouvert sans les droits root. La bonne méthode passe par tee :
echo "127.0.0.1 test.local" | sudo tee -a /etc/hosts
Permission denied : causes et solutions
L'erreur Permission denied signifie que le noyau a refusé l'opération à votre processus. La démarche de diagnostic est toujours la même : qui suis-je (id), qui est le propriétaire et quels sont les droits (ls -l), quels sont les droits de chaque répertoire du chemin (namei -l).
$ namei -l /srv/app/config/app.env
f: /srv/app/config/app.env
drwxr-xr-x root root /
drwxr-xr-x root root srv
drwxr-x--- deploy deploy app
drwxr-xr-x deploy deploy config
-rw-r----- deploy deploy app.env
On voit ici que le répertoire app est fermé aux autres : un utilisateur qui ne fait pas partie du groupe deploy ne peut pas aller plus loin, quels que soient les droits du fichier lui-même.
Le script ne se lance pas
$ ./deploy.sh
bash: ./deploy.sh: Permission denied
Le fichier n'a pas le droit d'exécution. La solution est chmod +x deploy.sh, ou le lancement via l'interpréteur : bash deploy.sh. Si la partition est montée avec l'option noexec (cela arrive avec /tmp), on ne peut pas lancer le fichier directement, seule la seconde solution fonctionne.
Écriture impossible dans un répertoire système
Les fichiers de /etc, /usr et /var/www appartiennent à root ou à des utilisateurs de service. Utilisez sudo pour les modifications ponctuelles ; pour un travail régulier, donnez les droits à un groupe, pas à tout le monde.
Le serveur web répond 403
Nginx ou Apache s'exécutent sous l'utilisateur www-data (sous Debian et Ubuntu). Il lui faut la lecture des fichiers et x sur tous les répertoires du chemin. Correction : sudo chown -R www-data:www-data /var/www/site, ou les droits 755 sur les répertoires et 644 sur les fichiers.
SSH n'accepte pas la clé
SSH refuse les clés dont les droits sont trop ouverts. La clé privée doit avoir les droits 600, le répertoire ~/.ssh — 700, et le fichier authorized_keys sur le serveur — 600.
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519 ~/.ssh/authorized_keys
Pas d'accès à Docker
Le message permission denied while trying to connect to the Docker daemon socket signifie que vous n'êtes pas dans le groupe docker. Exécutez sudo usermod -aG docker $USER puis reconnectez-vous. Notez que l'appartenance à ce groupe équivaut en pratique aux droits root.
Pourquoi chmod 777 est une mauvaise idée
Le conseil « lance simplement chmod 777 » supprime l'erreur, mais rend le fichier modifiable par tous les utilisateurs et tous les processus du système. Si une application web est compromise, un attaquant peut remplacer ces fichiers. La bonne démarche consiste à identifier l'utilisateur qui a besoin d'accéder au fichier et à lui accorder le droit, par le propriétaire ou par le groupe.
umask : les droits par défaut
Les nouveaux fichiers reçoivent des droits calculés à partir du masque umask. Avec la valeur habituelle 022, les fichiers sont créés en 644 et les répertoires en 755.
$ umask
0022
Synthèse
Les droits d'accès Linux se composent de trois ensembles rwx pour le propriétaire, le groupe et les autres. chmod modifie les droits sous forme numérique (755, 644, 600) ou symbolique, chown change le propriétaire, et sudo permet d'exécuter une commande isolée en tant que root. Face à Permission denied, vérifiez l'utilisateur, les droits du fichier et de chaque répertoire du chemin, et ne réglez pas le problème avec 777. Utilisateurs, groupes, droits et sudo sont traités pas à pas et en pratique dans notre cours sur Linux.
Questions fréquentes
Que signifie chmod 755 ?
Le propriétaire peut lire, écrire et exécuter (7) ; le groupe et les autres peuvent lire et exécuter (5). C'est l'ensemble standard pour les répertoires et les scripts.
Quelle est la différence entre chmod et chown ?
chmod modifie les droits (ce qu'on peut faire du fichier), tandis que chown modifie le propriétaire et le groupe (à qui appartiennent ces droits).
Comment donner à un utilisateur les droits sudo ?
Sous Ubuntu et Debian, ajoutez-le au groupe sudo avec sudo usermod -aG sudo nom ; sur les systèmes de type RHEL, ajoutez-le au groupe wheel. Les modifications prennent effet après une nouvelle connexion.
Que signifient les droits 4755 et le bit SUID ?
Le chiffre de tête 4 active SUID : le programme s'exécute avec les droits du propriétaire du fichier, et non de celui qui le lance. C'est ainsi que fonctionne par exemple passwd ; dans la sortie de ls, le x du propriétaire devient un s.
Pourquoi root peut-il lire un fichier aux droits 000 ?
Le noyau n'applique pas les contrôles ordinaires de lecture et d'écriture à root. On ne peut le restreindre que par d'autres mécanismes, comme SELinux, AppArmor ou l'attribut d'immuabilité défini par chattr +i.
Ce sujet est traité en détail avec de la pratique dans le cours « Linux: с нуля до уверенного администрирования ».
Voir le cours