Wie sichert man PHP5 mit Suhosin unter Debian Etch und Ubuntu

Version 1.0
Autor: Falko Timme
Stand: 29.03.2007

Diese Anleitung veranschaulicht, wie man PHP5 mit Suhosin auf Debian-Etch und Ubuntu-Servern absichern kann. Von der Suhosin-Projektseite: "Suhosin is an advanced protection system for PHP installations that was designed to protect servers and users from known and unknown flaws in PHP applications and the PHP core. Suhosin comes in two independent parts, that can be used separately or in combination. The first part is a small patch against the PHP core, that implements a few low-level protections against bufferoverflows or format string vulnerabilities and the second part is a powerful PHP extension that implements all the other protections."
Diese Anleitung ist ohne jede Garantie und ich möchte an dieser Stelle darauf hinweisen, dass dies hier nicht der einzige Weg ist, ein solches System zu installieren. Es gibt viele Möglichkeiten - ich selbst habe mich für diese entschieden. Ich kann aber nicht garantieren, dass diese Lösung bei jedem funktioniert bzw. für jeden die richtige ist!

1 Vorbemerkung

Für die folgende Installation habe ich einen Debian-Etch-Server mit der IP-Adresse 192.168.0.100 genutzt.

In dieser Anleitung werde ich beide Suhosin-Teile installieren: einen Suhosin-Patch (hierfür muss man PHP5 rekompilieren) und eine Suhosin-PHP-Erweiterung (diese ist als Debian/Ubuntu-Paket erhältlich). Möchte man einen Überblick über die Funktionen von Suhosin, empfehle ich folgenden Link: http://www.hardened-php.net/suhosin/a_feature_list.html. Die Funktionen von Suhosin-Patch sind unter Engine Protection (only with patch) aufgelistet - alle anderen Funktionen liefert der zweite Teil, die Suhosin-Erweiterung.

2 Installation von Apache2 und PHP5 (Optional)

(Dieses Kapitel ist optional! Wenn man bereits Apache2 und PHP5 installiert hat, kann man direkt im nächsten Kapitel weiterlesen.)

Wenn man Apache2 und PHP5 noch nicht auf dem Server installiert hat, installiert man sie jetzt:

apt-get install libapache2-mod-php5 php5 apache2-mpm-prefork php5-dev

Dieser Schritt installiert PHP5 mit sämtlichen Basisfunktionen - benötigt man spezielle PHP5-Module, kann man so nach ihnen suchen:

apt-cache search php5

Nun wählt man aus der Ausgabe die benötigten Module und installiert sie so:

apt-get install php5-auth-pam php5-clamavlib php5-common php5-curl php5-gd php5-idn php5-imagick php5-imap php5-json php5-ldap php5-mcrypt php5-memcache php5-mhash php5-ming php5-mysql php5-odbc php5-pgsql php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-uuid php5-xapian php5-xmlrpc php5-xsl

Folgende Frage erscheint:

Continue installing libc-client without Maildir support? <-- Yes
Hat man sich für die Installation von php5-clamavlib entschieden, sollte man auch ClamAV installieren:

apt-get install clamav


3 Wie kommt man an wichtige Details zur PHP5-Installation?

Wenn man noch keine virtuellen Hosts in der Apache-Installation eingerichtet hat, erfolgt der Dokumenten-Root von der vorgegebenen Webseite /var/www. Ich werde nun eine kleine PHP-Datei (info.php) in das Datenverzeichnis einrichten und in einem Browser aufrufen (wenn man virtuelle Hosts hat, platziert man die PHP-Datei in jedem virtuellen Host, der PHP aktiviert hat). Die Datei wird viele nützliche Details für die PHP-Installation anzeigen, z.B. über die bereits installierte PHP-Version.

vi /var/www/info.php

<?php
phpinfo(); ?>
Nun kann man die Datei in einem Browser öffnen (z.B. http://192.168.0.100/info.php):


Wie man sieht, ist diese PHP-Version die 5.2.0-8+etch1.

4 Installieren von Suhosin

Zuerst installiere ich jetzt die Suhosin-PHP-Erweiterung, die als Paket in den Debian-Etch und Ubuntu-Speichern abrufbar ist:

apt-get install php5-suhosin

Weiter geht es mit der Patch-Installation. Um das Patch zu installieren, muss man PHP5 auf dem System rekompilieren.Glücklicherweise gibt es einen sehr einfachen Weg: Man lädt das PHP5-Quelltextpaket aus dem Debian/Ubuntu- Speicher. Aus diesem Paket wurde die momentane PHP5-Installation kompiliert. Dann wird der Suhosin-Patch auf den Quelltext angewendet und erzeugt ein neues PHP5.deb -Paket mit dpkg-buildpackage. Vorteil: Jetzt muss man sich keine Gedanken mehr um die richtigen PHP5-Konfigurationsoptionen machen und man bleibt mit der Apt-Paketdatenbank synchronisiert.

Zunächst installiert man alles, um PHP5 vom Quelltext zu kompilieren:

apt-get install dpkg-dev build-essential

Dann geht man in das /usr/src Verzeichnis und lädt die PHP5-Quelltexte herunter:

cd /usr/src
apt-get source php5

Nun installiert man den Signaturschlüssel des Hardened-PHP-Projekts:

wget http://www.hardened-php.net/hardened-php-signature-key.asc
gpg --import < hardened-php-signature-key.asc

Nun geht man auf http://www.hardened-php.net/suhosin/download.html und wählt das Suhosin-Patch, das zu der PHP-Version passt. In meiner Anleitung ist die PHP-Version 5.2.0-8+etch1, deshalb lade ich nun das Patch für PHP 5.2.0 herunter:

wget http://www.hardened-php.net/suhosin/_media/suhosin-patch-5.2.0-0.9.6.2.patch.gz

Jetzt entpackt man das Patch und wendet es auf den PHP-Quelltext an:

gunzip suhosin-patch-5.2.0-0.9.6.2.patch.gz
cd php5-5.2.0
patch -p 1 -i ../suhosin-patch-5.2.0-0.9.6.2.patch

Nachdem das Patch ohne Fehler angewendet wurde, bildet man die neuen PHP5.deb-Pakete:

dpkg-buildpackage

Je nachdem welche PHP5-Module man installiert hat wird dpkg-buildpackage höchstwahrscheinlich melden, dass Pakte fehlen, die für die neu zu erstellenden Pakete für die vielfältigen PHP-Module benötigt werden:

server1:/usr/src/php5-5.2.0# dpkg-buildpackage
dpkg-buildpackage: source package is php5
dpkg-buildpackage: source version is 5.2.0-8+etch1
dpkg-buildpackage: source changed by sean finney <seanius@debian.org>
dpkg-buildpackage: host architecture i386
dpkg-buildpackage: source version without epoch 5.2.0-8+etch1
dpkg-checkbuilddeps: Unmet build dependencies: apache-dev (>= 1.3.23) apache2-prefork-dev (>= 2.0.53-3) bison chrpath debhelper (>= 3) firebird2-dev flex (>= 2.5.4) freetds-dev libapr1-dev (>= 1.2.7-8) libbz2-dev (>= 1.0.0) libc-client-dev libcurl3-openssl-dev | libcurl3-dev libdb4.4-dev libexpat1-dev (>= 1.95.2-2.1) libfreetype6-dev libgcrypt11-dev libgd2-xpm-dev (>= 2.0.28-3) libjpeg62-dev libkrb5-dev libldap2-dev libmcrypt-dev libmhash-dev (>= 0.8.8) libmysqlclient15-dev | libmysqlclient12-dev libncurses5-dev libpam0g-dev libpcre3-dev (>= 6.6) libpng12-dev libpq-dev | postgresql-dev libpspell-dev librecode-dev libsnmp9-dev | libsnmp-dev libsqlite0-dev libt1-dev libtidy-dev libwrap0-dev libxmltok1-dev libxml2-dev (>= 2.4.14) libxslt1-dev (>= 1.0.18) re2c unixodbc-dev
dpkg-buildpackage: Build dependencies/conflicts unsatisfied; aborting.
dpkg-buildpackage: (Use -d flag to override.)

Sieht man einen Fehler wie diesen, installiert man einfach die fehlenden Pakete (ein |Symbol meint OR, z.B. package1 | package2 bedeutet, dass man entweder package1 oder package2 installieren kann), z.B. so:

apt-get install apache-dev apache2-prefork-dev bison chrpath debhelper firebird2-dev flex freetds-dev libapr1-dev libbz2-dev libc-client-dev libcurl3-dev libdb4.4-dev libexpat1-dev libfreetype6-dev libgcrypt11-dev libgd2-xpm-dev libjpeg62-dev libkrb5-dev libldap2-dev libmcrypt-dev libmhash-dev libmysqlclient15-dev libncurses5-dev libpam0g-dev libpcre3-dev libpng12-dev libpq-dev libpspell-dev librecode-dev libsnmp9-dev libsqlite0-dev libt1-dev libtidy-dev libwrap0-dev libxmltok1-dev libxml2-dev libxslt1-dev re2c unixodbc-dev

Jetzt wieder dpkg-buildpackage ausführen:

dpkg-buildpackage

Dieser Befehl sollte nun wieder PHP5 und alle installierten PHP5-Module kompilieren und neue .deb Pakete im /usr/src Verzeichnis erstellen. Dies kann einige Zeit dauern - man braucht etwas Geduld. Möglicherweise erhält man am Ende einige Warnungen über Signaturen, die man aber ignorieren kann.

Danach geht man ins /usr/src Verzeichnis:

cd /usr/src
ls -l

Die Ausgabe könnte so aussehen:

server1:/usr/src# ls -l
total 21792
-rw-r--r-- 1 root src 1351 2005-07-05 13:02 hardened-php-signature-key.asc
-rw-r--r-- 1 root src 2419598 2007-03-29 16:37 libapache2-mod-php5_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 2418714 2007-03-29 16:37 libapache-mod-php5_5.2.0-8+etch1_i386.deb
drwxr-xr-x 20 root root 4096 2007-03-29 16:37 php5-5.2.0
-rw-r--r-- 1 root src 1044 2007-03-29 16:37 php5_5.2.0-8+etch1_all.deb
-rw-r--r-- 1 root src 124228 2007-03-29 16:02 php5_5.2.0-8+etch1.diff.gz
-rw-r--r-- 1 root src 1739 2007-03-29 16:02 php5_5.2.0-8+etch1.dsc
-rw-r--r-- 1 root src 5689 2007-03-29 16:38 php5_5.2.0-8+etch1_i386.changes
-rw-r--r-- 1 root src 8583491 2006-11-07 13:34 php5_5.2.0.orig.tar.gz
-rw-r--r-- 1 root src 4771850 2007-03-29 16:37 php5-cgi_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 2405518 2007-03-29 16:37 php5-cli_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 215058 2007-03-29 16:37 php5-common_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 24464 2007-03-29 16:37 php5-curl_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 350954 2007-03-29 16:37 php5-dev_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 33416 2007-03-29 16:37 php5-gd_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 34496 2007-03-29 16:37 php5-imap_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 44322 2007-03-29 16:37 php5-interbase_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 17232 2007-03-29 16:37 php5-ldap_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 12822 2007-03-29 16:37 php5-mcrypt_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 5046 2007-03-29 16:37 php5-mhash_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 64902 2007-03-29 16:37 php5-mysql_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 33410 2007-03-29 16:37 php5-odbc_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 50652 2007-03-29 16:37 php5-pgsql_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 8628 2007-03-29 16:37 php5-pspell_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 4756 2007-03-29 16:37 php5-recode_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 11302 2007-03-29 16:37 php5-snmp_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 34454 2007-03-29 16:37 php5-sqlite_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 18392 2007-03-29 16:37 php5-sybase_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 16478 2007-03-29 16:37 php5-tidy_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 36450 2007-03-29 16:37 php5-xmlrpc_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 12260 2007-03-29 16:37 php5-xsl_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 310194 2007-03-29 16:37 php-pear_5.2.0-8+etch1_all.deb
-rw-r--r-- 1 root src 95588 2007-03-06 10:37 suhosin-patch-5.2.0-0.9.6.2.patch

Jetzt installiert man nahezu alle neuen PHP5 .deb Pakete (man muss die Erstellungszeiten vergleichen, um die neuen Pakete zu identifizieren). Auf die Installation von manchen Paketen kann man verzichten: z.B braucht man weder php5-cgi noch php5-cli, da man mod_php. benutzt Ebensowenig braucht man php-pear und libapache-mod-php5. libapache-mod-php5 ist für die Version Apache 1.3 - in diesem Beispiel wurde Apache 2.2 installiert, d.h. man wählt libapache2-mod-php5.

dpkg -i libapache2-mod-php5_5.2.0-8+etch1_i386.deb php5_5.2.0-8+etch1_all.deb php5-common_5.2.0-8+etch1_i386.deb php5-curl_5.2.0-8+etch1_i386.deb php5-dev_5.2.0-8+etch1_i386.deb php5-gd_5.2.0-8+etch1_i386.deb php5-imap_5.2.0-8+etch1_i386.deb php5-interbase_5.2.0-8+etch1_i386.deb php5-ldap_5.2.0-8+etch1_i386.deb php5-mcrypt_5.2.0-8+etch1_i386.deb php5-mhash_5.2.0-8+etch1_i386.deb php5-mysql_5.2.0-8+etch1_i386.deb php5-odbc_5.2.0-8+etch1_i386.deb php5-pgsql_5.2.0-8+etch1_i386.deb php5-pspell_5.2.0-8+etch1_i386.deb php5-recode_5.2.0-8+etch1_i386.deb php5-snmp_5.2.0-8+etch1_i386.deb php5-sqlite_5.2.0-8+etch1_i386.deb php5-sybase_5.2.0-8+etch1_i386.deb php5-tidy_5.2.0-8+etch1_i386.deb php5-xmlrpc_5.2.0-8+etch1_i386.deb php5-xsl_5.2.0-8+etch1_i386.deb

Der letzte Befehl wird Apache automatisch neu starten, deshalb muss man dies jetzt nicht selbst tun. Jetzt öffnet man wieder die Seite info.php in einem Browser (z.B. http://192.168.0.100/info.php). Wenn alles geklappt hat, sollte man Suhosin jetzt zweimal auf der Seite geöffnet sehen :



Geschafft! Wenn man möchte, kann man Suhosin konfigurieren (siehe http://www.hardened-php.net/suhosin/configuration.html), obwohl Suhosin mit den voreingestellten Konfiguration hervorragend arebiten wird! Deshalb Achtung - man sollte sich sehr sicher sein, wenn man etwas verändert!

5 Links