Naxsi Whitelist erstellen (deprecated: nx_util)

Naxsi (Logo von MARE system)

Ich möchte in diesem Beitrag gerne erklären, wie die Whitelist für Naxsi um eigene Einträge erweitert werden kann.
Dieser Beitrag betrifft Naxsi in der Version >=0.44.
Debian Squeeze und Debian Wheezy benutzen Version 0.45, sind also kompatibel.
Ich empfehle für Debian trotzallem die Pakete aus dem dotdeb.org Repository, mehr dazu hier.
Getestet wurde dieser Beitrag auf einem Debian 7.3 System mit „nginx-naxsi“ aus dem Debian-Repository.

Voraussetzung

  • Nginx mit Naxsi Modul >=0.44. Eine Anleitung habe ich hier ebenfalls online gestellt. Diese betrifft Debian und Derivate.
  • Git (Debian und Derivate: „apt-get install git“)

Installation

Zuerst Naxsi aus dem Github in das Heimverzeichnis holen. Gebraucht wird am Ende nur das „nx_util„, jedoch ist es so einfacher:

cd
git clone https://github.com/nbs-system/naxsi.git

Nun in das „nx_util“ Verzeichnis wechseln und von dort die Installation anstoßen:

cd naxsi/nxapi
chmod +x setup.py
./setup.py build
./setup.py install

Altbekannt von Installationen aus dem Quellcode, sind die entsprechenden Dateien nun in „/usr/local“ zu finden.

Vorbereitung

Konfiguration

Der Pfad zur Konfigurationsdatei lautet „/usr/local/etc/nx_util.conf„. Der Inhalt ist aktuell (Stand 12/2013) folgender:

[nx_util]
data_dir=/usr/local/nx_datas
database_dir=
naxsi_core_rules=/etc/nginx/naxsi_core.rules

Diese ist tatsächlich so unspektakulär wie sie ausschaut. Wichtig ist lediglich der Pfad zur Datei „naxsi_core.rules„. Der bereits gesetzte Pfad stimmt mit einer Standardinstallation unter Debian überein. Sollte er geändert worden sein oder die Datei einen anderen Namen haben etc., kann der Pfad nun angepasst werden.
database_dir=“ bedeutet, dass „nx_util“ die Datenbank mit den erstellten Regeln (dazu später mehr) im aktuellen Verzeichnis, in welchem es ausgeführt wird, erstellt.

LearningMode

Da ich davon ausgehe, dass Naxsi bereits konfiguriert wurde, ist bereits eine Datei für die Regeln einer Site vorhanden, etwa definiert in der Location. Hiermit sind natürlich nicht die „naxsi_core.rules“ gemeint. Etwa:

location / {
                include    /etc/nginx/naxsi.rules;
		...
}

In der Kopfzeile der Datei (in diesem Fall „/etc/nginx/naxsi.rules„) befindet sich der Parameter „LearningMode„. Dieser wird nun auskommentiert:
Aus

#LearningMode

wird

LearningMode

Anschließend den Nginx Dienst neuladen:

service nginx reload

Hinweis: Das Einschalten des „LearningMode“ ist nicht zwingend notwendig. Wichtig sind am Ende nur die Fehler/Filter in der „error.log„. Jedoch ist es zu empfehlen, da auf diese Art Naxsi Daten sammeln kann und die Site trotzdem benutzbar bleibt. Der Parameter „DeniedUrl“ greift in diesem Fall nicht.
Der Pfad für „error_log“ der Site sollte natürlich schon bekannt sein. In einer Standardinstallation und wenn nicht explizit im „server“-Block der Site geändert, lautet „/var/log/nginx/error.log„.

Daten sammeln

An diesem Punkt heißt es: Daten sammeln. Am einfachsten geht das, indem so ziemlich alles angeklickt und ausprobiert wird, was klickbar ist. Sicherlich kann man dies auch automatisieren, allerdings wäre ich damit vorsichtig, um nicht einen Lösch-Trigger auszulösen. ;) Vermutlich sollte der LearningMode ein paar Stunden oder Tage aktiv bleiben, wobei das stark von der Benutzung abhängt.

Optional: Alte Daten verwenden

War Naxsi bereits im Einsatz und hat Kopfzerbrechen bereit, indem es fälschlich gefilter hat, können auch diese (alten) Daten verwendet werden.
Aber Vorsicht! Die vorhandenen Logs filtert ihr vorher am Besten nach eurer eigenen IP, um nicht REELLE Angriffe auf die Whitelist zu setzen! Etwa so:

cat /var/log/nginx/error.log | grep -i naxsi_fmt | grep EIGENE.IP.ADRE.SSE

Da die älteren Logdateien der Standardinstallation wohl schon archiviert wurden, verwendet an diesem Punkt „zcat“ anstatt „cat„. Am Ende könnte etwa stehen:

cat /var/log/nginx/error.log | grep -i naxsi_fmt | grep EIGENE.IP.ADRE.SSE >> ~/naxsi_fmt_errors
cat /var/log/nginx/error.log.1 | grep -i naxsi_fmt | grep EIGENE.IP.ADRE.SSE >> ~/naxsi_fmt_errors
zcat /var/log/nginx/error.log.*.gz | grep -i naxsi_fmt | grep EIGENE.IP.ADRE.SSE >> ~/naxsi_fmt_errors

Die Daten lägen nun zusammengefasst in der Datei „~/naxsi_fmt_erors„.

Naxsi Whitelist erstellen

Nun zum eigentlichen Erstellen der Regeln auf Basis der gesammelten Filter.
nx_util“ arbeitet mit Datenbanken. Diese Datenbanken können für spätere Ausführungen immer wieder verwendet werden, um den Inhalt zu erweitern – wenn erwünscht.

In diesem Beispiel würde eine Datenbank mit dem Namen „site_rules_db_name“ im aktuellen Verzeichnis gespeichert werden. Vorausgesetzt „database_dir“ wurde in der Konfiguration nicht definiert:

nx_util.py -d site_rules_db_name -l /pfad/zu/nginx/error.log

Um diese später um neue Einträge zu erweitern, wird der Parameter „-i“ verwendet:

nx_util.py -i -d site_rules_db_name -l /pfad/zu/nginx/error.log

Wird keine Datenbank definiert, erstellt das Util eine Datenbank mit dem Namen „naxsi_sig„:

nx_util.py -l /pfad/zu/nginx/error.log

Zum Auslesen der Datenbank, wird das Util mit dem Parameter „-o DB_NAME“ ausgeführt:

nx_util.py -o site_rules_db_name

Die Befehle lassen sich außerdem kombinieren. So würde eine Regel-Datenbank mit eigenem Namen auf Basis einer definierten Log erstellt und ausgegeben werden:

nx_util.py -d site_name_db -l /pfad/zu/nginx/error.log -o

Auch kann die Ausgabe in eine HTML-Datei erfolgen, hierzu wird von „-H output.html“ Gebrauch gemacht. Zum Beispiel:

nx_util.py -d site_name_db -l /pfad/zu/nginx/error.log -H output.html

Generell empfehle ich einen Blick in die „man page“ des Utils.

Eine Beispielausgabe:

12/31/2013 08:26:16 Deleting old database :site_name_db
12/31/2013 08:26:16 Unable to delete old database :site_name_db
12/31/2013 08:26:17 List of files :[‚/var/log/nginx/error.log‘]
########### Optimized Rules Suggestion ##################
# total_count:1 (11.11%), peer_count:1 (100.0%) | double quote
BasicRule wl:1001 „mz:$URL:/tag/mariadb/|$BODY_VAR:customized“;
# total_count:1 (11.11%), peer_count:1 (100.0%) | double quote
BasicRule wl:1001 „mz:$URL:/tag/bash/|$BODY_VAR:customized“;
# total_count:1 (11.11%), peer_count:1 (100.0%) | double quote
BasicRule wl:1001 „mz:$URL:/category/linux-allgemein/|$BODY_VAR:customized“;

Alle Zeilen mit „BasicRule“ beginnend sind relevant für die Whitelist. Selbstverständlich kann auch „grep“ zum Filtern benutzt werden:

nx_util.py -d site_name_db -l /pfad/zu/nginx/error.log -o | grep BasicRule

Wie erwähnt ist in diesem Beitrag die Datei „/etc/nginx/naxsi.rules“ hierfür zuständig. Am Ende dieser Datei werden die erstellten Regeln eingefügt und Nginx neu geladen:

service nginx reload

Zum Abschluss sollten die Regeln noch auf Ihre Funktion hin getestet werden. Entsprechende Whitelist-Einträge sollten nun nicht mehr als gefiltert in der jeweiligen „error.log“ auftauchen.

Kleiner Tipp: IDs kombinieren

Oft betrifft ein Filter gleich mehrere Regeln, zum Beispiel kann die Ausgabe des Utils Folgende sein:

BasicRule wl:1303 „mz:$URL:/|$ARGS_VAR:a“;
BasicRule wl:1302 „mz:$URL:/|$ARGS_VAR:a“;

Anmerkung: Das bedeutet – nach einem Blick in die „naxsi_core.rules“-Datei – dass folgende Regeln gelten:

MainRule "str:<" "msg:html open tag" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$XSS:8" id:1302;
MainRule "str:>" "msg:html close tag" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$XSS:8" id:1303;

Kombiniert wird hieraus für die Whitelist:

BasicRule wl:1302,1303 „mz:$URL:/|$ARGS_VAR:a“;

Viel Erfolg!

Eine Antwort auf “Naxsi Whitelist erstellen (deprecated: nx_util)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.