Chmod récursif sous Linux : corriger les permissions sans casser son serveur

Modifier les permissions d’un dossier complet à la main avec un client FTP, c’est possible. C’est aussi lent, pénible, et rarement la meilleure idée quand on administre un serveur.

En ligne de commande, chmod permet de corriger les droits beaucoup plus vite. Toutefois, il faut le faire proprement. Une commande récursive mal pensée peut rendre un site inaccessible, empêcher PHP de lire ses fichiers, ou donner trop de droits à tout le monde.

La règle à retenir est simple : on ne traite pas les fichiers et les répertoires de la même façon. Les dossiers ont besoin du droit d’exécution pour être traversés. Les fichiers, eux, n’ont généralement pas besoin d’être exécutables.

Distingo, le livret à 2%

Pourquoi éviter chmod -R ?

La commande chmod -R applique les mêmes permissions à tout ce qu’elle trouve : fichiers, dossiers, scripts, images, fichiers de configuration, caches, uploads. C’est brutal.

Par exemple, cette commande est presque toujours une mauvaise idée :

chmod -R 777 /var/www/example.comLangage du code : JavaScript (javascript)

Elle donne les droits de lecture, écriture et exécution à tout le monde. Sur un serveur web, c’est beaucoup trop permissif.

James Bond vêtu d'un smoking noir redresse son nœud papillon sur un fond sombre. À côté de lui, un grand texte blanc indique : "007 est vraiment stupide en matière d'autorisations - même sous Linux, n'utilisez pas chmod récursif comme ça sur un espion.

Cette autre commande semble plus restrictive, mais elle casse les dossiers :

chmod -R 640 /var/www/example.comLangage du code : JavaScript (javascript)

Pourquoi ? Parce qu’un répertoire doit avoir le bit d’exécution pour être traversé. Sans lui, le serveur web peut se retrouver incapable d’entrer dans les dossiers, même si les fichiers ont l’air lisibles.

La méthode propre consiste donc à utiliser find, puis à appliquer une règle aux fichiers et une autre aux répertoires.

Voir ce que find va modifier avant d’agir

Avant de lancer un chmod récursif, commencez par afficher les fichiers ou dossiers concernés. C’est le petit filet de sécurité qui évite les grands moments de solitude.

Pour lister tous les fichiers PHP dans le dossier courant et ses sous-dossiers :

find . -type f -name '*.php' -printLangage du code : PHP (php)

Pour lister tous les répertoires :

find . -type d -printLangage du code : PHP (php)

Pour travailler sur un chemin précis plutôt que sur le dossier courant :

find /var/www/example.com -type f -name '*.php' -printLangage du code : PHP (php)

Une fois la liste validée, vous pouvez remplacer -print par -exec chmod ....

Kinsta: Premium Managed WordPress hosting

Changer les permissions de tous les fichiers PHP

Pour appliquer un chmod 640 à tous les fichiers PHP du dossier courant :

find . -type f -name '*.php' -exec chmod 640 {} +Langage du code : JavaScript (javascript)

Cette commande cherche uniquement les fichiers avec l’extension .php, puis applique chmod 640. Le + final permet à find de regrouper plusieurs fichiers dans une même exécution de chmod, ce qui évite de lancer une commande par fichier.

Pour appliquer la même logique à un dossier précis :

find /var/www/example.com -type f -name '*.php' -exec chmod 640 {} +Langage du code : JavaScript (javascript)

Si vous voulez traiter les extensions en majuscules et minuscules, utilisez -iname :

find /var/www/example.com -type f -iname '*.php' -exec chmod 640 {} +Langage du code : JavaScript (javascript)

Changer les permissions de tous les fichiers

Pour appliquer des permissions à tous les fichiers d’un site, sans toucher aux répertoires :

find /var/www/example.com -type f -exec chmod 640 {} +Langage du code : JavaScript (javascript)

Sur beaucoup de serveurs web, on rencontre aussi 644 pour les fichiers :

find /var/www/example.com -type f -exec chmod 644 {} +Langage du code : JavaScript (javascript)

Le bon choix dépend de votre modèle d’exécution : utilisateur système, groupe web, PHP-FPM, déploiement Git, environnement mutualisé ou serveur dédié. Ne copiez pas une valeur sans comprendre qui doit lire ou écrire les fichiers.

Changer les permissions de tous les répertoires

Pour appliquer un chmod 750 à tous les répertoires :

find /var/www/example.com -type d -exec chmod 750 {} +Langage du code : JavaScript (javascript)

Dans une configuration plus classique, avec dossiers lisibles et traversables par le serveur web, vous verrez souvent 755 :

find /var/www/example.com -type d -exec chmod 755 {} +Langage du code : JavaScript (javascript)

La différence est importante :

ModeUsage courantEffet
640Fichiers plus restrictifsLecture/écriture propriétaire, lecture groupe, rien pour les autres
644Fichiers web classiquesLecture/écriture propriétaire, lecture groupe et autres
750Dossiers plus restrictifsAccès propriétaire et groupe, rien pour les autres
755Dossiers web classiquesAccès propriétaire, lecture/traversée groupe et autres

Sur un serveur bien cloisonné, 640 pour les fichiers et 750 pour les dossiers peuvent convenir. Sur un hébergement plus classique, 644 et 755 restent fréquents.

Modifier seulement les permissions incorrectes

Sur un gros site, il est inutile de relancer chmod sur des milliers de fichiers déjà corrects. Vous pouvez cibler uniquement ceux qui n’ont pas les permissions attendues.

Pour corriger seulement les fichiers qui ne sont pas en 640 :

find /var/www/example.com -type f -not -perm 640 -exec chmod 640 {} +Langage du code : JavaScript (javascript)

Pour corriger seulement les dossiers qui ne sont pas en 750 :

find /var/www/example.com -type d -not -perm 750 -exec chmod 750 {} +Langage du code : JavaScript (javascript)

Avant d’appliquer, vous pouvez afficher les éléments concernés :

find /var/www/example.com -type f -not -perm 640 -print
find /var/www/example.com -type d -not -perm 750 -printLangage du code : PHP (php)
Kinsta: Premium Managed WordPress hosting

Rendre uniquement certains scripts exécutables

Un script shell doit souvent être exécutable. Un fichier PHP servi par PHP-FPM n’a généralement pas besoin de l’être.

Pour rendre exécutables les scripts .sh :

find /var/www/example.com -type f -name '*.sh' -exec chmod 750 {} +Langage du code : JavaScript (javascript)

Pour ajouter le droit d’exécution au propriétaire seulement :

find /var/www/example.com -type f -name '*.sh' -exec chmod u+x {} +Langage du code : JavaScript (javascript)

Pour retirer le bit exécutable de tous les fichiers réguliers, vérifiez d’abord la liste :

find /var/www/example.com -type f -perm /111 -printLangage du code : PHP (php)

Puis retirez l’exécution si la liste est cohérente :

find /var/www/example.com -type f -perm /111 -exec chmod a-x {} +Langage du code : JavaScript (javascript)

Cas WordPress : permissions recommandées

Pour WordPress, les permissions dépendent beaucoup de l’utilisateur PHP-FPM, du groupe web et de la méthode de déploiement. Il faut donc éviter les recettes universelles trop confiantes.

Sur un serveur classique, cette base peut servir de point de départ :

find /var/www/example.com/public_html -type d -exec chmod 755 {} +
find /var/www/example.com/public_html -type f -exec chmod 644 {} +Langage du code : JavaScript (javascript)

Pour une configuration plus restrictive, avec un groupe web correctement configuré :

find /var/www/example.com/public_html -type d -exec chmod 750 {} +
find /var/www/example.com/public_html -type f -exec chmod 640 {} +Langage du code : JavaScript (javascript)

Le fichier wp-config.php mérite souvent un traitement particulier :

chmod 640 /var/www/example.com/public_html/wp-config.phpLangage du code : JavaScript (javascript)

Ou, si votre modèle de droits le permet :

chmod 440 /var/www/example.com/public_html/wp-config.phpLangage du code : JavaScript (javascript)

Pour un guide WordPress plus complet, vous pouvez lire l’article dédié : WordPress : accorder les bonnes permissions aux fichiers et dossiers avec chown et chmod.

Réparer un site après un mauvais chmod récursif

Si vous avez lancé un chmod -R trop violent et que le site affiche une erreur 403, 500 ou des fichiers illisibles, commencez par vérifier les permissions actuelles :

ls -la /var/www/example.com
find /var/www/example.com -maxdepth 2 -type d -ls
find /var/www/example.com -maxdepth 2 -type f -lsLangage du code : JavaScript (javascript)

Ensuite, restaurez une base propre :

find /var/www/example.com -type d -exec chmod 755 {} +
find /var/www/example.com -type f -exec chmod 644 {} +Langage du code : JavaScript (javascript)

Si votre serveur utilise un modèle plus restrictif avec groupe web :

find /var/www/example.com -type d -exec chmod 750 {} +
find /var/www/example.com -type f -exec chmod 640 {} +Langage du code : JavaScript (javascript)

Puis vérifiez le propriétaire et le groupe :

namei -l /var/www/example.com/public_html/index.php
ls -la /var/www/example.com/public_htmlLangage du code : JavaScript (javascript)

Si les permissions semblent correctes mais que le site reste inaccessible, le problème vient peut-être du propriétaire des fichiers. Dans ce cas, il faut examiner chown, l’utilisateur PHP-FPM et le groupe utilisé par le serveur web.

Vérifier le propriétaire des fichiers

chmod règle les permissions. chown règle le propriétaire et le groupe. Les deux sujets sont liés, mais ils ne font pas la même chose.

Pour voir les propriétaires :

ls -la /var/www/example.com/public_htmlLangage du code : JavaScript (javascript)

Pour inspecter tout le chemin d’accès :

namei -l /var/www/example.com/public_html/index.phpLangage du code : JavaScript (javascript)

Cette commande est très utile pour repérer un dossier parent trop restrictif. Un fichier peut avoir les bonnes permissions, mais rester inaccessible si un dossier parent bloque la traversée.

Permissions symboliques : souvent plus lisibles

Les permissions numériques sont pratiques, mais les permissions symboliques sont parfois plus claires.

Ajouter le droit d’exécution au propriétaire :

chmod u+x script.shLangage du code : CSS (css)

Retirer l’écriture aux autres utilisateurs :

chmod o-w fichier.txtLangage du code : CSS (css)

Retirer l’exécution à tous les fichiers réguliers :

find /var/www/example.com -type f -exec chmod a-x {} +Langage du code : JavaScript (javascript)

Les modes symboliques réduisent le risque de remplacer toute la permission par une valeur numérique trop agressive.

Bonnes pratiques avant un chmod récursif

  • Travaillez sur un chemin absolu plutôt que sur . si vous avez le moindre doute.
  • Lancez d’abord la commande avec -print.
  • Traitez séparément les fichiers et les dossiers.
  • Évitez chmod -R 777, sauf cas temporaire très contrôlé.
  • Ne rendez pas tous les fichiers exécutables.
  • Vérifiez aussi le propriétaire avec ls -la et namei -l.
  • Gardez une sauvegarde récente avant une modification massive.

La ligne de commande est plus rapide qu’un client FTP. Elle est aussi beaucoup plus rapide pour casser quelque chose. Autant s’en servir avec méthode.

Besoin de remettre votre serveur au propre ?

Permissions incohérentes, uploads WordPress bloqués, erreurs 403, mises à jour impossibles, fichiers possédés par le mauvais utilisateur : ce sont des problèmes fréquents sur les serveurs qui ont vécu.

  • audit des permissions Linux et WordPress ;
  • correction des propriétaires avec chown ;
  • remise à plat des droits fichiers et dossiers ;
  • configuration PHP-FPM, Nginx, Apache et groupes système ;
  • sécurisation et optimisation de serveurs WordPress ou WooCommerce.

Si votre site fonctionne “à peu près” mais que personne n’ose toucher aux permissions, contactez-moi. On remet ça au carré, sans chmod vaudou.

Articles connexes

FAQ

Quelle est la différence entre chmod 644 et chmod 755 ?

644 convient généralement aux fichiers : le propriétaire peut lire et écrire, les autres peuvent lire. 755 convient généralement aux dossiers : le propriétaire peut lire, écrire et traverser ; les autres peuvent lire et traverser.

Pourquoi ne pas utiliser chmod -R 777 ?

Parce que 777 donne tous les droits à tout le monde. Sur un serveur web, cela peut permettre à des processus non prévus de modifier ou d’exécuter des fichiers. C’est une solution de panique, pas une configuration durable.

Pourquoi mes dossiers ne fonctionnent plus après un chmod récursif ?

Les dossiers ont besoin du droit d’exécution pour être traversés. Si vous appliquez 640 à des dossiers, le serveur web peut ne plus pouvoir entrer dedans. Utilisez 750 ou 755 selon votre modèle de droits.

Faut-il mettre les fichiers WordPress en 644 ou 640 ?

Les deux peuvent être valables selon la configuration. 644 est courant et compatible avec beaucoup d’environnements. 640 est plus restrictif, mais demande que le groupe utilisé par le serveur web soit correctement configuré.

Comment appliquer chmod uniquement aux fichiers PHP ?

Utilisez find avec un filtre sur l’extension : find /chemin -type f -name '*.php' -exec chmod 640 {} +. Testez d’abord avec -print pour vérifier la liste.

chmod change-t-il le propriétaire des fichiers ?

Non. chmod change les permissions. Pour changer le propriétaire ou le groupe, utilisez chown. Sur un serveur web, les deux doivent être cohérents.

Sources

Demandez à l'IA son opinion
Gravatar for Matt Biscay

Je suis Matt Biscay, développeur WordPress & WooCommerce certifié chez Codeable, administrateur système et enseignant.

J’aide les entreprises à créer, optimiser et fiabiliser leurs sites WordPress avec une approche technique propre : performance, sécurité, maintenance, développement sur mesure et résolution de problèmes complexes.

Sur Skyminds, je partage des tutoriels WordPress, WooCommerce, Linux et administration système, avec des solutions testées sur des cas réels et pensées pour durer.

Découvrez mes services WordPress et WooCommerce.

4 réflexions au sujet de “Chmod récursif sous Linux : corriger les permissions sans casser son serveur”

Laisser un commentaire