PHP absichern

From macwrench
Jump to navigation Jump to search

In diesem Artikel sollen Möglichkeiten vorgestellt Werden, PHP gegen Angriffe abzusichern. Dabei sollen neben einigen Konfigurationstipps auch auf Erweiterungen wie mod-Security, FASTCGI oder suexec vorgestellt und beschrieben werden.

Konfigurationsdateien

PHP-Direktiven lassen sich prinzipiell auf 2 verschiedenen Wegen einstellen:

  • in der Konfigurationsdatei php.ini
  • in einer .htaccess Datei mit Hilfe der PHP Apache-Direktiven

php.ini

Es existieren üblicherweise verschiedene Exemplare der Datei php.ini für verschiedene Einsatzzwecke, hier am Beispiel eines Debian-Systems:

Ort Zweck
/etc/php.ini Globale Konfiguration
/etc/php4/apache/php.ini Konfiguration für das Apache-PHP-Modul
/etc/php4/cgi/php.ini Konfiguration für den CGI-Betrieb im Apache
/etc/php4/cli/php.ini Konfiguration für die Nutzung in Shell-Skripten

Unter Mac OS X existiert in der Standardinstallation lediglich die folgende Datei:

/private/etc/php.ini

.htaccess

Einige (nicht alle!) Konfigurationsdirektiven lassen sich auch innerhalb der sog. ".htaccess" Dateien verwenden. Das ermöglicht beispielsweise unterschiedliche Einstellungen für einzelne VirtualHosts oder Verzeichnisse - so sind Produktivinstallationen anders (wesentlich restriktiver) zu konfigurieren als Entwicklungssysteme.

Weitere Informationen zur Verwendung von .htaccess Dateien sind in den am Ende des Artikels verlinkten Seiten nachzulesen.

Wichtige Einstellungen

Direktive Wert Beschreibung
php_flag register_globals off EGPCS Variablen sind nicht mehr global zugänglich bzw. als globale Variablen registriert (EGPCS = Environment/Umgebung, GET, POST, Cookie, Server)
php_flag display_errors off Fehlermeldungen nicht im Client (Browser) darstellen
php_flag log_errors on Fehlermeldungen in ein Logfile schreiben
php_flag error_log $PFADANGABE Pfadangabe für das Logfile, z.B. /home/web/logs/php4.log
syslog Fehlermeldungen werden durch syslogd protokolliert

PHP safe mode

Der sog. "safe mode" von PHP dient in erster Linie dazu, Sicherheitsprobleme durch Dateizugriffe bei gemeinsam genutzten Server (sog. "shared server", wie sie beispielsweise bei handelsüblichen Web-Hosting Angeboten zum Einsatz kommen) zu verhindern. Sprich: Kunde A soll nicht auf die Dateien und Verzeichnisse des Kunden B zugreifen können.

Anschließend überprüft der PHP-Parser, ob der Eigentümer der Datei identisch mit dem Benutzer ist, der das Skript aufruft. Außerdem ist im safe mode der Zugriff auf Umgebungsvariablen nur lesend möglich.

Dieser Ansatz hat jedoch den großen Nachteil erhebliche Nebenwirkungen auf verschiedenste PHP-Funktionen zu besitzen. Eine Übersicht der dadurch eingeschränkten Funktionen ist im PHP Handbuch nachzulesen.

safe mode aktivieren

Aktiviert und konfiguriert wird der PHP safe mode in der Konfigurationsdatei php.ini durch die folgenden Direktiven:

Direktive Beschreibung
safe_mode = on safe mode anhand eines Benutzers
safe_mode_gid = 0 safe mode anhand der Gruppenzugehörigkeit (anstatt safe-mode zu verwenden, unter Angabe der Group-ID)
safe_mode_include_dir = Freigabe von Verzeichnissen für die PHP-Funktionen include() und require(). Mehrere Verzeichnisse werden durch Kommata getrennt, die Freigabe gilt dabei für die angegebenen Verzeichnisse inklusive allen darin enthaltenen Unterverzeichnissen.
safe_mode_exec_dir = Freigabe von Verzeichnissen für Systemaufrufe durch Funktionen wie system() oder exec() (Handhabung siehe safe_mode_include_dir)
safe_mode_allowed_env_vars = PHP_ Freigabe von Umgebungsvariablen für schreibenden Zugriff. Ist der Wert leer, werden ALLE Umgebungsvariablen freigegeben! Mehrere Variablen/Präfixe werden durch Kommata voneinander getrennt.
safe_mode_protected_env_vars = LD_LIBRARY_PATH Enthält eine Liste aller Umgeungsvariablen, die nicht mit der Funktion putenv() veränderbar sein sollen. Hinweis: die Angabe safe_mode_allowed_env_vars hebt diesen Schutz wieder auf!

safe mode abfragen

Mit den folgenden Zeilen PHP-Code kann abgefragt werden, ob der safe mode aktiviert ist:

<?php
if ( ini_get('safe_mode') ) {
  // safe mode aktiviert
} else {
  // safe mode nicht aktiviert
}

Dateizugriffe mit open_basedir einschränken

Eine weitere Möglichkeit alternativ zum safe mode, Dateizugriffe einzuschränken, ist der Einsatz der PHP Direktive

open_basedir

Im Rahmen der Apache-Konfiguration. Dadurch ist es möglich, für jeden Benutzer des Servers Dateizugriffsopertationen auf ein bestimmtes Verzeichnis (üblicherweise dessen Document Root) einzuschränken, z.B.:

<Directory /home/web/user0815/>
   php_admin_value open_basedir /home/web/user0815/
</Directory>

Durch folgenden Eintrag:

disable_functions readfile,system

in der Datei php.ini kann zusätzlich der Zugriff durch die PHP Funktionen readfile() und system() verhindert werden (siehe folgender Abschnitt).

Direktiven unabhängig von safe_mode

Direktive Beschreibung
open_basedir = Freigabe eines Verzeichnisses für Dateioperationen, wirksam für das Verzeichnis mit allen Unterverzeichnissen, unabhängig von der safe_mode Konfiguration. Bei Angabe eines Punktes "." wird der Speicherort des gerade ausgeführten Skriptes als basedir verwendet (sicherheitstechnisch bedenklich, da durch chdir() veränderbar). Kann durch die Angabe von php_admin_value open_basedir none in der httpd.conf deaktiviert werden.
disable_functions = Eine Liste von Funktionen, die (aus Sicherheitsgründen) nicht ausgeführt werden dürfen. Kann auch in der Datei php.ini konfiguriert werden, nicht jedoch in der Datei httpd.conf
disable_classes = Angabe einer Liste von Klassen, die (aus Sicherheitsgründen) nicht verwendet werden dürfen. Kann auch in der Datei php.ini konfiguriert werden, nicht jedoch in der Datei httpd.conf

suexec, FastCGI und suPHP

... kommt noch ...

Web-Links:

Apache-Hardening mit mod_security

mod-Security ist eine Applikationsfirewall in Form eines Apache-Moduls. Dabei kann anhand von Regeln - in denen auch reguläre Ausdrücke zum Einsatz kommen können - definiert werden, welche GET- und POST-Aufrufe[1] "böse" sind und daher blockiert werden sollen. Diese Regeln werden dann direkt in die Apache-Konfiguration integriert und sehen beispielsweise so aus:

SecFilter "drop[[:space:]]table"

Obiger Eintrag blockiert also den String "drop table" und soll damit das Löschen einer Tabelle via SQL-Query verhindern. Mit diese Modul können also recht einfach verschiedene Ziele verfolgt werden:

  • Verminderung der Gefahr von SQL-Injection (Einfügen von Datenbankabfragen durch mangelhafte Überprüfung eingegebener Daten, z.B. in Formularen oder über die URL)
  • Abfangen von Systemaufrufen über fehlerhafte Skripte
  • Protokollierung sicherheitsrelevanter Vorfälle
  • Absichern des WebServers durch die "chroot"-Funktion von mod_security (Kapseln der Laufzeitumgebung des Webservers, um bei Angriffen Übergriffe auf die Systemumgebung zu verhindern)

Außerdem bietet mod_security noch einige nette "Security-by-Obscurity" Funktionen wie beispielsweise das Ändern der Serversignatur:

SecServerSignature "Microsoft-IIS/5.0"

Der Einsatz von mod_security empfiehlt sich vor allem in den folgenden Fällen:

  • Software, die nur ungenügend getestet wurde
  • Software, die bekanntermaßen recht häufig Sicherheitslücken aufweist
  • Eigenentwicklungen (Jeder macht Fehler)

mod_security bietet also einige wertvolle Funktionen zur Absicherung eines Webservers und der darin laufenden Applikationen, ohne gleich auf schwergewichtigere Lösungen wie IDS (Intrusion Detection System, z.B. Snort), Proxies oder ALG (Application Level Gateway) setzen zu müssen. Weitere Informationen zu mod_security finden sich am Ende dieses Artikels.

Verschiedene Tipps

PHP Skripte vor direkter Ausführung sichern

Eine einfache Möglichkeit, das Ausführen von PHP-Skripten - und auch allgemein auch das Auslesen von durch PHP-Skripte eingebundene Dateien - durch direkte Adressierung im Browser zu verhindern, ist das Erstellen einer .htaccess-Datei mit dem folgenden Inhalt:

order allow,deny
deny from all

Dadurch wird der direkte Zugriff auf die Dateien verhindert, Skripte können diese Dateien jedoch weiterhin problemlos einbinden und verwenden.

Weitere Informationen

PHP Ressourcen

PHP Konfiguration

PHP safe mode

Apache Web Server

.htaccess

mod_security

PHPIDS

Weitere Themen

Bücher

  • PHP-Sicherheit. PHP/MySQL-Webanwendungen sicher programmieren
    von Christopher Kunz, Peter Prochaska (Dpunkt Verlag), ISBN 3898643697
    Buchtipp des PHP-Magazins

  1. GET und POST sind verschiedene Methoden für HTTP-Anragen an einen Server