O'Reilly logo

PHP-Sicherheit: PHP/MySQL-Webanwendungen sicher programmieren by Stefan Esser, Christopher Kunz

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

29912.4 mod_parmguard
Um zu überprüfen, aus welchem Zeichenbereich eine Variable kommt,
und etwa NUL-Bytes ohne eine spezielle Regel zu filtern, können Sie
den Operator
@validateByteRange verwenden, der mit zwei Parame-
tern, nämlich dem Anfang und dem Ende des Byte-Bereichs (beide zwi-
schen 0 und 255), aufgerufen wird:
SecRule ARGS "@validateByteRange 1 255"
Mit den Operatoren @validateDTD und @validateSchema können Sie in
einer speziellen Variablen enthaltenes XML (siehe Abschnitt 12.3.8.2)
auf Validität bezüglich einer DTD bzw. eines XML-Schemas prüfen.
Dabei ist der jeweilige Dateiname dem Operator als absoluter Pfad zu
übergeben. Zwei weitere Operatoren, nämlich
@validateUrlEncoding
und @validateUtf8Encoding, stellen sicher, dass der Inhalt der zu prü-
fenden Variablen korrekt URL- bzw. UTF-8-codiert ist.
12.4 mod_parmguard
Das von Jerome Delamarche entwickelte Apache-Modul mod_parm-
guard verfolgt einen anderen Ansatz als mod_security. Anstelle des
pragmatischen Blacklist-Ansatzes, bei dem alle Filter über reguläre
Ausdrücke konfiguriert werden, legt mod_parmguard Wert auf einen
formal richtigen Whitelist-Ansatz und verwendet für die Konfigura-
tion XML-Dateien. Bei richtiger Verwendung und entsprechender
Vorarbeit entsteht so eine anwendungsspezifische Whitelist.
Für experimentierfreudige
Admins
Als dieses Kapitel geschrieben wurde, war mod_parmguard noch
in einer recht frühen Entwicklungsphase und hatte einige größere und
kleinere Fehler. Die Weiterentwicklung des Apache-Moduls scheint
zudem momentan zu stocken – seit Ende 2006 sind keine aktualisier-
ten Versionen mehr veröffentlicht worden. Da das Projekt und der ihm
zugrunde liegende Ansatz jedoch sehr vielversprechend aussehen,
wollten wir Ihnen dieses Modul nicht vorenthalten. Sie sollten jedoch
stets davon ausgehen, dass mod_parmguard nicht für Produktions-
umgebungen geeignet ist.
12.4.1 So funktionierts
Anders als mod_security orientiert sich mod_parmguard nicht an
Angriffssignaturen, sondern an der Signatur Ihrer Anwendung selbst.
Über eine XML-basierte Menge an Regeln listen Sie alle Parameter, die
Ihre Anwendung vom Nutzer entgegennimmt, auf. Für jede Variable
können Sie individuell den Wertebereich festlegen, sodass das resultie-
rende XML-Regelset exakt auf die von Ihrer Anwendung erwarteten
12 Webserver-Filter für Apache300
Parameter passt. Die dabei verwendete XML-Syntax ist nicht beliebig,
sondern muss einer (im Lieferumfang von mod_parmguard selbstver-
ständlich enthaltenen) DTD genügen. In dem XML-Dokument werden
zusätzlich auch alle zugelassenen Dateien festgelegt.
Ähnlich wie mod_security schaltet sich mod_parmguard im Web-
server zwischen eingehende Anfragen und weiterverarbeitende
Module wie mod_php oder mod_fastcgi, sodass alle Anfragen
zunächst die in mod_parmguard konfigurierten Filter passieren müs-
sen, bevor sie durch PHP geparst und interpretiert werden.
Auch mod_parmguard lässt also nicht zu, dass Verstöße gegen das
Regelwerk an das PHP-Subsystem (und damit an eine möglicherweise
verwundbare Anwendung) weitergegeben werden. Der beanstandete
HTTP-Request wird nicht an das nächste Subsystem (also mod_php)
weitergeleitet und mit einem HTTP-Statuscode beantwortet. Durch
die Verwendung weniger Schlüsselwörter und einer fest definierten
Syntax ist es einfacher zu erlernen und zu handhaben, aber unflexibler
als mod_security.
12.4.2 Installation
Wie bei fast jedem anderen Apache-Modul ist die Installation von
mod_parmguard auf dem Webserver recht einfach und schnell erle-
digt. Da keine Linux-Distribution momentan entsprechende Pakete
vorhält und sämtliche anderen Beispiele in diesem Buch auch auf einer
Installation aus dem Quellbaum ausgehen, benötigen Sie zunächst das
aktuelle Archiv mit dem Quellcode zu mod_parmguard. Als Schon seit
längerm ist Version 1.4, die auf der Projekthomepage
8
erhältlich ist,
aktuell.
Laden Sie das Archiv im .tar.gz-Format von dort in Ihr übliches
Quellverzeichnis (z.B.
/usr/local/src) herunter. Überprüfen Sie mit
dem Kommando
md5sum mod_parmguard-1.4.tar.gz,
ob das Quellarchiv dieselbe MD5-Prüfsumme hat wie auf der Down-
load-Seite des Entwicklers angegeben. Ist dies der Fall, entpacken Sie
das Archiv:
tar zxf mod_parmguard-1.4.tar.gz
Da mod_parmguard alle Konfigurationsdateien im XML-Format
erwartet und über einen externen Parser interpretiert, benötigen Sie für
das Modul die LibXML2, die jedoch auch für viele PHP-Funktionen
8. http://www.trickytools.com/php/mod_parmguard.php
30112.4 mod_parmguard
gebraucht wird und somit ohnehin installiert sein sollte. Prüfen Sie
vorsichtshalber, ob das der Fall ist, und installieren Sie LibXML2 gege-
benenfalls nach.
Danach wechseln Sie in das Unterverzeichnis
mod_parmguard-1.4
und führen dort die inzwischen wohlbekannte Kommandoabfolge
configure, make, make install wie folgt aus:
./configure --with-apxs=/usr/local/apache/bin/apxs (für Apache 1)
./configure --with-apxs2=/usr/local/apache2/bin/apxx2 (für Apache 2)
Passen Sie, falls notwendig, die Pfade auf Ihre lokale Apache-Installa-
tion an.
Sollten Sie Ihre LibXML2 in einem Verzeichnis installiert haben,
das nicht im Suchpfad des Compilers enthalten ist, müssen Sie unter
Umständen den Parameter
--with-libxml2dir=/usr/local/include zu der
configure-Zeile hinzufügen, der dem Compiler den Pfad der LibXML2-
Include-Dateien anzeigt. Meist ist der Standardwert
/usr/include
jedoch korrekt.
Nachdem das
configure-Skript ohne Fehler durchgelaufen ist,
übersetzen und installieren Sie mod_parmguard wie gewohnt mit
make && make install
Das Apache-Modul wird vom Installationsskript in das richtige Ver-
zeichnis kopiert, und die Webserver-Konfigurationsdatei wird ange-
passt, sodass mod_parmguard beim nächsten Neustart des Webservers
geladen wird.
Nun muss das Modul noch mit einigen Konfigurationsdirektiven
im Webserver konfiguriert werden, bevor Sie damit beginnen können,
Filterdateien zu schreiben.
12.4.3 Webserver-Konfiguration
Anders als mod_security wird mod_parmguard in Location-Blöcken
konfiguriert, alle Direktiven werden also von
<Location></Location>
eingerahmt.
Eine »Location« in der Apache-Konfiguration bezeichnet eine
relative URL und kann innerhalb eines VirtualHost-Blocks stehen.
Eine solche Schachtelung kann wie folgt aussehen:
<VirtualHost ihredomain.de>
<Location /verzeichnis>
ParmguardEngine On
</Location>
</VirtualHost>

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required