51 votes

Problèmes de permissions avec /var/www/html et mon propre répertoire personnel pour la racine de document d'un site Web

Je tente de ne pas donner l'autorisation 777 dans mon dossier /var/www/html, mais je veux éditer mes fichiers sans sudo. J'ai donc pensé à créer un lien symbolique d'un dossier dans mon répertoire personnel dans /var/www/html. Je l'ai créé en utilisant :

sudo ln -sT /home/andre/www/moodle/ moodle

et la sortie de ls -la est la suivante :

andre@andre-270E5G:/var/www/html$ ls -la
total 8
drwxr-xr-x 2 root root 4096 Mai  4 10:20 .
drwxr-xr-x 4 root root 4096 Abr 29 14:29 ..
lrwxrwxrwx 1 root root   23 Mai  4 10:20 moodle -> /home/andre/www/moodle/

Donc, mon dossier moodle a des autorisations de lecture, écriture et exécution pour tout le monde, et ce n'est pas ce que je veux. J'ai utilisé la commande :

sudo chmod -R 775 moodle/

en essayant de le modifier, mais il est resté avec des autorisations de lecture, écriture et exécution pour tous. J'ai essayé la même chose avec le dossier moodle dans /home/andre/www/moodle, mais cela est resté pareil. La sortie de ls -la dans /home/andre/www/ est :

andre@andre-270E5G:~/www$ ls -la
total 28
drwxrwxr-x  3 andre andre  4096 Mai  4 10:02 .
drwx------ 49 andre andre 20480 Mai  4 10:01 ..
drwxrwxr-x 41 andre andre  4096 Mai  4 10:02 moodle

Donc le dossier moodle dans /home/andre/www/ a les autorisations que je veux.

En outre, quand j'accède à localhost/moodle, j'obtiens une erreur 403 Forbidden.

Qu'est-ce que je fais de mal ici ?

91voto

Joe the Person Points 5090

Vous ne devriez jamais avoir à gérer un site web à partir de votre répertoire personnel. . EVER. Dans le cas contraire, vous devriez donner au serveur web la possibilité de passer par /home/ pour voir la structure du répertoire, mais aussi dans /home/$USER/ (le répertoire personnel de votre utilisateur, où nous pouvons essayer de voir ce qui existe d'autre dans votre répertoire utilisateur), ainsi que tous les autres sous-dossiers qui s'y trouvent. Un serveur web mal configuré ou non corrigé peut provoquer une fuite massive de données de cette manière, ou la perte d'informations d'identification, ce qui mettrait en péril vos données personnelles et vos identifiants de connexion à d'autres systèmes. L'approche par lien symbolique que vous utilisez ne sert à rien non plus, pour la même raison que d'essayer de donner à Apache des autorisations de lecture. /home/andre/www/moodle - le serveur web doit être capable de traverser votre répertoire personnel pour atteindre l'emplacement du lien symbolique en /var/www/html ce qui constitue toujours un risque pour la sécurité.

Tout d'abord, utilisez sudo cp -r /home/andre/www/moodle/ /var/www/html/ . Cette opération copiera vos fichiers sur /var/www/html et gardez-le à l'écart de votre propre répertoire personnel. Nous allons ensuite modifier les autorisations pour que vous et le serveur web puissiez accéder à tout ce qui se trouve dans ce répertoire, et pour que votre utilisateur ait accès à tous les fichiers et répertoires en lecture/écriture. Ainsi, vous n'aurez jamais à travailler qu'à partir de /var/www/html pour votre site.

Il s'agit en fait de quatre étapes, après que vous avez recopié vos données sur /var/www/html :

  1. Donnez à Apache l'accès aux dossiers et aux fichiers, afin qu'il puisse servir le site sans erreurs 403.
  2. Donnez à votre utilisateur le statut de "propriétaire" des fichiers et des dossiers, et donnez-vous le droit de lire et d'écrire sur tous les fichiers et dossiers, ainsi que la possibilité de parcourir les répertoires.
  3. (Facultatif mais recommandé) Configurez-le de manière à ce que tout fichier ou dossier créé à partir de maintenant dans l'ensemble de la structure du répertoire ait le groupe défini comme étant www-data .
  4. (optionnel) Nettoyage final de la sécurité : nous définissons les autorisations de sorte que vous et le serveur web puissiez voir les données du site, mais que les autres utilisateurs ne puissent pas accéder aux fichiers ou à la structure des répertoires du site.

(1) Autoriser Apache à accéder aux dossiers et aux fichiers.

sudo chgrp -R www-data /var/www/html
sudo find /var/www/html -type d -exec chmod g+rx {} +
sudo find /var/www/html -type f -exec chmod g+r {} +

Cette opération définit récursivement le "groupe" comme étant www-data pour les dossiers et les fichiers. Le serveur web est alors autorisé à rechercher et à accéder à la structure des répertoires racine du document du site ( +x pour les répertoires uniquement). Il s'assure également que le serveur web dispose des autorisations de lecture pour tous les fichiers, afin que les données du site puissent être reçues.

Dans certains cas, il peut être nécessaire d'accorder au serveur web des droits d'écriture sur un fichier ou un répertoire. sudo chmod g+w /var/www/html/PATH (où PATH est le chemin d'accès au fichier ou au dossier de la structure de répertoires où vous devez appliquer les droits d'écriture pour le serveur web).

AVIS : Dans de nombreux cas, cela peut exposer des informations "sécurisées" sur la configuration d'un site (comme les identifiants d'accès à la base de données, etc.), et vous devez supprimer les "autres" autorisations d'accès à ces données sur ces fichiers ou répertoires individuels avec ce qui suit : sudo chmod o-rwx /var/www/html/FILEPATH (remplaçant FILEPATH avec le chemin d'accès relatif au /var/www/html pour le fichier).

Notez également que vous devrez peut-être réexécuter ces commandes à l'avenir si les "nouveaux fichiers" obtiennent des problèmes 403, afin de donner les autorisations correctes au serveur web pour qu'il puisse continuer à accéder aux fichiers et dossiers qui sont créés ou copiés et qui n'obtiennent pas l'autorisation d'accès. www-data correctement paramétré.


(2) Accordez à votre propriétaire des privilèges de lecture/écriture sur les dossiers et les fichiers, et autorisez l'accès aux dossiers pour parcourir la structure des répertoires.

sudo chown -R USER /var/www/html/
sudo find /var/www/html -type d -exec chmod u+rwx {} +
sudo find /var/www/html -type f -exec chmod u+rw {} +

Remplacer USER dans la première commande avec votre propre nom d'utilisateur !

Nous faisons trois choses ici. Premièrement, nous définissons votre utilisateur comme étant le "propriétaire" de tous les fichiers et répertoires de /var/www/html . Ensuite, nous définissons les droits de lecture et d'écriture sur les dossiers, et nous vous permettons d'accéder aux dossiers pour y entrer (l'option +x sur les éléments du répertoire). Nous définissons ensuite pour tous les fichiers des autorisations de lecture/écriture pour le propriétaire, que nous venons de définir.


(3) (optionnel) Assurez-vous que tous les nouveaux fichiers créés par la suite le soient avec la mention www-data en tant qu'utilisateur 'access'.

sudo find /var/www/html -type d -exec chmod g+s {} +

Cela permet d'activer le bit "set gid" pour le groupe sur les répertoires. Les fichiers et dossiers créés à l'intérieur de ces répertoires auront toujours l'attribut www-data en tant que groupe, autorisant l'accès au serveur web.


(4) (optionnel) Nettoyage de sécurité final, si vous ne voulez pas que d'autres utilisateurs puissent voir les données

Nous avons besoin de votre utilisateur pour voir les répertoires et les fichiers. Nous avons également besoin que le serveur web puisse le faire. Il se peut que nous ne voulions pas que d'autres utilisateurs du système (à l'exception de root) voient les données. Ne leur donnons donc pas cet accès et faisons en sorte que seuls votre utilisateur et le serveur web puissent voir les données.

sudo chmod -R o-rwx /var/www/html/

NOTE : Vous n'aurez pas à réexécuter cette opération ultérieurement, ni à modifier les autorisations pour la catégorie d'autorisations "autres". Si les "autres" utilisateurs ne peuvent pas accéder à /var/www/html/ (ils ne disposent pas des +x bit sur /var/www/html pour parcourir la structure des fichiers et des répertoires, ni la fonction +r pour lire les listes de fichiers), les autorisations sur les éléments situés sous ce répertoire pour d'autres utilisateurs ou groupes n'auront pas beaucoup d'importance.


Il existe également une solution un peu moins invasive, bien qu'il ne soit pas garanti qu'elle fonctionne pour tous les nouveaux fichiers, ni qu'elle fonctionne sur tous les systèmes de fichiers. qui impliquent des listes de contrôle d'accès aux fichiers. Cela vous permet de laisser la propriété des fichiers à www-data mais vous donne des droits de propriétaire effectifs, à toutes fins utiles, même si vous ne possédez pas personnellement les fichiers.

Cette solution est un peu moins invasive, et vous permet d'avoir un répertoire et tous les fichiers qui s'y trouvent appartenant à www-data:www-data o root:www-data mais aussi de s'en donner l'accès. Il utilise Listes de contrôle d'accès qui permet à plusieurs utilisateurs d'avoir des autorisations sans avoir à créer des groupes individuels. Cela permet également au root o www-data permet aux utilisateurs du système de posséder des fichiers, mais aussi d'ajouter des permissions supplémentaires au cas par cas, et d'affiner les permissions pour certains utilisateurs afin qu'ils puissent lire des choses mais pas les modifier, etc.

En supposant que nous travaillions toujours avec /var/www/html/ et que nous ne voulons pas que des utilisateurs espions autres que nous et le système (et la racine bien sûr) puissent voir nos données, nous devrons faire les choses suivantes :

  1. Redonner la propriété à l'utilisateur du système du serveur web www-data .

    sudo chown -R www-data:www-data /var/www/html

  2. Recursivement, vous avez accès aux fichiers en lecture/écriture, tandis que les autres utilisateurs (à l'exception de www-data y root bien sûr) aucun accès aux fichiers.

    sudo find /var/www/html -type f -exec setfacl -m u:YOURUSERNAME:rw -m other::--- {} \;

  3. Recursivement, donnez-vous les droits de lecture/écriture/traversée sur les répertoires, supprimez l'accès aux dossiers pour les autres utilisateurs (à l'exception de www-data y root ) et la définir comme ACL "par défaut" pour les nouveaux fichiers dans les répertoires.

    sudo find /var/www/html -type d -exec setfacl -d -m u:YOURUSERNAME:rwx -m o::--- {} \;

  4. Nous devons également définir le paramètre setgid pour tous les répertoires, de sorte que si vous créez un fichier, le serveur web peut toujours y accéder en tant que www-data par le biais des autorisations de groupe.

    sudo find /var/www/html -type d -exec chmod g+x {} \;

Vous avez maintenant accès à tous les répertoires, et vous n'aviez pas besoin de retirer l'accès aux www-data ce qui permet au serveur web de continuer à créer des fichiers partout où il en a besoin (par exemple, les frontaux basés sur PHP ont leurs propres répertoires de cache et autres qui doivent être créés et écrits pour fonctionner correctement).

Seul bémol : si vous créez manuellement de nouveaux fichiers, vous devez les chowner en conséquence pour en donner la propriété au serveur web. Il s'agit d'un simple sudo chown www-data:www-data filename et les listes de contrôle d'accès devraient toujours vous permettre d'avoir des droits de propriétaire effectifs sur le fichier.

Il y a de nombreux cas où j'ai dû faire cela en tant qu'administrateur système pour un certain type d'accès non standard sans changer les propriétaires d'un fichier donné. Cela fonctionne, mais comporte ses propres problèmes, car tous les systèmes de fichiers soutiens les listes d'accès aux fichiers.

11voto

vipin mehta Points 111

Excellente réponse de Thomas Ward https://askubuntu.com/a/767534/717860

Vous pouvez effectuer toutes les étapes recommandées en seulement 3 commandes au lieu de 8 commandes :

3 commandes :

sudo chown -R ubuntu:www-data /var/www
sudo find /var/www -type d -exec chmod 2750 {} \+
sudo find /var/www -type f -exec chmod 640 {} \+

effectuer le même travail que les 8 commandes suivantes :

sudo chgrp -R www-data /var/www
sudo find /var/www -type d -exec chmod g+rx {} +
sudo find /var/www -type f -exec chmod g+r {} +
sudo chown -R ubuntu /var/www/
sudo find /var/www -type d -exec chmod u+rwx {} +
sudo find /var/www -type f -exec chmod u+rw {} +
sudo find /var/www -type d -exec chmod g+s {} +
sudo chmod -R o-rwx /var/www/

3voto

mastov Points 183

Toute l'idée d'utiliser des liens symboliques pour résoudre un problème de permission est erronée et ne peut pas fonctionner. Les autorisations affichées pour le lien symbolique lui-même sont principalement sans objet, elles ne peuvent pas être utilisées pour contourner les autorisations du répertoire "réel". Créer un lien symbolique de /var/www/html/moodle vers /home/andre/www/moodle/ ne contourne pas les autorisations pour /home/andre/www/moodle/. Quiconque souhaite effectuer des actions dans /var/www/html/moodle ne peut le faire que s'il a les autorisations nécessaires pour /home/andre/www/moodle/.

Votre exécution de sudo chmod -R 775 moodle/ a en réalité eu un effet, mais différemment de ce que vous pensiez elle n'a pas modifié les autorisations du lien symbolique, mais de la cible du lien symbolique /home/andre/www/moodle/.

L'erreur 403 que vous obtenez dans le serveur web est probablement due au fait que votre serveur web n'a pas les autorisations nécessaires pour accéder à /home/andre. Ce n'est pas "un problème supplémentaire", mais dû au même problème d'autorisation.

Donc au lieu d'utiliser des liens symboliques, vous devez trouver des autorisations qui vous permettent de modifier les fichiers et au serveur web d'y accéder (ou même de les modifier, cela dépend de l'application). Les autorisations exactes dépendent de votre cas d'utilisation précis (votre application et la configuration du serveur).

En général, je pense qu'il est une bonne idée que vous possédiez les fichiers et ayez les autorisations en lecture et écriture, que le serveur web n'ait qu'un accès en lecture aux fichiers via les autorisations de groupe, et que tous les autres utilisateurs n'aient aucun accès.

Un exemple d'autorisation (qui pourrait ne pas fonctionner pour votre cas d'utilisation en raison d'informations manquantes) :

andre@fermat:/var/www/html$ ls -al moodle/
total 0
drwxr-x--- 2 andre www-data 60 mai  4 16:20 .
drwxr-xr-x 3 root  root     80 mai  4 16:20 ..
-rw-r----- 1 andre www-data  0 mai  4 16:20 index.html

Vous pouvez voir que le répertoire a suffisamment d'accès pour vous en tant que propriétaire pour y entrer et modifier son contenu, le serveur web (dans le groupe www-data) peut y entrer et lire. Les fichiers eux-mêmes sont lisibles et modifiables pour vous (le propriétaire) et lisibles pour le serveur web (dans le groupe www-data). Tous les autres utilisateurs n'ont aucun accès.

Encore une fois, prenez ceci uniquement comme exemple. L'utilisateur/le groupe exact de votre serveur web dépend de votre configuration. Et votre application (moodle) pourrait avoir besoin d'autorisations différentes, consultez sa documentation.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X