Wie zum einrichten der Datei-Berechtigungen für Laravel 5 (und andere)
Ich bin mit Apache Web-Server, hat der Eigentümer zu _www:_www
. Ich weiß nie, was ist die beste Praxis mit den Datei-Berechtigungen, zum Beispiel wenn ich neue Laravel 5 Projekt.
Laravel 5 erfordert /storage
Ordner beschreibbar sein. Ich fand viele verschiedene Ansätze, damit es funktioniert und ich in der Regel am Ende mit machen, es 777
chmod rekursiv. Ich weiß, es ist nicht die beste Idee, obwohl.
Den offiziellen doc sagt:
Laravel erfordern einige Berechtigungen konfiguriert werden: Ordner innerhalb
storage
undvendor
benötigen Schreibzugriff für den web-server.
Bedeutet es, dass der web-server benötigt Zugriff auf die storage
und vendor
Ordner selbst zu oder einfach Ihren aktuellen Inhalt?
Ich gehe davon aus, dass das, was viel besser ist, ist die änderung der Besitzer anstelle von Berechtigungen. Ich änderte alle Laravel Dateien die Berechtigungen rekursiv zu _www:_www
und dass die Website richtig funktioniert, als wenn ich chmod geändert zu 777
. Das problem ist, dass jetzt mein text-editor fragt mich nach Passwort jedes mal, wenn ich speichern will eine Datei und das gleiche passiert wenn ich versuche etwas zu ändern im Finder, wie zum Beispiel eine Datei kopieren.
Was ist der richtige Ansatz, um diese Probleme zu lösen?
- Ändern
chmod
- Ändern Sie den Besitzer der Dateien entsprechen denen der
web-server und vielleicht legen Sie die text-editor (und Finder?) überspringen
bitte um Passwort, oder Sie verwendensudo
- Ändern Sie den Besitzer der web-server die os-Benutzer (ich weiß nicht
kennen die Konsequenzen) - Etwas anderes
- Ich denke
777
ist zu viel Freiheit, denn es enthält alle Berechtigungen für jeder. - Aus der Laravel Dokumentation: Verzeichnisse innerhalb der
storage
und diebootstrap/cache
Verzeichnisse sollten beschreibbar durch den web-server - benutze fcgi und Sie können 755/644 für alle (inkl. öffentliche/Lager)
- Zustimmen könnten wir verschieben die Frage auf serverfault, anstatt Sie zu halten?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur um das offensichtliche für alle Leser dieser Diskussion.... wenn Sie geben jedem Ihrer Ordner von 777 Berechtigungen, die Sie erlauben, JEMAND zu Lesen, zu schreiben und führen Sie eine Datei in das Verzeichnis.... was dies bedeutet ist Sie haben JEDERMANN (jeden hacker oder eine böswillige person in der ganzen Welt) die Berechtigung zum hochladen von Dateien, Viren oder andere Datei, und führen Sie DANN die Datei...
Grundsätzlich gibt es zwei Möglichkeiten zum einrichten der Zugriffsberechtigungen und Eigentum. Entweder geben Sie sich selbst das Eigentum, oder Sie machen den webserver, der Besitzer aller Dateien.
Webserver als Besitzer (wie die meisten Menschen tun es, und die Laravel doc ' s Weg):
vorausgesetzt, www-data (es könnte etwas anderes sein) ist und der webserver-Benutzer.
wenn Sie das tun, ist der webserver besitzt Sie alle Dateien, und ist auch die Gruppe, und Sie haben etwas Probleme beim Upload von Dateien oder bei der Arbeit mit Dateien über FTP, weil Ihre FTP-client wird angemeldet sein wie Sie, nicht auf Ihrem webserver, so fügen Sie Ihren Benutzer zu der webserver-Benutzer Gruppe:
Natürlich, dies setzt Voraus, Ihr webserver läuft als www-data (der Standard-Homestead), und Ihre Benutzer ubuntu (es ist wandernden, wenn Sie mit Homestead).
Dann stellen Sie alle Ihre Verzeichnisse auf 755 und Dateien auf 644...
SET-Datei Berechtigungen
SET directory-Berechtigungen
Ihrem Benutzer als Besitzer
Ich lieber selber alle Verzeichnisse und Dateien (es macht die Arbeit mit dem alles viel einfacher), so dass ich tun:
Dann gebe ich mich und die webserver-Berechtigungen:
Dann geben die Server die Rechte zum Lesen und schreiben auf Speicher und cache
Welcher Art und Weise Sie es eingerichtet haben, dann müssen Sie lese-und Schreibrechte für den webserver für die Speicherung, cache und alle anderen Verzeichnisse, die der webserver benötigt, um zu laden oder zu schreiben (je nach situation), so führen Sie die Befehle von bashy oben :
Nun, Sie sind sicher und Ihre website funktioniert, UND Sie können die Dateien relativ leicht
anyone
Konzept. Linux istanyone
- flag bedeutet, dass alle Benutzer, keine person. Sie müssen noch server-Zugriff.755
,644
vs775
,664
? Auch, wenn Sie die zweite Methode, tun Sie wirklich brauchen, um ausführen die Befehle vorgeschlagen, die von bashy? Wieder, vielen Dank.write
Berechtigung der Gruppe?touch
eine neue Datei, sei es als normaler Benutzer oder alswww-data
die neue Datei nicht scheinen, um die Berechtigung zu Erben..?sudo chgrp -R www-data storage bootstrap/cache
wirklich nützlich, dennsudo chown -R my-user:www-data /path/to/your/root/directory
?/path/to/your/root/directory
? Tut es daspublic
Verzeichnis von Laravel-app, die das Dokument-root für den virtuellen host? oder es ist das Laravel-app-root-Verzeichnis selbst, d.h., die alles, was ist es?production.ERROR: UnexpectedValueException: The stream or file "/var/www/html/laravel/storage/job/248/import.log" could not be opened: failed to open stream: Permission denied in /var/www/html/laravel/bootstrap/cache/compiled.php
sudo -i
und danncrontab -e
sudo chgrp -R www-data storage bootstrap/cache
denn es ist bereits getan.sudo find /path/to/your/laravel/root/directory -type f -exec chmod 664 {} \;
! Sie werden nicht in der Lage, beliebige Befehle aus der Kommandozeile nach (z.B. alles invendor/bin/
)! Ich habe jetzt raus, wie man Laravel arbeiten von der Befehl Linie wieder.sudo find/path/to/your/laravel/root/directory/storage/ -type f -exec chmod 664 {} \;
sudo find /path/to/your/laravel/root/directory/storage/ -type d -exec chmod 775 {} \;
Die Berechtigungen für die
storage
undvendor
Ordner sollte an775
aus offensichtlichen Gründen der Sicherheit.Jedoch sowohl auf Ihrem computer und Ihrem server Apache brauchen, um in der Lage zu schreiben in diesen Ordner. Ex: wenn Sie Befehle ausführen, wie
php artisan
benötigt Ihr computer zu schreiben, in der logs Datei instorage
.Alles, was Sie tun müssen, ist, um Besitz von dem Ordner zu Apache :
Dann müssen Sie Ihren computer (verwiesen wird, indem es
username
) zu der Gruppe, zu dem der server der Apache gehört. Etwa so :HINWEIS: am häufigsten
groupName
istwww-data
aber in deinem Fall, ersetzen Sie es mit_www
chown
Befehle sollte auch das -R flag. Auch in laravel 5.1 und 5.2, anstatt der vendor-Verzeichnis, sollten Sie Zugriff auf das bootstrap/cache-Verzeichnis.Wir haben in vielen Grenzfälle beim einrichten der Berechtigungen für Laravel Applikationen. Wir erstellen ein eigenes Benutzerkonto (
deploy
) für die Eigentümer der Laravel application-Ordner und ausführen von Laravel-Kommandos von der Kommandozeile, und führen Sie den web-server unterwww-data
. Ein Problem, das bewirkt, dass die log-Datei(en) ist möglicherweise im Besitz vonwww-data
oderdeploy
, je nachdem, wer schrieb, um die log-Datei zuerst, die offensichtlich verhindern, das andere user schreiben, Sie in der Zukunft.Habe ich herausgefunden, dass die einzige vernünftige und sichere Lösung ist der Einsatz von Linux-ACLs. Das Ziel dieser Lösung ist:
deploy
).www-data
Benutzer lese-Zugriff auf Laravel application-code, aber keinen Schreibzugriff.www-data
Benutzer und die Benutzer der Anwendung (deploy
) schreiben Zugriff auf den Ordner storage, unabhängig davon, welcher Benutzer der Eigentümer der Datei (also beidedeploy
undwww-data
schreiben können, um die gleiche log-Datei, zum Beispiel).Dies erreichen wir wie folgt:
application/
Ordner erstellt werden, die Standard-umask von0022
, die Ergebnisse in Ordnern mitdrwxr-xr-x
Berechtigungen und Dateien, die mit-rw-r--r--
.sudo chown -R deploy:deploy application/
(oder einfach nur das bereitstellen Ihrer Anwendung alsdeploy
Benutzer, das ist, was wir tun).chgrp www-data application/
zu geben, diewww-data
Gruppe den Zugriff auf die Anwendung.chmod 750 application/
zu ermöglichen, diedeploy
Benutzer Lesen/schreiben, diewww-data
Benutzer schreibgeschützt, und entfernen Sie alle Berechtigungen für andere Benutzer.setfacl -Rdm u:www-data:rwx,u:deploy:rwx application/storage/
um die Standard-Berechtigungen auf denstorage/
Ordner und alle Unterordner. Jeder neue Ordner/Dateien erstellt, in den Ordner storage, 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 auf alle vorhandenen Dateien/Ordner.Ändern Sie die Berechtigungen für Ihr Projekt Ordner, um read/write/exec für alle Benutzer innerhalb der Gruppe besitzen das Verzeichnis (die in Ihrem Fall ist
_www
):Dann fügen Sie Ihre OS X-Benutzernamen zur
_www
Gruppe Zugriff auf das Verzeichnis:dseditgroup
von Ihnen, ich erhalte eine Fehlermeldung:Username and password must be provided.
.sudo
am Anfang._www:_www
odermyuser:_www
wie gut?_www:_www
, weil 775 bedeutet, dass jeder Benutzer in der Gruppe_www
haben vollständige Berechtigungen zum Lesen/schreiben/exect in diesem Ordner, und Sie nur Ihren Benutzernamen zu dieser Gruppe.chown myuser:_www
? Ich weiß, der erste ist der Benutzer und das zweite ist die Gruppe, doch bedeutet es "diesen Benutzer UND JEDER AUS dieser Gruppe" oder "dieser Benutzer ABER NUR, WENN ER GEHÖRT ZU dieser Gruppe"?_www
haben vollständige Berechtigungen zum Lesen/schreiben/exec in diesem Ordner.chmod go-rwx
auf einen Ordner. Sie setzen die Berechtigungen zum Lesen/schreiben für_www
Gruppe und kein Zugang füreveryone
. Auch wenn ich jetzt gehören_www
Gruppe, ich kann keinen Zugriff auf diese Dateien aus dem Finder. Warum ist das so?_www:_www
ich bin nicht in der Lage, änderungen aus dem Finder ohne Eingabe von Passwort.775
nicht765
. Ich habe gerade getestet das Szenario selbst und es funktioniert ohne Probleme./Documents
haben nur so wenig Berechtigungen wie gewünscht. Ich denke775
auf alle Dateien und Ordner, die zu viel ist, ist es nicht?775
benötigt? Nicht770
genug?Als gebucht, bereits
aber ich habe -R für chown Befehl:
sudo chown -R www-data:www-data /path/to/your/project/vendor
sudo chown -R www-data:www-data /path/to/your/project/storage
Meisten Ordner sollte normal sein "755" und Dateien "644"
Laravel benötigt einige Ordner beschreibbar für den Webserver-Benutzer. Mit diesem Befehl können Sie auf unix-basierten Betriebssystemen.
Die Lösung gepostet von bgles ist vor Ort auf für mich, in Bezug auf korrekt festlegen von Berechtigungen anfangs (als ich die zweite Methode verwenden), aber es hat immer noch mögliche Probleme für die Laravel.
Standardmäßig wird der Apache erstellen von Dateien mit 644 Berechtigungen. Also das ist so ziemlich alles in storage/. Also, wenn Sie löschen Sie den Inhalt des Speichers/framework/views, dann eine Seite zuzugreifen, die über Apache finden Sie die zwischengespeicherte Ansicht erstellt wurde, wie:
Wenn Sie "artisan serve" und auf eine andere Seite, erhalten Sie unterschiedliche Berechtigungen, da der CLI-PHP verhält sich anders als Apache:
In sich, dies ist keine große Sache, da werden Sie nicht tun, jede dieser in der Produktion. Aber wenn Apache eine Datei erstellt, die später benötigt werden, vom Benutzer geschrieben, wird es scheitern. Und diese kann anwenden, um cache-Dateien, zwischengespeicherten Ansichten und Protokolle, die bei der Bereitstellung mit einem angemeldeten Benutzer und Handwerker. Eine einfache Beispiel "Handwerker-cache:klar," das wird nicht löschen Sie alle cache-Dateien, die www-data:www-data 644.
Diese werden teilweise gemildert durch die Ausführung artisan Befehle als www-data, so werden Sie tun/scripting alles wie:
Oder Sie vermeiden die Langweiligkeit dieses und fügen Sie diese zu Ihrem .bash_aliases:
Ist das gut genug und ist nicht auf die Sicherheit in irgendeiner Weise. Aber auf die Entwicklung von Maschinen, ausführen von Prüf-und Hygiene-Skripten macht diese unhandlich, es sei denn, Sie möchten einrichten Aliasnamen für die Verwendung von 'sudo -u www-data' zum ausführen von phpunit und alles, was Sie überprüfen Sie Ihre builds mit verursachen könnte-Dateien erstellt werden.
Die Lösung ist, folgt der zweite Teil der bgles Beratung, und fügen Sie Folgendes zu /etc/apache2/envvars, und neu starten (nicht neu laden) - Apache:
Diese zwingen den Apache zu erstellen, Dateien 664 standardmäßig. An sich, dies kann ein Sicherheitsrisiko darstellen. Aber auf das Laravel-Umgebungen meist diskutiert hier (Homestead, Vagrant, Ubuntu) der web-server läuft als user www-data unter die Gruppe www-data. Also, wenn Sie nicht willkürlich erlauben Benutzern, an www-data Gruppe soll es kein zusätzliches Risiko. Wenn es jemand schafft, um aus den webserver, Sie haben www-data access level sowieso, so dass nichts verloren geht (obwohl das nicht die beste Einstellung zu haben bezüglich der Sicherheit, zugegeben). Also auf Produktion, es ist relativ sicher, und auf einem single-user-Entwicklung-Maschine, es ist nicht nur ein Problem.
Letztlich als user ist www-data der Gruppe, und alle Verzeichnisse mit diesen Dateien sind g+s (die Datei wird immer erstellt, unter der Gruppe der Eltern-Verzeichnis), alles durch den Benutzer erstellt oder von www-Daten r/w-für die anderen.
... Und das ist es hier das Ziel.
Bearbeiten
Auf die Untersuchung des oben erwähnten Ansatz zum festlegen von Berechtigungen weiter, es sieht immer noch gut genug, aber ein paar Kniffe, die helfen können:
Standardmäßig Verzeichnisse 775 und Dateien 664 und alle Dateien haben den Eigentümer und die Gruppe des Benutzers nur installiert das framework. So übernehmen wir starten von diesem Punkt aus.
Erste, was wir tun, ist, blockieren Sie den Zugriff auf alle anderen, und stellen Sie der Gruppe www-data. Nur der Besitzer und die Mitglieder der www-data kann auf das Verzeichnis zugreifen.
Erlauben dem webserver zu erstellen Dienstleistungen.json und compiled.php, wie vorgeschlagen, durch die offizielle Laravel installation guide. Einstellen der Gruppen-sticky-bit bedeutet, dass diese im Besitz der Schöpfer mit einer Gruppe von www-data.
Wir tun das gleiche mit dem Speicher-Ordner ermöglichen die Erstellung von cache, log, session und anzeigen von Dateien. Wir suchen explizit den directory-Berechtigungen anders für Verzeichnisse und Dateien. Wir brauchen nicht, dies zu tun in der bootstrap/cache gibt es nicht (normalerweise) alle sub-Verzeichnisse dort.
Müssen Sie möglicherweise erneut executable-flags und löschen von Verkäufer/* und installieren Sie composer Abhängigkeiten zu erstellen-links für phpunit et al, zB:
Das ist es. Außer für die umask für den Apache oben erklärt, das ist alles, was erforderlich ist, ohne dass die ganze projectroot writeable by www-data, das ist, was passiert mit anderen Lösungen. So ist es geringfügig sicherer, auf diese Weise, dass ein Eindringling läuft als www-data hat mehr der Schreibzugriff eingeschränkt.
Ende Bearbeiten
Änderungen für Systemd
Dies gilt für die Verwendung von php-fpm, aber vielleicht auch andere.
Standard systemd service muss überschrieben werden, die umask gesetzt, in den override.conf-Datei, und der Dienst neu gestartet wird:
Die Laravel 5.4 docs sagen:
Gibt es viele Antworten auf dieser Seite erwähnen, dass mit
777
Berechtigungen. Nicht. Sie würde Verfügbarmachen von selbst, um Hackern.Statt, befolgen Sie die Vorschläge von anderen, wie etwa das festlegen der Berechtigungen von 755 (oder mehr restriktiv). Möglicherweise müssen Sie herausfinden, welche Benutzer Ihre app ausgeführt wird, durch ausführen
whoami
im terminal und dann ändern Sie das Eigentum bestimmter Verzeichnisse mitchown -R
.Wenn Sie nicht über die Berechtigung zum verwenden
sudo
wie so viele andere Antworten erfordern...Dein server ist wahrscheinlich ein shared host wie Cloudways.
(In meinem Fall hatte ich geklont mein Laravel-Applikation in einem zweiten Cloudways server von mir, und es war nicht ganz funktioniert, da die Berechtigungen der
storage
undbootstrap/cache
Verzeichnisse waren Durcheinander.)Ich brauchte, um:
Cloudways Platform > Server > Application Settings > Reset Permission
Dann konnte ich
php artisan cache:clear
im terminal.Habe ich installiert laravel auf EC2-Instanz und habe 3 Tage zu beheben, die Erlaubnis, Fehler endlich behoben.
So möchte ich teilen diese Erfahrung mit anderen.
Benutzer problem
Wenn ich eingeloggt ec2-instance, mein Benutzername ist " ec2-user und usergroup ist ec2-user.
Und die website funktioniert, unter der httpd-user: apache: apache
also sollten wir die Rechte für apache.
Ordner-und Datei-Berechtigung
A. Ordner-Struktur
zunächst sollten Sie sicherstellen, dass Sie die Ordner-Struktur wie diese unter Speicher
Lagerung
Die Ordner-Struktur kann unterschiedlich sein nach der laravel-version, die Sie verwenden.
meine laravel-version ist 5.2 und Sie könnten finden die geeignete Struktur, abhängig von Ihrer version.
B. Genehmigung
Auf den ersten, sehe ich die Anweisungen, um festzulegen, 777 unter Speicher zu entfernen file_put_contents: failed to open stream Fehler.
Also richte ich die Berechtigung 777 zu Speicher
chmod -R 777-Speicher
Aber der Fehler wurde nicht behoben.
hier sollten Sie überlegen: wer schreibt Dateien auf storage/sessions und Ansichten.
Das ist nicht "ec2-user", aber apache.
Ja, richtig.
"apache" user schreibt Datei (session-Datei, die kompilierten Datei anzeigen), um die Sitzung und Ordner anzeigen.
So sollten Sie geben der apache Schreibzugriff auf diesen Ordner.
Standardmäßig ist SELinux sagen, das /var/www Ordner schreibgeschützt sein sollte, die von der apache-Dämon.
Also, für dieses, können wir die selinux-0:
setenforce 0
Kann dieses problem lösen zeitlich, aber das macht das mysql nicht funktioniert.
das ist also keine so gute Lösung.
Können Sie eine Lesen-schreiben-Kontext auf den storage-Ordner mit: (denkt daran, setenforce 1, um es zu testen)
Dann ist dein problem behoben wird.
und vergessen Sie nicht, dieses
Komponist update
php artisan-cache:klar
Diese Befehle nützlich sein wird, nachdem oder bevor.
Ich hoffe, dass Sie Ihre Zeit sparen.
Viel Glück. Hacken
Nach
composer install
Habe ich mich dazu entschlossen, mein eigenes Skript zu lindern einige der Schmerzen für die Einrichtung von Projekten.
Führen Sie den folgenden innerhalb Ihrer Projekt-root:
Warten bootstrapping-Vorgang abgeschlossen und du bist gut zu gehen.
Überprüfen Sie das Skript vor der Verwendung.
Hatte ich folgende Konfiguration:
nginx
)Angewendet und Berechtigungen korrekt als @bgies vorgeschlagen, in der akzeptierten Antwort. Das problem in meinem Fall war das die php-fpm konfiguriert ist ausführen von Benutzer-und Gruppen-das ursprünglich
apache
.Wenn Sie mithilfe von NGINX mit php-fpm, öffnen Sie php-fpm config-Datei:
Und ersetzen
user
undgroup
Optionen' Wert mit einer NGINX konfiguriert ist, um mit zu arbeiten; 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 und Neustart von nginx und php-fpm Dienste.
Fand ich eine noch bessere Lösung.
Seine verursacht, weil php läuft als ein anderer Benutzer standardmäßig.
so, um dieses Problem beheben zu tun
sudo nano /etc/php/7.0/fpm/pool.d/www.conf
Bearbeiten Sie dann die
user = "put user that owns the directories"
group = "put user that owns the directories"
dann:
sudo systemctl reload php7.0-fpm