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

34

J'essaie de ne pas donner l'autorisation 777 dans mon /var/www/htmldossier, mais je veux éditer 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éé en utilisant sudo ln -sT /home/andre/www/moodle/ moodle, et le ls -larésultat est le suivant:

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 elle est restée avec les autorisations de lecture, d'écriture et d'exécution pour tous. J'ai essayé la même chose avec le dossier moodle /home/andre/www/moodle, mais il est resté le même. La sortie de ls -lain /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 moodledans /home/andre/www/a les autorisations que je veux.

Comme un problème supplémentaire, lorsque j'accède, localhost/moodleje reçois une erreur 403 Forbidden.

Qu'est-ce que je fais mal ici?

André Carvalho
la source

Réponses:

63

Vous ne devriez jamais avoir à exécuter un site Web à partir de votre répertoire personnel . DÉJÀ. 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 et voir ce qui existe dans votre répertoire utilisateur), ainsi que dans tout autre sous-dossier. dedans là. Un serveur Web mal configuré ou mal configuré ou non corrigé peut provoquer de cette façon une fuite massive de données, ou une perte d'informations d'identification, susceptible 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 celle qui consiste à donner à Apache les autorisations de lecture./home/andre/www/moodle- le serveur Web doit pouvoir parcourir votre répertoire de base pour accéder à l'emplacement indiqué par le lien symbolique /var/www/html, ce 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 /var/www/htmlet 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 /var/www/htmlpour votre site.

Cette opération est en vigueur en quatre étapes après la copie de 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 manière à ce que tous les fichiers ou dossiers créés à partir de là dans l'ensemble de la structure de répertoires aient le groupe défini www-data.
  4. (Facultatif) Nettoyage final de la sécurité, où nous définissons 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 ni à la structure de répertoires du 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 {} +

Cela définit de manière récursive le "groupe" comme étant www-datapour 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 ( +xpour 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, vous devez le faire sudo chmod g+w /var/www/html/PATH(où PATHest le chemin du fichier ou du dossier dans la structure de répertoires où vous devez appliquer le écrire des autorisations pour le serveur Web).

AVIS : 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. ce qui suit: sudo chmod o-rwx /var/www/html/FILEPATH(en remplaçant FILEPATHpar le chemin relatif au /var/www/htmldossier 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 afin de pouvoir continuer à accéder aux fichiers et aux dossiers créés ou copiés dans. le www-datagroupe n'est pas correctement défini.


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

Remplacer USER dans la première commande avec 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’ +xélément sur 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éé est créé avec www-datal'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-datale même groupe, permettant ainsi l'accès au serveur Web.


(4) (Facultatif) Nettoyage final de la sécurité, si vous ne voulez 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: vous n'aurez pas à réexécuter cela plus tard, ni à modifier les autorisations pour la catégorie «autre» d'autorisations ici. Si les 'autres' utilisateurs ne peuvent pas accéder à /var/www/html/(ils n'ont pas le +xbit nécessaire /var/www/htmlpour parcourir la structure de fichiers et le répertoire, ni le +rbit pour lire les listes de fichiers), les autorisations sur les éléments situés sous ce répertoire pour d'autres utilisateurs ou les groupes n’auront pas vraiment 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 www-data, mais vous donne des droits de propriété 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 de disposer d’un répertoire et de tous les fichiers qu’il possède www-data:www-dataou qui root:www-datavous donne également accès. Il utilise des listes de contrôle d'accès , qui permettent à plusieurs utilisateurs d'obtenir des autorisations sans configurer de groupes individuels. Cela permet également au rootouwww-data utilisateurs du système aux utilisateurs 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 devrons procéder comme suit:

  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
  1. Récursivement vous donner lecture / écriture sur les fichiers, tout en donnant aux autres utilisateurs (à l'exclusion www-dataet rootbien sûr) pas d'accès aux fichiers.
sudo trouver / var / www / html -type f -exec setfacl -mu: 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-dataet root) et définissez-le comme ACL 'par défaut' pour les nouveaux fichiers dans les répertoires.
sudo trouver / var / www / html -type d -exec setfacl -d -mu: YOURUSERNAME: rwx -mo :: --- {} \;
  1. Nous devons également définir le setgidbit pour tous les répertoires afin que, si vous créez un fichier, le serveur Web puisse toujours y accéder www-datavia les 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 plus à vous en débarrasser, www-datace qui est très utile, car le serveur Web peut toujours créer des fichiers partout où il le souhaite (comme les interfaces basées sur PHP ayant leurs propres répertoires de cache et autres). besoin d’être créé et écrit pour un fonctionnement correct).

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. C’est simple sudo chown www-data:www-data filename, et les listes de contrôle d’accès devraient toujours vous permettre d’obtenir 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.

Thomas Ward
la source
2
@ AndréCarvalho +xvers des fichiers donnerait des permissions à un exécutable, et nous ne voulons pas que les fichiers PHP soient exécutés, nécessairement, via la ligne de commande PHP ou en tant qu'exécutable sur le serveur lui-même. Nous voulons qu'ils soient traités par l'analyseur PHP du serveur Web (et nous pas besoin des fichiers PHP à avoir +xpour que l’analyseur PHP puisse les lire et les traiter). Les répertoires sont nécessaires +xpour permettre la traversée des répertoires - c'est-à-dire que si un répertoire n'est pas +xet que je ne suis pas root, je ne peux pas entrer dans ce répertoire. C'est le problème que vous aviez avec Apache ne fonctionnant pas avec vos liens symboliques et votre maison. annuaire.
Thomas Ward
1
@ AndréCarvalho www-dataest un groupe système - ce n'est pas un groupe d'utilisateurs standard.
Thomas Ward
1
@JunaidQadirShekhanzai Impossible à fournir car les paramètres des utilisateurs diffèrent grandement de l'environnement dont ils ont besoin et de nombreux autres facteurs. Un tel "fichier shell" serait impossible à produire étant donné qu'il existe des composants facultatifs . Je pourrais essayer de créer un script Python capable de le faire, mais nous rencontrons toujours des problèmes tels que des restrictions système, des tâches facultatives, des chemins différents, etc.
Thomas Ward
1
@ T.Todua, ce n'est pas ce que j'ai dit. J'ai dit que vous ne devriez jamais exécuter un site en dehors de (lire: de l'intérieur) de votre répertoire "home" - c'est-à-dire que vous ne devriez rien exécuter /home/USER/...sur un serveur Web. Vous avez mal lu et mal compris le sens des mots que j'utilise. /var/www/*est un endroit relativement 'sûr' pour faire fonctionner des sites Web, car c'est un dossier / espace dédié. Cependant, ce /var/www/htmln’est PAS sûr, car cela est écrit par les serveurs Web lors de l’installation, etc., et conduit à une superposition de données importantes (utilisez /var/www/SUBDIRECTORYdonc plutôt des sous-répertoires de sites individuels)
Thomas Ward
1
J'ai ajusté le libellé pour plus de clarté.
Thomas Ward
2

L’idée 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". Créer un lien symbolique de /var/www/html/moodleà /home/andre/www/moodle/ne contourne pas les autorisations pour /home/andre/www/moodle/. Quiconque veut faire des choses à l'intérieur ne /var/www/html/moodlepeut le faire que s'il dispose des autorisations nécessaires /home/andre/www/moodle/.

Votre exécution de sudo chmod -R 775 moodle/réellement fait avoir un effet, mais différemment de ce que vous pensiez qu'il n'a pas changé l'autorisation du lien symbolique, mais de la cible symlink /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 (du 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.

mastov
la source
D'accord, mais cela n'est pas très utile s'ils ne savent pas comment définir les autorisations correctement, et ils rencontreront également d'autres problèmes.
Thomas Ward
@ThomasW .: Ensuite, la question de savoir comment définir correctement les autorisations devrait être une nouvelle question, y compris les informations nécessaires, telles que la configuration du serveur Web, la manière souhaitée de modifier les fichiers et les besoins de l'application.
mastov
ou écrit comme une réponse correcte - ce que je fais maintenant. Vous devriez également ne jamais exécuter quoi que ce soit hors de / home / USER / pour un site Web non plus, il a accès à de nombreuses autres données «utilisateur» si le serveur Web n'est pas correctement corrigé ou configuré.
Thomas Ward
@mastov J'ai compris. Vous résolvez beaucoup de questions que j'avais avec votre explication.
André Carvalho
2

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:

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

faire le même travail que 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/
Vipin Mehta
la source