Berechtigungsprobleme mit / var / www / html und meinem eigenen Ausgangsverzeichnis für ein Website-Dokumentstammverzeichnis

34

Ich versuche, in meinem Ordner keine 777-Berechtigung zu erteilen /var/www/html, aber ich möchte meine Dateien ohne bearbeiten sudo. Ich erstelle also einen Symlink zu einem Ordner in meinem Homeverzeichnis /var/www/html. Ich habe es mit erstellt sudo ln -sT /home/andre/www/moodle/ moodleund die ls -laAusgabe ist wie folgt:

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/

Mein Moodle-Ordner hat also Lese-, Schreib- und Ausführungsberechtigungen für alle, und das ist nicht das, was ich will. Ich habe sudo chmod -R 775 moodle/versucht, den Befehl zu ändern, aber er blieb bei den Lese-, Schreib- und Ausführungsberechtigungen für alle. Ich habe dasselbe mit dem Moodle-Ordner versucht /home/andre/www/moodle, aber er ist gleich geblieben. Die Ausgabe von ls -lain /home/andre/www/ist:

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

Der Ordner moodlein /home/andre/www/hat also die Berechtigungen, die ich möchte.

Als zusätzliches Problem localhost/moodleerhalte ich beim Zugriff den Fehler 403 Verboten.

Was mache ich hier falsch?

André Carvalho
quelle

Antworten:

63

Sie sollten niemals eine Website in Ihrem Home-Verzeichnis ausführen müssen . JE. Andernfalls müssten Sie dem Webserver die Möglichkeit geben, durch/home/die Verzeichnisstruktur zu navigieren, aber auch in/home/$USER/(das Basisverzeichnis Ihres Benutzers, in dem wir nachsehen können, was in Ihrem Benutzerverzeichnis noch vorhanden ist) sowie in andere Unterordner da drin. Ein schlecht konfigurierter oder falsch konfigurierter oder nicht gepatchter Webserver kann auf diese Weise zu massiven Datenverlusten oder zum Verlust von Anmeldeinformationen führen, wodurch Ihre persönlichen Daten und Anmeldungen für verschiedene Dinge gefährdet werden. Der von Ihnen verwendete Symlink-Ansatz hilft auch nicht aus demselben Grund wie der Versuch, Apache Leseberechtigungen zu erteilen/home/andre/www/moodle- Der Webserver muss in der Lage sein, Ihr Home-Verzeichnis zu durchlaufen, um zu dem Speicherort zu gelangen, auf den der Symlink /var/www/htmlverweist, der immer noch das Sicherheitsrisiko darstellt.

Erstens verwenden sudo cp -r /home/andre/www/moodle/ /var/www/html/. Dadurch werden Ihre Dateien in /var/www/htmlIhr eigenes Ausgangsverzeichnis kopiert und von diesem ferngehalten. Wir werden dann die Berechtigungen wiederholen, damit Sie und der Webserver auf alles in diesem Verzeichnis zugreifen können und Ihrem Benutzer das vollständige Lesen / Schreiben aller Dateien und Verzeichnisse ermöglichen. Dann müssen Sie immer nur /var/www/htmlfür Ihre Website arbeiten.

Dies geschieht in vier Schritten, nachdem Sie Ihre Daten zurückkopiert haben /var/www/html:

  1. Geben Sie Apache Zugriff auf die Ordner und Dateien, damit die Site ohne 403 Fehler bereitgestellt werden kann.
  2. Geben Sie Ihrem Benutzer "Eigentümer" über die Dateien und Ordner, und geben Sie sich das Lesen / Schreiben aller Dateien und Ordner sowie die Möglichkeit, die Verzeichnisse zu durchlaufen.
  3. (Optional, aber empfohlen) Richten Sie es so ein, dass für alle darauf erstellten Dateien oder Ordner in der gesamten Verzeichnisstruktur die Gruppe festgelegt ist www-data.
  4. (Optional) Endgültige Sicherheitsbereinigung, bei der wir Berechtigungen einrichten, damit Sie und der Webserver die Site-Daten sehen können, andere Benutzer jedoch nicht auf Dateien oder die Verzeichnisstruktur der Site zugreifen können.

(1) Ermöglichen Sie Apache den Zugriff auf die Ordner und Dateien.

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

Dies setzt rekursiv die 'Gruppe' www-datafür die Ordner und Dateien. Dadurch erhält der Webserver die Berechtigung, die Stammverzeichnisstruktur des Site-Dokuments erneut aufzurufen und darauf zuzugreifen (nur +xfür Verzeichnisse). Außerdem wird sichergestellt, dass der Webserver über Leseberechtigungen für alle Dateien verfügt, sodass Standortdaten empfangen werden können.

Möglicherweise gibt es einige Fälle, in denen Sie den Web - Server Schreibzugriff auf eine Datei geben, oder in ein Verzeichnis - dies kann , indem Sie erreicht wird sudo chmod g+w /var/www/html/PATH(wo PATHist der Pfad zur Datei oder einen Ordner in der Verzeichnisstruktur in dem Sie die Anwendung müssen Schreibrechte für den Webserver).

HINWEIS : In vielen Fällen können hierdurch "sichere" Informationen zu einer Site-Konfiguration angezeigt werden (z. B. Anmeldeinformationen für den Datenbankzugriff usw.), und Sie sollten "andere" Zugriffsberechtigungen für diese Daten in diesen einzelnen Dateien oder Verzeichnissen mit entfernen Folgendes: sudo chmod o-rwx /var/www/html/FILEPATH(Ersetzen FILEPATHdurch den Pfad relativ zum /var/www/htmlOrdner für die Datei).

Beachten Sie auch, dass Sie diese Befehle möglicherweise in Zukunft erneut ausführen müssen, wenn bei 'neuen Dateien' 403 Probleme auftreten, damit der Webserver weiterhin über die richtigen Berechtigungen für den Zugriff auf Dateien und Ordner verfügt, die in und erstellt oder kopiert wurden Die www-dataGruppe wird nicht richtig festgelegt.


(2) Gewähren Sie Ihrem Eigentümer Lese- / Schreibrechte für die Ordner und Dateien und erlauben Sie dem Ordnerzugriff, die Verzeichnisstruktur zu durchlaufen.

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

Ersetzen Sie USERim ersten Befehl mit Ihrem eigenen Benutzernamen!

Wir machen hier drei Dinge. Zuerst legen wir Ihren Benutzer als "Eigentümer" aller Dateien und Verzeichnisse in fest /var/www/html. Als Nächstes legen wir Lese- und Schreibberechtigungen für die Ordner fest und ermöglichen Ihnen den Zugriff auf die Ordner, um in diese zu gelangen (das +xElement in den Verzeichniselementen). Wir setzen dann alle Dateien auf Lese- / Schreibrechte für den Eigentümer, die wir gerade eingestellt haben.


(3) (Optional) Stellen Sie sicher, dass jede neue Datei danach mit www-datadem Benutzer 'access' erstellt wird.

sudo find /var/www/html -type d -exec chmod g+s {} +

Dies setzt das "set gid" -Bit für die Gruppe in den Verzeichnissen. Dateien und Ordner, die in diesen Verzeichnissen erstellt wurden, gelten immer www-dataals Gruppe und ermöglichen den Zugriff auf den Webserver.


(4) (Optional) Endgültige Sicherheitsbereinigung, wenn Sie nicht möchten, dass andere Benutzer die Daten sehen können

Wir brauchen Ihren Benutzer, um die Verzeichnisse und Dateien zu sehen. Wir brauchen dazu auch den Webserver. Möglicherweise möchten wir nicht, dass andere Systembenutzer (außer root) die Daten sehen. Lassen Sie sie also nicht diesen Zugriff gewähren, und legen Sie fest, dass nur Ihr Benutzer und der Webserver die Daten sehen können.

sudo chmod -R o-rwx /var/www/html/

HINWEIS: Sie müssen dies zu einem späteren Zeitpunkt nicht erneut ausführen oder die Berechtigungen für die Kategorie "Andere" hier bearbeiten. Wenn die 'anderen' Benutzer nicht ankommen können /var/www/html/(sie haben nicht das erforderliche +xBit /var/www/html, um die Dateistruktur und Verzeichnisstruktur zu durchlaufen, noch das +rBit, um die Dateilisten zu lesen), dann die Berechtigungen für Elemente unter diesem Verzeichnis für andere Benutzer oder Gruppen wird nicht wirklich zu viel ausmachen.


Es gibt auch eine etwas weniger invasive Lösung, obwohl nicht garantiert ist, dass sie für alle neuen Dateien funktioniert, und auch nicht für alle Dateisysteme , die Dateizugriffskontrolllisten enthalten. Auf diese Weise können Sie das Eigentum an den Dateien www-datafür bestimmte Zwecke behalten, erhalten jedoch in jeder Hinsicht effektive Eigentumsrechte, auch wenn Sie die Dateien nicht persönlich besitzen.

Diese Lösung ist etwas weniger invasiv und ermöglicht es Ihnen, ein Verzeichnis und alle darin enthaltenen Dateien zu besitzen www-data:www-dataoder sich root:www-dataselbst Zugriff zu gewähren. Es verwendet Zugriffssteuerungslisten , mit denen Sie mehrere Benutzer über Berechtigungen verfügen können, ohne einzelne Gruppen einzurichten. Auf diese Weise können Benutzer rootoder www-dataSystembenutzer auch Dateien besitzen, aber Sie können auch von Fall zu Fall zusätzliche Berechtigungen hinzufügen und die Berechtigungen für bestimmte Benutzer so anpassen, dass sie Dinge lesen, aber nicht bearbeiten können.

Angenommen, wir arbeiten noch mit /var/www/html/anderen Benutzern zusammen und möchten nicht, dass andere Benutzer als wir und das System (und natürlich root) unsere Daten sehen, müssen wir die folgenden Dinge tun:

  1. Geben Sie dem Webserver-Systembenutzer den Besitz zurück www-data.
sudo chown -R www-daten: www-daten / var / www / html
  1. Geben Sie Ihnen rekursiv Lese- / Schreibzugriff auf die Dateien, während Sie anderen Benutzern (außer www-dataund rootnatürlich) keinen Zugriff auf die Dateien gewähren.
sudo find / var / www / html -type f -exec setfacl -mu: IHR BENUTZERNAME: rw -m other :: --- {} \;
  1. Geben Sie sich rekursiv das Lesen / Schreiben / Durchlaufen der Verzeichnisse, entfernen Sie den Zugriff auf die Ordner für andere Benutzer (ohne www-dataund root) und legen Sie dies als 'Standard'-ACL für neue Dateien in den Verzeichnissen fest.
sudo find / var / www / html -type d -exec setfacl -d -mu: IHR BENUTZERNAME: rwx -mo :: --- {} \;
  1. Wir müssen auch das setgidBit für alle Verzeichnisse setzen, damit der Webserver beim Erstellen einer Datei weiterhin www-dataüber Gruppenberechtigungen darauf zugreifen kann .
sudo find / var / www / html -type d -exec chmod g + x {} \;

Und jetzt haben Sie Zugriff auf alle Verzeichnisse, und Sie mussten den Zugriff nicht wegnehmen www-data, um Hilfe zu erhalten, da der Webserver weiterhin überall Dateien erstellen kann, wie es erforderlich ist (z. B. PHP-basierte Frontends mit eigenen Cache-Verzeichnissen und dergleichen) müssen für den ordnungsgemäßen Betrieb erstellt und beschrieben werden).

Die einzige Einschränkung: Wenn Sie manuell neue Dateien erstellen, müssen Sie diese entsprechend anzeigen, um dem Webserver den Besitz zu übertragen. Das ist ganz einfach sudo chown www-data:www-data filename, und in den Zugriffssteuerungslisten sollten Sie weiterhin über effektive Eigentümerrechte für die Datei verfügen.

Es gibt mehrere Fälle, in denen ich dies als Sysadmin für einen nicht standardmäßigen Zugriff tun musste, ohne die Besitzer einer bestimmten Datei zu ändern. Dies funktioniert, hat jedoch seine eigenen Kopfschmerzen, da nicht jedes Dateisystem Dateizugriffslisten unterstützt .

Thomas Ward
quelle
2
@ AndréCarvalho +xfür Dateien würde ausführbare Berechtigungen geben, und wir möchten nicht, dass PHP-Dateien notwendigerweise über die PHP-Befehlszeile oder als ausführbare Datei auf dem Server selbst ausgeführt werden - wir möchten, dass sie vom PHP-Parser auf dem Webserver verarbeitet werden (und wir brauchen keine PHP-Dateien, damit +xder PHP-Parser sie lesen und verarbeiten kann). Verzeichnisse müssen vorhanden +xsein, um das Durchsuchen der Verzeichnisse zu ermöglichen. Wenn also ein Verzeichnis nicht vorhanden ist +xund ich kein Root-Benutzer bin, kann ich nicht in das Verzeichnis gelangen. Dies ist das Problem, das Sie hatten , wenn Apache nicht mit Ihren Symlinks und Ihrem Heimnetzwerk zusammenarbeitet Verzeichnis.
Thomas Ward
1
@ AndréCarvalho www-dataist eine Systemgruppe - es ist keine Gruppe für Standardbenutzer.
Thomas Ward
1
@JunaidQadirShekhanzai Unmöglich bereitzustellen, da sich die Einstellungen der Menschen stark von den von ihnen benötigten Umgebungen und vielen anderen Faktoren unterscheiden. Eine solche 'Shell-Datei' wäre unmöglich zu produzieren, da es optionale Komponenten gibt. Ich könnte versuchen , ein Python-Skript
Thomas Ward
1
@ T.Todua das habe ich nicht gesagt. Ich habe gesagt, dass Sie niemals eine Site außerhalb Ihres "Home" -Verzeichnisses (gelesen: von dort aus) ausführen sollten - das heißt, Sie sollten nichts /home/USER/...auf einem Webserver ausführen . Sie haben die Bedeutung der von mir verwendeten Wörter falsch verstanden und missverstanden. /var/www/*ist ein relativ "sicherer" Ort, an dem Websites ausgeführt werden können, da dies ein dedizierter Ordner / Speicherplatz ist. Dies /var/www/htmlist jedoch NICHT sicher, da dies von Webservern bei der Installation und dergleichen geschrieben wurde und zu einer Überlastung wichtiger Daten führt (verwenden /var/www/SUBDIRECTORYSie diese stattdessen mit einzelnen Site-Unterverzeichnissen)
Thomas Ward
1
Ich habe den Wortlaut der Klarheit halber angepasst.
Thomas Ward
2

Die gesamte Idee, Symlinks zur Behebung eines Berechtigungsproblems zu verwenden, ist fehlerhaft und funktioniert nicht. Die Berechtigungen, die für den Symlink selbst angezeigt werden, sind größtenteils irrelevant. Sie können nicht verwendet werden, um die Berechtigungen des "echten" Verzeichnisses zu umgehen. Das Erstellen eines Symlinks von /var/www/html/moodlebis /home/andre/www/moodle/umgeht nicht die Berechtigungen für /home/andre/www/moodle/. Jeder, der etwas tun möchte, /var/www/html/moodlekann dies nur tun, wenn er über die erforderlichen Berechtigungen für verfügt /home/andre/www/moodle/.

Ihre Ausführung sudo chmod -R 775 moodle/tatsächlich tat eine Wirkung haben, aber anders , als Sie dachten , es nicht die Erlaubnis der Symlink nicht geändert haben, aber das Symlink Ziels /home/andre/www/moodle/.

Der 403-Fehler, den Sie auf dem Webserver erhalten, liegt wahrscheinlich daran, dass Ihr Webserver nicht über die erforderlichen Eingabeberechtigungen verfügt /home/andre. Dies ist kein "zusätzliches Problem", sondern aufgrund des gleichen Berechtigungsproblems.

Anstatt Symlinks zu verwenden, müssen Sie Berechtigungen festlegen, mit denen Sie die Dateien bearbeiten und der Webserver auf sie zugreifen kann (oder sie sogar bearbeiten kann, was von der Anwendung abhängt). Was genau diese Berechtigungen sind, hängt von Ihrem genauen Anwendungsfall (Ihrer Anwendungs- und Serverkonfiguration) ab.

Generell halte ich es für eine gute Idee, dass Sie die Dateien besitzen und über RW-Berechtigungen verfügen, der Webserver nur über die Gruppenberechtigungen Lesezugriff auf die Dateien hat und alle anderen Benutzer überhaupt keinen Zugriff haben.

Ein Berechtigungsbeispiel (das aufgrund fehlender Informationen möglicherweise nicht für Ihren Anwendungsfall geeignet ist):

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

Sie können sehen, dass das Verzeichnis über genügend Zugriff für Sie als Eigentümer verfügt, um es einzugeben und seinen Inhalt zu ändern. Der Webserver (in der Gruppe www-data) kann dies eingeben und lesen. Die Dateien selbst sind für Sie (den Eigentümer) lesbar und beschreibbar und für den Webserver (in der Gruppe www-data) lesbar . Alle anderen Benutzer haben überhaupt keinen Zugriff.

Bitte nehmen Sie dies nur als Beispiel. Der genaue Benutzer / die genaue Gruppe Ihres Webservers hängt von Ihrer Konfiguration ab. Und für Ihre Anwendung (Moodle) sind möglicherweise andere Berechtigungen erforderlich. Weitere Informationen finden Sie in der Dokumentation.

mastov
quelle
Einverstanden, aber das ist nicht hilfreich, wenn sie nicht wissen, wie sie die Berechtigungen richtig festlegen sollen, und sie werden auch auf andere Probleme stoßen.
Thomas Ward
@ThomasW .: Dann sollte die Frage, wie die Berechtigungen richtig eingestellt werden, eine neue Frage sein, einschließlich der erforderlichen Informationen, wie der Webserverkonfiguration, der gewünschten Art der Bearbeitung der Dateien und den Anforderungen der Anwendung.
Mastov
oder als richtige Antwort geschrieben - was ich gerade tue. Sie sollten auch niemals irgendetwas von / home / USER / für eine Website ausführen, da es Zugriff auf viele andere 'Benutzer'-Daten hat, wenn der Webserver nicht korrekt gepatcht oder konfiguriert ist.
Thomas Ward
@mastov Verstanden. Sie lösen viele Fragen, die ich mit Ihrer Erklärung hatte.
André Carvalho
2

Ausgezeichnete Antwort von Thomas Ward https://askubuntu.com/a/767534/717860

Sie können alle empfohlenen Schritte in nur 3 Befehlen anstelle von 8 Befehlen ausführen:

3 Befehle:

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

Führen Sie die gleichen Schritte aus wie die folgenden 8 Befehle:

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
quelle