So installieren und konfigurieren Sie Naxsi unter Ubuntu 14.04

Einführung

Naxsi ist ein Nginx-Modul eines Drittanbieters, das Firewall-Funktionen für Webanwendungen bietet. Es bietet Ihrem Webserver zusätzliche Sicherheit und schützt Sie vor verschiedenen Webangriffen wie XSS- und SQL-Injections.

Naxsi ist flexibel und leistungsstark. Sie können leicht verfügbare Regeln für gängige Webanwendungen wie WordPress verwenden. Gleichzeitig können Sie im Lernmodus von Naxsi auch Ihre eigenen Regeln erstellen und diese verfeinern.

Naxsi ähnelt ModSecurity for Apache . Wenn Sie bereits mit ModSecurity vertraut sind und / oder nach ähnlichen Funktionen für Nginx suchen, wird Naxsi Sie auf jeden Fall interessieren. Möglicherweise finden Sie jedoch nicht alle ModSecurity-Funktionen in Naxsi.

In diesem Tutorial erfahren Sie, wie Sie Naxsi installieren, die Regeln verstehen, eine Whitelist erstellen und nach Regeln suchen, die bereits für häufig verwendete Webanwendungen geschrieben wurden.

Voraussetzungen

Stellen Sie vor dem Ausführen dieses Lernprogramms sicher, dass folgende Voraussetzungen erfüllt sind:

Sofern nicht anders angegeben, sollten alle Befehle, für die in diesem Lernprogramm Root-Berechtigungen erforderlich sind, als Nicht-Root-Benutzer mit Sudo-Berechtigungen ausgeführt werden.

Schritt 1 - Naxsi installieren

Um Naxsi zu installieren, müssen Sie einen damit kompilierten Nginx-Server installieren. Zu diesem Zweck benötigen Sie das Paket + nginx-naxsi +. Sie können es auf die übliche Ubuntu-Weise mit dem Befehl + apt-get + installieren:

sudo apt-get update
sudo apt-get install nginx-naxsi

Dadurch wird Naxsi zusammen mit Nginx und all seinen Abhängigkeiten installiert. Außerdem wird sichergestellt, dass der Dienst auf dem Droplet automatisch gestartet und beendet wird.

Die Standardinstallation von Nginx bietet eine grundlegende, funktionierende Nginx-Umgebung, die ausreicht, um sich mit Naxsi vertraut zu machen. Wir werden keine Zeit damit verbringen, Nginx anzupassen, sondern direkt mit der Konfiguration von Naxsi fortfahren. Wenn Sie jedoch noch keine Erfahrung mit Nginx haben, lesen Sie bitte How To Installieren Sie Nginx unter Ubuntu 14.04 LTS und den zugehörigen Artikeln, insbesondere https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-server-blocks-virtual-hosts-on-ubuntu-14 -04-lts [So richten Sie Nginx-Serverblöcke (virtuelle Hosts) unter Ubuntu 14.04 LTS ein].

Schritt 2 - Aktivieren von Naxsi

Um Naxsi zu aktivieren, müssen zuerst die Hauptregeln geladen werden, die in der Datei "+ / etc / nginx / naxsi_core.rules " enthalten sind. Diese Datei enthält allgemeine Signaturen zum Erkennen böswilliger Angriffe. Wir werden diese Regeln später genauer besprechen. Im Moment werden wir nur die Regeln in die Nginx-Hauptkonfigurationsdatei " / etc / nginx / nginx.conf +" im HTTP-Listener-Teil aufnehmen. Öffnen Sie also die zuletzt genannte Datei zum Bearbeiten mit nano:

sudo nano /etc/nginx/nginx.conf

Suchen Sie dann den Abschnitt "+ http " und kommentieren Sie den Include-Teil für die Naxsi-Regeln aus, indem Sie das Zeichen " # +" am Anfang der Zeile entfernen. Es sollte jetzt so aussehen:

/etc/nginx/nginx.conf

http {
...
       # nginx-naxsi config
       ##
       # Uncomment it if you installed nginx-naxsi
       ##


...

Speichern Sie die Datei und beenden Sie den Editor.

Zweitens müssen wir die vorherigen Regeln aktivieren und einige grundlegende Optionen für Naxsi konfigurieren. Standardmäßig befindet sich die grundlegende Naxsi-Konfiguration in der Datei "+ / etc / nginx / naxsi.rules +". Öffnen Sie diese Datei:

sudo nano /etc/nginx/naxsi.rules

Ändern Sie nur den Wert für "+ DeniedUrl +" in eine Fehlerdatei, die standardmäßig bereits vorhanden ist, und lassen Sie den Rest unverändert:

/etc/nginx/naxsi.rules

# Sample rules file for default vhost.
LearningMode;
SecRulesEnabled;
#SecRulesDisabled;


## check rules
CheckRule "$SQL >= 8" BLOCK;
CheckRule "$RFI >= 8" BLOCK;
CheckRule "$TRAVERSAL >= 4" BLOCK;
CheckRule "$EVADE >= 4" BLOCK;
CheckRule "$XSS >= 8" BLOCK;

Speichern Sie die Datei und beenden Sie sie.

Hier sind die Konfigurationsanweisungen von oben mit ihrer Bedeutung:

  • + LearningMode + - Starten Sie Naxsi im Lernmodus. Dies bedeutet, dass keine Anfrage tatsächlich blockiert wird. Im Nginx-Fehlerprotokoll werden nur Sicherheitsausnahmen ausgelöst. Ein solches nicht blockierendes Anfangsverhalten ist wichtig, da die Standardregeln ziemlich aggressiv sind. Basierend auf diesen Ausnahmen erstellen wir später eine Whitelist für legitimen Datenverkehr.

  • + SecRulesEnabled + - Aktiviert Naxsi für einen Serverblock / -standort. Ebenso können Sie Naxsi für eine Site oder einen Teil einer Site deaktivieren, indem Sie "+ SecRulesDisabled +" auskommentieren.

  • + DeniedUrl + - URL, an die abgelehnte Anfragen intern gesendet werden. Dies ist die einzige Einstellung, die Sie ändern sollten. Sie können die sofort verfügbare Fehlerseite "+ 50x.html " verwenden, die sich im Standard-Dokumentenstamm befindet (" / usr / share / nginx / html / 50x.html +"), oder Sie können Ihre eigene benutzerdefinierte Fehlerseite erstellen.

  • + CheckRule + - Legen Sie den Schwellenwert für die verschiedenen Zähler fest. Sobald diese Schwelle überschritten ist (z. 8 Punkte für den SQL-Zähler) wird die Anfrage gesperrt. Um diese Regeln aggressiver zu gestalten, verringern Sie ihre Werte und umgekehrt.

Die Datei "+ naxsi.rules " muss für einen Serverblock auf Standortbasis geladen werden. Laden wir es für den Root-Speicherort (" / ") des Standard-Serverblocks. Öffnen Sie zuerst die Konfigurationsdatei des Serverblocks " / etc / nginx / sites-enabled / default +":

sudo nano /etc/nginx/sites-enabled/default

Suchen Sie dann den Root-Speicherort "+ / +" und stellen Sie sicher, dass er folgendermaßen aussieht:

   location / {
           # First attempt to serve request as file, then
           # as directory, then fall back to displaying a 404.
           try_files $uri $uri/ =404;
           # Uncomment to enable naxsi on this location

   }

Nachdem Sie die obigen Änderungen vorgenommen haben, können Sie Nginx neu laden, damit die Änderungen wirksam werden:

sudo service nginx reload

Im nächsten Schritt wird erläutert, wie Sie überprüfen, ob die Änderungen erfolgreich waren, und wie Sie die Protokolle lesen.

Schritt 3 - Überprüfen der Protokolle

Um sicherzustellen, dass Naxsi auch im Lernmodus funktioniert, greifen wir auf eine URL zu, die eine Ausnahme auslösen soll, und überprüfen das Fehlerprotokoll auf die Ausnahme.

Wir werden später sehen, wie diese Regel genau funktioniert. Derzeit wird das Fehlerprotokoll von Tail Nginx nach der Ausnahme durchsucht (die Option "+ -f +" hält die Ausgabe offen und fügt neuen Inhalt hinzu:

sudo tail -f /var/log/nginx/error.log

Versuchen Sie unter der URL "+ http: ///index.html? Asd = ---- +" auf Ihr Droplet zuzugreifen. Dies sollte aufgrund der Bindestriche, die in SQL für Kommentare verwendet werden, eine Naxsi-Sicherheitsausnahme auslösen und daher als Teil der SQL-Injektionen betrachtet werden.

In der Ausgabe von + sudo tail -f / var / log / nginx / error.log + sollte nun der folgende neue Inhalt angezeigt werden:

Output of nginx's error log2015/11/14 03:58:35 [error] 4088#0: *1 NAXSI_FMT: ip=X.X.X.X&server=Y.Y.Y.Y&uri=/index.html&learning=1&total_processed=24&total_blocked=1&, client: X.X.X.X, server: localhost, request: "GET /index.html?asd=---- HTTP/1.1", host: "Y.Y.Y.Y"

Der wichtigste Teil der obigen Zeile ist hervorgehoben: + zone0 = ARGS & id0 = 1007 & var_name0 = asd +. Es gibt Ihnen die Zone (den Teil der Anforderung), die ID der ausgelösten Regel und den Variablennamen der verdächtigen Anforderung.

Außerdem ist "+ X.X.X.X " die IP Ihres lokalen Computers und " Y.Y.Y.Y " die IP Ihres Droplets. Die URI enthält auch den Dateinamen der Anfrage (` index.htm `), die Tatsache, dass Naxsi noch im Lernmodus arbeitet (` learning = 1 `) und die Gesamtzahl aller verarbeiteten Anfragen (` total_processed) = 24 + `).

Unmittelbar nach der obigen Zeile sollte eine Nachricht über die Weiterleitung zum + DeniedUrl + folgen:

Output of nginx's error log2015/11/14 03:58:35 [error] 4088#0: *1 rewrite or internal redirection cycle while internally redirecting to "/50x.html" while sending response to client, client: X.X.X.X, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "Y.Y.Y.Y", referrer: "http://Y.Y.Y.Y/index.html?asd=----"

Wenn sich Naxsi im Lernmodus befindet, wird diese Umleitung nur in den Protokollen angezeigt, jedoch nicht tatsächlich.

Drücken Sie "+ STRG-C ", um " tail +" zu beenden und die Ausgabe der Fehlerprotokolldatei zu stoppen.

Später werden wir mehr über die Regeln von Naxsi erfahren. Dann wird es wichtig sein, dass Sie über dieses grundlegende Verständnis der Protokolle verfügen.

Schritt 4 - Konfigurieren der Naxsi-Regeln

Der wichtigste Teil der Konfiguration von Naxsi sind die Regeln. Es gibt zwei Arten von Regeln - Hauptregeln und Grundregeln. Die Hauptregeln (gekennzeichnet durch "+ MainRule ") werden global auf den Server angewendet und sind daher Teil des " http +" - Blocks der Hauptkonfiguration von Nginx. Sie enthalten generische Signaturen zum Erkennen böswilliger Aktivitäten.

Die Grundregeln (gekennzeichnet mit "+ BasicRule +") werden hauptsächlich zum Whitelisten von falsch positiven Signaturen und Regeln verwendet. Sie werden pro Standort angewendet und sollten daher Teil der Serverblockkonfiguration (vhost) sein.

Beginnen wir mit den Hauptregeln und werfen einen Blick auf die Standardregeln, die im Paket "+ nginx-naxsi " in der Datei " / etc / nginx / naxsi_core.rules +" enthalten sind. Hier ist eine Beispielzeile:

/etc/nginx/naxsi_core.rules

...
MainRule "str:--" "msg:mysql comment (--)" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:4" id:1007;
...

Aus der obigen Regel können wir die folgenden Teile ableiten, die universell sind und in jeder Regel vorhanden sind:

  • + MainRule + ist die Direktive, mit der jede Regel beginnt. Ebenso endet jede Regel mit der ID-Nummer der Regel.

  • + str: + steht im zweiten Teil der Regel. Wenn es "+ str: " ist, bedeutet dies, dass die Signatur eine einfache Zeichenfolge ist, wie im obigen Beispiel. Reguläre Ausdrücke können auch mit der Direktive ` rx: +` abgeglichen werden.

  • + msg: + verdeutlicht die Regel.

  • + mz: + steht für Match Zone, oder welcher Teil der Anfrage geprüft wird. Dies können der Text, die URL, die Argumente usw. sein.

  • + s: + bestimmt die Punktzahl, die vergeben wird, wenn die Signatur gefunden wird. Scores werden zu verschiedenen Leistungsindikatoren hinzugefügt, z. B. zu "+ SQL " (SQL-Angriffe), " RFI +" (Angriffe zur Einbeziehung von Remotedateien) usw.

Grundsätzlich bedeutet die obige Regel (+ id 1007 +) mit dem Kommentar + mysql comments +, dass, wenn der String + - + in einem Teil einer Anfrage (body, arguments, etc.) gefunden wird, 4 Punkte wird zum SQL-Zähler hinzugefügt.

Wenn wir zu dem Beispiel-URI (+ http: ///index.html? Asd = ---- +) zurückkehren, der die SQL-Ausnahme im Protokoll ausgelöst hat, werden Sie feststellen, dass wir zum Auslösen von Regel 1007 2 benötigten Strichpaare (+ - +). Dies liegt daran, dass wir für jedes Paar 4 Punkte erhalten und die SQL-Kette 8 Punkte benötigt, um eine Anfrage zu blockieren. Somit wäre nur ein Paar Bindestriche unproblematisch, und in den meisten Fällen leidet der legitime Verkehr nicht.

Eine spezielle Regelanweisung ist "+ negativ +". Es werden Bewertungen angewendet, wenn die Signatur nicht übereinstimmt, d. H. Sie vermuten böswillige Aktivitäten, wenn etwas in der Anfrage fehlt.

Betrachten wir zum Beispiel die Regel mit "+ id 1402 " aus derselben Datei " /etc/nginx/naxsi_core.rules +":

/etc/nginx/naxsi_core.rules

...
MainRule negative "rx:multipart/form-data|application/x-www-form-urlencoded" "msg:Content is neither mulipart/x-www-form.." "mz:$HEADERS_VAR:Content-type" "s:$EVADE:4" id:1402;
...

Die obige Regel bedeutet, dass dem EVADE-Zähler 4 Punkte hinzugefügt werden, wenn der Anforderungskopf "+ Inhaltstyp " weder " mehrteilige / Formulardaten " noch " Anwendung / x-www-formular-urlenkodiert " enthält . Diese Regel ist auch ein Beispiel dafür, wie reguläre Ausdrücke (` rx: +`) für die Signaturbeschreibung verwendet werden können.

Schritt 5 - Whitelisting-Regeln

Die Standardregeln von Naxsi blockieren mit ziemlicher Sicherheit legitimen Datenverkehr auf Ihrer Website, insbesondere wenn Sie über eine komplexe Webanwendung verfügen, die eine Vielzahl von Benutzerinteraktionen unterstützt. Aus diesem Grund gibt es Whitelists, um solche Probleme zu lösen.

Whitelists werden mit dem zweiten Regeltyp erstellt, den Grundregeln von Naxsi. Mit einer Grundregel können Sie entweder eine ganze Regel oder Teile davon auf die Whitelist setzen.

Um zu demonstrieren, wie grundlegende Regeln funktionieren, kehren wir zur SQL-Kommentarregel (ID 1007) zurück. Stellen Sie sich vor, Sie haben eine Datei mit zwei Bindestrichen im Dateinamen, z. + some - file.html auf Ihrer Site. Mit der Regel 1007 erhöht diese Datei den SQL-Zähler um 4 Punkte. Dieser Dateiname allein und die resultierende Punktzahl reichen nicht aus, um eine Anfrage zu blockieren, es handelt sich jedoch immer noch um ein falsches Positiv, das Probleme verursachen kann. Wenn wir zum Beispiel auch ein Argument mit zwei Bindestrichen haben, löst die Anforderung die Regel 1007 aus.

Um es zu testen, schließen Sie das Fehlerprotokoll wie zuvor ab:

sudo tail -f /var/log/nginx/error.log

Versuchen Sie, auf "+ http: ///some—​file.html? Asd = - +" zuzugreifen. Sie müssen diese Datei für den Test nicht auf Ihrer Website haben.

In der Ausgabe des Fehlerprotokolls sollte eine bekannte Ausnahme ähnlich der folgenden angezeigt werden:

Output of nginx's error log2015/11/14 14:43:36 [error] 5182#0: *10 NAXSI_FMT: ip=X.X.X.X&server=Y.Y.Y.Y&uri=/some--file.html&learning=1&total_processed=10&total_blocked=6&zone0=URL&id0=1007&var_name0=&zone1=ARGS&id1=1007&var_name1=asd, client: X.X.X.X, server: localhost, request: "GET /some--file.html?asd=-- HTTP/1.1", host: "Y.Y.Y.Y"

Drücken Sie + STRG-C +, um die Ausgabe des Fehlerprotokolls zu beenden.

Um diesen falsch positiven Auslöser zu beheben, benötigen wir eine Whitelist, die wie folgt aussieht:

BasicRule :1007 "mz:URL";

Das wichtige Schlüsselwort ist "+ wl +" für die Whitelist, gefolgt von der Regel-ID. Um genauer zu sein, was wir auf der Positivliste haben, haben wir auch die Übereinstimmungszone angegeben - die URL.

Um diese Whitelist anzuwenden, erstellen Sie zunächst eine neue Datei für Whitelists:

sudo nano /etc/nginx/naxsi_whitelist.rules

Fügen Sie dann die Regel in die Datei ein:

/etc/nginx/naxsi_whitelist.rules

BasicRule wl:1007 "mz:URL";

Wenn Sie andere Whitelists haben, können diese auch in diese Datei aufgenommen werden, und zwar jeweils in einer neuen Zeile.

Die Datei mit den Whitelists muss in Ihrem Serverblock enthalten sein. Um es in den Standardserverblock aufzunehmen, verwenden Sie erneut nano:

sudo nano /etc/nginx/sites-enabled/default

Fügen Sie dann das neue Include direkt nach dem vorherigen für Naxsi wie folgt hinzu:

/ etc / nginx / sites-enabled / default

       location / {
               # First attempt to serve request as file, then
               # as directory, then fall back to displaying a 404.
               try_files $uri $uri/ =404;
               # Uncomment to enable naxsi on this location
               include /etc/nginx/naxsi.rules;

       }

Laden Sie Nginx neu, damit diese Änderung wirksam wird:

sudo service nginx reload

Wenn Sie nun die gleiche Anfrage in Ihrem Browser an "+ / some - file.html? Asd = - " erneut versuchen, wird nur der " asd +" - Parameter, der zwei Strichen entspricht, 4 Punkte für den SQL-Zähler auslösen, aber der ungewöhnliche Dateiname wird nicht. Daher wird diese Anforderung im Fehlerprotokoll nicht als Ausnahme angezeigt.

Das Schreiben aller erforderlichen Whitelists kann eine mühsame Aufgabe und eine Wissenschaft für sich sein. Aus diesem Grund können Sie zu Beginn leicht verfügbare Naxsi-Whitelists verwenden. Es gibt solche für die meisten gängigen Webanwendungen. Sie müssen sie nur herunterladen und in den Serverblock aufnehmen, wie wir es gerade getan haben.

Nachdem Sie sichergestellt haben, dass im Fehlerprotokoll keine Ausnahmen für berechtigte Anforderungen angezeigt werden, können Sie den Lernmodus von Naxsi deaktivieren. Öffnen Sie dazu die Datei + / etc / nginx / naxsi.rules + mit nano:

sudo nano /etc/nginx/naxsi.rules

Kommentieren Sie die Direktive "+ LearningMode " aus, indem Sie das Zeichen " # +" wie folgt voranstellen:

/etc/nginx/naxsi.rules

...
LearningMode;
SecRulesEnabled;
#SecRulesDisabled;
...

Laden Sie abschließend Nginx neu, damit die Änderung wirksam wird:

sudo service nginx reload

Jetzt blockiert Naxsi verdächtige Anfragen und Ihre Website wird sicherer.

Fazit

So einfach ist es, eine Webanwendungs-Firewall mit Nginx und Naxsi zu haben. Das ist genug für einen Anfang und Sie werden hoffentlich mehr darüber erfahren wollen, was das leistungsstarke Naxsi-Modul zu bieten hat. Jetzt können Sie Ihren Nginx-Server nicht nur schnell, sondern auch sicher machen.

Related