Ich verwende Apache Web Server, für den der Eigentümer festgelegt ist _www:_www
. Ich weiß nie, was die beste Vorgehensweise bei Dateiberechtigungen ist, beispielsweise wenn ich ein neues Laravel 5-Projekt erstelle.
Für Laravel 5 muss der /storage
Ordner beschreibbar sein. Ich habe viele verschiedene Ansätze gefunden, damit es funktioniert, und ich 777
beende es normalerweise damit, es rekursiv chmod zu machen. Ich weiß, dass es nicht die beste Idee ist.
Der offizielle Arzt sagt:
Für Laravel müssen möglicherweise einige Berechtigungen konfiguriert werden: Ordner innerhalb
storage
undvendor
erfordern Schreibzugriff durch den Webserver.
Bedeutet dies, dass der Webserver auch Zugriff auf die Ordner storage
und vendor
oder nur auf deren aktuellen Inhalt benötigt?
Ich gehe davon aus, dass es viel besser ist, den Besitzer anstelle von Berechtigungen zu wechseln . Ich habe alle Dateiberechtigungen von Laravel rekursiv in geändert, _www:_www
und dadurch funktionierte die Site ordnungsgemäß, als hätte ich chmod in geändert 777
. Das Problem ist, dass mein Texteditor mich jetzt jedes Mal nach einem Passwort fragt, wenn ich eine Datei speichern möchte, und dasselbe passiert, wenn ich versuche, etwas im Finder zu ändern, wie zum Beispiel eine Datei zu kopieren.
Was ist der richtige Ansatz, um diese Probleme zu lösen?
- Veränderung
chmod
- Ändern Sie den Eigentümer der Dateien so, dass er mit dem des Webservers übereinstimmt, und stellen Sie möglicherweise den Texteditor (und den Finder?) So ein, dass die Frage nach dem Kennwort übersprungen oder verwendet wird
sudo
- Ändern Sie den Besitzer des Webservers so, dass er dem Betriebssystembenutzer entspricht (ich kenne die Konsequenzen nicht).
- Etwas anderes
777
ist zu viel Freiheit, weil es alle Berechtigungen für alle beinhaltet.storage
und diebootstrap/cache
Verzeichnisse sollten von Ihrem Webserver beschreibbar seinAntworten:
Nur um das Offensichtliche für jeden zu sagen, der diese Diskussion sieht ... Wenn Sie einem Ihrer Ordner 777 Berechtigungen erteilen, erlauben Sie JEDEM, eine Datei in diesem Verzeichnis zu lesen, zu schreiben und auszuführen ... was dies bedeutet, haben Sie angegeben JEDER (jeder Hacker oder jede böswillige Person auf der ganzen Welt) hat die Erlaubnis, JEDE Datei, jeden Virus oder jede andere Datei hochzuladen und diese Datei dann auszuführen ...
Grundsätzlich gibt es zwei Möglichkeiten, um Ihren Besitz und Ihre Berechtigungen einzurichten. Entweder geben Sie sich selbst das Eigentum oder Sie machen den Webserver zum Eigentümer aller Dateien.
Webserver als Eigentümer (wie es die meisten Leute tun und wie es das Laravel-Dokument tut):
Angenommen, www-data (es könnte etwas anderes sein) ist Ihr Webserver-Benutzer.
Wenn Sie dies tun, besitzt der Webserver alle Dateien und ist auch die Gruppe. Sie haben einige Probleme beim Hochladen von Dateien oder beim Arbeiten mit Dateien über FTP, da Ihr FTP-Client als Sie angemeldet ist und nicht als Ihr Webserver Ihr Benutzer zur Webserver-Benutzergruppe:
Dies setzt natürlich voraus, dass Ihr Webserver als WWW-Daten ausgeführt wird (die Standardeinstellung für Homestead) und Ihr Benutzer Ubuntu ist (es ist vagabundierend, wenn Sie Homestead verwenden).
Dann setzen Sie alle Ihre Verzeichnisse auf 755 und Ihre Dateien auf 644 ... SET-Dateiberechtigungen
SET-Verzeichnisberechtigungen
Ihr Benutzer als Eigentümer
Ich bevorzuge es, alle Verzeichnisse und Dateien zu besitzen (es erleichtert die Arbeit mit allem viel), also mache ich:
Dann gebe ich mir und dem Webserver die Berechtigung:
Geben Sie dem Webserver dann die Rechte zum Lesen und Schreiben in Speicher und Cache
Unabhängig davon, wie Sie es einrichten, müssen Sie dem Webserver Lese- und Schreibberechtigungen für Speicher, Cache und andere Verzeichnisse erteilen, die der Webserver hochladen oder auch schreiben muss (abhängig von Ihrer Situation). Führen Sie daher die folgenden Befehle aus bashy aus:
Jetzt sind Sie sicher und Ihre Website funktioniert UND Sie können ziemlich einfach mit den Dateien arbeiten
quelle
anyone
Konzept zu sehr falsch . Das Linux-anyone
Flag bedeutet jeden Benutzer , keine Person. Sie benötigen noch Serverzugriff.write
der Gruppe keine Berechtigung erteilt haben?Die Berechtigungen für die Ordner
storage
undvendor
sollten775
aus offensichtlichen Sicherheitsgründen beibehalten werden.Sowohl Ihr Computer als auch Ihr Server Apache müssen jedoch in der Lage sein, in diese Ordner zu schreiben. Beispiel: Wenn Sie Befehle wie ausführen
php artisan
, muss Ihr Computer in die Protokolldatei schreibenstorage
.Alles, was Sie tun müssen, ist, Apache das Eigentum an den Ordnern zu übertragen:
Dann müssen Sie Ihren Computer (auf den er verweist
username
) zu der Gruppe hinzufügen, zu der der Server Apache gehört. Wie so:HINWEIS: Am häufigsten wird
groupName
eswww-data
jedoch in Ihrem Fall durch ersetzt_www
quelle
chown
Befehle sollten das -R-Flag enthalten. Außerdem sollten Sie in Laravel 5.1 und 5.2 anstelle des Herstellerverzeichnisses Zugriff auf das Bootstrap / Cache-Verzeichnis gewähren.Beim Einrichten von Berechtigungen für Laravel-Anwendungen sind viele Randfälle aufgetreten. Wir erstellen ein separates Benutzerkonto (
deploy
) für den Besitz des Laravel-Anwendungsordners und die Ausführung von Laravel-Befehlen über die CLI und führen den Webserver unter auswww-data
. Ein Problem, das dies verursacht, besteht darin, dass die Protokolldatei (en) möglicherweise Eigentum der Protokolldatei sindwww-data
oderdeploy
, je nachdem, wer zuerst in die Protokolldatei geschrieben hat, den anderen Benutzer in Zukunft offensichtlich daran hindern, darauf zu schreiben.Ich habe festgestellt, dass die einzig vernünftige und sichere Lösung die Verwendung von Linux-ACLs ist. Das Ziel dieser Lösung ist:
deploy
).www-data
Benutzer Lesezugriff auf Laravel-Anwendungscode, jedoch keinen Schreibzugriff erhalten.www-data
Benutzer als auch die Anwendung user (deploy
) Schreibzugriff auf den Speicherordner erhalten, unabhängig davon, welchem Benutzer die Datei gehört (also beidedeploy
undwww-data
können beispielsweise in dieselbe Protokolldatei schreiben).Dies erreichen wir wie folgt:
application/
Ordners werden mit der Standard-Umask von erstellt0022
, was dazu führt, dass Ordnerdrwxr-xr-x
Berechtigungen und Dateien haben-rw-r--r--
.sudo chown -R deploy:deploy application/
(oder stellen Sie einfach Ihre Anwendung alsdeploy
Benutzer bereit, was wir auch tun).chgrp www-data application/
um derwww-data
Gruppe Zugriff auf die Anwendung zu gewähren .chmod 750 application/
um demdeploy
Benutzer das Lesen / Schreiben zu ermöglichen, denwww-data
Benutzer schreibgeschützt zu machen und alle Berechtigungen für andere Benutzer zu entfernen.setfacl -Rdm u:www-data:rwx,u:deploy:rwx application/storage/
um die Standardberechtigungen für denstorage/
Ordner und alle Unterordner festzulegen. Alle neuen Ordner / Dateien, die im Speicherordner erstellt wurden, erben diese Berechtigungen (rwx
für beidewww-data
unddeploy
).setfacl -Rm u:www-data:rwX,u:deploy:rwX application/storage/
um die oben genannten Berechtigungen für vorhandene Dateien / Ordner festzulegen.quelle
Ändern Sie die Berechtigungen für Ihren Projektordner, um Lesen / Schreiben / Ausführen für jeden Benutzer in der Gruppe zu aktivieren, der das Verzeichnis besitzt (in Ihrem Fall
_www
):Fügen Sie dann Ihren OS X-Benutzernamen zur
_www
Gruppe hinzu, um den Zugriff auf das Verzeichnis zu ermöglichen:quelle
dseditgroup
von Ihnen zur Verfügung gestellt werde, erhalte ich eine Fehlermeldung :Username and password must be provided.
.sudo
am Anfang hinzu._www:_www
odermyuser:_www
auch?_www:_www
, da 775 bedeutet, dass jeder Benutzer in der Gruppe_www
über die vollständigen Berechtigungen zum Lesen / Schreiben / Ausführen in diesem Ordner verfügt und Sie gerade Ihren Benutzernamen zu dieser Gruppe hinzugefügt haben.chown myuser:_www
? Ich weiß, der erste ist der Benutzer und der zweite ist die Gruppe, aber bedeutet das "dieser Benutzer UND JEMAND AUS dieser Gruppe" oder "dieser Benutzer, ABER NUR, WENN ER ZU dieser Gruppe gehört"?Wie schon gepostet
aber ich habe -R für den Befehl chown hinzugefügt :
sudo chown -R www-data:www-data /path/to/your/project/vendor sudo chown -R www-data:www-data /path/to/your/project/storage
quelle
Die meisten Ordner sollten normal "755" und Dateien "644" sein.
Für Laravel müssen einige Ordner für den Webserverbenutzer beschreibbar sein. Sie können diesen Befehl auf Unix-basierten Betriebssystemen verwenden.
quelle
In den Laravel 5.4-Dokumenten heißt es:
Auf dieser Seite gibt es viele Antworten, in denen die Verwendung von
777
Berechtigungen erwähnt wird. Tu das nicht. Sie würden sich Hackern aussetzen .Befolgen Sie stattdessen die Vorschläge anderer zum Festlegen von Berechtigungen von 755 (oder restriktiver). Möglicherweise müssen Sie herausfinden, auf welchem Benutzer Ihre App ausgeführt wird, indem Sie sie
whoami
im Terminal ausführen und dann den Besitz bestimmter Verzeichnisse mithilfe von ändernchown -R
.Wenn Sie nicht die Berechtigung haben,
sudo
so viele andere Antworten zu verwenden, benötigen Sie ...Ihr Server ist wahrscheinlich ein gemeinsam genutzter Host wie Cloudways.
(In meinem Fall hatte ich geklont meine Laravel Anwendung in einen zweiten Cloudways Server von mir, und es war nicht vollständig funktioniert , weil sich die Berechtigungen der
storage
undbootstrap/cache
Verzeichnisse wurden durcheinander.)Ich musste verwenden:
Cloudways Platform > Server > Application Settings > Reset Permission
Dann könnte ich
php artisan cache:clear
im Terminal laufen .quelle
Nach dem
composer install
quelle
Die von bgles veröffentlichte Lösung ist genau das Richtige für mich, wenn es darum geht, Berechtigungen anfangs korrekt festzulegen (ich verwende die zweite Methode), aber es gibt immer noch potenzielle Probleme für Laravel.
Standardmäßig erstellt Apache Dateien mit 644 Berechtigungen. Das ist also so ziemlich alles im Speicher. Wenn Sie also den Inhalt von Speicher / Framework / Ansichten löschen und über Apache auf eine Seite zugreifen, wird die zwischengespeicherte Ansicht wie folgt erstellt:
Wenn Sie "Artisan Serve" ausführen und auf eine andere Seite zugreifen, erhalten Sie unterschiedliche Berechtigungen, da sich CLI PHP anders als Apache verhält:
An sich ist dies keine große Sache, da Sie dies in der Produktion nicht tun werden. Wenn Apache jedoch eine Datei erstellt, die anschließend vom Benutzer geschrieben werden muss, schlägt dies fehl. Dies kann für Cache-Dateien, zwischengespeicherte Ansichten und Protokolle gelten, wenn die Bereitstellung mit einem angemeldeten Benutzer und Handwerker erfolgt. Ein einfaches Beispiel ist "artisan cache: clear", bei dem keine Cache-Dateien gelöscht werden können, die www-data: www-data 644 sind.
Dies kann teilweise gemildert werden, indem handwerkliche Befehle als WWW-Daten ausgeführt werden. Sie werden also alles tun / skripten wie:
Oder Sie vermeiden die Langeweile und fügen dies Ihren .bash_aliases hinzu:
Dies ist gut genug und beeinträchtigt die Sicherheit in keiner Weise. Das Ausführen von Test- und Hygieneskripten auf Entwicklungsmaschinen macht dies jedoch unhandlich, es sei denn, Sie möchten Aliase einrichten, um 'sudo -u www-data' zum Ausführen von phpunit zu verwenden, und alles andere, mit dem Sie Ihre Builds überprüfen, kann dazu führen, dass Dateien erstellt werden.
Die Lösung besteht darin, dem zweiten Teil der Bgles-Ratschläge zu folgen, Folgendes zu / etc / apache2 / envvars hinzuzufügen und Apache neu zu starten (nicht neu zu laden):
Dadurch wird Apache gezwungen, standardmäßig Dateien als 664 zu erstellen. Dies kann an sich ein Sicherheitsrisiko darstellen. In den hier meist diskutierten Laravel-Umgebungen (Homestead, Vagrant, Ubuntu) wird der Webserver jedoch als Benutzer-www-Daten unter der Gruppe www-Daten ausgeführt. Wenn Sie Benutzern also nicht willkürlich erlauben, der www-Datengruppe beizutreten, sollte kein zusätzliches Risiko bestehen. Wenn es jemandem gelingt, aus dem Webserver auszubrechen, hat er ohnehin eine WWW-Datenzugriffsebene, sodass nichts verloren geht (obwohl dies zugegebenermaßen nicht die beste Einstellung in Bezug auf Sicherheit ist). In der Produktion ist es also relativ sicher, und auf einer Einzelbenutzer-Entwicklungsmaschine ist dies einfach kein Problem.
Da sich Ihr Benutzer in der WWW-Datengruppe befindet und alle Verzeichnisse, die diese Dateien enthalten, g + s sind (die Datei wird immer unter der Gruppe des übergeordneten Verzeichnisses erstellt), ist alles, was vom Benutzer oder von WWW-Daten erstellt wird, r /. w für den anderen.
Und das ist das Ziel hier.
bearbeiten
Wenn Sie den obigen Ansatz zum weiteren Festlegen von Berechtigungen untersuchen, sieht er immer noch gut genug aus, aber ein paar Verbesserungen können helfen:
Standardmäßig sind Verzeichnisse 775 und Dateien 664, und alle Dateien haben den Eigentümer und die Gruppe des Benutzers, der gerade das Framework installiert hat. Nehmen wir also an, wir beginnen an diesem Punkt.
Als erstes blockieren wir den Zugriff auf alle anderen und machen die Gruppe zu WWW-Daten. Nur der Eigentümer und die Mitglieder von www-data können auf das Verzeichnis zugreifen.
Damit der Webserver services.json und compiled.php erstellen kann, wie im offiziellen Laravel-Installationshandbuch vorgeschlagen. Das Setzen des Gruppen-Sticky-Bits bedeutet, dass diese dem Ersteller mit einer Gruppe von WWW-Daten gehören.
Wir machen dasselbe mit dem Speicherordner, um die Erstellung von Cache-, Protokoll-, Sitzungs- und Ansichtsdateien zu ermöglichen. Wir verwenden find, um die Verzeichnisberechtigungen für Verzeichnisse und Dateien explizit unterschiedlich festzulegen. Wir mussten dies nicht in Bootstrap / Cache tun, da dort (normalerweise) keine Unterverzeichnisse vorhanden sind.
Möglicherweise müssen Sie alle ausführbaren Flags erneut anwenden, Vendor / * löschen und Composer-Abhängigkeiten neu installieren, um Links für phpunit et al. Neu zu erstellen, z.
Das ist es. Mit Ausnahme der oben erläuterten Umask für Apache ist dies alles, was erforderlich ist, ohne dass die gesamte Projektwurzel durch www-Daten beschreibbar ist, was bei anderen Lösungen der Fall ist. Auf diese Weise ist es etwas sicherer, wenn ein Eindringling, der als WWW-Daten ausgeführt wird, einen eingeschränkteren Schreibzugriff hat.
Ende bearbeiten
Änderungen für Systemd
Dies gilt für die Verwendung von php-fpm, aber möglicherweise auch für andere.
Der Standarddienst systemd muss überschrieben, die Umask in der Datei override.conf festgelegt und der Dienst neu gestartet werden:
quelle
Das hat bei mir funktioniert:
Was es macht:
Hinweis: Möglicherweise können oder müssen Sie dies nicht mit dem Präfix sudo tun. Dies hängt von den Berechtigungen, der Gruppe usw. Ihres Benutzers ab.
quelle
Ich beschloss, mein eigenes Skript zu schreiben, um die Probleme beim Einrichten von Projekten zu lindern.
Führen Sie in Ihrem Projektstamm Folgendes aus:
Warten Sie, bis das Bootstrapping abgeschlossen ist, und Sie können loslegen.
Überprüfen Sie das Skript vor der Verwendung.
quelle
Ich habe laravel auf der EC2-Instanz installiert und 3 Tage damit verbracht, den Berechtigungsfehler zu beheben und ihn endlich zu beheben. Deshalb möchte ich diese Erfahrung mit anderen teilen.
Benutzerproblem Wenn ich mich in der ec2-Instanz angemeldet habe, ist mein Benutzername ec2-user und die Benutzergruppe ec2-user. Und die Website funktioniert unter httpd user: apache: apache, daher sollten wir die Berechtigung für Apache festlegen.
Ordner- und Dateiberechtigung A. Zuerst sollten Sie sicherstellen, dass Sie eine solche Ordnerstruktur im Speicher haben
Lager
B. Erlaubnis Zuerst sehe ich die Anweisungen, um 777 unter Speicher zu setzen, um file_put_contents zu entfernen: Fehler beim Öffnen des Streams fehlgeschlagen. Also habe ich die Berechtigung 777 zum Speichern von chmod -R 777-Speicher eingerichtet. Der Fehler wurde jedoch nicht behoben. Hier sollten Sie eines berücksichtigen: Wer schreibt Dateien in Speicher / Sitzungen und Ansichten? Das ist kein ec2-User, sondern Apache. Ja richtig. Der Benutzer "Apache" schreibt eine Datei (Sitzungsdatei, kompilierte Ansichtsdatei) in den Sitzungs- und Ansichtsordner. Sie sollten Apache also die Berechtigung zum Schreiben in diesen Ordner erteilen. Standardmäßig: SELinux sagt, dass der Ordner / var / www vom Apache Deamon schreibgeschützt sein sollte.
Dazu können wir den Selinux auf 0 setzen: setenforce 0
Dies kann das Problem zeitlich lösen, aber dies führt dazu, dass MySQL nicht funktioniert. Das ist also keine so gute Lösung.
Sie können einen Lese- / Schreibkontext für den Speicherordner festlegen mit: (Denken Sie daran, setenforce 1 zu verwenden, um ihn zu testen.)
Dann wird Ihr Problem behoben.
und vergessen Sie nicht dieses Komponisten-Update PHP Artisan Cache: klar
Diese Befehle sind nach oder vor nützlich.
Ich hoffe du sparst deine Zeit. Viel Glück. Hacken
quelle
Ich hatte die folgende Konfiguration:
nginx
)Und die Berechtigungen wurden korrekt angewendet, wie @bgies in der akzeptierten Antwort vorgeschlagen hat. Das Problem in meinem Fall war der ursprünglich konfigurierte laufende Benutzer und die Gruppe von php-fpm, die ursprünglich war
apache
.Wenn Sie NGINX mit php-fpm verwenden, sollten Sie die Konfigurationsdatei von php-fpm öffnen:
Der Wert von " Ersetzen
user
undgroup
Optionen" durch einen NGINX ist für die Arbeit mit konfiguriert. in meinem Fall waren beidenginx
:... ; 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 ...
Speichern Sie es und starten Sie die Dienste nginx und php-fpm neu.
quelle
Für Laravel-Entwickler können Verzeichnisprobleme ein wenig schmerzhaft sein. In meiner Anwendung habe ich Verzeichnisse im laufenden Betrieb erstellt und Dateien erfolgreich in dieses Verzeichnis in meiner lokalen Umgebung verschoben. Dann bekam ich auf dem Server Fehler beim Verschieben von Dateien in ein neu erstelltes Verzeichnis.
Hier sind die Dinge, die ich getan habe und am Ende ein erfolgreiches Ergebnis erzielt habe.
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);
Nachdem ich diese Änderungen auf dem Produktionsserver vorgenommen hatte, habe ich erfolgreich neue Verzeichnisse erstellt und Dateien in diese verschoben.
Wenn Sie die Dateifassade in Laravel verwenden, können Sie Folgendes tun:
File::makeDirectory($save_path, 0755, true);
quelle
Ich habe eine noch bessere Lösung dafür gefunden. Es wird verursacht, weil PHP standardmäßig als ein anderer Benutzer ausgeführt wird.
Also, um dies zu beheben
sudo nano /etc/php/7.0/fpm/pool.d/www.conf
dann bearbeiten Sie die
user = "put user that owns the directories" group = "put user that owns the directories"
dann:
sudo systemctl reload php7.0-fpm
quelle