it-swarm.com.de

Welchen Benutzer sollten Apache und PHP als ausführen? Welche Berechtigungen sollten / var / www-Dateien haben?

Ich habe gerade eine Ubuntu 11.10-Box hochgefahren und dann apt-get install Apache2 php5 Ausgeführt, um Apache2 und PHP 5 auf der Box zu installieren. Jetzt fungiert sie als "Webserver" und lädt die Seite "Es funktioniert!". Jetzt versuche ich, die Sicherheit zu erhöhen, und habe folgende Fragen zu Linux-Webservern:

  1. Als wen sollte Apache laufen?
  2. In welcher Gruppe sollte dieser Benutzer sein?
  3. Welche Pakete können dazu führen, dass PHP (und Apache?) Als Eigentümer der Dateien ausgeführt wird? (Wie auf gemeinsam genutzten Webhosts) Soll ich diese Pakete verwenden? Sind sie einfach/machbar zu warten? auf einem kleinen System?
  4. Was sollten die Standardberechtigungen für Dateien und Ordner sein, die mit Apache als www-data Im Web bereitgestellt werden? Für Apache/PHP als Benutzer?

Ich habe die folgenden Schritte unternommen, um das Standardeinstellungen zu überprüfen:

Dateistruktur

Wenn ich cd / Und eine ls -al Auflistung des Inhalts mache, sehe ich /var:

drwxr-xr-x 13 root root  4096 2012-02-04 20:47 var/

Wenn ich cd in var und ls -al Mache, sehe ich:

drwxr-xr-x  2 root root  4096 2012-02-04 20:47 www/

Schließlich sehe ich in /var/www:

drwxr-xr-x  2 root root 4096 2012-02-04 20:47 ./
drwxr-xr-x 13 root root 4096 2012-02-04 20:47 ../
-rw-r--r--  1 root root  177 2012-02-04 20:47 index.html

Mein Schlüssel zum Mitnehmen ist, dass alle diese Dateien bisher zu root:root Gehören, Dateien die Berechtigung 644 haben und Verzeichnisse die Berechtigung 755 haben.

Apaches Berechtigungen

Wenn ich eine Datei als root in /var/www/test.php Mit dem Inhalt erstelle:

<?php echo Shell_exec('whoami');

und lade diese Datei in einen Browser, der mir www-data sagt, was dasselbe ist wie in der /etc/Apache2/envvars - Datei:

export Apache_RUN_USER=www-data
export Apache_RUN_GROUP=www-data

Wenn ich ps aux | grep -i Apache Mache, sehe ich Folgendes:

root      1916  1.2 104664  7488 Ss   20:47 /usr/sbin/Apache2 -k start
www-data  1920  0.8 105144  5436 S    20:47 /usr/sbin/Apache2 -k start
www-data  1921  1.0 105144  6312 S    20:47 /usr/sbin/Apache2 -k start
www-data  1922  0.7 104688  4624 S    20:47 /usr/sbin/Apache2 -k start
www-data  1923  0.7 104688  4624 S    20:47 /usr/sbin/Apache2 -k start
www-data  1924  0.7 104688  4624 S    20:47 /usr/sbin/Apache2 -k start
www-data  1925  0.7 104688  4624 S    20:47 /usr/sbin/Apache2 -k start

Also, als wen läuft Apache? Es sieht so aus, als ob der erste Prozess root ist, möglicherweise aus dem Skript /etc/init.d/Apache, Als das System gestartet wurde, und die anderen als www-data Aus dem ersten. Ist das korrekt?

Wenn ich als nächstes groups www-data Eingebe, sehe ich www-data : www-data - es scheint also nur in der Gruppe www-data Zu sein. Ich vermute, dass dies ebenfalls Standard ist.

Shared Hosting und Sicherheit

Wenn ich die Dinge richtig verstehe, wenn Apache als www-data Ausgeführt wird und ich möchte, dass Apache ein Verzeichnis lesen kann, muss das Bit x für die Weltgruppe (andere) gesetzt werden ( o+x), Und das muss auch für alle übergeordneten Verzeichnisse in der gesamten Kette festgelegt werden (www, var). Und wenn ich möchte, dass Apache aus einer Datei lesen kann, muss das Bit o+r Gesetzt werden.

Leider glaube ich, dass dies eine Sicherheitslücke für mehrere Anwendungen und/oder mehrere Benutzer auf derselben Linux-Box darstellt: Alle Webdateien müssen weltweit lesbar sein und können daher auch von anderen Anwendungen und anderen Benutzern im System aufgerufen werden. Wenn eine auf dem System installierte Anwendung eine Sicherheitslücke aufwies, die rohe, nicht validierte Benutzereingaben ermöglichte, die dann von PHP ausgeführt wurden, konnte ein Remoteangreifer alle anderen Dateien auf dem Websystem durchsuchen, die weltweit lesbar waren. Wenn die Box mehrere Benutzer hatte und ein Benutzer den Pfad der Webdateien eines anderen Benutzers kannte, konnte er den Dateiinhalt lesen (und vertrauliche Dinge wie Datenbankverbindungszeichenfolgen usw. sehen).

Ich habe von zwei Paketen gehört, suphp und phpsuexec, die sich damit befassen, dass Benutzerdateien "als sie" auf einem gemeinsam genutzten System bereitgestellt werden. Eine der Schönheiten dabei ist, dass Webanwendungen (wie Wordpress) Dateien erstellen und ändern können - sehr hilfreich beim Hinzufügen von Themen, Plugins und beim Aktualisieren von Software. Natürlich ist es wahrscheinlich sicherer, diese Dinge manuell zu erledigen, aber kann vielleicht mit einem der oben genannten Pakete ein Kompromiss eingegangen werden? Oder indem Sie möglicherweise chown verwenden, um die Verzeichnisgruppe wordpress zu www-data Zu machen und das Sticky-Bit für die Gruppe zu setzen (g+s)?

Ich habe diese nur als Endbenutzer eines Webhosting-Unternehmens verwendet, daher kenne ich ihre Vor- und Nachteile nicht und weiß nicht, ob sie überhaupt auf einem kleinen System installiert werden können oder ob es ein anderes gibt Sicherheitsmaßnahmen, die ich stattdessen anwenden sollte, aber ich dachte, ich würde sie hier erwähnen, da sie eine Möglichkeit darstellen, einige meiner Bedenken auszuräumen.

Zurück zu den Fragen

  1. Als wen sollte Apache laufen?
  2. In welcher Gruppe sollte dieser Benutzer sein?
  3. Welche Pakete können dazu führen, dass PHP (und Apache?) Als Eigentümer der Dateien ausgeführt wird? (Wie auf gemeinsam genutzten Webhosts) Soll ich diese Pakete verwenden? Sind sie einfach/machbar zu warten? auf einem kleinen System?
  4. Was sollten die Standardberechtigungen für Dateien und Ordner sein, die mit Apache als www-data Im Web bereitgestellt werden? Für Apache/PHP als Benutzer?
41
cwd
  1. nicht root
  2. nicht root
  3. SuEXEC
  4. Hängt davon ab. 644 für Dateien und 755 für Ordner sind eine sichere Standardeinstellung.

Ändern Sie den Besitz von nichts in www-Daten, es sei denn, Sie möchten, dass PHP den Inhalt dieser Datei/dieses Ordners bearbeiten kann

Unabhängig davon, was Sie sonst noch tun: Ordner benötigen Lese- und Ausführungsberechtigungen, damit der Benutzer Dateien finden kann. Dateien benötigen Leseberechtigungen, damit der Benutzer sie lesen kann. Wenn beim Ändern von Berechtigungen Berechtigungsfehler auftreten, können Sie diese grundlegend erforderlichen Berechtigungen entfernen.

Wenn Sie keine Dateien über Ihre PHP-Anwendung schreiben, können Sie Dateien hinterlassen, die Ihnen gehören: Ihnen. Unter diesen Umständen gilt die Weltgenehmigung (xx4/5).

Wenn Sie die Dateien als Eigentum von Ihnen belassen: Sie mit Dateiberechtigungen von 644 (Dateien) würden bedeuten, dass nur Sie die Website-Dateien bearbeiten können - www-data sind nicht Sie - also Die Dateien können nicht bearbeitet werden.

Wenn Sie den Zugriff auf Apache + you einschränken und alle anderen Zugriffe blockieren möchten chown -R you:www-data *. Mit Dateiberechtigungen von 640 und Ordnerberechtigungen von 750, die Sie bearbeiten können, können WWW-Daten gelesen werden - denn dann liest Apache die Gruppenberechtigung (x4/5x).

Beschränken Sie die Pfade, in die Apache/PHP schreiben darf, auf ein Minimum. Wenn es ein TMP-Verzeichnis gibt, in das die Anwendung schreiben muss, lassen Sie es in nur diesen Ordner - und für alle beschreibbaren Speicherorte schreiben Wenn möglich, stellen Sie sicher, dass es außerhalb der Dokumentstamm ist, oder ergreifen Sie Maßnahmen, um sicherzustellen, dass dieser beschreibbare Pfad nicht über das Internet zugänglich ist.

Beachten Sie, dass "Sie" nicht root sein sollte. Das Zulassen des direkten SSH-Zugriffs als Root ist ein Indikator für andere Sicherheitslücken (z. B. nicht Nicht zulassen der Kennwortanmeldung), aber das ist eine ganze Reihe von Fragen an sich.

17
AD7six

Wenn ich die Dinge richtig verstehe, wenn Apache als WWW-Daten ausgeführt wird und ich möchte, dass Apache ein Verzeichnis lesen kann, muss das x-Bit für die Weltgruppe (andere) (o + x) gesetzt werden, und das auch muss für alle übergeordneten Verzeichnisse in der gesamten Kette festgelegt werden (www, var). Und wenn ich möchte, dass Apache aus einer Datei lesen kann, muss das o + r-Bit gesetzt werden.

Dies ist nicht wahr, Sie müssen rwx nicht für 'other' setzen. Sie sollten den Eigentümer und/oder die Gruppe des bestimmten Ordners/der Datei ändern, die Sie schützen möchten. Z.B.:

chown -R cwd:www-data /var/www/cwd.com
chmod 750 /var/www/cwd.com

Jetzt nur noch Mitglieder der Gruppe www-data kann lesen /var/www/cwd.com. Und nur Sie (cwd) können darauf schreiben. Wenn Sie Ihren Anwendungen (über Apache) erlauben möchten, Dateien auch in diesem Verzeichnis zu schreiben/zu ändern, ändern Sie sie auf 770.

Ich denke, dies deckt alle Ihre Probleme ab. Ich sehe keinen Grund, den Benutzer zu ändern, unter dem Apache ausgeführt wird.

10
Rob Wouters