Gestion des droits
Voici les instructions concernant les permissions à positionner sur les fichiers/répertoires que vous envoyez sur votre serveur dédié avec option « Pack Web » (Apache/PHP).
Si besoin, pensez à lire nos rappels sur la gestion des droits Unix.
Comment bien positionner les permissions sur les fichiers/répertoires de mon compte web ?
Nous supposons ici que vous avez un compte example
sur votre serveur dédié. Vous pouvez ainsi vous connecter en SSH/SFTP avec ce compte example
.
Par défaut il y a une « protection en écriture » pour éviter qu’Apache/PHP puisse modifier/supprimer tous vos fichiers.
Voici les instructions générales :
- Pour être lisible par Apache/PHP, vos fichiers/répertoires doivent être lisibles par le groupe (g+r pour les fichiers, g+rx et vos répertoires)
- Pour qu’Apache/PHP puissent écrire dans vos fichiers/répertoires, vous devez ajouter le droit d’écriture sur le groupe (g+w)
- Pour que votre compte
example
puis modifier/supprimer les fichiers créés par Apache/PHP, ils doivent avoir la lecture et l’écriture pour le groupe (g+rw pour les fichiers, g+rwx et vos répertoires). Les fichiers/répertoires créés appartiendront à un autre utilisateurwww-example
mais cela ne pose pas de problème grâce aux permissions sur le groupe communexample
De façon pratique, lors d’un déploiement, vous pouvez vous assurer que tous les fichiers sont lisibles par Apache/PHP ainsi :
$ chmod -R g+rX /home/example/www/
De façon pratique, pour les répertoires de cache, uploads, etc. vous devez ajouter le droit d’écriture pour le groupe :
$ chmod -R g+w /home/example/cache/
$ chmod -R g+w /home/example/uploads/
Attention, il ne faut pas faire cela sur l’ensemble des fichiers/répertoires, sinon on perd tout l’intérêt de la « protection en écriture » …et on gagne beaucoup de problème de permissions. Si vraiment nécessaire, vous pouvez nous demander de façon exceptionnelle d’enlever la « protection en écriture ».
De façon pratique, votre code PHP ne devrait pas forcer les droits car un UMASK est positionné sur votre serveur pour que tous vos fichiers/répertoires créés aient la lecture et l’écriture pour le groupe. Si vous avez des problèmes, c’est sûrement que votre code force des droits malgré tout (fonctions chmod(), mkdir() etc.).
De façon exceptionnelle, on peut enlever la “protection en écriture”
Il faut bien noter que cette fameuse « protection en écriture » n’est pas là pour vous embêter, elle permet - en cas de piratage ou mauvaise manipulation - d’éviter que la majorité de vos fichiers soit supprimés/modifiés et d’éviter tout soupçon sur cette possibilité en cas de problème.
Néanmoins, pour certains logiciels web qui se mettent à jour tout seul (Wordpress, Nextcloud, Matomo, etc.) cela complique la tâche.
Pour votre code PHP que vous déployez, vous devriez ne pas en avoir besoin en appliquant les instructions ci-dessus.
Mais de façon exceptionnelle, nous pouvons retirer cette « protection en écriture » et vous n’aurez plus aucun souci de permissions. Mais en contrepartie, votre application web sera moins sécurisée, et en cas de problème il faudra probablement restaurer complètement votre dernière sauvegarde.
Si vous avez besoin de cela, merci de nous ouvrir un ticket en nous expliquant pourquoi vous avez ce besoin particulier.
Rappels sur la gestion des droits Unix
Version courte et simplifiée
Les permissions de vos fichiers/répertoires sont définis selon 3 catégories :
- utilisateur (u)
- groupe (g)
- other (o)
et 3 droits possibles :
- read (r)
- write (g)
- exec (x)
Ainsi on manipule les droits en général avec la commande chmod
et par exemple l’on peut ajouter des droits ainsi :
$ chmod g+r FICHIER # Ajout du droit de lecture pour le groupe
$ chmod -R g+w REPERTOIRE # Ajout récursif du droit d'écriture
$ chmod g+rwx REPERTOIRE # Ajout des droits de lecture/écriture/exéction pour le groupe
Attention, quelques particularités importantes :
- pour un fichier le droit
exec
(x) n’est pas vraiment utile sur un serveur web (il sert principalement à des binaires ou des scripts à exécuter en ligne de commande - pour un répertoire le droit
exec
(x) signifie qu’on a le droit de le « traverser » (pour atteindre un fichier ou un sous-répertoire) - pour un répertoire le droit
read
(r) signifie qu’on peut lister les fichiers/répertoires se trouvant dedans - pour un répertoire les droits rw permettent d’effacer tous les fichiers et répertoires vides dedans… même si l’on n’a pas les permissions sur ces fichiers/répertoires
Version longue
Sous les systèmes de type Unix ou Linux, il existe plusieurs types de fichiers: les fichiers, les répertoires, les liens symboliques, les fichiers-périphériques. Un fichier appartient à un utilisateur (en fait un numéro d’utilisateur) et à un groupe (en fait un numéro de groupe). En tant que root on peut faire des modifications ainsi :
# chown NEW_USER FICHIER # on change l'utilisateur propriétaire
# chgrp NEW_GROUP FICHIER # on change le groupe propriétaire
# chown NEW_USER:NEW_GROUP # on change à la fois l'utilisateur et le groupe propriétaires
# chown NEW_USER: # on change l'utilisateur et on change aussi le groupe avec celui par défaut de l'utilisateur
Les 3 droits fondamentaux sont la lecture, l’écriture et l’exécution.
Pour un fichier, ces 3 droits sont définis pour 3 catégories: l’utilisateur (u) le groupe (g) et le « reste du monde » (o). Pour chacune de ces catégories: on note les droits sous la forme rwx
:
r
correspond à la lecturew
à l’écriturex
à l’exécution
Par exemple r-x
correspond à des droits de lecture et d’exécution autorisés, mais l’écriture interdite.
Une notation pratique est de voir rwx
comme 3 bits. L’autorisation correspond à 1 et l’interdiction à 0. Par exemple r-x
correspond à 101
: en base 10, 101=1*4+0*2+1*1=5
cela correspond donc à 5.
On notera côte à côte les droits des 3 catégories. Par exemple rwxr-xr--
correspond à des droits rwx
pour l’utilisateur, r-x
pour le groupe et r--
pour le reste du monde. Si vous avez bien suivi rwxr-xr--=111101100=754
.
On ajoute (ou retire) des droits avec la commande chmod
:
$ chmod CATEGORIE+DROIT FICHIER
- CATEGORIE peut être u (utilisateur), g (groupe) ou a (all=reste du monde)
- DROIT peut être r,w ou x
Pour retirer, on mettra un -
à la place du +
. On peut changer complètement les droits d’une catégorie avec =
ou même changer tous les droits avec :
$ chmod NNN FICHIER
avec NNN en notation numérique : 754, 750, 640, 660, 770, 666, 777 etc.
Pour un répertoire, on pourra lister les fichiers dans ce répertoire si on a les droits r
du répertoire (et ceux des répertoires supérieurs). Si on n’a pas ces droits, on ne pourra pas lister. Le droit rx
permet en plus d’entrer dans ce répertoire. Sans lui, on ne pourra pas effectuer des opérations sur un des fichiers contenus dans ce répertoire. Par exemple, le répertoire /root/
n’a souvent aucun droit pour all et donc on ne peut rien faire dans ce répertoire si l’on est pas root. Notons que le droit x
seul permet de traverser le répertoire mais pas d’y entrer ou de le lister.
Attention, pour pouvoir effacer un fichier ou un répertoire vide, il suffit d’avoir les droits wx
sur le répertoire contenant ! (avoir uniquement de droit w
ne sert à rien pour un répertoire). Notez que dans un répertoire avec droit wx
, on peut effacer les fichiers (ou répertoires vides) sur lesquels on n’a pas les droits (par contre, on ne peut pas effacer les répertoires non vides sur lesquels on a pas les droits wx
).
En plus de cela, il existe des droits spéciaux : setuid, setgid et sticky bit :
- Un fichier exécutable peut être setuid, c’est-à-dire qu’au lieu d’être exécuté avec les droits de l’utilisateur qui le lance, il sera exécuté avec les droits du propriétaire de l’exécutable. Ceci s’avère assez dangereux notamment pour les exécutables setuid root. L’exemple type est le pogramme
passwd
qui permet de changer de mot de passe. Il est exécutable par un utilisateur mais il est setuid root car seulroot
peut écrire dans les fichiers/etc/passwd
et/etc/shadow
- Un fichier exécutable peut être setguid. Il s’agit de la même notion que celle vue ci-dessus pour le groupe. Le fichier est donc exécuté avec les droits du groupe auquel il appartient.
- Un fichier exécutable peut être sticky, c’est-à-dire avoir le sticky bit positionné. Cela signifie qu’il reste en mémoire même après la fin de son exécution afin d’être relancé plus rapidement (à préciser). Attention, seul
root
peut positionner le sticky bit. - Un répertoire peut être setgid : cela signifie que tous les fichiers créés dans ce répertoire appartiendront au même groupe que le répertoire.
- Un répertoire peut être sticky bit : cela signifie dans ce répertoire, un utilisateur ne pourra effacer que les fichiers qui lui appartiennent. L’exemple type est le répertoire
/tmp
où tout le monde peut écrire mais où l’on ne peut effacer que ce que l’on a créé.
Ces droits spéciaux sont notés sst
où le premier s
correspond au setuid, le second s
au setgid et le t
au sticky bit.
On écrira également cela sous la forme de bits. Par exemple s-t=101=5
en ajoutant cela avant NNN, qui devient NNNN.
Ainsi on peut ajouter/modifier les droits spéciaux avec la commande chmod
.
FAQ
Puis-je faire un CHOWN ?
La commande chown
n’est utilisable que par root. Vous ne devriez pas avoir besoin d’utiliser cette commande si les droits des fichiers/répertoires créés sont corrects. En dernier recours, nous pouvons fixer les droits sur toute votre arborescence, mais l’utilisation de chown
ne devrait jamais être nécessaire.
Puis-je faire un CHMOD 777 pour résoudre mes problèmes de permissions ?
Il ne faut JAMAIS faire un CHMOD 777 (ou 666) pour résoudre à l’aveugle des problèmes de permissions. Si vous êtes désespéré à ce point, contactez-nous avant. Si vraiment nécessaire, on pourrait de façon exceptionnelle enlever la « protection en écriture ».
Comment détecter les fichiers ou répertoires en écriture dans mon compte ?
Vous pouvez utiliser la commande find
pour identifier les fichiers/répertoires avec le droit WRITE sur le groupe ainsi :
$ find . ! -type l -perm -g+w