Problème de permissions: comment Apache peut-il accéder aux fichiers de mon répertoire de base?

33

Je sais que les autorisations de fichiers ont déjà été abordées ici, mais je ne parviens pas à comprendre le concept de mon scénario.

  • J'ai créé les fichiers sur une ancienne installation d'ubuntu.
  • J'ai copié les fichiers dans ma nouvelle installation d'ubuntu et les ai placés dans ma racine Web.
  • Lorsque j'essaie d'exécuter les fichiers (fichiers PHP), j'obtiens une erreur relative aux autorisations.

pour tenter de résoudre ce problème, j’ai supposé qu’ils devaient toujours appartenir à l’ancien propriétaire; j’ai donc exécuté chown -Rle répertoire, avec mon nom d’utilisateur comme argument, afin de prendre possession de tous les fichiers du répertoire. Il convient de noter que les noms d'utilisateur entre les nouvelles et les anciennes installations d'ubuntu étaient les mêmes.

Lorsque je tente d'exécuter à nouveau les fichiers, le même problème: erreur 500 due à des problèmes d'autorisations. Quelqu'un peut-il me dire quelles autres mesures je devrais prendre?

La racine Web de mon installation d’apache se trouve dans mon dossier personnel. Si je crée de nouveaux fichiers dans ma racine Web, ils fonctionnent également comme prévu. Ce ne sont que les anciens fichiers à l'origine du problème.

Richzilla
la source
Je ne suis pas sûr que les autorisations de fichiers soient copiées lorsque le fichier existe. Quelqu'un peut-il confirmer cela? Sinon, serait-il possible de transmettre les fichiers à un autre utilisateur (ou à un utilisateur root), puis de les récupérer?
Tagger
Ok, j'ai résolu mon problème de fichiers ne s'exécutant pas, mais je l'ai fait en exécutant simplement chmod -R 777 dirsur le répertoire en question. Je ne peux pas m'empêcher de penser qu'il existe une meilleure façon de le faire
richzilla
3
Les autorisations d'un fichier permettent à tout le monde d'écrire vos fichiers, ce qui pourrait endommager vos pages ou le piratage. Vous devriez essayer avec 755 qui est normalement utilisé pour les fichiers php. Assurez-vous que vous n'avez pas besoin d'activer "autoriser l'exécution" pour un fichier, auquel cas vous pouvez exécuter chmod [nom du fichier] -x. Des informations sur la commande chmod sont accessibles en cliquant sur le lien suivant: catcode.com/teachmod/chmod_cmd.html
Geppettvs D'Constanzo
Que montre le journal des erreurs Apache?
Kees Cook

Réponses:

14

Dans les répertoires situés au-dessus de votre racine Web, le bit d'exécution doit être défini pour permettre à Apache de descendre dans ces répertoires.

Si vous avez votre Webroot situé à /home/user/htdocs, la /, /home, /home/useret /home/user/htdocsdoit avoir le bit d' exécution.


La solution ci-dessus "fonctionne", mais ce n'est pas idéal. Si vous avez créé un dossier, Apache ne peut pas y écrire. L'inverse se produit aussi.

Cela peut être "corrigé" en définissant umask 0007 et en vous ajoutant au groupe Apache (www-data si je ne me trompe pas), afin que les fichiers et les dossiers nouvellement créés puissent être écrits par le groupe.

Vous pouvez également installer un autre MPM Apache: Apache2 MPM ITK ( informations sur la configuration ) et ajuster la configuration pour qu'Apache s'exécute sous votre utilisateur.

Lekensteyn
la source
Pour des instructions explicites sur la façon de procéder, voir la réponse de Marco ci
plaques de cuisson
2
@hobs Encore mieux, askubuntu.com/a/46371/6969
Lekensteyn
44

Si vos documents de serveur sont dans le /home/$USER/public_htmlrépertoire, vous devez exécuter

sudo chown -R www-data:www-data /home/$USER/public_html

attribuer la propriété du dossier DocumentRoot à l'utilisateur www-dataet au groupe www-data.

Ensuite, vous pouvez vous ajouter au groupe www-data

sudo adduser $USER www-data

Enfin, vous devez rendre le dossier DocumentRoot accessible en écriture par le propriétaire (utilisateur de www-data) et par vous-même (en tant que membre du www-datagroupe):

sudo chmod -R 775 /home/$USER/public_html

Pour plus de commodité, vous pouvez créer un script portant le nom suivant public_html_fix.sh:

#!/bin/bash

sudo adduser $USER www-data
sudo chown -R www-data:www-data /home/$USER/public_html
sudo chmod -R 775 /home/$USER/public_html

Enregistrez-le à l'intérieur /home/$USER/binet rendez-le exécutable en utilisant:

sudo chmod +x /home/$USER/bin/public_html_fix.sh

Ensuite, vous l’appelez chaque fois que vous en avez besoin, peu importe où vous vous trouvez dans le système de fichiers:

public_html_fix.sh
Marko
la source
1
a travaillé pour moi ....
Emmanuel Okeke
Très bonne réponse! - Avec Exemples et même un script pratique et comment utiliser / installer Excellent!
André
2
Si cela est fait sur un hôte partagé, comment empêchez-vous les autres utilisateurs du www-datagroupe de lire vos fichiers ou d'écrire sur eux?
jozxyqk
Vraiment génial réponse ... tu m'as sauvé la vie
NullPoiиteя
1
chmod -R 775 /home/$USER/public_htmlvraiment terrible. find /home/$USER/public_html -type d -exec chmod 775 {} \;et find /home/$USER/public_html -type f -exec chmod 664 {} \;est beaucoup mieux
iharob
1

À part les fichiers chmodés et l'édition de fichiers .achef apache, je tiens à dire que rien ne fonctionnait pour moi car mes fichiers se trouvaient sur une partition que j'avais montée automatiquement via Nautilus. Cela limite la partition pour votre utilisateur uniquement.

Pour vérifier si vos fichiers sont visibles par l' www-rootutilisateur ou quel que soit l'utilisateur qui exécute Apache (exécuter ps -aux | grep apache2pour vérifier), exécutez la commande suivante:

sudo su -l www-data -s /bin/bash

et essayez de lire un fichier à partir de la racine de votre document.

Si le fichier n'est pas lisible, vérifiez que:

1) vous avez défini toutes les autres autorisations de fichier

2) vous avez utilisé FollowSymlinksdans votre.conf fichiers si nécessaire

3) vous avez configuré DocumentRoot

3) montez votre partition pour tous les utilisateurs. Je devais éditer /etc/fstabet spécifier ma partition via son UUID:

UUID=afdee1d3-5bb8-4652-892f-e83a9b5ff72e /mnt/4tb      ext4    rw,nosuid,nodev,errors=remount-ro

Puis démontez votre partition via Nautilus et effectuez une sudo mount -a. Si tout se passe bien, vos fichiers sont maintenant sous /mnt. Mettez à jour vos liens symboliques et vous êtes prêt à partir.

alexg
la source
1

La meilleure façon que j'ai trouvée de toujours configurer cela est la façon dont VirtualMin le fait.

créer un utilisateur et un groupe "myhome"

Faites de l’utilisateur apache un membre du groupe "myhome". Pas l'inverse comme certaines des explications décrites ici

Alors maintenant, apache a lu et exécuté l'accès à / home / myhome en plus de / home / myhome / www

"myhome" utilisateur a un accès en écriture

utilisateur458431
la source
J'aime ce concept, mais il ne semble pas fonctionner pour moi. L'utilisateur www-dataappartient au groupe myhome. Tous les fichiers et répertoires ont des autorisations d'écriture de groupe et appartiennent à myhome:myhome. J'ai redémarré Apache. Apache ne peut toujours pas écrire de nouveaux fichiers et dossiers. (Script PHP utilisant www-data: utilisateur / groupe www-data)
squarecandy