PHP Security
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[edit]
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[edit]
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[edit]
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[edit]
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[edit]
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[edit]
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[edit]
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[edit]
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[edit]
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[edit]
... kommt noch ...
Web-Links:
- suPHP Projekt (Ausführen von PHP Skripten mit den Rechten des Dateibesitzers)
- suexec (apache.org)
- FastCGI: Projektseite, Wikipedia-Artikel
Apache-Hardening mit mod_security[edit]
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[edit]
PHP Skripte vor direkter Ausführung sichern[edit]
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[edit]
PHP Ressourcen[edit]
- Artikel Webentwicklungs-Ressourcen hier im Wiki
- PHP Handbuch (offizielles Handbuch)
- Apple Developer Connection: PHP on Mac OS X
- O'Reilly ONLamp.com/php: PHP devcenter
- Hardened-PHP Project
- PHP Security Consortium
PHP Konfiguration[edit]
- PHP Handbuch: Teil IV. Sicherheit
- php.net: Informationen zur Konfiguration
- php.net: Übersicht aller php.ini Direktiven und deren Beschreibung
- Securityfocus: Securing PHP Step-by-Step
- PHPSecInfo - gibt analog zu phpinfo() sicherheitsrelevante Informationen zur aktuellen PHP-Konfiguration aus.
PHP safe mode[edit]
- PHP Handbuch: Kapitel 42. Safe Mode
- domainepublic.net: Konfigurationsübersicht (Sécurité et Safe Mode)
Apache Web Server[edit]
- Projektseite des Apache Server Project
- Kleine Apache-Einführung bei SelfHTML.org
- Securityfocus: Securing Apache Step-by-Step
- Securityfocus: Securing Apache 2 Step-by-Step
.htaccess[edit]
- SelfHTML Artikel zu .htaccess Dateien
- Wikipedia-Artikel zum Thema
- Beschreibung in der Apache Dokumentation, für Apache 1.3 und Apache 2
- Ken Coar: Using .htaccess Files with Apache
mod_security[edit]
- Projektseite
- modsecurity.org: Quick examples
- Securityfocus: Web Security Appliance With Apache and mod_security
- O'Reilly ONLamp.com:
- Fedora News: HOWTO: Enhancing Apache with mod_security
PHPIDS[edit]
- Projektseite
- PHPIDS Google Group
- Artikel auf heise security vom 24.04.2009]
- Weiterer Artikel auf net-developers.de
Weitere Themen[edit]
- Securityfocus: Securing MySQL Step-by-Step
Bücher[edit]
- PHP-Sicherheit. PHP/MySQL-Webanwendungen sicher programmieren
von Christopher Kunz, Peter Prochaska (Dpunkt Verlag), ISBN 3898643697
Buchtipp des PHP-Magazins