Wie Du PHP5 mit Suhosin auf CentOS 5.0 sicherer machen kannst

Version 1.0
Author: Falko Timme


Diese Anleitung veranschaulicht, wie man PHP5 mit Suhosin auf einem CentOS 5.0 Server sicherer machen kann. Von der Suhosin Projekt Seite: "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 jegliche Gewähr! Ich möchte darauf hinweisen, dass dies nicht der einzige Weg ist, ein solches System einzurichten. Es gibt viele Möglichkeiten dieses Ziel zu erreichen - dies ist der Weg, den ich gewählt habe. Ich übernehme keine Garantie, dass dies auch bei Dir funktioniert!

1 Vorbemerkung

Ich habe dies auf einem CentOS 5.0 Server mit der IP Adresse 192.168.0.100 getestet.

Ich werde in dieser Anleitung beide Suhosin Teile installieren, den Suhosin Patch (für den wir PHP5 rekompilieren müssen) und die Suhosin PHP Extension. Für nähere Informationen sieh Dir bitte http://www.hardened-php.net/suhosin/a_feature_list.html an. Die Funktionen des Suhosin Patchs sind unter Engine Protection (only with patch)aufgelistet; alle anderen Funktionen sind in der Suhosin Extension enthalten.

2 Installation von Apache2 und PHP5 (optional)

(Dieses Kapitel ist optional. Wenn Du Apache2 und PHP5 bereits installiert hast, fahre bitte mit dem nächsten Kapitel fort.)

Falls Du Apache2 und PHP5 auf Deinem Server noch nicht installiert haben solltest, dann installiere es jetzt:

yum install httpd php php-devel

Erstelle dann die System Startup Links für Apache2 und starte Apache2:

chkconfig --levels 235 httpd on
/etc/init.d/httpd start

Nun hast Du PHP5 mit einer Grundfunktionalität auf Deinem Server; falls Du besondere PHP5 Module benötigst, kannst Du diese wie folgt suchen:

yum search php

Wähle in der Ausgabe die Module, die Du benötigst, installiere sie wie folgt und starte Apache2 neu:

yum install php-gd php-imap php-ldap php-mysql php-odbc php-pear php-xml php-xmlrpc

/etc/init.d/httpd restart


3 Angaben über Deine PHP5 Installation beziehen

Sofern Du nicht bereits virtuelle Hosts in Deiner Apache Installation erstellt hast, ist der Dokumenten-Root der Standard Webseite /var/www/html. Nun erstellen wir eine kleine PHP Datei (info.php) in diesem Verzeichnis (falls Du virtuelle Hosts erstellt hast, setze es in irgendeinen Host, der PHP aktiviert hat) und rufen sie in einem Browser auf. Die Datei wird viele nützliche Informationen über unsere PHP Installation liefern, wie zum Beispiel die installiert PHP Version.

vi /var/www/html/info.php


<?php
phpinfo(); ?>
Nun rufen wir diese Datei in einem Browser auf (z.B. http://192.168.0.100/info.php):



Wie Du sehen kannst, haben wir die PHP Version 5.1.6. Suhosin wird auf der Seite nirgendwo erwähnt, was bedeutet, dass es nicht installiert ist.

4 Installation von Suhosin

Suhosin kann runter geladen von: http://www.hardened-php.net/suhosin/download.html
Um den Suhosin Patch installieren zu können, müssen wir PHP5 aus den Quellen rekompilieren, jedoch werden wir dafür das CentOS 5.0 PHP5 .src.rpm Paket verwenden (mittels des rpmbuild Befehls), so dass wir neue PHP5 .rpm Pakete (mit Suhosin) erhalten, die wir installieren können. Wir müssen uns daher keine Sorgen um die richtigen PHP5 Konfigurationsoptionen machen, da rpmbuild sich darum kümmern wird.

Aber zunächst besorgen wir uns eine Kopie des Hardened-PHP Project's Release Signaturekey und importieren ihn in unsere GNU Privacy Guard Keychain:

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

Dann laden wir ein PHP5 .src.rpm Paket (das zu unserer derzeitig installierten PHP Version, 5.1.6 in diesem Beispiel, passt) von einem CentOS 5.0 Spiegel nach /usr/src und installieren es:

cd /usr/src
wget http://ftp-stud.fht-esslingen.de/pub/Mirrors/centos/5.0/updates/SRPMS/php-5.1.6-12.el5.src.rpm

(Wie Du siehst, lade ich das neuste PHP5 .src.rpm aus dem updates/ Verzeichnis meines CentOS Spiegels; natürlich kannst Du auch das originale .src.rpm aus dem os/ Verzeichnis runter laden, z.B. http://ftp-stud.fht-esslingen.de/pub/Mirrors/centos/5.0/os/SRPMS/php-5.1.6-5.el5.src.rpm. Wenn Du das tust, musst Du die Dateinamen in den nachfolgenden Schritten dieser Anleitung anpassen.)

rpm -ivh php-5.1.6-12.el5.src.rpm

Falls Du eine Warnung wie die folgnde erhältst:

warning: user mockbuild does not exist - using root

kannst Du sie ignorieren.

Als Nächstes laden wir den Suhosin Patch, der zu unserer PHP Version passt, nach /usr/src/redhat/SOURCES (auf der Suhosin Downloads Seite findest Du alle verfügbaren Patches):

cd /usr/src/redhat/SOURCES
wget http://www.hardened-php.net/suhosin/_media/suhosin-patch-5.1.6-0.9.6.patch.gz

Nun sollten wir überprüfen, ob die MD5 Summe des runter geladenen Patches mit der übereinstimmt, die auf der Suhosin Downloads Seite veröffentlicht ist:

md5sum suhosin-patch-5.1.6-0.9.6.patch.gz

Wenn die MD5 Summe in Ordnung ist, können wir die digitale Unterschrift wie folgt überprüfen:

wget http://www.hardened-php.net/suhosin/_media/suhosin-patch-5.1.6-0.9.6.patch.gz.sig
gpg suhosin-patch-5.1.6-0.9.6.patch.gz.sig

Falls Du diese Zeile in der Ausgabe sehen solltest:

gpg: Good signature from "Hardened-PHP Signature Key"

dann ist mit dem runter geladenen Patch alles in Ordnung und wir können weiter machen.


Nun entpacken wir den Suhosin Patch, benennen ihn um, damit er in das CentOS Bezeichnungsschema passt und bearbeiten die Datei /usr/src/redhat/SPECS/php.spec so dass der rpmbuild Befehl weiß, dass der Suhosin Patch mit eingefügt werden muss, wenn PHP5 neu kompiliert wird:

gunzip suhosin-patch-5.1.6-0.9.6.patch.gz
mv suhosin-patch-5.1.6-0.9.6.patch php-5.1.6-suhosin.patch
cd /usr/src/redhat/SPECS/
vi php.spec

Füge Patch0: php-5.1.6-suhosin.patch zu der Zeile, in der alle Patches aufgelistet sind und kommentiere die Zeile Patch14: php-5.1.6-ecalloc.patch in der gleichen Zeile aus (der ecalloc Patch kollidiert mit Suhosin). Füge dann %patch0 -p1 -b .suhosin der %setup -q Zeile hinzu und kommentiere die Zeile %patch14 -p1 -b .ecalloc in der gleichen Zeile aus:

[...]
Source51: php.ini Patch0: php-5.1.6-suhosin.patch Patch1: php-5.1.4-gnusrc.patch Patch2: php-5.1.4-warnings.patch Patch5: php-4.3.3-install.patch Patch6: php-5.0.4-norpath.patch Patch7: php-4.3.2-libtool15.patch Patch13: php-5.0.2-phpize64.patch # Patch14: php-5.1.6-ecalloc.patch [...] %setup -q %patch0 -p1 -b .suhosin %patch1 -p1 -b .gnusrc %patch2 -p1 -b .warnings %patch5 -p1 -b .install %patch6 -p1 -b .norpath %patch7 -p1 -b .libtool15 %patch13 -p1 -b .phpize64 # %patch14 -p1 -b .ecalloc [...]
Nun kompilieren wir PHP5 neu:

rpmbuild -ba php.spec

Je nachdem welche PHP5 Module Du installiert hast, wird sich rpmbuild höchstwahrscheinlich über fehlende Pakete beschweren, die es benötigt, um neue Pakete für die zahlreichen PHP5 Module zu erstellen:

[root@server1 SPECS]# rpmbuild -ba php.spec
cat: /usr/include/httpd/.mmn: No such file or directory
error: Failed build dependencies:
aspell-devel >= 0.50.0 is needed by php-5.1.6-12.i386
httpd-devel >= 2.0.46-1 is needed by php-5.1.6-12.i386
libjpeg-devel is needed by php-5.1.6-12.i386
libpng-devel is needed by php-5.1.6-12.i386
pcre-devel >= 4.5 is needed by php-5.1.6-12.i386
libc-client-devel is needed by php-5.1.6-12.i386
mysql-devel >= 4.1.0 is needed by php-5.1.6-12.i386
postgresql-devel is needed by php-5.1.6-12.i386
unixODBC-devel is needed by php-5.1.6-12.i386
net-snmp-devel is needed by php-5.1.6-12.i386
gd-devel is needed by php-5.1.6-12.i386
freetype-devel is needed by php-5.1.6-12.i386
[root@server1 SPECS]#

Wenn Du einen derartigen Fehler siehst, installiere die fehlenden Pakete z.B. wie folgt:

yum install aspell-devel httpd-devel libjpeg-devel libpng-devel pcre-devel libc-client-devel mysql-devel postgresql-devel unixODBC-devel net-snmp-devel gd-devel freetype-devel

Führe danach rpmbuild erneut aus:

rpmbuild -ba php.spec

Dies sollte nun PHP5 und alle installieren PHP5 Module wieder kompilieren und neue .rpm Pakete im /usr/src/redhat/RPMS/i386 Verzeichnis erstellen. Das kann etwas dauern, sei also etwas geduldig.

Danach können wir die neuen PHP5 Pakete wie folgt installieren:

cd /usr/src/redhat/RPMS/i386
rpm -Uvh --force php-*

Das war's mit dem Suhosin Patch.

Nun werden wir die Suhosin PHP Extension erstellen. Zuerst laden wir dessen Quellen in das /usr/src Verzeichnis (die Quellen der Suhosin Extension sind auf der Suhosin Downloads Seite erhältlich):

cd /usr/src
wget http://www.hardened-php.net/suhosin/_media/suhosin-0.9.20.tgz

Als Nächstes überprüfen wir wieder die MD5 Summe und die Signatur:

md5sum suhosin-0.9.20.tgz


wget http://www.hardened-php.net/suhosin/_media/suhosin-0.9.20.tgz.sig
gpg suhosin-0.9.20.tgz.sig

Dann entpacken wir die Quellen und erstellen die Extension wie folgt:

tar xvfz suhosin-0.9.20.tgz
cd suhosin-0.9.20
phpize
./configure
make
make install

Um die Suhosin Extension zu aktivieren, erstellen wir die Datei /etc/php.d/suhosin.ini und fügen die Zeile extension=suhosin.so ein:

vi /etc/php.d/suhosin.ini


extension=suhosin.so
Nun müssen wir Apache2 nur noch neu starten:

/etc/init.d/httpd restart

Nun rufen wir unsere info.php Seite wieder in einem Browser auf (z.B. http://192.168.0.100/info.php). Wenn alles gut gegangen ist, sollte Suhosin nun an zwei Stellen auf der Seite erwähnt werden:



Das war's. Wenn Du magst, kannst Du Suhosin konfigurieren (siehe http://www.hardened-php.net/suhosin/configuration.html), obwohl Suhosin mit der Standardkonfiguration wunderbar funktioniert, Du solltest also ganz genau wissen, was Du tust.

5 Links