Aller au contenu

Permissions correctes pour serveur web

Lorsqu'on met en place un serveur web sous Linux en vu d'y développer (ou au moins déposer) des sites, la question des permissions revient toujours. J'en avais marre de me la poser et j'ai décidé de me rédiger ce petit guide de démarrage.

Cet article est particulièrement rédigé pour Ubuntu/Apache, mais la logique resterait la même pour tout autres système et web serveur.

Pour aller directement aux commandes à exécuter, cliquer ici.

Le constat

Dans le cas d'Ubuntu/Apache, l'utilisateur du serveur web est www-data, et le dossier racine est /var/www/html. Les droits par défaut sur ce dossier sont :

$ ls -al /var/www/html
drwxr-xr-x 2 root root  4096 mai 5 14:39 .
-rw-r--r-- 1 root root 10918 mai 5 14:39 index.html

En conclusion :

  • L'utilisateur propriétaire est root et a les droits de lecture, d'écriture et d'exécution sur le dossier, et de lecture et écriture sur les fichiers
  • Le groupe propriétaire est root et a les droits de lecture et d'écriture sur le dossier, et de lecture sur les fichiers (en bref, il perd les droits d'écriture, comparé à l'utilisateur).
  • Le reste du monde a les mêmes droits que le groupe propriétaire.

En gros, seul root peut y écrire, et tout le monde (dont www-data) peut lire dans ce dossier. Sauf que :

  1. En tant que developeur web, on aimerait bien pouvoir y écrire avec notre compte utilisateur sans avoir besoin de faire eds sudo et des chmod 777 à tout va.
  2. L'utilisateur www-data, qui exécute nos sites web, aura parfois lui aussi besoin de pouvoir écrire dans certains sous-dossiers (les dossiers de cache ou de log par exemple).

La solution

Notre propre compte utilisateur va devenir propriétaire du dossier et de tout son contenu, afin d'avoir systématiquement les droits d'écriture. Le groupe www-data va devenir le groupe propriétaire, ainsi on pourra lui laisser un accès en lecture à ce dossier et en exécution (pour pouvoir les afficher dans le navigateur), et au cas par cas lui ajouter les droits d'écriture.

N'oublions pas la règle de base des permissions sous Linux

Par sécurité, il faut toujours appliquer les permissions les plus stricts, ne donnant des droits que lorsque c'est nécessaire.

De ce fait, on va faire en sorte de retirer le droit d'exécution à tous, et de retirer le droit de lecture au reste du monde.

Les commandes

# www-data devient propriétaire et le groupe $USER devient groupe prorpiétaire
sudo chown -R www-data:$USER /var/www/html

# le propriétaire peut lire, le groupe peut lire et écrire, et le monde ne peut plus rien faire dans ce dossier
sudo chmod -R u=rx,g=rwX,o= /var/www/html

Après, il suffit d'ajouter au cas par cas les droits d'écriture pour notre serveur web sur les sous-dossiers le nécessitant. Exemple :

# "sudo" devrait être facultatif ici
sudo chmod -R u+w /var/www/html/sous/dossier
  • Edit 19/04/2023 : après réflexion, je préfère l'approche www-data:$USER (corrigé plus haut), plutôt que $USER:www-data, car certain outils exécutés par Apache peuvent vérifier s'ils sont propriétaires de leurs dossiers (comme Nextcloud).

Conclusion

Voilà tout ! Je trouve cette solution simple et élégante, tout en restant suffisamment complète pour le besoins de base. Il y aurait sans doute d'autres choses à améliorer donc n'hésitez pas à me faire vos remarques.