1.) Herrunterladen der benötigten Pakete

Die Pfade müssen natürlich bei einer neueren Version entsprechend angepasst werden. Außerdem muss evtl. das Paket auf die installierte Betriebssystem-Version angepasst werden (AMD64, PowerPC...).

Ich würde die Pakete einfach nach /tmp herunterladen.

cd /tmp
wget http://etc.inittab.org/~agi/debian/libapache-mod-security2/libapache-mod-security_2.5.9-1_i386.deb
wget http://etc.inittab.org/~agi/debian/libapache-mod-security2/mod-security-common_2.5.9-1_all.deb

2.) Installation der Pakete

Auch hier gilt wieder, den Pfad (bzw. die Datei) entsprechend auf sein System abzuändern.

dpkg -i mod-security-common_2.5.9-1_all.deb libapache-mod-security_2.5.9-1_i386.deb

3.) modsecurity-Verzeichnis im Apache-Pfad anlegen

mkdir /etc/apache2/modsecurity2
chmod 600 -R /etc/apache2/modsecurity2

4.) Herunterladen und entpacken der Regeln

Diese Regeln kommen direkt von modsecurity.com, und verhindern schon die meisten üblichen Angriffe.

wget http://www.modsecurity.org/download/modsecurity-core-rules_2.5-1.6.1.tar.gz

nun können wir die heruntergeladenen Regeln entpacken und in das vorher angelegte Verzeichnis verschieben:

tar fvx modsecurity-core-rules_2.5-1.6.1.tar.gz
mv *.conf /etc/apache2/modsecurity2/

5.) Dem Apache den Ordner mit den Regeln bekannt machen

vi /etc/apache2/conf.d/mod-security2.conf

...und folgendes einfügen:

<IfModule mod_security2.c>
Include /etc/apache2/modsecurity2/*.conf
</IfModule>

6.) Symlink zum Apache-Logfile erstellen

Damit wird das Apache Log-Verzeichnis an Debian angepasst. Somit werden die Logfiles dann unter /var/log/apache2/modsec_<Regel>.log abgelegt.

ln -s /var/log/apache2 /etc/apache2/logs

7.) Testen ob das Modul geladen wurde

Wenn ihr euch auf eurem Webserver eine "phpinfo.php"-Datei anlegt könnt ihr sehen, ob das mod_security Modul korrekt geladen wurde. Und zwar unter dem Punkt "Loaded Modules".

Die phpinfo.php (kann natürlich auch anders heißen) muss folgenden Inhalt haben:

‹?php phpinfo(); ?›

8.) Erstmal nur mitloggen, später blockieren

Zuerst soll mal nichts blockiert, sondern nur geloggt werden:

vi /etc/apache2/modsecurity2/modsecurity_crs_10_config.conf

Diese Zeile folgendermaßen anpassen:

SecRuleEngine DetectionOnly

So werden alle potenziellen Gefahren und Warnungen zwar geloggt, aber noch nichts geblockt. Man sollte also das Modul erstmal eine Weile so laufen lassen, damit nicht zuviel geblockt wird, was evtl. garnicht erwünscht ist.

Jetzt muss natürlich der Apache neu geladen werden:

/etc/init.d/apache2 reload

In der Datei /var/log/apache2/modsec_debug.log kann man nun nachsehen, was alles geblockt werden würde. Hier ein Beispiel:

[31/Jan/2010:12:15:23 +0100] [www.itwelt.org/sid#3f1b6d0][rid#1125ac1][/administrator/index.php][1] Access denied with code 501 (phase 2). Pattern match "(?:\b(?:\.(?:ht(?:access|passwd|group)|www_?acl)|global\.asa|httpd\.conf|boot\.ini)\b|\/etc\/)" at ARGS:text. [file "/etc/apache2/modsecurity2/modsecurity_crs_40_generic_attacks.conf"] [line "114"] [id "950005"] [msg "Remote File Access Attempt"] [data "/etc/"] [severity "CRITICAL"] [tag "WEB_ATTACK/FILE_INJECTION"]

Jede dieser Regeln hat eine ID, in diesem Fall ist das z.B. die "950005". So ist es möglich, später Ausnahmen für mod_security festzulegen.

9.) Ausnahmen hinzufügen

Mit der oben ausgelesenen ID ist es nun möglich, Ausnahmen für bestimmte Seiten festzulegen. Am einfachsten ist es, ein neues Config-File mit einer Whitelist anzulegen:

vi /etc/apache2/mod_security/modsecurity_crs_99_whitelist.conf

<LocationMatch /administrator/index.php>
SecRuleRemoveById 950005
SecRuleRemoveById 950006
SecRuleRemoveById 950907
</LocationMatch>

Man kann die Ausnahmen alternativ auch in den <VirtualHost...>-Bereich der entsprechenden Apache Konfigurations-Datei eintragen. (/etc/apache2/sites-available/...). Die Syntax ist dann die gleiche wie im obigen Beispiel.

10.) mod_security "scharf" schalten

Um unser Modul nun einzuschalten, und auch potenzielle Angriffe zu blockieren, muss die Konfiguration entsprechend angepasst werden:

vi /etc/apache2/modsecurity2/modsecurity_crs_10_config.conf

SecRuleEngine On