Unter welchem ​​Benutzer sollten Apache und PHP ausgeführt werden? Welche Berechtigungen sollten / var / www-Dateien haben?

41

Ich habe gerade eine Ubuntu 11.10-Box apt-get install apache2 php5hochgefahren und bin dann gelaufen , um Apache2 und PHP 5 auf der Box zu installieren. Jetzt funktioniert es als "Webserver" und lädt das "It Works!" Seite. Jetzt versuche ich die Sicherheit zu erhöhen und habe folgende Fragen zu Linux-Webservern:

  1. Als wen sollte Apache laufen?
  2. Zu welcher Gruppe (n) sollte dieser Benutzer gehören?
  3. Mit welchen Paketen kann PHP (und Apache?) Als Eigentümer der Dateien ausgeführt werden? (wie bei freigegebenen Webhosts) Soll ich diese Pakete verwenden? Sind sie auf einem kleinen System einfach / machbar zu warten?
  4. Wie sollten die Standardberechtigungen für Dateien und Ordner lauten, die mit Apache im Web bereitgestellt werden www-data? Für Apache / PHP als Benutzer ausgeführt?

Bei der Überprüfung des Standard-Setups habe ich folgende Dinge getan:

Dateistruktur

Wenn ich cd /eine ls -alAuflistung der Inhalte mache , sehe ich /var:

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

Wenn ich cdin varund sehe, ls -alsehe ich:

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

Schließlich /var/wwwsehe ich innen :

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 bis jetzt alle diese Dateien gehören root:root, Dateien Berechtigungen von 644 haben und Verzeichnisse Berechtigungen von 755 haben.

Apache's Berechtigungen

Wenn ich eine Datei als root /var/www/test.phpmit dem Inhalt erstelle :

<?php echo shell_exec('whoami');

und lade diese Datei in einen Browser, der mir sagt www-data, das ist das gleiche wie in der /etc/apache2/envvarsDatei:

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

Wenn ich das tue, ps aux | grep -i apachesehe 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, wer läuft als Apache? Es sieht so aus, als ob der erste Prozess wie der rootaus dem /etc/init.d/apacheSkript stammt, als das System gestartet wurde, und die anderen wie www-datader erste. Ist das korrekt?

Als nächstes groups www-datasehe ich , wenn ich eingebe, www-data : www-datadass es nur in der www-dataGruppe zu sein scheint. Ich schätze, das ist auch Standard.

Shared Hosting und Sicherheit

Also, wenn ich die Dinge richtig verstehe, wenn Apache als ausgeführt wird www-dataund Apache ein Verzeichnis lesen kann, muss das xBit für die world (other) group ( o+x) gesetzt sein, und das muss auch für alle Eltern gesetzt sein Verzeichnisse bis zum Ende der Kette ( www, var). Und wenn Apache in der Lage sein soll, aus einer Datei zu lesen, muss das o+rBit gesetzt werden.

Leider glaube ich, dass dies eine Sicherheitslücke für mehrere Anwendungen und / oder mehrere Benutzer auf derselben Linux-Box mit sich bringt: Alle Webdateien müssen weltweit lesbar sein, und daher können auch andere Anwendungen und andere Benutzer auf dem System auf sie zugreifen. Wenn eine auf dem System installierte Anwendung eine Sicherheitslücke aufweist, die eine unbearbeitete Benutzereingabe zulässt, die dann von PHP ausgeführt wird, kann ein entfernter Angreifer alle anderen Dateien auf dem Websystem durchsuchen, die weltweit lesbar sind. 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 bin aus zwei Paketen gehört, suphpund phpsuexecdie sich mit der Benutzer Dateien ermöglicht ‚ wie sie‘ serviert werden aus auf einem gemeinsamen System. Eine der Besonderheiten dabei ist, dass Webanwendungen (wie Wordpress) Dateien erstellen und ändern können - sehr hilfreich beim Hinzufügen von Designs, Plugins und beim Aktualisieren von Software. Natürlich ist es wahrscheinlich sicherer, diese Dinge manuell zu erledigen, aber kann man vielleicht mit einem der oben genannten Pakete einen Kompromiss eingehen? Oder indem Sie möglicherweise verwenden chown, um die WordPress-Verzeichnisgruppe zur Gruppe zu gehören www-dataund das Sticky-Bit für die Gruppe zu setzen ( g+s)?

Ich habe diese nur als Endbenutzer eines Webhosting-Unternehmens verwendet und weiß daher nicht, wie sie aussehen und ob sie sich überhaupt auf einem kleinen System installieren lassen oder ob es andere 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. Zu welcher Gruppe (n) sollte dieser Benutzer gehören?
  3. Mit welchen Paketen kann PHP (und Apache?) Als Eigentümer der Dateien ausgeführt werden? (wie bei freigegebenen Webhosts) Soll ich diese Pakete verwenden? Sind sie auf einem kleinen System einfach / machbar zu warten?
  4. Wie sollten die Standardberechtigungen für Dateien und Ordner lauten, die mit Apache im Web bereitgestellt werden www-data? Für Apache / PHP als Benutzer ausgeführt?
cwd
quelle
Mögliches Duplikat von serverfault.com/questions/339948/…
AD7six

Antworten:

17
  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 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 Sie beim Ändern von Dingen Berechtigungsfehler erhalten, haben Sie es geschafft, diese grundlegend erforderlichen Berechtigungen zu entfernen.

Wenn Sie keine Dateien über Ihre PHP-Anwendung schreiben, können Sie Dateien in Ihrem Besitz lassen: Sie. In diesem Fall gilt die Welterlaubnis (xx4 / 5).

Wenn Sie die Dateien als Ihr Eigentum belassen: Wenn Sie über die Dateiberechtigung 644 (Dateien) verfügen, bedeutet dies, dass nur Sie die Websitedateien bearbeiten können - www-data sind Sie nicht -, sodass die Dateien nicht bearbeitet werden können.

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 können Sie bearbeiten, www-Daten können gelesen werden - denn dann liest Apache die Gruppenberechtigung (x4 / 5x).

Schränken Sie die Pfade, in die Apache / PHP schreiben darf, auf ein Minimum ein - wenn es ein tmp-Verzeichnis gibt, in das die Anwendung schreiben muss - lassen Sie zu, dass es nur in diesen Ordner schreibt - und stellen Sie für alle beschreibbaren Speicherorte, wenn möglich, sicher, dass es sich außerhalb des befindet Dokument root oder ergreifen Sie Maßnahmen, um sicherzustellen, dass dieser beschreibbare Pfad nicht über das Web zugänglich ist.

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

AD7six
quelle
10

Also, wenn ich die Dinge richtig verstehe, wenn Apache als WWW-Daten ausgeführt wird und Apache ein Verzeichnis lesen kann, muss das x-Bit für die Welt (andere) Gruppe (o + x) gesetzt werden, und das auch muss für alle übergeordneten Verzeichnisse in der gesamten Kette festgelegt werden (www, var). Und wenn Apache in der Lage sein soll, aus einer Datei zu lesen, muss das O + R-Bit gesetzt werden.

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

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

Jetzt können nur Mitglieder der Gruppe www-datalesen /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 dies auf 770.

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

Rob Wouters
quelle
2
Danke. Es ist keine schlechte Lösung, aber wenn ein Benutzer den Pfad zu der Datei eines anderen Benutzers kennt, könnte er ein Skript schreiben, das den Inhalt der Datei liest, und dieses dann in den Webbrowser laden, der es als Apache ausführt - effektiv lesen die Datei aus dem Verzeichnis des anderen Benutzers. Ist das sinnvoll? Selbst wenn Sie die Ordnerberechtigungen auf 750 festlegen, besteht dennoch eine potenzielle Sicherheitsanfälligkeit.
KWD
@cwd hast du das herausgefunden?
Ricky Boyce
@cwd Das war genau die Frage, die ich hatte. Deshalb habe ich gefragt: serverfault.com/questions/807723/…
Nandakumar Edamana