GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Welche Berechtigungen sollten meine Website-Dateien/Ordner auf einem Linux-Webserver haben?

Lösung 1:

Bei der Entscheidung, welche Berechtigungen verwendet werden sollen, müssen Sie genau wissen, wer Ihre Benutzer sind und was sie benötigen. Ein Webserver interagiert mit zwei Arten von Benutzern.

Authentifiziert Benutzer haben ein Benutzerkonto auf dem Server und können mit bestimmten Privilegien ausgestattet werden. Dazu gehören normalerweise Systemadministratoren, Entwickler und Dienstkonten. Sie nehmen normalerweise Änderungen am System mit SSH oder SFTP vor.

Anonym Benutzer sind die Besucher Ihrer Website. Obwohl sie nicht berechtigt sind, direkt auf Dateien zuzugreifen, können sie eine Webseite anfordern und der Webserver handelt in ihrem Namen. Sie können den Zugriff anonymer Benutzer einschränken, indem Sie sorgfältig darauf achten, welche Berechtigungen der Webserverprozess hat. Auf vielen Linux-Distributionen läuft Apache als www-data Benutzer, aber es kann anders sein. Verwenden Sie ps aux | grep httpd oder ps aux | grep apache um zu sehen, welchen Benutzer Apache auf Ihrem System verwendet.

Hinweise zu Linux-Berechtigungen

Linux und andere POSIX-kompatible Systeme verwenden herkömmliche Unix-Berechtigungen. Es gibt einen ausgezeichneten Artikel auf Wikipedia über Dateisystemberechtigungen, daher werde ich hier nicht alles wiederholen. Aber es gibt ein paar Dinge, die Sie beachten sollten.

Das Ausführungsbit
Interpretierte Skripte (z. B. Ruby, PHP) funktionieren problemlos ohne die Ausführungsberechtigung. Nur Binärdateien und Shell-Skripte benötigen das Ausführungsbit. Um ein Verzeichnis zu durchlaufen (einzugeben), müssen Sie die Ausführungsberechtigung für dieses Verzeichnis haben. Der Webserver benötigt diese Berechtigung, um ein Verzeichnis aufzulisten oder darin enthaltene Dateien bereitzustellen.

Standardberechtigungen für neue Dateien
Wenn eine Datei erstellt wird, erbt sie normalerweise die Gruppen-ID desjenigen, der sie erstellt hat. Aber manchmal möchten Sie, dass neue Dateien die Gruppen-ID des Ordners erben, in dem sie erstellt wurden, also würden Sie das SGID-Bit im übergeordneten Ordner aktivieren.

Standard-Berechtigungswerte hängen von Ihrer umask ab. Die umask zieht Berechtigungen von neu erstellten Dateien ab, sodass der allgemeine Wert von 022 dazu führt, dass Dateien mit 755 erstellt werden. Wenn Sie mit einer Gruppe zusammenarbeiten, ist es hilfreich, Ihre umask auf 002 zu ändern, damit von Ihnen erstellte Dateien von Gruppenmitgliedern geändert werden können. Und wenn Sie die Berechtigungen hochgeladener Dateien anpassen möchten, müssen Sie entweder die umask für Apache ändern oder chmod ausführen, nachdem die Datei hochgeladen wurde.

Das Problem mit 777

Wenn Sie chmod 777 Ihrer Website haben Sie keinerlei Sicherheit. Jeder Benutzer des Systems kann jede Datei auf Ihrer Website ändern oder löschen. Aber im Ernst, denken Sie daran, dass der Webserver im Namen der Besucher Ihrer Website handelt und dass der Webserver jetzt in der Lage ist, dieselben Dateien zu ändern, die er ausführt. Wenn es Programmierschwachstellen auf Ihrer Website gibt, können diese ausgenutzt werden, um Ihre Website zu verunstalten, Phishing-Angriffe einzufügen oder Informationen von Ihrem Server zu stehlen, ohne dass Sie es jemals wissen.

Wenn Ihr Server auf einem bekannten Port läuft (was er verhindern sollte, um Nicht-Root-Benutzer daran zu hindern, weltweit zugängliche Listening-Dienste zu starten), bedeutet dies, dass Ihr Server von Root gestartet werden muss (obwohl jeder vernünftige Server sofort fallen wird). auf ein weniger privilegiertes Konto, sobald der Port gebunden ist). Mit anderen Worten, wenn Sie einen Webserver betreiben, bei dem die ausführbare Hauptdatei Teil der Versionskontrolle ist (z die ausführbare Datei) bei 777 erlaubt any Benutzer zum Ausführen von any als root ausführbar.

Definieren Sie die Anforderungen

  • Entwickler benötigen Lese-/Schreibzugriff auf Dateien, damit sie die Website aktualisieren können
  • Entwickler benötigen Lese-/Schreib-/Ausführungsrechte für Verzeichnisse, damit sie sich umsehen können
  • Apache benötigt Lesezugriff auf Dateien und interpretierte Skripte
  • Apache benötigt Lese-/Ausführungszugriff auf bedienbare Verzeichnisse
  • Apache benötigt Lese-/Schreib-/Ausführungszugriff auf Verzeichnisse für hochgeladene Inhalte

Von einem einzigen Benutzer verwaltet

Wenn nur ein Benutzer für die Wartung der Website verantwortlich ist, legen Sie ihn als Benutzereigentümer im Website-Verzeichnis fest und geben Sie dem Benutzer volle rwx-Berechtigungen. Apache benötigt immer noch Zugriff, damit er die Dateien bereitstellen kann, also legen Sie www-data als Gruppeneigentümer fest und geben Sie der Gruppe r-x-Berechtigungen.

In Ihrem Fall Eve, deren Benutzername möglicherweise eve lautet , ist der einzige Benutzer, der contoso.com verwaltet :

chown -R eve contoso.com/
chgrp -R www-data contoso.com/
chmod -R 750 contoso.com/
chmod g+s contoso.com/
ls -l
drwxr-s--- 2 eve      www-data   4096 Feb  5 22:52 contoso.com

Wenn Sie Ordner haben, die von Apache beschreibbar sein müssen, können Sie einfach die Berechtigungswerte für den Gruppeneigentümer ändern, sodass www-data Schreibzugriff hat.

chmod g+w uploads
ls -l
drwxrws--- 2 eve      www-data   4096 Feb  5 22:52 uploads

Der Vorteil dieser Konfiguration besteht darin, dass es für andere Benutzer im System schwieriger (aber nicht unmöglich*) wird, herumzuschnüffeln, da nur die Benutzer- und Gruppenbesitzer Ihr Website-Verzeichnis durchsuchen können. Dies ist nützlich, wenn Sie geheime Daten in Ihren Konfigurationsdateien haben. Seien Sie vorsichtig mit Ihrer umask! Wenn Sie hier eine neue Datei erstellen, werden die Berechtigungswerte wahrscheinlich standardmäßig auf 755 gesetzt. Sie können umask 027 ausführen sodass neue Dateien standardmäßig auf 640 (rw- r-- --- ).

Verwaltet von einer Gruppe von Benutzern

Wenn mehr als ein Benutzer für die Wartung der Website verantwortlich ist, müssen Sie eine Gruppe erstellen, die Sie zum Zuweisen von Berechtigungen verwenden. Es empfiehlt sich, für jede Website eine separate Gruppe zu erstellen und die Gruppe nach dieser Website zu benennen.

groupadd dev-fabrikam
usermod -a -G dev-fabrikam alice
usermod -a -G dev-fabrikam bob

Im vorherigen Beispiel haben wir den Gruppenbesitzer verwendet, um Apache Berechtigungen zu erteilen, aber jetzt wird dies für die Entwicklergruppe verwendet. Da der Benutzereigentümer für uns nicht mehr nützlich ist, ist das Setzen auf root eine einfache Möglichkeit, um sicherzustellen, dass keine Berechtigungen verloren gehen. Apache benötigt immer noch Zugriff, also gewähren wir dem Rest der Welt Lesezugriff.

chown -R root fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 775 fabrikam.com
chmod g+s fabrikam.com
ls -l
drwxrwxr-x 2 root     dev-fabrikam   4096 Feb  5 22:52 fabrikam.com

Wenn Sie Ordner haben, die von Apache beschreibbar sein müssen, können Sie Apache entweder zum Eigentümer des Benutzers oder zum Eigentümer der Gruppe machen. In jedem Fall hat es den erforderlichen Zugriff. Ich persönlich ziehe es vor, es zum Besitzer des Benutzers zu machen, damit die Entwickler weiterhin den Inhalt der Upload-Ordner durchsuchen und ändern können.

chown -R www-data uploads
ls -l
drwxrwxr-x 2 www-data     dev-fabrikam   4096 Feb  5 22:52 uploads

Obwohl dies ein gängiger Ansatz ist, gibt es einen Nachteil. Da jeder andere Benutzer auf dem System die gleichen Rechte für Ihre Website hat wie Apache, ist es für andere Benutzer einfach, Ihre Website zu durchsuchen und Dateien zu lesen, die möglicherweise geheime Daten enthalten, wie z. B. Ihre Konfigurationsdateien.

Du kannst deinen Kuchen haben und ihn auch essen

Dies kann weiter verbessert werden. Es ist völlig legal, dass der Eigentümer weniger Rechte hat als die Gruppe. Anstatt also den Eigentümer des Benutzers zu verschwenden, indem wir ihn root zuweisen, können wir Apache zum Eigentümer des Benutzers für die Verzeichnisse und Dateien auf Ihrer Website machen. Dies ist eine Umkehrung des Single-Maintainer-Szenarios, aber es funktioniert genauso gut.

chown -R www-data fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 570 fabrikam.com
chmod g+s fabrikam.com
ls -l
dr-xrwx--- 2 www-data  dev-fabrikam   4096 Feb  5 22:52 fabrikam.com

Wenn Sie Ordner haben, die von Apache beschreibbar sein müssen, können Sie einfach die Berechtigungswerte für den Benutzerbesitzer ändern, sodass www-data Schreibzugriff hat.

chmod u+w uploads
ls -l
drwxrwx--- 2 www-data  dev-fabrikam   4096 Feb  5 22:52 fabrikam.com

Bei dieser Lösung ist zu beachten, dass der Benutzerbesitzer neuer Dateien mit dem Ersteller übereinstimmt, anstatt auf www-data festgelegt zu werden. Daher können alle neu erstellten Dateien nicht von Apache gelesen werden, bis Sie sie ändern.

*Apache-Berechtigungstrennung

Ich habe bereits erwähnt, dass es anderen Benutzern tatsächlich möglich ist, auf Ihrer Website herumzuschnüffeln, unabhängig davon, welche Art von Privilegien Sie verwenden. Standardmäßig werden alle Apache-Prozesse als derselbe www-data-Benutzer ausgeführt, sodass jeder Apache-Prozess Dateien von allen anderen Websites lesen kann, die auf demselben Server konfiguriert sind, und manchmal sogar Änderungen vornehmen kann. Jeder Benutzer, der Apache dazu bringen kann, ein Skript auszuführen, kann denselben Zugriff erhalten, den Apache selbst hat.

Um diesem Problem entgegenzuwirken, gibt es in Apache verschiedene Ansätze zur Rechtetrennung. Jeder Ansatz ist jedoch mit verschiedenen Leistungs- und Sicherheitsnachteilen verbunden. Meiner Meinung nach sollte jede Site mit höheren Sicherheitsanforderungen auf einem dedizierten Server ausgeführt werden, anstatt VirtualHosts auf einem gemeinsam genutzten Server zu verwenden.

Zusätzliche Überlegungen

Ich habe es vorher nicht erwähnt, aber es ist normalerweise eine schlechte Praxis, Entwickler die Website direkt bearbeiten zu lassen. Bei größeren Sites ist es viel besser, eine Art Freigabesystem zu haben, das den Webserver aus den Inhalten eines Versionskontrollsystems aktualisiert. Der Single-Maintainer-Ansatz ist wahrscheinlich ideal, aber statt einer Person haben Sie automatisierte Software.

Wenn Ihre Website Uploads zulässt, die nicht bereitgestellt werden müssen, sollten diese Uploads irgendwo außerhalb des Webstamms gespeichert werden. Andernfalls stellen Sie möglicherweise fest, dass Personen Dateien herunterladen, die geheim sein sollten. Wenn Sie beispielsweise Schülern erlauben, Aufgaben einzureichen, sollten sie in einem Verzeichnis gespeichert werden, das nicht von Apache bedient wird. Dies ist auch ein guter Ansatz für Konfigurationsdateien, die Geheimnisse enthalten.

Für eine Website mit komplexeren Anforderungen sollten Sie sich die Verwendung von Zugriffskontrolllisten ansehen. Diese ermöglichen eine viel ausgefeiltere Kontrolle von Privilegien.

Wenn Ihre Website komplexe Anforderungen hat, möchten Sie vielleicht ein Skript schreiben, das alle Berechtigungen einrichtet. Testen Sie es gründlich und bewahren Sie es dann sicher auf. Es könnte Gold wert sein, wenn Sie jemals feststellen, dass Sie Ihre Website aus irgendeinem Grund neu erstellen müssen.

Lösung 2:

Ich frage mich, warum so viele Leute den "anderen" (o) Teil der Linux-Rechte verwenden (oder empfehlen), um zu kontrollieren, was Apache (und/oder PHP) tun kann. Indem Sie diesen rechten Teil auf etwas anderes als "0" setzen, erlauben Sie einfach der ganzen Welt, etwas mit der Datei/dem Verzeichnis zu tun.

Mein Ansatz ist folgender:

  • Ich erstelle zwei getrennte Benutzer. Eine für den SSH/SFTP-Zugriff (falls erforderlich), der alle Dateien besitzen wird, und eine für den PHP FastCGI-Benutzer (der Benutzer, unter dem die Website ausgeführt wird). Nennen wir diese Benutzer entsprechend bob und bob-www .
  • Bob volle Rechte haben (rwx auf Ordner, rw- auf Dateien), damit er/sie die gesamte Website lesen und bearbeiten kann.
  • Der PHP FastCGI-Prozess benötigt r-x Rechte auf Ordner und r-- Rechte auf Dateien, außer für sehr spezielle Ordner wie cache/ oder uploads/ , wo auch die Berechtigung "Schreiben" benötigt wird. Um PHP FastCGI diese Fähigkeit zu geben, wird es als bob-www ausgeführt , und bob-www wird dem automatisch erstellten Bob hinzugefügt Gruppe.
  • Wir stellen jetzt sicher, dass der Besitzer und die Gruppe aller Verzeichnisse und Dateien bob bob sind .
  • Etwas fehlt:sogar wir verwenden FastCGI, aber Apache benötigt immer noch Lesezugriff für statische Inhalte oder .htaccess-Dateien, die es zu lesen versucht, wenn AllowOverride auf etwas anderes als None eingestellt ist . Um die Verwendung des o zu vermeiden Teil der Rechte füge ich die www-data hinzu Benutzer zum Bob Gruppe.

Jetzt:

  • Um zu steuern, was der Entwickler tun kann, können wir mit dem u spielen Teil der Rechte (aber dazu der Hinweis unten).
  • Um zu kontrollieren, was Apache und PHP können, können wir mit dem g spielen Teil der Rechte.
  • Das o part immer auf 0 gesetzt, damit niemand sonst auf dem Server die Website lesen oder bearbeiten kann.
  • Es gibt kein Problem beim Bob Benutzer erstellt neue Dateien, da sie automatisch zu seiner Hauptgruppe gehören (bob ).

Dies ist eine Zusammenfassung, aber in dieser Situation, Bob SSH erlaubt ist. Wenn es keinen Benutzer geben sollte, der die Website ändern darf (z. B. ein Kunde ändert die Website nur über ein CMS-Admin-Panel und hat keine Linux-Kenntnisse), erstellen Sie trotzdem zwei Benutzer, geben Sie jedoch /bin/false ein als Schale für Bob und deaktivieren Sie die Anmeldung.

    adduser --home /var/www/bobwebsite --shell /bin/bash bob
    adduser --no-create-home --shell /bin/false --disabled-login --ingroup bob bob-www
    adduser www-data bob
    cd /var/www/bobwebsite
    chown -R bob:bob .
    find -type d -exec chmod 750 {} \;
    find -type f -exec chmod 640 {} \;

Hinweis: Menschen neigen dazu, die Begrenzung des u zu vergessen (Eigentümer-)Rechte ist meistens nutzlos und unsicher, da der Eigentümer einer Datei den chmod ausführen kann Befehl, auch die Rechte sind 000.

Sagen Sie mir, ob mein Ansatz Sicherheitsprobleme aufweist, da ich mir nicht 100 % sicher bin, aber es ist das, was ich verwende.

Ich denke, diese Konfiguration hat ein Problem:Wenn PHP/Apache eine neue Datei erstellt (z. B. Upload), gehört sie zu bob-www:bob , und Bob kann es nur lesen. Vielleicht kann setuid im Verzeichnis das Problem lösen.

Lösung 3:

Angesichts des Google-Rangs für die obige ausgezeichnete Antwort gibt es meiner Meinung nach eine Sache, die beachtet werden sollte, und ich kann anscheinend keine Notiz nach der Antwort hinterlassen.

Wenn Sie mit dem Beispiel fortfahren und vorhaben, www-data als Eigentümer und dev-fabrikam als Gruppe mit 570-Berechtigungen für das Verzeichnis (oder die Datei) zu verwenden, ist es wichtig zu beachten, dass Linux ignoriert setuid , sodass alle neuen Dateien dem Benutzer gehören, der sie erstellt hat. Das bedeutet, dass Sie nach dem Erstellen neuer Verzeichnisse und Dateien etwas Ähnliches verwenden müssen:

chown -R www-data /newdirectory/
chmod -R 570 /newdirectory/

In Ubuntu 12.04 für Rackspace OpenStack hatte ich ein seltsames Problem, bei dem ich die Berechtigungen 570 nicht zum Laufen bringen konnte, bis ich den Server neu gestartet hatte, wodurch das Problem auf magische Weise behoben wurde. Verlor wegen dieses scheinbar einfachen Problems in zunehmendem Maße Haare....

Lösung 4:

Ich gehe mit dieser Konfiguration:

  1. Alle Verzeichnisse außer lädt einen Satz auf Besitzer root hoch und Gruppe root , Berechtigungen für 0755 .
  2. Alle Dateien auf Besitzer root gesetzt und Gruppe root , Berechtigungen für 0644 .
  3. Ladet das Verzeichnis hoch, das auf Besitzer root eingestellt ist , Gruppe www-data , Berechtigungen für 1770 . Das Sticky-Bit erlaubt es dem Gruppeneigentümer nicht, das Verzeichnis und die darin enthaltenen Dateien zu entfernen oder umzubenennen.
  4. Innerhalb lädt der Ordner ein neues Verzeichnis mit www-data hoch Eigentümer, Benutzer und Gruppe und 0700 Berechtigungen für jeden www-data Benutzer, der Dateien hochlädt.
  5. Apache-Konfiguration:

Verweigern Sie AllowOverride und Index im Uploads-Verzeichnis, damit Apache .htaccess nicht liest Dateien, und Apache-Benutzer können den Inhalt des Upload-Ordners nicht indizieren:

<Directory /siteDir>
   Options -Indexes
</Directory>

<Directory /siteDir/uploadDir>
   AllowOverride none
</Directory>

6. php.ini Konfiguration:

open_basedir = /siteDir:/tmp:/usr/share/phpmyadmin
post_max_size = 5M
file_uploads = On
upload_max_filesize = 3M
max_file_uploads = 20

Mit dieser Konfiguration wird der www-data Der Benutzer kann nicht in andere Verzeichnisse als siteDir/ gelangen /tmp und /usr/share/phpmyadmin . Außerdem können Sie die maximale Dateigröße, die maximale Beitragsgröße und die maximale Anzahl an hochzuladenden Dateien in derselben Anfrage steuern.

Lösung 5:

Wenn Sie einen FTP-Benutzer namens „leo“ haben, der Dateien in das Webverzeichnis example.com hochladen muss, und Sie auch möchten, dass Ihr „Apache“-Benutzer in der Lage ist, Upload-Dateien/Sitzungen/Cache-Dateien im Cache-Verzeichnis zu erstellen, gehen Sie wie folgt vor:

Dieser Befehl weist example.com leo als Eigentümer und die Gruppe als Apache zu. Der Apache-Benutzer ist Teil der Gruppe Apache, sodass er die Berechtigungen der Apache-Gruppe erbt

chown -R leo:apache example.com

Ein weiterer Befehl, der die richtige Erlaubnis gewährleistet und auch Sicherheitsbedenken erfüllt.

chmod -R 2774 example.com

Hier steht die erste Nummer 2 für das Verzeichnis und stellt sicher, dass jede neu erstellte Datei in derselben Gruppe und denselben Eigentümerberechtigungen bleibt. 77 ist für Eigentümer und Gruppen, was bedeutet, dass sie vollen Zugriff haben. 4 bedeutet für andere, dass sie nur durchlesen können.

Folgendes ist hilfreich, um die Berechtigungsnummern zu verstehen

Number  Octal Permission Representation
0   No permission
1   Execute permission
2   Write permission
3   Execute and write permission: 1 (execute) + 2 (write) = 3
4   Read permission
5   Read and execute permission: 4 (read) + 1 (execute) = 5
6   Read and write permission: 4 (read) + 2 (write) = 6
7   All permissions: 4 (read) + 2 (write) + 1 (execute) = 7

Linux
  1. Was ist ein Linux-Benutzer?

  2. Soundthemen in Linux:Was jeder Benutzer wissen sollte

  3. Linux – Kann ein einzelner Benutzer mehrere Crontab-Dateien haben?

  4. Was sind Sparse-Dateien in Linux?

  5. Linux, warum kann ich nicht schreiben, obwohl ich Gruppenrechte habe?

Linux – Ordnerberechtigungen ändern?

Was führt dazu, dass Dateien Berechtigungen verlieren?

Listen Sie rekursiv den vollständigen absoluten Pfad von Dateien mit Berechtigungen in Linux auf

Als welcher Benutzer sollten Apache und PHP ausgeführt werden? Welche Berechtigungen sollten /var/www-Dateien haben?

Was sind die verschiedenen Möglichkeiten zum Festlegen von Dateiberechtigungen usw. unter gnu/linux

Wie erzwinge ich bestimmte Berechtigungen für neue Dateien/Ordner auf dem Linux-Dateiserver?