web-dev-qa-db-fra.com

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

J'essaie de pas accorder l'autorisation 777 dans mon dossier /var/www/html, mais je souhaite modifier mes fichiers sans Sudo. J'ai donc créé un lien symbolique vers un dossier de mon répertoire personnel dans /var/www/html. Je l'ai créé à l'aide de 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, d’écriture et d’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/ pour essayer de la modifier, mais les autorisations de lecture, d'écriture et d'exécution sont restées inchangées. J'ai essayé la même chose avec le dossier moodle dans /home/andre/www/moodle, mais il est resté le même. Le résultat 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

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

En tant que problème supplémentaire, lorsque j’accède à localhost/moodle, j’obtiens une erreur 403 Forbidden.

Qu'est-ce que je fais mal ici?

31
André Carvalho

Vous ne devriez jamais avoir à exécuter un site Web à partir de votre répertoire personnel . EVER. Sinon, vous devrez donner au serveur Web la possibilité de parcourir /home/ pour voir la structure du répertoire, mais aussi dans /home/$USER/ (répertoire de base de votre utilisateur, où nous pouvons essayer de voir ce qui existe dans votre répertoire d'utilisateur), ainsi que tous les autres sous-dossiers qu'il contient. Un serveur Web mal configuré ou mal configuré ou non corrigé peut entraîner de cette façon une fuite massive de données, ou une perte d'informations d'identification risquant de mettre en péril vos données personnelles et vos identifiants de connexion. L’approche symbolique que vous utilisez n’aide pas non plus pour la même raison que si vous tentiez de donner à Apache le droit de lire /home/andre/www/moodle - le serveur Web doit pouvoir parcourir votre répertoire personnel pour atteindre l’emplacement indiqué par le lien symbolique dans /var/www/html, qui pose toujours ce risque de sécurité.

Tout d'abord, utilisez Sudo cp -r /home/andre/www/moodle/ /var/www/html/. Cela va copier vos fichiers dans /var/www/html et les garder loin de votre propre répertoire personnel. Nous rétablirons ensuite les autorisations pour que vous et le serveur Web puissiez accéder à tout ce qui se trouve dans ce répertoire, et donnerons à votre utilisateur une lecture/écriture complète de tous les fichiers et répertoires. Ensuite, vous ne devrez jamais travailler que sur /var/www/html pour votre site.

Ceci est en vigueur, en quatre étapes, après que vous ayez copié vos données dans /var/www/html:

  1. Donnez à Apache l’accès aux dossiers et aux fichiers pour qu’il puisse desservir le site sans erreur 403.
  2. Donnez à votre utilisateur 'propriétaire' sur les fichiers et les dossiers, et donnez-vous la lecture/écriture sur tous les fichiers et tous les dossiers, ainsi que la possibilité de parcourir les répertoires.
  3. (Facultatif mais recommandé) Configurez-le de sorte que tous les fichiers ou dossiers créés à partir de cette page dans la totalité de la structure de répertoires aient le groupe défini sur www-data.
  4. (Facultatif) Nettoyage final de la sécurité, où nous configurons des autorisations pour 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 au serveur. structure de répertoire pour le site.

(1) Autorisez 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 {} +

Ceci définit récursivement le 'groupe' sur www-data pour les dossiers et les fichiers. Cela donne ensuite au serveur Web le droit de rediffuser et d'accéder à la structure de répertoires racine du document de site (+x pour les répertoires uniquement). Il s'assure ensuite 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, vous devrez peut-être donner au serveur Web le droit d'écrire sur un fichier ou un répertoire. Pour ce faire, utilisez Sudo chmod g+w /var/www/html/PATH (où PATH est le chemin du fichier ou du dossier dans la structure de répertoire où vous devez appliquer les autorisations d'écriture pour le serveur Web).

NOTICE: Dans de nombreux cas, cela peut exposer des informations "sécurisées" sur une configuration de site (telles que les informations d'identification 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 les éléments suivants: Sudo chmod o-rwx /var/www/html/FILEPATH (en remplaçant FILEPATH par le chemin relatif au dossier /var/www/html du fichier).

Notez également que vous devrez peut-être réexécuter ces commandes à l'avenir si les "nouveaux fichiers" rencontrent 403 problèmes, afin de donner les autorisations appropriées au serveur Web pour pouvoir continuer à accéder aux fichiers et aux dossiers créés. ou copié dans et ne pas obtenir le groupe www-data défini correctement.


(2) Donnez à 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 de 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 {} +

Remplacez USER dans la première commande par votre propre nom d'utilisateur!

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


(3) (Facultatif) Assurez-vous que chaque nouveau fichier créé par la suite est créé avec www-data en tant qu'utilisateur 'accès'.

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

Ceci définit le bit "set gid" pour le groupe sur les répertoires. Les fichiers et les dossiers créés dans ces répertoires auront toujours www-data comme groupe, permettant ainsi l'accès au serveur Web.


(4) (Facultatif) Nettoyage final de la sécurité, si vous ne souhaitez pas que les 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 du serveur Web. Nous ne voulons peut-être pas que les autres utilisateurs du système (sauf root) voient les données. Donc, ne leur donnons pas cet accès et faisons en sorte que seul votre utilisateur et le serveur Web puissent voir les données.

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

REMARQUE: Il ne sera pas nécessaire de réexécuter cette opération ultérieurement, ni de modifier les autorisations pour la catégorie "autre" d'autorisations ici. Si les 'autres' utilisateurs ne peuvent pas accéder à /var/www/html/ (ils ne disposent pas du bit +x nécessaire sur /var/www/html pour parcourir la structure de fichiers et la structure du répertoire, ni du bit +r pour lire les listes de fichiers), les autorisations sur les éléments situés au-dessous de celle-ci répertoire pour les autres utilisateurs ou groupes ne va pas vraiment avoir beaucoup d'importance.


Il existe également une solution légèrement moins invasive, même s’il n’est pas garanti que tous les nouveaux fichiers fonctionnent, ni sur tous les systèmes de fichiers, impliquant des listes de contrôle d’accès aux fichiers. Cela vous permet de laisser la propriété des fichiers avec www-data, mais vous donne les 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 appartenant à www-data:www-data ou root:www-data mais vous en donnez également l’accès. Il utilise des listes de contrôle d'accès , qui permettent à plusieurs utilisateurs de disposer d'autorisations sans configurer de groupes individuels. Cela permet également aux utilisateurs du système root ou www-data de posséder des fichiers, mais vous permet également d'ajouter des autorisations supplémentaires au cas par cas et d'ajuster les autorisations de certains utilisateurs afin qu'ils puissent lire des éléments sans les modifier, etc.

En supposant que nous travaillons toujours avec /var/www/html/, et que nous ne voulons pas surveiller d'autres utilisateurs que nous et le système (et la racine bien sûr) pour voir nos données, nous devons procéder comme suit:

  1. Rendez la propriété à l'utilisateur système du serveur Web www-data.
Sudo chown -R www-data: www-data/var/www/html
  1. Récursivement, vous donnez lecture/écriture sur les fichiers, tout en donnant aux autres utilisateurs (à l'exception de www-data et root bien sûr) aucun accès aux fichiers.
Recherchez Sudo/var/www/html -type f -exec setfacl -m u: YOURUSERNAME: rw -m autre :: --- {} \;
  1. Donnez-vous récursivement lecture/écriture/chemin sur les répertoires, supprimez l'accès aux dossiers des autres utilisateurs (à l'exception de www-data et root) et définissez cette liste comme ACL "par défaut" pour les nouveaux fichiers des répertoires.
Sudo trouver/var/www/html -type d -exec setfacl -d -m u: VOTRENOM: rwx -m o :: --- {} \;
  1. Nous devons également définir le bit setgid pour tous les répertoires afin que, si vous créez un fichier, le serveur Web puisse toujours y accéder sous le nom www-data via des autorisations de groupe.
Sudo find/var/www/html -type d -exec chmod g + x {} \;

Et maintenant, vous avez accès à tous les répertoires et . Vous n'avez pas besoin de retirer l'accès à www-data, ce qui aide le serveur Web à créer encore fichiers partout où il le faut (telles que les interfaces basées sur PHP ayant leurs propres répertoires de cache et qui doivent être créées et écrites pour fonctionner correctement).

Seul inconvénient: si vous créez manuellement de nouveaux fichiers, vous devez les chowner en conséquence pour que le serveur Web devienne propriétaire. Il s’agit d’un simple Sudo chown www-data:www-data filename et les listes de contrôle d’accès doivent toujours vous laisser disposer des droits de propriété effectifs sur le fichier.

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

60
Thomas Ward

L’idée même d’utiliser des liens symboliques pour résoudre un problème d’autorisation est imparfaite et ne peut pas fonctionner. Les autorisations affichées pour le lien symbolique lui-même sont généralement sans importance, elles ne peuvent pas être utilisées pour contourner les autorisations du répertoire "réel". La création d'un lien symbolique de /var/www/html/moodle à /home/andre/www/moodle/ ne contourne pas les autorisations pour /home/andre/www/moodle/. Quiconque souhaite utiliser des éléments de /var/www/html/moodle ne peut le faire que s’il dispose des autorisations nécessaires pour /home/andre/www/moodle/.

Votre exécution de Sudo chmod -R 775 moodle/ en fait did a un effet, mais différemment de ce que vous pensiez ne pas changer les permissions du lien symbolique, mais du lien symbolique cible /home/andre/www/moodle/.

L'erreur 403 que vous obtenez sur le serveur Web est probablement due au fait que votre serveur Web ne dispose pas des autorisations nécessaires pour entrer /home/andre. Ce n'est pas "un problème supplémentaire", mais dû au même problème d'autorisation.

Ainsi, au lieu d'utiliser des liens symboliques, vous devez déterminer les autorisations vous permettant de modifier les fichiers et le serveur Web d'y accéder (ou même de les modifier, cela dépend de l'application). La nature exacte de ces autorisations dépend de votre cas d'utilisation (configuration de votre application et de votre serveur).

En général, je pense que c'est une bonne idée que vous possédiez les fichiers et disposiez des autorisations rw, le serveur Web ne dispose que d'un accès en lecture aux fichiers via les autorisations de groupe, et tous les autres utilisateurs n'ont 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 constater que le répertoire a suffisamment d’accès pour que le propriétaire puisse l’entrer et en modifier le contenu, que le serveur Web (dans le groupe www-data) peut entrer et lire. Les fichiers eux-mêmes sont lisibles et inscriptibles pour vous (le propriétaire) et lisibles sur le serveur Web (dans le groupe www-data). Tous les autres utilisateurs n'ont aucun accès.

Encore une fois, prenez ceci comme exemple seulement. L’utilisateur/groupe exact de votre serveur Web dépend de votre configuration. Et votre application (moodle) peut nécessiter des autorisations différentes, vous devez consulter sa documentation.

2
mastov

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

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

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 {} \+

fait 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/
2
vipin mehta