Wie richte ich Linux-Berechtigungen für den WWW-Ordner ein?

69

Aktualisierte Zusammenfassung

Das / var / www-Verzeichnis ist Eigentum von, root:rootwas bedeutet, dass niemand es verwenden kann und es völlig nutzlos ist. Da wir alle einen Webserver wollen, der tatsächlich funktioniert (und sich niemand als "root" anmelden sollte), müssen wir dies beheben.

Nur zwei Entitäten benötigen Zugriff.

  1. PHP / Perl / Ruby / Python benötigen alle Zugriff auf die Ordner und Dateien, da sie viele von ihnen erstellen (dh /uploads/). Diese Skriptsprachen sollten unter Nginx oder Apache (oder sogar unter FastCGI für PHP) ausgeführt werden.

  2. Die Entwickler

Wie bekommen sie Zugang? Ich weiß, dass jemand das schon einmal gemacht hat. Bei so vielen Milliarden von Websites würde man meinen, dass es mehr Informationen zu diesem Thema geben würde.


Ich weiß, dass 777 eine vollständige Lese- / Schreib- / Ausführungsberechtigung für Eigentümer / Gruppe / Andere hat. Das scheint also nicht richtig zu sein , da es zufälligen Benutzern volle Berechtigungen gibt.

Welche Berechtigungen müssen verwendet /var/wwwwerden, damit:

  1. Quellcodeverwaltung wie Git oder Svn
  2. Benutzer in einer Gruppe wie "Websites" ( oder sogar zu "WWW-Daten" hinzugefügt )
  3. Server wie Apache oder Lighthttpd
  4. Und PHP / Perl / Ruby

Können alle dort Dateien (und Verzeichnisse) lesen, erstellen und ausführen?

Wenn ich richtig liege, werden Ruby- und PHP-Skripte nicht direkt "ausgeführt", sondern an einen Interpreter übergeben. Es ist also nicht erforderlich, Berechtigungen für Dateien in /var/www... auszuführen . Es scheint also die richtige Erlaubnis zu sein, chmod -R 1660die das machen würde

  1. Alle Dateien, die von diesen vier Entitäten gemeinsam genutzt werden können
  2. Alle Dateien sind versehentlich nicht ausführbar
  3. Blockieren Sie alle anderen Personen vollständig aus dem Verzeichnis
  4. Setzen Sie den Berechtigungsmodus für alle zukünftigen Dateien auf "sticky"

Ist das richtig?

Update 1: Ich habe gerade festgestellt, dass für Dateien und Verzeichnisse möglicherweise unterschiedliche Berechtigungen erforderlich sind. Ich habe oben über Dateien gesprochen, daher bin ich mir nicht sicher, welche Verzeichnisberechtigungen erforderlich sind.

Update 2: Die Ordnerstruktur /var/wwwverändert sich drastisch, da eine der vier oben genannten Entitäten immer Ordner und Unterordner mit einer Tiefe von mehreren Ebenen hinzufügt (und manchmal entfernt). Sie erstellen und entfernen auch Dateien, auf die die anderen 3 Entitäten möglicherweise Lese- / Schreibzugriff benötigen. Daher müssen die Berechtigungen die vier oben genannten Schritte für Dateien und Verzeichnisse ausführen. Da keiner von ihnen eine Ausführungserlaubnis benötigen sollte (siehe Frage zu Ruby / PHP oben), würde ich davon ausgehen, dass die rw-rw-r--Erlaubnis alles ist, was benötigt wird und absolut sicher ist, da diese vier Entitäten von vertrauenswürdigem Personal (siehe Nr. 2) und allen anderen Benutzern ausgeführt werden Das System hat nur Lesezugriff.

Update 3: Dies ist für persönliche Entwicklungsmaschinen und private Unternehmensserver. Keine zufälligen "Web-Kunden" wie ein gemeinsamer Host.

Update 4: In diesem Artikel von slicehost wird anscheinend am besten erklärt, was zum Einrichten von Berechtigungen für Ihren WWW-Ordner erforderlich ist. Ich bin mir jedoch nicht sicher, welcher Benutzer oder welche Gruppe Apache / Nginx mit PHP oder Svn / Git ausführt und wie ich sie ändern soll.

Update 5: Ich habe (glaube ich) endlich einen Weg gefunden, dies alles zum Laufen zu bringen (Antwort unten). Ich weiß jedoch nicht, ob dies der richtige und SICHERE Weg ist, dies zu tun. Deshalb habe ich ein Kopfgeld angefangen. Die Person mit der besten Methode zum Sichern und Verwalten des WWW-Verzeichnisses gewinnt.

Xeoncross
quelle

Antworten:

47

Nach weiteren Recherchen scheint es eine andere (möglicherweise bessere) Möglichkeit zu sein, dies zu beantworten, indem der www-Ordner so eingerichtet wird.

  1. sudo usermod -a -G developer user1 (füge jeden Benutzer der Entwicklergruppe hinzu)
  2. sudo chgrp -R developer /var/www/site.com/ damit Entwickler dort arbeiten können
  3. sudo chmod -R 2774 /var/www/site.com/ damit nur Entwickler Dateien erstellen / bearbeiten können (andere / world können lesen)
  4. sudo chgrp -R www-data /var/www/site.com/uploads damit www-daten (apache / nginx) uploads erstellen können.

Da gitder Befehl so ausgeführt wird, wie der Benutzer ihn aufruft, sollte er in der Lage sein, Ordner zu erstellen, PHP-Dateien zu bearbeiten und das Git-Repository zu verwalten, solange sich der Benutzer in der Gruppe "Entwickler" befindet.

Hinweis: In Schritt (3): "2" in 2774 bedeutet "Gruppen-ID festlegen" für das Verzeichnis. Dadurch erben neue darin erstellte Dateien und Unterverzeichnisse die Gruppen-ID des übergeordneten Verzeichnisses (anstelle der primären Gruppe des Benutzers). Referenz: http://en.wikipedia.org/wiki/Setuid#setuid_and_setgid_on_directories

Xeoncross
quelle
Sieht für mich vernünftig aus.
Wazoox
Gut. Vielleicht werde ich diesen Ansatz anwenden, wenn ich dies mit ein paar weiteren Personen bestätigen kann. Es scheint die beste Antwort zu sein, die ich aus Menschen herausholen konnte.
Xeoncross
Sie geben nicht an, wer der Eigentümer der Dateien sein soll. Würdest du es als root belassen? Dann können nur Sudoer Ihren Upload-Ordner bearbeiten (wahrscheinlich nicht das, was Sie beabsichtigt haben).
Nic
Ja, root würde der Besitzer bleiben. Da der Gruppeneigentümer jetzt "Entwickler" ist (und über die Berechtigung "wrx" verfügt), können auch alle Entwickler (und Apache / Nginx) lesen. Kein sudo nötig.
Xeoncross
7
Eine weitere Sache, auf die Sie achten sollten, ist umask. Viele Systeme haben eine Standard-Umask von 022, wodurch Schreibberechtigungen für Gruppen und für die Öffentlichkeit für neue Dateien entfernt werden. Ich vermute, Sie möchten 002 (kein Schreiben für die Öffentlichkeit) oder 007 (kein Zugriff für die Öffentlichkeit). Sie können die umask in der Apache-Konfiguration und / oder in den Startskripten für jeden Prozess festlegen, der Zugriff auf das Verzeichnis benötigt. Vergessen Sie nicht, dies zu / etc / profile oder / etc / bashrc hinzuzufügen, damit es auch für Ihre Entwickler standardmäßig festgelegt ist
Mark Porter
8

Ich bin nicht sicher, ob es "richtig" ist, aber hier ist, was ich auf meinem Server mache:

  • / var / www enthält einen Ordner für jede Website.
  • Jede Website hat einen festgelegten Eigentümer, der als Eigentümer aller Dateien und Ordner im Verzeichnis der Website festgelegt wird.
  • Alle Benutzer, die die Website verwalten, werden zu einer Gruppe für die Website zusammengefasst.
  • Diese Gruppe wird als Gruppeneigentümer aller Dateien und Ordner im Verzeichnis festgelegt.
  • Alle Dateien oder Ordner, die vom Webserver geschrieben werden müssen (z. B. PHP), haben ihren Besitzer in www-data geändert, den Benutzer, unter dem Apache ausgeführt wird.

Denken Sie daran, dass das Ausführungsbit für Verzeichnisse aktiviert sein sollte, damit Sie den Inhalt auflisten können.

Nic
quelle
Wie erstellt git / svn oder PHP dann neue Ordner?
Xeoncross
2
PHP läuft im gleichen Benutzerkontext wie der Webserver, sodass Dateien und Ordner in jedem Verzeichnis des Webservers erstellt werden können. In der Regel gibt es nur wenige solche Ordner (z. B. / uploads /). Ich bin mir bei Git / Svn nicht sicher. Können Sie sie dem Gruppenkonto hinzufügen, das die Website kontrolliert?
Nic
scheinbar läuft git so, wie der benutzer es ausführt - genau wie jedes andere tool.
Xeoncross
Fügen Sie dann den Git-Benutzer der Apache-Gruppe hinzu und erteilen Sie der Ordnergruppe Schreibberechtigungen.
David Rickman
Ich habe gerade gesagt, git hat keinen Benutzer - es wird als der aktuelle Benutzer ausgeführt, der es verwendet.
Xeoncross
7

Nach weiteren Recherchen scheint es, dass git / svn- TOOLS KEIN Problem sind, da sie so ausgeführt werden, wie sie von jedem Benutzer verwendet werden. (Allerdings sind die git / svn-Daemons eine andere Sache!) Alles, was ich mit git erstellt / geklont habe, hatte meine Berechtigungen und das git-Tool wurde aufgelistet, in /usr/bindas diese These passt.

Git Berechtigungen gelöst.

Benutzerberechtigungen scheinen lösbar zu sein, wenn alle Benutzer, die Zugriff auf das WWW-Verzeichnis benötigen, zu der www-dataGruppe hinzugefügt werden, unter der Apache (und Nginx) ausgeführt werden.

Eine Antwort auf diese Frage scheint also so zu lauten :

Standardmäßig /var/wwwgehört root:rootund niemand kann dort Dateien hinzufügen oder ändern.

1) Ändern Sie den Gruppeneigentümer

Zuerst müssen wir die www-Verzeichnisgruppe ändern, damit sie "www-data" anstelle der "root" -Gruppe gehört

sudo chgrp -R www-data /var/www

2) Benutzer zu www-Daten hinzufügen

Dann müssen wir den aktuellen Benutzer (und alle anderen) zur WWW-Datengruppe hinzufügen

sudo usermod -a -G www-data demousername

3) CHMOD www Verzeichnis

Ändern Sie die Berechtigungen so, dass NUR der Eigentümer (root) und alle Benutzer in der Gruppe "www-data" Dateien und Verzeichnisse rwx (lesen / schreiben / ausführen) können ( niemand anderes sollte überhaupt darauf zugreifen können ).

sudo chmod -R 2770 /var/www

Jetzt können alle Dateien und Verzeichnisse, die von einem Benutzer erstellt wurden, der Zugriff hat (dh in der Gruppe "www-data"), von Apache und damit von PHP gelesen / geschrieben werden.

Ist das richtig? Was ist mit Dateien, die PHP / Ruby erstellt - können die WWW-Datenbenutzer darauf zugreifen?

Xeoncross
quelle
6
Mir gefällt die Idee nicht, dass alle Webdateien mit PHP beschreibbar sind. Sie erhöht Ihre potenzielle Gefährdung, wenn eine Skript-Sicherheitslücke besteht.
Nic
Ok, ich weiß, dass ich PHP verwende, um viele Text-, Teer-, Protokoll- und Bilddateien (plus Ordner) zu erstellen , also ging ich nur davon aus, dass alles beschreibbar sein sollte. Vielleicht sollten Ihr Recht und PHP jedoch nur in der Lage sein, DATEIEN ZU ÄNDERN , DIE ES ERSTELLT, was harmlos wäre, da 99% aller PHP-Apps niemals Skriptdateien erstellen. Die andere Möglichkeit scheint darin zu bestehen, nur bestimmten Verzeichnissen PHP-Schreibzugriff (/ uploads /) zu erlauben, was seitdem nicht möglich ist, da PHP dann immer noch verwendet werden kann, um dort etwas Schlechtes zu erstellen. Irgendwelche Ideen?
Xeoncross
2
Versuchen Sie, Skript und Daten getrennt zu halten. Selbst wenn ein Angreifer etwas in / uploads / ablegen kann, sollte es nicht ausführbar sein. Sicherheit in Schichten ist der Schlüssel.
Nic
6

Klebrigkeit ist keine Vererbung von Berechtigungen. Stickiness in einem Verzeichnis bedeutet, dass nur der Eigentümer einer Datei oder der Verzeichnisbesitzer diese Datei im Verzeichnis umbenennen oder löschen kann, obwohl die Berechtigungen etwas anderes angeben. Also 1777 auf / tmp /.

In klassischem Unix gibt es keine Vererbung von Berechtigungen basierend auf dem Dateisystem, sondern nur auf der aktuellen umask des Prozesses. Bei * BSD oder Linux mit setgid im Verzeichnis wird das Gruppenfeld der neu erstellten Dateien auf dasselbe wie das des übergeordneten Verzeichnisses gesetzt. Für alles Weitere müssen Sie sich mit ACLs befassen, wobei die 'Standard'-ACL für Verzeichnisse verwendet wird, damit Sie Berechtigungen erben können.

Sie sollten zunächst Folgendes definieren: * Welche Benutzer haben Zugriff auf das System? * Was ist Ihr Bedrohungsmodell?

Wenn Sie zum Beispiel Webhosting mit mehreren Kunden durchführen und nicht möchten, dass diese sich gegenseitig die Dateien anzeigen, können Sie eine gemeinsame Gruppe "Webcusts" für alle diese Benutzer und den Verzeichnismodus 0705 verwenden. Dann werden die Dateien von bereitgestellt Der Webserver-Prozess ( nicht in "webcusts") sieht die anderen Perms und ist zulässig. Kunden können die Dateien nicht sehen und die Benutzer können mit ihren eigenen Dateien herumspielen. Dies bedeutet nicht jedoch, dass der Moment , den Sie CGI oder PHP können Sie haben , um sicherzustellen , dass die Prozesse wie die spezifischen Benutzer ausgeführt (gute Praxis wie auch immer, für mehrere Anwender-on-one-Host, für die Rechenschaftspflicht). Andernfalls könnten die Kunden durch ein CGI mit den Dateien der jeweils anderen Benutzer in Konflikt geraten.

Wenn jedoch der Laufzeitbenutzer für eine Website derselbe wie der Eigentümer der Website ist, treten Probleme auf, wenn Sie im Falle einer Sicherheitslücke im Skript nicht in der Lage sind, Inhalte vor Missbrauch zu schützen. Hier gewinnen dedizierte Hosts, sodass Sie einen Laufzeitbenutzer haben können, der sich vom Eigentümer des statischen Inhalts unterscheidet, und sich nicht so sehr um die Interaktion mit anderen Benutzern kümmern müssen.

Phil P
quelle
Gute Antwort. Unter MacOS X verhält sich das System so, als ob sich das SGID-Bit automatisch in den Verzeichnissen befindet. Das Sticky-Bit bedeutet normalerweise, dass Sie die Datei nur entfernen können, wenn Sie sie schreiben können. Das heißt, jeder kann eine öffentlich beschreibbare Datei in / tmp entfernen. Unter MacOS X ist / tmp ein Symlink zu einem privaten Verzeichnis für den Benutzer - es findet also keine gemeinsame Nutzung statt.
Jonathan Leffler
Vielen Dank für die Antwort, ich habe die Frage mit weiteren Informationen aktualisiert.
Xeoncross
Jonathan: Das Sticky-Bit bedeutet, dass nur der Eigentümer des Verzeichnisses oder der Eigentümer der Datei es umbenennen oder löschen kann (dh auf seinen Eintrag im Verzeichnis 'file' reagieren). Berechtigungen für die einzelne Datei werden für diese Verzeichnisvorgänge ( rename(), unlink()) nicht berücksichtigt, sondern nur für Aktionen für die Datei selbst ( open()). Dies ist das "übliche" Verhalten.
Phil P
2

Ich glaube, dass der beste Weg, dies zu tun, die Verwendung von Posix-ACLs ist. Sie sind komfortabel zu bedienen und bieten alle Funktionen, die Sie benötigen.

http://en.wikipedia.org/wiki/Access_control_list#Filesystem_ACLs

Krawattenkämpfer
quelle
+1 für hilfreiche Informationen zu Zugriffssteuerungslisten. Ich möchte jedoch nicht, dass zusätzlicher Müll das System blockiert, nur um einen einfachen Server mit ein paar Entwicklern zu verwalten. Ich bin auch nicht zufrieden mit dem Neukompilieren des Kernels, um ACLs zu verwenden.
Xeoncross
@Xeoncross: ACLs machen nichts kaputt. Sie sind nur Metainformationen wie normale Dateiberechtigungen. Es ist nicht alles "extra" und kompliziert, ich glaube, dass es der einfachste und beste Weg ist, um Berechtigungen zu verwalten, anstatt eine verwirrende Lösung zu finden. Haben Sie keine Angst, steigen Sie einfach wieder mit acl ein und probieren Sie es aus!
Tie-Fighter
1

Der Eigentümer der Datei sollte die Person sein, die sie erstellt, während die Gruppe aus WWW-Daten bestehen sollte. Der Modus für Verzeichnisse / Dateien ist dann im Allgemeinen 755/644. Während für Verzeichnisse und Dateien die Gruppe Schreibzugriff benötigt, ist der Mod 775/664. Angenommen, Paddy ist der Entwickler. Insgesamt macht dies:

chown -R paddy:www-data /var/www/websiteindevelopment
chmod -R 755 /var/www/websiteindevelopment
chmod -R 775 /var/www/websiteindevelopment/directorywritablebygroup
find /var/www/websiteindevelopment -type f -perm 755 -print -exec chmod 644 {} \;  
find /var/www/websiteindevelopment -type f -perm 775 -print -exec chmod 664 {} \;
Jonny
quelle
0

Als Ergänzung zur Antwort von @ Xeoncross halte ich es für sinnvoll, die Berechtigungen für Dateien und Verzeichnisse separat zu konfigurieren.

sudo find /var/www -type d -exec chmod 775 {} \;  # Change permissions of directories to rwxrwxr-x
sudo find /var/www -type f -exec chmod 664 {} \;  # Change file permissions to rw-rw-r--

Dadurch können Entwickler Verzeichnisse in / var / www erstellen und ändern. Dies scheint wichtig zu sein, da Entwickler möglicherweise zusätzliche Verzeichnisse erstellen oder ein Verzeichnis entfernen müssen, das nicht mehr benötigt wird.

Außerdem können Entwickler Code-Dateien erstellen und ändern (HTML-, PHP-Dateien und ähnliches lesen). Erlaubt jedoch weiterhin nur den Lesezugriff für alle anderen.

MikeyE
quelle