J'utilise Apache Web Server dont le propriétaire est défini sur _www:_www
. Je ne sais jamais quelle est la meilleure pratique avec les autorisations de fichiers, par exemple lorsque je crée un nouveau projet Laravel 5.
Laravel 5 nécessite que le /storage
dossier soit accessible en écriture. J'ai trouvé beaucoup d'approches différentes pour le faire fonctionner et je finis généralement par le faire 777
récursivement. Je sais que ce n'est pas la meilleure idée.
Le doc officiel dit:
Laravel peut nécessiter certaines autorisations pour être configuré: les dossiers à l'intérieur
storage
etvendor
nécessitent un accès en écriture par le serveur Web.
Cela signifie-t-il que le serveur Web doit également accéder aux dossiers storage
et vendor
eux-mêmes ou uniquement à leur contenu actuel?
Je suppose que ce qui est beaucoup mieux, c'est de changer le propriétaire au lieu des autorisations. J'ai changé toutes les autorisations de fichiers de Laravel de manière récursive en _www:_www
et cela a fait fonctionner le site correctement, comme si j'avais changé chmod en 777
. Le problème est que mon éditeur de texte me demande maintenant un mot de passe chaque fois que je veux enregistrer un fichier et la même chose se produit si j'essaie de changer quoi que ce soit dans le Finder, comme par exemple copier un fichier.
Quelle est la bonne approche pour résoudre ces problèmes?
- Changement
chmod
- Modifiez le propriétaire des fichiers pour qu'ils correspondent à ceux du serveur Web et définissez peut-être l'éditeur de texte (et le Finder?) Pour ignorer la demande de mot de passe ou les faire utiliser
sudo
- Changer le propriétaire du serveur Web pour correspondre à l'utilisateur du système d'exploitation (je ne connais pas les conséquences)
- Autre chose
777
c'est trop de liberté, car cela inclut toutes les autorisations pour tout le monde.storage
et lesbootstrap/cache
répertoires doivent être accessibles en écriture par votre serveur WebRéponses:
Juste pour indiquer l'évidence pour quiconque consulte cette discussion .... si vous accordez à l'un de vos dossiers les autorisations 777, vous autorisez TOUT LE MONDE à lire, écrire et exécuter n'importe quel fichier de ce répertoire .... ce que cela signifie, c'est que vous avez donné N'IMPORTE QUI (n'importe quel pirate informatique ou personne malveillante dans le monde entier) permission de télécharger N'IMPORTE QUEL fichier, virus ou tout autre fichier, puis exécutez ce fichier ...
Il existe essentiellement deux façons de configurer votre propriété et vos autorisations. Soit vous vous en donnez la propriété, soit vous rendez le serveur Web propriétaire de tous les fichiers.
Serveur Web en tant que propriétaire (comme le font la plupart des gens et à la manière du Laravel doc):
en supposant que www-data (cela pourrait être autre chose) est votre utilisateur de serveur Web.
si vous faites cela, le serveur Web possède tous les fichiers, et est également le groupe, et vous aurez des problèmes pour télécharger des fichiers ou travailler avec des fichiers via FTP, car votre client FTP sera connecté en tant que vous, pas votre serveur Web, alors ajoutez votre utilisateur au groupe d'utilisateurs du serveur Web:
Bien sûr, cela suppose que votre serveur Web s'exécute en tant que www-data (la valeur par défaut de Homestead) et que votre utilisateur est ubuntu (c'est vagabond si vous utilisez Homestead).
Ensuite, vous définissez tous vos répertoires sur 755 et vos fichiers sur 644 ...
SET autorisations de répertoire
Votre utilisateur en tant que propriétaire
Je préfère posséder tous les répertoires et fichiers (cela rend le travail avec tout beaucoup plus facile), donc je fais:
Ensuite, je me donne moi-même et les autorisations de serveur Web:
Donnez ensuite au serveur Web les droits de lecture et d'écriture sur le stockage et le cache
Quelle que soit la façon dont vous le configurez, vous devez alors donner des autorisations de lecture et d'écriture au serveur Web pour le stockage, le cache et tous les autres répertoires que le serveur Web doit télécharger ou écrire également (selon votre situation), alors exécutez les commandes de bashy ci-dessus:
Maintenant, vous êtes sécurisé et votre site Web fonctionne ET vous pouvez travailler avec les fichiers assez facilement
la source
anyone
concept. Leanyone
drapeau de Linux signifie n'importe quel utilisateur , pas n'importe qui. Vous avez toujours besoin d'un accès au serveur.write
autorisé le groupe?Les autorisations pour les dossiers
storage
etvendor
doivent rester775
, pour des raisons de sécurité évidentes.Cependant, à la fois votre ordinateur et votre serveur Apache doivent pouvoir écrire dans ces dossiers. Ex: lorsque vous exécutez des commandes comme
php artisan
, votre ordinateur doit écrire dans le fichier journalstorage
.Il vous suffit de donner la propriété des dossiers à Apache:
Ensuite, vous devez ajouter votre ordinateur (référencé par c'est
username
) au groupe auquel appartient le serveur Apache. Ainsi :NOTE: Le plus souvent,
groupName
est ,www-data
mais dans votre cas, le remplacer par_www
la source
chown
commandes devraient inclure le drapeau -R. De plus, dans laravel 5.1 et 5.2, au lieu du répertoire du vendeur, vous devez donner accès au répertoire bootstrap / cache.Nous avons rencontré de nombreux cas marginaux lors de la configuration des autorisations pour les applications Laravel. Nous créons un compte utilisateur distinct (
deploy
) pour posséder le dossier d'application Laravel et exécuter les commandes Laravel à partir de la CLI, et exécutons le serveur Web souswww-data
. Un problème que cela provoque est que le ou les fichiers journaux peuvent appartenir à,www-data
oudeploy
, selon la première personne qui y a écrit, ce qui empêche évidemment l'autre utilisateur d'y écrire à l'avenir.J'ai trouvé que la seule solution saine et sûre est d'utiliser les ACL Linux. Le but de cette solution est:
deploy
).www-data
utilisateur d'accéder en lecture au code d'application Laravel, mais pas en écriture.www-data
utilisateur et l'utilisateur de l' application (deploy
accès en écriture dans le dossier de stockage), quel que soit l' utilisateur qui possède le fichier (donc à la foisdeploy
etwww-data
peut écrire dans le même fichier journal par exemple).Nous accomplissons cela comme suit:
application/
dossier sont créés avec le umask par défaut de0022
, ce qui entraîne des dossiers avec desdrwxr-xr-x
autorisations et des fichiers-rw-r--r--
.sudo chown -R deploy:deploy application/
(ou simplement déployer votre application en tantdeploy
qu'utilisateur, c'est ce que nous faisons).chgrp www-data application/
pour donner auwww-data
groupe l'accès à l'application.chmod 750 application/
pour autoriser l'deploy
utilisateur en lecture / écriture, l'www-data
utilisateur en lecture seule et pour supprimer toutes les autorisations à tout autre utilisateur.setfacl -Rdm u:www-data:rwx,u:deploy:rwx application/storage/
pour définir les autorisations par défaut sur lestorage/
dossier et tous les sous-dossiers. Tout nouveau dossier / fichier créé dans le dossier de stockage héritera de ces autorisations (rwx
pourwww-data
et pourdeploy
).setfacl -Rm u:www-data:rwX,u:deploy:rwX application/storage/
pour définir les autorisations ci-dessus sur tous les fichiers / dossiers existants.la source
Modifiez les autorisations de votre dossier de projet pour activer la lecture / écriture / exécution pour tout utilisateur du groupe propriétaire du répertoire (ce qui dans votre cas est
_www
):Ajoutez ensuite votre nom d'utilisateur OS X au
_www
groupe pour lui permettre d'accéder au répertoire:la source
dseditgroup
fourni par vous, je reçois une erreur:Username and password must be provided.
.sudo
au début._www:_www
oumyuser:_www
aussi?_www:_www
, car 775 signifie que tout utilisateur du groupe_www
aura les autorisations complètes pour lire / écrire / exect dans ce dossier, et vous venez d'ajouter votre nom d'utilisateur à ce groupe.chown myuser:_www
? Je sais que le premier est l'utilisateur et le second est le groupe, mais cela signifie-t-il «cet utilisateur ET TOUTE PERSONNE DE CE GROUPE» ou «cet utilisateur MAIS SEULEMENT SI IL APPARTIENT À ce groupe»?Tel que déjà publié
mais j'ai ajouté -R pour la commande chown :
sudo chown -R www-data:www-data /path/to/your/project/vendor sudo chown -R www-data:www-data /path/to/your/project/storage
la source
La plupart des dossiers doivent être "755" normaux et les fichiers "644"
Laravel nécessite que certains dossiers soient accessibles en écriture pour l'utilisateur du serveur Web. Vous pouvez utiliser cette commande sur les systèmes d'exploitation basés sur Unix.
la source
Après
composer install
la source
Les documents de Laravel 5.4 disent:
Il y a beaucoup de réponses sur cette page qui mentionnent l'utilisation d'
777
autorisations. Ne fais pas ça. Tu t'exposerais exposeriez à des pirates.Au lieu de cela, suivez les suggestions des autres sur la façon de définir des autorisations de 755 (ou plus restrictives). Vous devrez peut-être déterminer quel utilisateur votre application exécute en exécutant
whoami
dans le terminal, puis changer la propriété de certains répertoires à l'aidechown -R
.Si vous n'êtes pas autorisé à utiliser
sudo
comme tant d'autres réponses l'exigent ...Votre serveur est probablement un hôte partagé tel que Cloudways.
(Dans mon cas, j'avais cloné mon application Laravel dans un deuxième serveur Cloudways, et cela ne fonctionnait pas complètement parce que les autorisations du
storage
etbootstrap/cache
répertoires ont été gâchées.)J'avais besoin d'utiliser:
Cloudways Platform > Server > Application Settings > Reset Permission
Ensuite, je pouvais courir
php artisan cache:clear
dans le terminal.la source
La solution publiée par bgles est parfaite pour moi en termes de définition correcte des autorisations au départ (j'utilise la deuxième méthode), mais elle a toujours des problèmes potentiels pour Laravel.
Par défaut, Apache créera des fichiers avec 644 autorisations. C'est donc à peu près tout dans le stockage /. Donc, si vous supprimez le contenu de stockage / framework / vues, puis accédez à une page via Apache, vous constaterez que la vue en cache a été créée comme:
Si vous exécutez "artisan serve" et accédez à une autre page, vous obtiendrez différentes autorisations car CLI PHP se comporte différemment d'Apache:
En soi, ce n'est pas grave car vous ne ferez rien de tout cela en production. Mais si Apache crée un fichier qui doit ensuite être écrit par l'utilisateur, il échouera. Et cela peut s'appliquer aux fichiers de cache, aux vues mises en cache et aux journaux lors du déploiement à l'aide d'un utilisateur connecté et d'un artisan. Un exemple facile étant "artisan cache: clear" qui ne supprimera pas les fichiers de cache qui sont www-data: www-data 644.
Cela peut être partiellement atténué en exécutant des commandes artisanales en tant que www-data, donc vous ferez / scripterez tout comme:
Ou vous éviterez la fastidieuse de ceci et l'ajouterez à vos .bash_aliases:
C'est assez bon et n'affecte en rien la sécurité. Mais sur les machines de développement, l'exécution de scripts de test et d'assainissement rend cela difficile, à moins que vous ne vouliez configurer des alias pour utiliser 'sudo -u www-data' pour exécuter phpunit et tout ce que vous vérifiez avec vos builds qui pourrait entraîner la création de fichiers.
La solution consiste à suivre la deuxième partie des conseils bgles, à ajouter ce qui suit à / etc / apache2 / envvars et à redémarrer (pas recharger) Apache:
Cela forcera Apache à créer des fichiers comme 664 par défaut. En soi, cela peut présenter un risque pour la sécurité. Cependant, sur les environnements Laravel principalement discutés ici (Homestead, Vagrant, Ubuntu), le serveur Web fonctionne en tant qu'utilisateur www-data sous le groupe www-data. Donc, si vous n'autorisez pas arbitrairement les utilisateurs à rejoindre le groupe www-data, il ne devrait pas y avoir de risque supplémentaire. Si quelqu'un réussit à sortir du serveur Web, il a de toute façon un niveau d'accès aux données www, donc rien n'est perdu (bien que ce ne soit pas la meilleure attitude à avoir en matière de sécurité). Donc, en production, c'est relativement sûr et sur une machine de développement mono-utilisateur, ce n'est tout simplement pas un problème.
En fin de compte, comme votre utilisateur est dans le groupe www-data, et tous les répertoires contenant ces fichiers sont g + s (le fichier est toujours créé sous le groupe du répertoire parent), tout ce qui est créé par l'utilisateur ou par www-data sera r / w pour l'autre.
Et c'est le but ici.
Éditer
En étudiant plus en détail l'approche ci-dessus pour définir des autorisations, cela semble toujours assez bon, mais quelques ajustements peuvent aider:
Par défaut, les répertoires sont 775 et les fichiers sont 664 et tous les fichiers ont le propriétaire et le groupe de l'utilisateur qui vient d'installer le framework. Supposons donc que nous partons de ce point.
La première chose que nous faisons est de bloquer l'accès à tout le monde et de faire du groupe des www-data. Seuls le propriétaire et les membres de www-data peuvent accéder à l'annuaire.
Pour permettre au serveur Web de créer services.json et compiled.php, comme suggéré par le guide d'installation officiel de Laravel. La définition du bit collant de groupe signifie que ceux-ci appartiendront au créateur avec un groupe de www-data.
Nous faisons la même chose avec le dossier de stockage pour permettre la création de fichiers cache, log, session et view. Nous utilisons find pour définir explicitement les autorisations de répertoire différemment pour les répertoires et les fichiers. Nous n'avions pas besoin de le faire dans bootstrap / cache car il n'y a (normalement) aucun sous-répertoire dedans.
Vous devrez peut-être réappliquer tous les indicateurs exécutables, supprimer le fournisseur / * et réinstaller les dépendances de compositeur pour recréer des liens pour phpunit et al, par exemple:
C'est tout. À l'exception du umask pour Apache expliqué ci-dessus, c'est tout ce qui est nécessaire sans rendre la totalité de la racine du projet accessible en écriture par www-data, ce qui se produit avec d'autres solutions. Il est donc légèrement plus sûr de cette façon, car un intrus fonctionnant en tant que www-data a un accès en écriture plus limité.
terminer l'édition
Changements pour Systemd
Cela s'applique à l'utilisation de php-fpm, mais peut-être à d'autres aussi.
Le service systemd standard doit être remplacé, le umask défini dans le fichier override.conf et le service redémarré:
la source
Cela a fonctionné pour moi:
Ce qu'il fait:
Remarque: Peut-être que vous ne pouvez pas ou n'avez pas besoin de le faire avec le préfixe sudo. cela dépend des permissions de votre utilisateur, du groupe, etc ...
la source
J'ai décidé d'écrire mon propre script pour alléger la douleur de la mise en place de projets.
Exécutez ce qui suit dans la racine de votre projet:
Attendez que le démarrage soit terminé et vous êtes prêt à partir.
Passez en revue le script avant utilisation.
la source
J'ai installé laravel sur l'instance EC2 et j'ai passé 3 jours pour corriger l'erreur d'autorisation et enfin la corriger. Je veux donc partager cette expérience avec quelqu'un d'autre.
problème d'utilisateur Lorsque je me suis connecté à l'instance ec2, mon nom d'utilisateur est ec2-user et usergroup est ec2-user. Et le site Web fonctionne sous l'utilisateur httpd: apache: apache, nous devons donc définir l'autorisation pour apache.
autorisation de dossier et de fichier A. structure de dossier d'abord, vous devez vous assurer que vous avez une telle structure de dossier comme celle-ci sous le stockage
espace de rangement
B. autorisation Dans un premier temps, je vois les instructions pour définir 777 sous stockage pour supprimer file_put_contents: échec d'ouverture du flux d'erreur. J'ai donc configuré l'autorisation 777 pour stocker le stockage chmod -R 777 Mais l'erreur n'a pas été corrigée. ici, vous devriez en considérer un: qui écrit les fichiers dans le stockage / les sessions et les vues. Ce n'est pas ec2-user, mais apache. Oui bien. L'utilisateur "apache" écrit le fichier (fichier de session, fichier de vue compilée) dans le dossier de session et de vue. Vous devez donc donner à apache l'autorisation d'écrire sur ces dossiers. Par défaut: SELinux dit que le dossier / var / www doit être en lecture seule par le démon apache.
Donc, pour cela, nous pouvons définir le selinux sur 0: setenforce 0
Cela peut résoudre le problème temporellement, mais cela fait que mysql ne fonctionne pas. donc ce n'est pas une si bonne solution.
Vous pouvez définir un contexte de lecture-écriture dans le dossier de stockage avec: (n'oubliez pas de mettre en vigueur 1 pour le tester)
Ensuite, votre problème sera résolu.
et n'oubliez pas cette mise à jour du cache php artisan du compositeur: effacer
Ces commandes seront utiles après ou avant.
J'espère que vous économisez votre temps. Bonne chance. Hacken
la source
J'avais la configuration suivante:
nginx
)Et appliqué les autorisations correctement comme @bgies l'a suggéré dans la réponse acceptée. Le problème dans mon cas était l'utilisateur et le groupe configurés en cours d'exécution de php-fpm qui était à l'origine
apache
.Si vous utilisez NGINX avec php-fpm, vous devez ouvrir le fichier de configuration de php-fpm:
Et remplacer
user
etgroup
la valeur des options par un NGINX est configuré pour fonctionner avec; dans mon cas, les deux étaientnginx
:... ; Unix user/group of processes ; Note: The user is mandatory. If the group is not set, the default user's group ; will be used. ; RPM: apache Choosed to be able to access some dir as httpd user = nginx ; RPM: Keep a group allowed to write in log dir. group = nginx ...
Enregistrez-le et redémarrez les services nginx et php-fpm.
la source
Pour les développeurs Laravel, les problèmes de répertoire peuvent être un peu pénibles. Dans mon application, je créais des répertoires à la volée et déplaçais des fichiers vers ce répertoire dans mon environnement local avec succès. Ensuite, sur le serveur, je recevais des erreurs lors du déplacement des fichiers vers le répertoire nouvellement créé.
Voici les choses que j'ai faites et qui ont obtenu un résultat réussi à la fin.
sudo find /path/to/your/laravel/root/directory -type f -exec chmod 664 {} \;
sudo find /path/to/your/laravel/root/directory -type d -exec chmod 775 {} \;
chcon -Rt httpd_sys_content_rw_t /path/to/my/file/upload/directory/in/laravel/project/
mkdir($save_path, 0755, true);
Après avoir effectué ces modifications sur le serveur de production, j'ai réussi à créer de nouveaux répertoires et à y déplacer des fichiers.
Enfin, si vous utilisez File façade dans Laravel, vous pouvez faire quelque chose comme ceci:
File::makeDirectory($save_path, 0755, true);
la source
J'ai trouvé une solution encore meilleure à cela. Cela est dû au fait que php fonctionne en tant qu'autre utilisateur par défaut.
donc pour résoudre ce problème
sudo nano /etc/php/7.0/fpm/pool.d/www.conf
puis modifiez le
user = "put user that owns the directories" group = "put user that owns the directories"
puis:
sudo systemctl reload php7.0-fpm
la source