Sichern von PHP-Webservern

31

PHP-Anwendungen sind bekannt für überdurchschnittliche Sicherheitsprobleme. Welche Konfigurationstechniken verwenden Sie, um sicherzustellen, dass die Anwendung so sicher wie möglich ist?

Ich suche Ideen wie:

Ich benutze normalerweise Linux, kann aber auch Windows-Lösungen vorschlagen.

David Pashley
quelle

Antworten:

15
  1. Verwenden Sie die open_basedir-Direktive, um Ihre PHP-Skripte auf ihr Home-Verzeichnis und eventuelle zusätzliche Anwendungsverzeichnisse zu beschränken. Dies ist von sich aus sehr effizient.

  2. Verwenden Sie gehärtetes PHP, denn das kostet nichts und kann helfen.

  3. Verwenden Sie suPHP , damit PHP-Skripte als Eigentümer der Datei ausgeführt werden (ein Benutzer pro Website), und vermeiden Sie die Verwendung von Dateien mit schlechten Berechtigungen wie 777 ... Mit suPHP können Sie auch php.ini pro Website verwenden, sodass eine Website dumm ist Anforderung nicht alles zerstören.

  4. Mod_security ist ein großes Plus, muss aber gut genutzt und konfiguriert werden.

Antoine Benkemoun
quelle
Einige fehlerhafte Sites benötigen tatsächlich register_globals und fopen. Deshalb verwenden Sie eine php.ini pro Site mit suPHP. Eine Seite kann nur Kamikaze gehen und die anderen sind (fast) vollkommen sicher.
Antoine Benkemoun
4
Wenn sie register_globals und fopen verwenden, deutet dies darauf hin, dass die Qualität so schlecht ist, dass Sie sie möglicherweise erneut verwenden möchten :)
David Pashley
Wenn sie 150 € / Monat bezahlen, überdenken Sie es nicht.
Antoine Benkemoun
3

Meiner Erfahrung nach sind die meisten Schwachstellen auf einer PHP-basierten Website eher auf schlechtes (Site-) Design zurückzuführen als auf Fehler in PHP.

Einige schnelle Tipps:

  • Universeller Filtereingang, Escape-Ausgang. Erläuterung: Filter bedeutet nicht "Escape", sondern "Wenn ich bei dieser Benutzereingabe etwas faul finde, kann die Übermittlung fehlschlagen, und der Benutzer wird aufgefordert, sich neu zu formatieren."
  • Lassen Sie keine Benutzereingaben in der Shell zu , anstatt escapeshellcmd () zu verwenden . Das ist gefährlich und wahrscheinlich nie notwendig.
  • Rufen Sie auf einer Produktionssite keine Funktionen wie phpinfo () auf (oder, falls ja, siehe unten *).
  • Denken Sie beim Entwerfen einer Webanwendung immer daran, ob dies ein möglicher Angriffsvektor ist. Sprich SQL Injection. Wenn die Antwort "Ja" lautet, schließen Sie sie sofort an - sagen Sie nicht "OK", das füge ich später in der Entwicklung als Feature hinzu. Sicherheit ist nie ein Merkmal.
  • Geben Sie niemals grobe Fehler an den Benutzer aus. Dies bedeutet, dass php.inis display_errors = Off, log_errors = On gesetzt wird. Überfüllen Sie Laufzeitfehler und geben Sie etwas Hübsches aus. Nehmen Sie den Wal von Twitter als Beispiel: Er gibt keine Informationen auf Debug-Ebene an den Benutzer weiter. Er sagt nur "Woops, etwas ist kaputt, bitte aktualisieren".

* Vielleicht werfen Sie auch einen Blick auf einen kurzen Beitrag mit dem Titel "Sichern von phpinfo (), Art von" und lesen Sie unbedingt die Kommentare http://egovsergo.com/2009/04/03/protecting-your-phpinfo/ Es war eine schnelle Idee, phpinfo () (etwas) zu schützen, wenn ich irgendwie vergessen habe, es auf einer Produktionsseite zu entfernen.

Im Allgemeinen schreiben einige Entwickler Wrapper für vertrauliche Funktionen, die prüfen, ob das Flag "Produktionsstandort" gesetzt ist oder nicht, und die vertrauliche Funktion in der Produktion deaktivieren.

msanford
quelle
Meine Frage war eher, wie Sie Ihren Server vor schlecht geschriebenem PHP schützen können. :) Ich wollte nicht, dass PHP selbst unsicher ist, sondern dass es weniger erfahrene Entwickler anzieht und die Standardbibliothek verlangt, dass sie sich daran erinnern, jeden Aufruf zu schützen, anstatt dass die Bibliothek alle Benutzer schützt. +1, da es eine sehr nützliche Antwort ist.
David Pashley
Ich habe diesen Eindruck bekommen und entsprechend geantwortet :) Danke für den Kommentar! Ich kann hier natürlich nicht auf alles eingehen, aber das sind einige große Gruben. Wenn Sie spezifischere Fragen haben, können Sie diese sicher auf Stack Overflow stellen, und ich und alle anderen werden dazu beitragen. (Und für das, was es wert ist, bin ich ein ZCE).
msanford
3

Andere Parameter, die geändert werden sollten, um das PHP zu härten:

safe_mode = Off
register_globals = Off
expose_php = Off
allow_url_fopen = Off
allow_url_include = Off
log_errors = On
error_log = /var/log/phperror.log
display_errors = Off
enable_dl = Off
disable_functions="popen,exec,system,passthru,proc_open,shell_exec,show_source,phpinfo"

Speichern Sie alle PHP-Fehler in der Datei /var/log/phperror.log :

touch /var/log/phperror.log
chmod 666 /var/log/phperror.log
Deem3n
quelle
1

Ich habe die DotDeb- Repositorys zu meiner /etc/apt/sources.lst hinzugefügt

deb http://packages.dotdeb.org stable all
deb-src http://packages.dotdeb.org stable all

Da sie PHP / Apache / MySQL viel häufiger patchen als Debian.

Brent
quelle
1

Erwägen Sie die Einrichtung open_basedirauf "pro Site" -Basis. open_basedirist eine php.ini-Einstellung, die verhindert, dass Ihre Skripte auf Dateien außerhalb einer definierten Whitelist zugreifen. Wenn Ihr Server mehrere Sites hostet, wird verhindert, dass eine Site die Datenbankeinstellungen von einer anderen Site liest. Es wird auch verhindert, dass ein PHP-Skript auf Kernsystemdateien zugreift / diese ändert. Open Basedir ist einfach einzurichten. Fügen Sie einfach die Zeile " php_admin_value open_basedir /my/list/of/folders:/as/a/colon/seperated/list" zu jedem Apache-Host hinzu.

Erwägen Sie auch, die PHP-Skript-Engine für alle Sites / Ordner zu deaktivieren, die keine PHP-Skripte enthalten sollten (z. B. einen hochgeladenen Bilderordner). Auch dies ist ganz einfach: Fügen Sie "php_admin_value engine off" zu allen Apache VirtualHosts hinzu, die kein PHP benötigen. Um PHP in einem Verzeichnis zu deaktivieren, fügen Sie dasselbe in ein Directory-Tag ein.

Führen Sie Dateiberechtigungen so knapp wie möglich aus. Vermeiden Sie den Schreibzugriff auf PHP-Skripte für den Apache-Benutzer. Dadurch wird verhindert, dass sich ein ausgeführtes Skript oder andere Skripte auf derselben Site / demselben Server ändern. Vermeiden Sie 777-Berechtigungen, wenn dies möglich ist. Ermitteln Sie die Mindestberechtigungen, die zum Ausführen der Anwendung erforderlich sind, und verwenden Sie diese.

Wenn Sie mehrere Sites mit jeweils einer eigenen Datenbank hosten, verwenden Sie für jeden einen separaten MySQL / Postgres-Benutzer und stellen Sie die Berechtigungen für jeden Benutzer so ein, dass er nur Zugriff auf die relevanten Datenbanken hat. Dies verhindert wiederum, dass ein unerwünschtes Skript die Datenbank einer anderen Anwendung manipuliert.

Suosin, HardenedPHP, mod_security und ähnliches sind ebenfalls wertvoll, aber verwenden Sie sie zusätzlich zu einer streng gesperrten Konfiguration, nicht stattdessen.

Jim OHalloran
quelle
0

Suhosin hat ziemlich hohe Performancekosten, daher ist der Kommentar "Kosten nichts" ein bisschen abwegig.


quelle
2
Was nützt eine schnelle, gehackte Website? :) hardened-php.net/suhosin/benchmark.html schlägt bei einem Benchmark 8,85% langsamer vor. Dies kann für die damit verbundenen Sicherheitsvorteile akzeptabel sein. Dies hätte wahrscheinlich eher ein Kommentar als eine Antwort sein sollen.
David Pashley
Suhosin schützt vor allem vor lokalen Angriffen. Wenn Sie also Ihren Server für Personen freigeben, denen Sie nicht vertrauen, lohnt sich möglicherweise die Verlangsamung. Wenn Sie einen eigenen Server oder ein eigenes VM-Slice haben, verstehe ich den Punkt nicht.
0

Suchen Sie nach einigen grundlegenden Firewall- / Topologievorschlägen? Ich mag die Idee, Dinge wie Pfund zu verwenden, um den direkten Zugriff auf den PHP-Webserver von ungewaschenen Internetseiten zu verhindern. Auf diese Weise können Sie den Webserver auch von anderen Teilen Ihres Netzwerks trennen.

DF
quelle
Nein, ich suche nach Möglichkeiten, um die Sicherheit der PHP-Laufzeit zu verbessern.
David Pashley
0

Wenn Sie Suhosin / mod_security / SuPHP verwenden, wird Ihr PHP-Server auf jeden Fall sicherer. Das Deaktivieren bestimmter Funktionen wie exec, passthru, system und escapeshellcmd hilft ebenfalls sehr.


quelle
1
Wird escapeshellcmd () nicht nur zum Escape von Zeichenfolgen verwendet? Es bietet keine Möglichkeit, einen Prozess auszuführen. Wie könnte jemand damit ein Problem verursachen?
David Pashley