LAMP installieren – PHP absichern
In diesem Artikel zeige ich euch wie ihr PHP absichern könnt. Auf einem Webserver sollte immer größte mögliche Sicherheit gewährleistet sein, da sich dort aber das Arbeitsfeld von Administrator und Programmierer überschneidet leidet gerade dort der Sicherheitsaspekt enorm. Besonders schlimm ist das bei shared Webspaces, im schlimmsten Fall können Benutzer auf solchen Server die Daten anderer Kunden auslesen und manipulieren. Auch eine komplette Übernahme des Servers ist durch eine zu schlechte Konfiguration spielend möglich.
PHP absichern
Ich schreibe aus eigener Erfahrung. PHP absichern ist ein Aufwand von Minuten, die Recherche einmalig von einigen Stunden. Einer meiner vServer wurde durch einen Hacker als Spamschleuder benutzt. Der Hoster hat diesen virutellen Server deshalb vom Netz genommen. Wie sich später herausstellen sollte konnte der Angreifer über PHP mit dem exec Befehl Shell Befehle ausführen und über die Kommandozeile eigene Programme hochladen und diese laufen lassen. Passiert ist glücklicherweise wenig, das letzte sichere Backup war schnell eingespielt und die Sicherheitslücke schnell geschlossen.
Damit ihr nicht auch einen Nachmittag Arbeit habt habe ich folgende Tipps zusammengestellt:
- disable_functions
War in meinem Fall die wichtigste Änderung. Mit dem Parameter disable_functions kann man in der php.ini Konfigurationsdatei beliebige PHP Funktionen mit Komma getrennt angeben die nicht ausgeführt werden dürfen. Sinn macht der Ausschluss von folgenden Funktionen: exec, shell_exec, phpinfo, system, passthru, show_source, popen, proc_open - open_basedir
Mit Angabe eines Base Verzeichnis bei einer Domain wird verhindert, dass PHP auf andere, außer diesem Verzeichnis zugreifen darf. Dadurch kann ein Angreifer nicht mehr Webspaces anderer Kunden ausspionieren und auch keine Server Konfigurationen sehen oder ändern. Der open_basedir Parameter wird bei der Konfiguration vom virtuellen Host gesetzt, also im /etc/apache2/site-available Verzeichnis. Man fügt zB nach der Definition vom DocumentRoot folgendes ein:DocumentRoot /var/www/htdocs/www.example.com/html php_admin_value open_basedir /var/www/htdocs/www.example.com:/usr/share/php
In meinem Fall war die Angabe der beiden Verzeichnisse ausreichend. Eventuell muss man noch zusätzliche Verzeichnisse freigeben, man sollte jedoch sehr sparsam vorgehen.
- allow_url_fopen
PHP erlaubt es externe Dateien zu laden. Damit kann man ein Include externer PHP Dateien machen und somit fremden Code ausführen. Schadcode ist somit schnell eingespielt. Idealerweise setzen wir allow_url_fopen=no, damit verhindet man das einbinden entfernten Codes. Leider weiß ich aus eigener Erfahrung, dass man gerade für bestimmte Schnittstellen ein aktiviertes allow_url_fopen benötigt. In dem Fall reicht, wenn man das pro Domain oder Webseite aktiviert.
Zusätzlich zu diesen Tipps sollte man am Server auch folgendes beachten:
- bei Debian wird bei der Installation von Apache der Benuter und die Gruppe www-data angelegt. Man sollte darauf achten, dass alle Dateien im /var/www Verzeichnis diesem Benutzer gehören. Das kann man mit folgendem Befehl durchsetzen:
chown -R www-data:www-data /var/www
- man sollte bei den Ordnern und den Dateien auf Dateiebene immer nur maximal nötige Zugriffsrechte setzen. Beispielsweise 755 bei Ordnern. Order deren Zugriff von außen nicht gewünscht sind kann man mit einer .htaccess Datei im Ordner den Zugriff einschränken. Diese enthält folgenden Inhalt:
Order deny,allow Deny from all
Das ist bei allen Ordnern die Konfigurationsdateien verwenden, in denen z.B. Datenbanklogins unverschlüsselt gespeichert sind. Alternativ kann man diese Konfigurationsdateien auch außerhalb vom Webroot Verzeichnis ablegen.
Weiterführende Links
Sobald man professionell ein System administriert auf dem jeder im Internet Zugriff hat, sollte man sich immer über aktuelle Sicherheitslücken informieren. Besonders interessant ist auch zu sehen wie Angreifer vorgehen und was alles probiert wird. Ein recht gutes Video dazu habe ich auf Youtube gefunden:
Diese Webseite von Heinlein Support und die Videos der Linux Tage sind generell eine gute Quelle für alle die mit Linux Systemen arbeiten.
Fazit
PHP absichern ist auf einer Live Umgebung sehr wichtig. Man muss bei PHP Webapplikationen immer davon ausgehen, dass es dort zahlreiche Sicherheitslücken gibt. Die letzten Monate haben gezeigt, dass auch von einer großen Community gepflegte Open Source Systeme angegriffen werden. WordPress, Joomla, Magento, … Sicherheitslücken gibt es immer wieder. Wenig oder gar nicht gepflegte PHP Skripte können so zu einer Gefahr für den Server werden. Eine gut durchdachte PHP Konfiguration sollte alle Angriffe auf das System verhindern. Im schlimmsten Fall wäre somit nur die gehackte Applikation betroffen.
Welche Ideen habt ihr noch PHP abzusichern? Was sind eure Erfahrungen mit PHP und Sicherheitslücken?