Tutoriel

Droits d'accès Linux : chmod, chown et sudo avec des exemples

Mis à jour: · Skillaria.Top

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, d un répertoire, l un 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.

DroitPour un fichierPour un répertoire
r (read)lire le contenuvoir la liste des fichiers (ls)
w (write)modifier le contenucréer, supprimer et renommer les fichiers qu'il contient
x (execute)l'exécuter comme programmeentrer 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.

ChiffreDroitsCalcul
7rwx4+2+1
6rw-4+2
5r-x4+1
4r--4
0---0

Quelques combinaisons typiques qu'il faut connaître par cœur :

ModeFormeOù on l'utilise
644rw-r--r--fichiers ordinaires, configurations, HTML
755rwxr-xr-xrépertoires, scripts et programmes
600rw-------clés SSH privées, fichiers contenant des mots de passe
700rwx------le répertoire ~/.ssh, répertoires personnels
640rw-r-----configurations que doit lire le groupe du service
777rwxrwxrwxtout à 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.

Apprenez ce sujet en vidéo

Ce sujet est traité en détail avec de la pratique dans le cours « Linux: с нуля до уверенного администрирования ».

Voir le cours