Introduction
Les permissions de fichiers Linux contrôlent qui peut lire, écrire ou exécuter des fichiers et des répertoires. Lorsque vous obtenez une erreur « Permission denied », le chemin le plus rapide vers la résolution est un flux de travail clair et reproductible. Ce guide montre comment :
- Identifier le chemin exact et l'opération qui échoue
- Lire correctement les propriétaires et les modes
- Utiliser chmod et chown en toute sécurité selon le principe du moindre privilège
- Comprendre umask pour que les défauts soient corrects à la création des fichiers
- Valider l'accès pour les services dans des conditions proches de la production
Aperçu du flux de travail
Utilisez cette séquence pour réduire le bruit et éviter le travail en double :
- Reproduire et capturer l'échec
- Notez la commande et le chemin : quel fichier ou répertoire, et quelle opération (lecture, écriture, exécution, listage, création, suppression).
- Si le message est générique, tracez les appels système localement :
strace -e trace=file -f -o /tmp/trace.log votre_commande
- Recherchez
EACCESouEPERMet le chemin en échec.
- Inspecter le chemin et ses parents
- Affichez la cible et chaque répertoire parent :
namei -l /chemin/vers/objet
- Inspectez les détails :
ls -ld /chemin /chemin/vers /chemin/vers/objet
stat -c "%A %a %U:%G %n" /chemin/vers/objet
- Vérifiez les options de montage qui peuvent bloquer l'exécution :
findmnt -no TARGET,OPTIONS --target /chemin/vers/objet
noexec bloque l'exécution de binaires ; nodev et nosuid affectent les bits device et suid.
- Vérifiez l'attribut immuable (rare mais pénible) :
lsattr /chemin/vers/objet
S'il est positionné, supprimez-le avant d'écrire :
chattr -i /chemin/vers/objet
- Confirmer l'identité qui agit
- Pour les shells interactifs :
whoami
id
id -Gn
- Pour un service :
systemctl show -p User,Group,SupplementaryGroups votre.service
ps -o user,group,egroup,egid= -C votre-binaire
(ou par PID)
- Décider du correctif minimal
- Incohérence de propriétaire : préférez
chownsur la plus petite arborescence, pas sur tout le système de fichiers. - Accès groupe manquant : utilisez un groupe partagé et positionnez setgid sur le répertoire.
- Mode trop restrictif : ajoutez seulement les bits nécessaires (souvent
g+rwXpour les collaborateurs). - Mode trop permissif : retirez l'accès « autres » (
o-rwx) et reposez-vous sur utilisateur/groupe.
- Définir les bons défauts
- Si les nouveaux fichiers arrivent encore avec de mauvaises permissions, ajustez umask ou forcez l'héritage de groupe avec setgid sur les répertoires partagés.
- Valider en tant qu'utilisateur visé
sudo -u utilisateur_app -g groupe_app -- test -r /chemin && echo lisible
sudo -u utilisateur_app -g groupe_app -- test -w /chemin && echo writable
sudo -u utilisateur_app -g groupe_app -- test -x /chemin/vers/binaire && echo executable
Diagnostiquer « Permission denied »
La plupart des refus proviennent de l'une de trois causes : absence du bit d'exécution sur un répertoire qu'il faut traverser, absence de lecture ou d'écriture sur le fichier cible, ou un montage/attribut empêchant l'opération.
Liste de contrôle :
- Permission de traversée sur chaque répertoire parent :
namei -l /srv/app/data/fichier.txt
Assurez-vous du bit x sur chaque répertoire pour l'utilisateur ou le groupe qui agit.
- Lecture/Écriture sur la cible finale :
stat -c "%A %a %U:%G %n" /srv/app/data/fichier.txt
- Échecs d'exécution :
- Si c'est un script : assurez-vous du bit
xsur le fichier, d'un shebang valide, et que l'interpréteur est exécutable. - Si le système de fichiers est monté
noexec, les binaires ne s'exécuteront pas même avecxpositionné.
- Attributs et montages :
lsattrpeut révéler des fichiers immuables (i) qui refusent les écritures.findmntmontre des options commenoexecqui bloquent l'exécution.
Exemple : Un script Python échoue avec « Permission denied ». namei -l montre que le répertoire parent /srv/app a le mode 750 et le groupe appdata, mais l'utilisateur n'appartient pas à ce groupe. Ajouter l'utilisateur à appdata et rouvrir une session corrige la traversée.
Propriétaires, groupes et modes
Les permissions sont évaluées dans cet ordre :
- Bits propriétaire (utilisateur)
u=rwx - Bits groupe
g=rwx(si le processus appartient au groupe du fichier) - Bits autres
o=rwx
Points clés :
- Répertoires :
xpermet la traversée,rliste les noms,wcrée ou supprime des entrées. - Fichiers :
rlit,wécrit,xexécute. - Le groupe effectif compte : assurez-vous que le processus est dans le groupe attendu (
id -Gn). - Utilisez la portée minimale lors du correctif : opérez sur le chemin qui échoue réellement.
Inspections utiles :
ls -ld /srv/app /srv/app/data
stat -c "%A %a %U:%G %n" /srv/app/data
namei -l /srv/app/data/rapport.csv
Utiliser chmod en toute sécurité
Évitez les changements globaux. Préférez les modes symboliques qui expriment l'intention :
- Accorder
rwau propriétaire etrau groupe sur fichiers et répertoires, retirer « autres » :
chmod -R u+rwX,g+rX,o-rwx /srv/app/data
- Rendre un script exécutable par propriétaire et groupe :
chmod ug+x /srv/app/bin/run.sh
- Configurer un répertoire pour la collaboration : lecture, écriture et traversée pour le groupe :
chmod 2770 /srv/partage
Le 2 initial positionne setgid pour que les nouveaux fichiers héritent du groupe du répertoire.
Référence numérique d'exemples :
- Fichiers couramment
0644(rw-r--r--) ou0660(rw-rw----) - Répertoires couramment
0755(rwxr-xr-x) ou0770(rwxrwx---)
À éviter :
chmod -R 777 ...(surexpose les données et peut masquer de vrais problèmes de propriété)- Retirer l'exécution de répertoires qu'il faut encore traverser
Utiliser chown et les groupes
Les correctifs de propriété doivent correspondre aux responsabilités.
- Définir propriétaire et groupe précisément :
chown app:appdata /srv/app/data
chown -R app:appdata /srv/app/data/logs # portée seulement sur ce qui est nécessaire
- Créer et utiliser un groupe de collaboration :
groupadd appdata
usermod -aG appdata alice
usermod -aG appdata app
Les utilisateurs doivent rouvrir une session pour bénéficier du nouveau groupe (ou utiliser newgrp appdata).
- Forcer l'héritage de groupe dans les répertoires partagés :
chmod g+s /srv/app/partage
Les nouveaux fichiers obtiendront automatiquement le groupe du répertoire.
- Créer des répertoires avec le bon propriétaire, groupe et mode en une étape :
install -d -o app -g appdata -m 2770 /srv/app/partage
Fondamentaux d'umask
umask définit quels bits de permission sont retirés du défaut lors de la création de nouveaux fichiers ou répertoires.
- Les fichiers démarrent à
0666; les répertoires à0777. - Mode effectif = base
&~umask - Exemples :
umask 022→ fichiers0644, répertoires0755umask 027→ fichiers0640, répertoires0750umask 002→ fichiers0664, répertoires0775(bon pour la collaboration de groupe)
Définir umask :
- Pour les shells interactifs : ajoutez
umask 027à~/.profileou/etc/profile. - Pour les services systemd : ajoutez
UMask=0027sous[Service]dans le fichier d'unité, puis :
systemctl daemon-reload
systemctl restart votre.service
Astuce : Combinez UMask= avec un répertoire de projet setgid pour obtenir des défauts partagés prévisibles.
Valider l'accès du service
Les services s'exécutent souvent comme utilisateurs sans ouverture de session, donc testez toujours comme cette identité.
- Découvrir l'utilisateur et les groupes du service :
systemctl show -p User,Group,SupplementaryGroups votre.service
- Vérifier le répertoire de travail, les données et les binaires :
sudo -u app -g appdata -- test -r /srv/app/config.yml && echo lisible
sudo -u app -g appdata -- test -w /srv/app/data && echo writable
sudo -u app -g appdata -- test -x /srv/app/bin/run && echo executable
- Vérifier les parents de chemin pour la traversée :
sudo -u app -- namei -l /srv/app/data/rapport.csv
- Confirmer que les montages ne bloquent pas l'exécution :
findmnt -no TARGET,OPTIONS --target /srv/app/bin
Si les permissions semblent correctes mais que les refus persistent, un système de contrôle d'accès obligatoire (comme SELinux ou AppArmor) peut être en cause. Cela dépasse ce guide sur les permissions de fichiers, mais les symptômes apparaissent souvent similaires.
Plan pilote local
Commencez petit pour pouvoir inspecter les résultats et revenir en arrière facilement.
- Créer un utilisateur, un groupe et des répertoires de test
groupadd appdata
useradd -m -G appdata app
install -d -o app -g appdata -m 2770 /srv/app-test/partage
install -d -o app -g appdata -m 0750 /srv/app-test/logs
- Définir les défauts avec umask pour la collaboration
sudo -u app -- bash -c 'umask 002; touch /srv/app-test/partage/pilote.txt; mkdir /srv/app-test/partage/sous-rep'
Vérifier que les nouveaux fichiers sont 0664 et les répertoires 0775, et que le groupe est appdata :
stat -c "%a %G %n" /srv/app-test/partage/pilote.txt /srv/app-test/partage/sous-rep
- Valider les chemins d'accès
sudo -u app -g appdata -- touch /srv/app-test/partage/pilote.txt
namei -l /srv/app-test/partage/pilote.txt
sudo -u app -g appdata -- test -w /srv/app-test/logs && echo logs writable
- Exercer l'échec et le corriger
chmod g-w /srv/app-test/logs
sudo -u app -g appdata -- test -w /srv/app-test/logs || echo denied as expected
chmod g+w /srv/app-test/logs
Gardez un journal de commandes simple pour pouvoir reproduire ou annuler.
- Documenter les commandes et résultats
Lorsque le pilote se comporte comme prévu, appliquez les mêmes changements minimaux aux vrais chemins.
Conclusion
Utilisez un flux de travail systématique pour résoudre les erreurs « Permission denied » :
- Identifier le chemin et l'opération qui échouent
- Inspecter propriétaires, groupes et modes à chaque niveau de répertoire
- Appliquer des changements
chmodetchownminimaux avec le moindre privilège - Définir des défauts prévisibles avec
umask(et setgid là où c'est utile) - Valider en tant que vrai utilisateur de service avant un déploiement plus large
Commencez par un pilote local étroit, confirmez les résultats, puis étendez aux chemins de type production avec confiance.