it-swarm.com.de

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

Aktualisierte Zusammenfassung

Das Verzeichnis/var/www gehört root:root, Was bedeutet, dass niemand es verwenden kann und es völlig nutzlos ist. Da wir alle einen Webserver wollen, der tatsächlich funktioniert (und niemand sollte sich als "root" anmelden), 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 davon erstellen (d. H. /uploads/). Diese Skriptsprachen sollten unter Nginx oder Apache (oder sogar einer anderen Sache wie FastCGI für PHP) ausgeführt werden.

  2. Die Entwickler

Wie bekommen sie Zugang? Ich weiß, dass jemand, irgendwo dies schon einmal getan hat. Bei so vielen Milliarden Websites würden Sie denken, dass es mehr Informationen zu diesem Thema geben würde.


Ich weiß, dass 777 die vollständige Lese-/Schreib-/Ausführungsberechtigung für Eigentümer/Gruppe/andere hat. Das scheint also nicht so zu sein erforderlich Richtig, da zufällige Benutzer die vollen Berechtigungen erhalten.

Welche Berechtigungen müssen für /var/www Verwendet werden, damit:

  1. Quellcodeverwaltung wie git oder svn
  2. Benutzer in einer Gruppe wie "Websites" ( oder sogar zu "www-data" 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, Ruby und PHP Skripte werden nicht direkt "ausgeführt" - sondern an einen Interpreter übergeben. Daher ist keine Ausführungsberechtigung für erforderlich Dateien in /var/www ...? Daher scheint es, als wäre die richtige Berechtigung chmod -R 1660, die machen würde

  1. alle Dateien, die von diesen vier Entitäten gemeinsam genutzt werden können
  2. alle Dateien versehentlich nicht ausführbar
  3. blockieren Sie alle anderen 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 Dateien und Verzeichnisse möglicherweise unterschiedliche Berechtigungen benötigen. Ich habe oben über Dateien gesprochen, daher bin ich mir nicht sicher, welche Verzeichnisberechtigungen dies haben würden muss sein.

Update 2: Die Ordnerstruktur von /var/www Ändert sich drastisch, da eine der vier oben genannten Entitäten immer Ordner und manchmal hinzufügt (und manchmal entfernt) Unterordner viele Ebenen tief. Sie erstellen und entfernen auch Dateien, auf die die anderen drei Entitäten möglicherweise Lese-/Schreibzugriff benötigen. Daher müssen die Berechtigungen die vier oben genannten Schritte sowohl für Dateien als auch für Verzeichnisse ausführen. Da keiner von ihnen eine Ausführungsberechtigung benötigen sollte (siehe Frage zu Ruby/PHP oben), würde ich davon ausgehen, dass die Berechtigung rw-rw-r-- Alles ist, was benötigt wird und absolut sicher ist, da diese vier Entitäten von vertrauenswürdigem Personal ausgeführt werden (siehe # 2) und alle anderen Benutzer im System haben nur Lesezugriff.

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

Update 4: Dieser Artikel von slicehost scheint am besten zu erklären, 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 OR svn/git) ausgeführt wird und wie sie geändert werden sollen.

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 gestartet. Die Person, die die beste Methode zum Sichern und Verwalten des WWW-Verzeichnisses hat, gewinnt.

70
Xeoncross

Nach weiteren Recherchen scheint es eine andere (möglicherweise bessere) Möglichkeit zu sein, dies zu beantworten, indem Sie den WWW-Ordner so einrichten.

  1. Sudo usermod -a -G developer user1 (füge jeden Benutzer zur 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-data (Apache/nginx) Uploads erstellen können.

Da git so ausgeführt wird, wie der Benutzer es aufruft, sollte der Benutzer, solange er sich in der Gruppe "Entwickler" befindet, in der Lage sein, Ordner zu erstellen, PHP Dateien und Verwalten Sie das Git-Repository.

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

49
Xeoncross

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 bestimmten Eigentümer, der als Eigentümer aller Dateien und Ordner im Verzeichnis der Website festgelegt wird.
  • Alle Benutzer, die die Website pflegen, werden in eine Gruppe für die Website eingeteilt.
  • Diese Gruppe wird als Gruppeneigentümer aller Dateien und Ordner im Verzeichnis festgelegt.
  • Bei allen Dateien oder Ordnern, die vom Webserver (z. B. PHP) geschrieben werden müssen, wurde der Eigentümer in www-data geändert, den Benutzer, unter dem Apache ausgeführt wird.

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

8
Nic

Nach weiteren Recherchen scheint es, dass git/svn TOOLS KEIN Problem sind, da sie so ausgeführt werden, wie der Benutzer sie verwendet. (Die Git/SVN-Dämonen sind jedoch eine andere Sache!) Alles, was ich mit Git erstellt/geklont habe, hatte meine Berechtigungen und das Git-Tool wurde in /usr/bin Aufgeführt, was zu dieser These passt.

Git-Berechtigungen gelöst.

Benutzerberechtigungen scheinen lösbar zu sein, indem alle Benutzer, die Zugriff auf das Verzeichnis www benötigen, zur Gruppe www-data Hinzugefügt werden, unter der Apache (und nginx) ausgeführt werden.

Es scheint also, dass eine Antwort auf diese Frage so lautet:

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

1) Ändern Sie den Gruppeneigentümer

Zuerst müssen wir die www-Verzeichnisgruppe so ändern, dass 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 ((== --- ==), die sonst niemand sein sollte) Zugriff darauf ).

Sudo chmod -R 2770 /var/www

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

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

7
Xeoncross

Klebrigkeit ist keine Berechtigungsvererbung. Klebrigkeit 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. So 1777 auf/tmp /.

In klassischem Unix gibt es keine Berechtigungsvererbung basierend auf dem Dateisystem, nur auf der Umask des aktuellen Prozesses. Unter * BSD oder Linux mit setgid im Verzeichnis wird das Gruppenfeld der neu erstellten Dateien auf das des übergeordneten Verzeichnisses festgelegt. Für weitere Informationen müssen Sie sich mit ACLs befassen, mit der 'Standard'-ACL für Verzeichnisse, mit denen Sie Berechtigungen geerbt haben.

Sie sollten zunächst definieren: * welche Benutzer Zugriff auf das System haben * was Ihr Bedrohungsmodell ist

Wenn Sie beispielsweise Webhosting mit mehreren Kunden durchführen und nicht möchten, dass diese sich gegenseitig Dateien anzeigen, verwenden Sie möglicherweise eine gemeinsame Gruppe "Webcusts" für alle diese Benutzer und einen Verzeichnismodus von 0705. Anschließend werden Dateien von bereitgestellt Der Webserver-Prozess (nicht in "Webcusts") sieht die anderen Dauerwellen und ist zulässig. Kunden können die Dateien der anderen nicht sehen und die Benutzer können mit ihren eigenen Dateien herumspielen. Dies bedeutet jedoch, dass in dem Moment, in dem Sie CGI oder PHP you have) zulassen, um sicherzustellen, dass die Prozesse als bestimmter Benutzer ausgeführt werden (bewährte Vorgehensweise für mehrere Benutzer auf einem Host, aus Gründen der Verantwortlichkeit). Andernfalls könnten Kunden mit den Dateien der anderen Benutzer herumspielen, indem sie dies von einem CGI ausführen lassen.

Wenn der Laufzeitbenutzer einer Website jedoch mit dem Eigentümer der Website identisch ist, haben Sie Probleme damit, Inhalte im Falle einer Sicherheitslücke im Skript nicht vor Missbrauchern 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.

6
Phil P

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

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

2
Tie-fighter

Der Eigentümer der Datei sollte die Person sein, die sie erstellt, während die Gruppe www-Daten sein 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 ergibt 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 {} \;
1
Jonny

Neben der Antwort von @ Xeoncross halte ich es für sinnvoll, 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--

Auf diese Weise 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 nicht mehr benötigtes Verzeichnis entfernen müssen.

Entwickler können damit auch Codedateien erstellen und ändern (HTML lesen, PHP Dateien und dergleichen). Es wird jedoch weiterhin nur Lesezugriff für alle anderen Benutzer zugelassen.

0
MikeyE