So sichern Sie Nginx mit NAXSI unter Ubuntu 16.04

Der Autor hatThe OWASP Foundation ausgewählt, um eine Spende im Rahmen desWrite for DOnations-Programms zu erhalten.

Einführung

Nginx ist ein beliebter Open-Source-HTTP-Server und Reverse-Proxy, der für seine Stabilität, einfache Konfiguration und sparsamen Ressourcenanforderungen bekannt ist. Sie können die Sicherheit Ihres Nginx-Servers erheblich erhöhen, indem Sie ein Modul wie NAXSI verwenden. NAXSI (Nginx Anti XSS & SQL Injection) ist ein kostenloses Nginx-Modul eines Drittanbieters, das Firewall-Funktionen für Webanwendungen bietet. NAXSI analysiert, filtert und sichert den Datenverkehr, der zu Ihrer Webanwendung gelangt, und verhält sich wie eine DROP-Standard-Firewall. Dies bedeutet, dass der gesamte Datenverkehr blockiert wird, sofern nicht ausdrücklich angewiesen wird, den Zugriff zuzulassen.

Die Einfachheit, mit der ein Benutzer den Zugriff manipulieren kann, ist eine wichtige Funktion, die NAXSI von anderen Webanwendungsfirewalls (WAF) mit ähnlichen Funktionen wieModSecurityunterscheidet. ModSecurity verfügt zwar über umfangreiche Funktionen, ist jedoch schwieriger zu warten als NAXSI. Dies macht NAXSI zu einer einfachen und anpassbaren Wahl, die leicht verfügbare Regeln bietet, die gut mit gängigen Webanwendungen wie WordPress zusammenarbeiten.

In diesem Tutorial verwenden Sie NAXSI, um Nginx auf Ihrem Ubuntu 16.04-Server zu sichern. Da das NAXSI-Modul standardmäßig nicht mit dem Nginx-Paket geliefert wird, müssen Sie Nginx aus dem Quellcode mit NAXSI kompilieren. Am Ende dieses Tutorials erfahren Sie, welche Arten von Angriffen NAXSI blockieren kann und wie Sie NAXSI-Regeln konfigurieren.

Voraussetzungen

Um dieses Tutorial abzuschließen, benötigen Sie:

[[Schritt 1 - Installation von Nginx und Naxsi]] == Schritt 1 - Installation von Nginx und NAXSI

Die meisten Nginx-Module sind nicht über Repositorys verfügbar, und NAXSI ist keine Ausnahme. Aus diesem Grund müssen Sie Nginx manuell aus dem Quellcode mit NAXSI herunterladen und kompilieren.

Laden Sie zunächst Nginx mit dem folgenden Befehl herunter.

[.note] #Note: Dieses Tutorial verwendet Version 1.14 von Nginx. Um eine neuere Version zu verwenden, können Siethe download page besuchen und den markierten Text im vorhergehenden Befehl durch eine aktualisierte Versionsnummer ersetzen. Es wird empfohlen, die neueste stabile Version zu verwenden.
#

wget http://nginx.org/download/nginx-1.14.0.tar.gz

Laden Sie anschließend NAXSI von der stabilen Version 0.56 auf Github herunter.

[.note] #Note: Dieses Tutorial verwendet Version 0.56 von NAXSI. Neuere Versionen finden Sie unterNAXSI Github page. Es wird empfohlen, die neueste stabile Version zu verwenden.
#

wget https://github.com/nbs-system/naxsi/archive/0.56.tar.gz -O naxsi

Wie Sie vielleicht bemerkt haben, ist das Nginx-Repository eintar-Archiv. Sie müssen es zuerst extrahieren, um es kompilieren und installieren zu können. Dies können Sie mit dem Befehltar tun.

tar -xvf nginx-1.14.0.tar.gz

Im vorhergehenden Befehl gibt-x das Dienstprogramm zum Extrahieren an,-v führt das Dienstprogramm im ausführlichen Modus aus und-f gibt den Namen der zu extrahierenden Archivdatei an.

Nachdem Sie die Nginx-Dateien extrahiert haben, können Sie mit dem folgenden Befehl fortfahren, um die NAXSI-Dateien zu extrahieren:

tar -xvf naxsi

Sie haben jetzt die Ordnernaxsi-0.56 undnginx-1.14.0 in Ihrem Home-Verzeichnis. Mit den Dateien, die Sie gerade heruntergeladen und extrahiert haben, können Sie den Nginx-Server mit NAXSI kompilieren. Wechseln Sie in das Verzeichnis vonnginx-1.14.0

cd nginx-1.14.0

Um Nginx aus dem Quellcode zu kompilieren, benötigen Sie den C-Compilergcc, die Perl Compatible Regular Expressions-Bibliotheklibpcre3-dev undlibssl-dev, die die kryptografischen SSL- und TLD-Protokolle implementieren. Diese Abhängigkeiten können mit dem Befehlapt-gethinzugefügt werden.

Führen Sie zunächst den folgenden Befehl aus, um sicherzustellen, dass Sie eine aktualisierte Liste der Pakete haben.

sudo apt-get update

Dann installieren Sie die Abhängigkeiten:

sudo apt-get install build-essential libpcre3-dev libssl-dev

Jetzt, da Sie alle Abhängigkeiten haben, können Sie Nginx aus dem Quellcode kompilieren. Führen Sie das folgende Skript aus, um Nginx für die Kompilierung aus dem Quellcode auf Ihrem System vorzubereiten. Dabei werden dieMakefile erstellt, die zeigen, wo alle erforderlichen Abhängigkeiten zu finden sind.

./configure \
--conf-path=/etc/nginx/nginx.conf \
--add-module=../naxsi-0.56/naxsi_src/ \
--error-log-path=/var/log/nginx/error.log \
--http-client-body-temp-path=/var/lib/nginx/body \
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
--http-log-path=/var/log/nginx/access.log \
--http-proxy-temp-path=/var/lib/nginx/proxy \
--lock-path=/var/lock/nginx.lock \
--pid-path=/var/run/nginx.pid \
--user=www-data \
--group=www-data \
--with-http_ssl_module \
--without-mail_pop3_module \
--without-mail_smtp_module \
--without-mail_imap_module \
--without-http_uwsgi_module \
--without-http_scgi_module \
--prefix=/usr

Jede Zeile des vorhergehenden Befehls definiert einen Parameter für den Nginx-Webserver. Die wichtigsten davon sind der Parameter--add-module=../naxsi-0.56/naxsi_src/, der das NAXSI-Modul mit Nginx verbindet, und die Parameter--user=www-data und--group=www-data, mit denen Nginx mit den Benutzer- und Gruppenberechtigungen eines dedizierten Benutzers ausgeführt wird Benutzer / Gruppe namenswww-data, die mit Ihrem Ubuntu 16.04-Server geliefert wird. Mit dem Parameter--with-http_ssl_module kann der Nginx-Server die SSL-Kryptografie verwenden, und mit den Parametern--without-mail_pop3_module,--without-mail_smtp_module und--without-mail_imap_module werden die nicht benötigten E-Mail-Protokolle deaktiviert, die andernfalls automatisch eingeschlossen würden. Weitere Erläuterungen zu diesen Parametern finden Sie inofficial Nginx docs.

Führen Sie nach Verwendung des Befehls./configure den Befehlmake aus, um eine Reihe von Aufgaben auszuführen, die in denMakefile definiert sind, die Sie gerade erstellt haben, um das Programm aus dem Quellcode zu erstellen.

make

Wenn Nginx erstellt und zur Ausführung bereit ist, verwenden Sie den Befehlmake install als Superuser, um das erstellte Programm und seine Bibliotheken an den richtigen Speicherort auf Ihrem Server zu kopieren.

sudo make install

Sobald dies erfolgreich ist, verfügen Sie über eine kompilierte Version von Nginx mit dem NAXSI-Modul. Damit NAXSI unerwünschten Datenverkehr blockiert, müssen Sie nun eine Reihe von Regeln festlegen, nach denen NAXSI eine Reihe von Konfigurationsdateien erstellt.

[[Schritt-2 - Konfigurieren von Naxsi]] == Schritt 2 - Konfigurieren von NAXSI

Der wichtigste Teil der Funktionsweise einer Firewall sind die Regeln, die festlegen, wie Anforderungen vom Server blockiert werden. Die grundlegenden Regeln, die standardmäßig mit NAXSI geliefert werden, heißencore rules. Diese Regeln dienen dazu, in Teilen einer Anfrage nach Mustern zu suchen und diejenigen herauszufiltern, die möglicherweise Angriffe darstellen. NAXSI-Kernregeln werden für den Signaturabgleich global auf den Server angewendet.

Um Nginx für die Verwendung dieser Kernregeln zu konfigurieren, kopieren Sie die Dateinaxsi_core.rulesin das Nginx-Konfigurationsverzeichnis.

sudo cp ~/naxsi-0.56/naxsi_config/naxsi_core.rules /etc/nginx/

Nachdem Sie die Kernregeln festgelegt haben, fügen Sie die grundlegenden Naxsi-Regeln hinzu, mit denen die Kernregeln auf Standortbasis aktiviert und implementiert werden, und weisen Sie dem Server Aktionen zu, die ausgeführt werden sollen, wenn eine URL-Anforderung die Kernregeln nicht erfüllt. Erstellen Sie eine Datei mit dem Namennaxsi.rules im Verzeichnis/etc/nginx/. Verwenden Sie dazu den folgenden Befehl, um die Datei im Texteditor mit dem Namen nano zu öffnen, oder verwenden Sie den Texteditor Ihrer Wahl.

sudo nano /etc/nginx/naxsi.rules

Fügen Sie den folgenden Codeblock hinzu, der einige grundlegende Firewallregeln definiert.

/etc/nginx/naxsi.rules

 SecRulesEnabled;
 DeniedUrl "/error.html";

 ## Check for all the rules
 CheckRule "$SQL >= 8" BLOCK;
 CheckRule "$RFI >= 8" BLOCK;
 CheckRule "$TRAVERSAL >= 4" BLOCK;
 CheckRule "$EVADE >= 4" BLOCK;
 CheckRule "$XSS >= 8" BLOCK;

Der vorhergehende Code definiert dieDeniedUrl, dh dieURL, zu denen NAXSI umleitet, wenn eine Anforderung blockiert wird. Die Datei enthält auch eine Checkliste mit verschiedenen Arten von Angriffen, die NAXSI abwehren sollte, einschließlich SQL-Injection, Cross-Site Scripting (XSS) und Remote File Inclusion (RFI). Speichern Sie den Texteditor, und beenden Sie ihn, nachdem Sie der Datei den vorhergehenden Code hinzugefügt haben.

Da Sie blockierte Anforderungen an/error.html umgeleitet haben, können Sie jetzt eineerror.html-Datei im Verzeichnis/usr/htmlerstellen, um diesem Ziel eine Zielseite bereitzustellen. Öffnen Sie die Datei in Ihrem Texteditor:

sudo nano /usr/html/error.html

Fügen Sie anschließend der Datei den folgenden HTML-Code hinzu, um eine Webseite zu erstellen, die den Benutzer darüber informiert, dass seine Anforderung blockiert wurde:

/usr/html/error.html


  
    Blocked By NAXSI
  
  
    

Malicious Request


This Request Has Been Blocked By NAXSI.

Speichern Sie die Datei und beenden Sie den Editor.

Öffnen Sie als Nächstes die Nginx-Konfigurationsdatei/etc/nginx/nginx.conf in Ihrem Texteditor.

sudo nano /etc/nginx/nginx.conf

Fügen Sie die hervorgehobenen Codezeilen in den Abschnitthttpder Dateinginx.confein, um die NAXSI-Konfigurationsdateien zur Konfiguration von Nginx hinzuzufügen, damit der Webserver weiß, wie NAXSI verwendet wird:

/etc/nginx/nginx.conf

. . .
http {
    include       mime.types;
    include /etc/nginx/naxsi_core.rules;
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;


    default_type  application/octet-stream;
. . .

Fügen Sie dann im Abschnittserver derselben Datei die folgende hervorgehobene Zeile hinzu:

/etc/nginx/nginx.conf

. . .
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
        include /etc/nginx/naxsi.rules;
            root   html;
            index  index.html index.htm;
        }
. . .

Nachdem Sie Nginx mit den Kern- und Grundregeln für NAXSI konfiguriert haben, blockiert die Firewall beim Starten des Webservers die entsprechenden böswilligen Anforderungen. Als Nächstes können Sie ein Startskript schreiben, um sicherzustellen, dass Nginx beim Neustart des Servers gestartet wird.

[[Schritt-3 - Erstellen des Startskripts für Nginx]] == Schritt 3 - Erstellen des Startskripts für Nginx

Da Sie Nginx manuell installiert haben, müssen Sie im nächsten Schritt ein Startskript erstellen, damit der Webserver beim erneuten Laden des Systems automatisch gestartet wird.

In diesem Tutorial wird das Skript mit der Systemd-Software erstellt. Zu diesem Zweck erstellen Sie eine Unit-Datei (weitere Informationen finden Sie unterUnderstanding Systemd Units and Unit Files), um zu konfigurieren, wie Systemd den Nginx-Dienst starten und verwalten soll.

Erstellen Sie eine Datei mit dem Namennginx.service und öffnen Sie sie in Ihrem Texteditor:

sudo nano /lib/systemd/system/nginx.service

Fügen Sie der Datei die folgenden Zeilen hinzu:

/lib/systemd/system/nginx.service

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Der Abschnitt[Unit] definiert das Programm, das Sie konfigurieren,[Service] beschreibt, wie sich Nginx beim Start verhalten soll, und[Install] enthält Informationen zur Geräteinstallation. Sobald Sie diese Zeilen zur Dateinginx.servicehinzugefügt haben, weißsystemd, wie Nginx gestartet wird.

Als Nächstes benötigt Nginx einen Ordner, in dem eingehende Anforderungsdaten vor der Verarbeitung zwischengespeichert werden, falls Ihr Server nicht über genügend Arbeitsspeicher verfügt. Da Sie Nginx von der Quelle installiert haben, müssen Sie ein Verzeichnis erstellen, in dem Nginx diese Daten speichern kann. Erstellen Sie ein Verzeichnis mit dem Namenbody in/var/lib/nginx:

sudo mkdir -p /var/lib/nginx/body

Wenn das Startskript eingerichtet ist, können Sie den Nginx-Server jetzt starten.

Verwenden Sie den folgenden Befehl, um den Server zu starten.

sudo systemctl start nginx

Führen Sie den folgenden Befehl aus, um zu überprüfen, ob Ihr Server aktiv ist:

sudo systemctl status nginx

In Ihrem Terminal wird die folgende Ausgabe angezeigt, die besagt, dass der Server erfolgreich gestartet wurde:

Output● nginx.service - The NGINX HTTP and reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; disabled; vendor preset: enabled)
   Active: active (running) since Mon 2018-11-05 13:59:40 UTC; 1s ago
  Process: 16199 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 16194 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
 Main PID: 16201 (nginx)
    Tasks: 2
   Memory: 1.3M
      CPU: 17ms
   CGroup: /system.slice/nginx.service
           ├─16201 nginx: master process /usr/sbin/ngin
           └─16202 nginx: worker proces
. . .

Sie haben jetzt einen laufenden Nginx-Server, der durch NAXSI gesichert ist. Im nächsten Schritt führen Sie einen simulierten XSS- und SQL-Injection-Angriff durch, um sicherzustellen, dass NAXSI Ihren Server effektiv schützt.

[[Schritt 4 - Testen von Naxsi]] == Schritt 4 - Testen von NAXSI

Um zu testen, ob Nginx mit aktiviertem NAXSI-Modul funktioniert, versuchen Sie, böswillige HTTP-Anforderungen an den Server zu senden und die Antworten zu analysieren.

Kopieren Sie zunächst die öffentliche IP Ihres Servers und verwenden Sie den Befehlcurl, um böswillige Anforderungen an den Nginx-Server zu richten.

curl 'http://your_server_ip/?q=">'

Diese URL enthält das XSS-Skript"><script>alert(0)</script> im Parameterq und sollte vom Server abgelehnt werden. Gemäß den zuvor eingerichteten NAXSI-Regeln werden Sie zur Dateierror.htmlumgeleitet und erhalten die folgende Antwort:

Output
  
    Blocked By NAXSI
  
  
    

Malicious Request


This Request Has Been Blocked By NAXSI.

Die NAXSI-Firewall hat die Anforderung blockiert.

Überprüfen Sie nun dasselbe mithilfe des Nginx-Protokolls, indem Sie das Nginx-Serverprotokoll mit dem folgenden Befehl abgleichen:

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

Im Protokoll sehen Sie, dass die XSS-Anforderung von der Remote-IP-Adresse von NAXSI blockiert wird:

Output2018/11/07 17:05:05 [error] 21356#0: *1 NAXSI_FMT: ip=your_server_ip&server=your_server_ip&uri=/&learning=0&vers=0.56&total_processed=1&total_blocked=1&block=1&cscore0=$SQL&score0=8&cscore1=$XSS&score1=8&zone0=ARGS&id0=1001&var_name0=q, client: your_server_ip, server: localhost, request: "GET /?q="> HTTP/1.1", host: "your_server_ip"

Drücken SieCTRL-C, umtail zu beenden und die Ausgabe der Fehlerprotokolldatei zu stoppen.

Versuchen Sie als Nächstes eine andere URL-Anforderung, diesmal mit einer böswilligen SQL Injection-Abfrage.

curl 'http://your_server_ip/?q=1" or "1"="1"'

Deror "1"="1"-Teil der vorhergehenden URL kann die Daten eines Benutzers in einer Datenbank verfügbar machen und wird von NAXSI blockiert. Es sollte die gleiche Antwort im Terminal erzeugen:

Output
  
    Blocked By NAXSI
  
  
    

Malicious Request


This Request Has Been Blocked By NAXSI.

Verwenden Sie nuntail, um das Serverprotokoll erneut zu verfolgen:

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

In der Protokolldatei sehen Sie den blockierten Eintrag für den SQL Injection-Versuch:

Output2018/11/07 17:08:01 [error] 21356#0: *2 NAXSI_FMT: ip=your_server_ip&server=your_server_ip&uri=/&learning=0&vers=0.56&total_processed=2&total_blocked=2&block=1&cscore0=$SQL&score0=40&cscore1=$XSS&score1=40&zone0=ARGS&id0=1001&var_name0=q, client: your_server_ip, server: localhost, request: "GET /?q=1" or "1"="1" HTTP/1.1", host: "your_server_ip"

Drücken SieCTRL-C, um das Protokoll zu verlassen.

NAXSI hat jetzt erfolgreich einen XSS- und SQL-Injection-Angriff blockiert. Dies zeigt, dass NAXSI korrekt konfiguriert wurde und Ihr Nginx-Webserver sicher ist.

Fazit

Sie haben jetzt grundlegende Kenntnisse darüber, wie Sie mit NAXSI Ihren Webserver vor böswilligen Angriffen schützen können. Weitere Informationen zum Einrichten von Nginx finden Sie unterHow To Set Up Nginx Server Blocks (Virtual Hosts) on Ubuntu 16.04. Wenn Sie die Sicherheit auf Webservern weiter untersuchen möchten, lesen SieHow To Secure Nginx with Let’s Encrypt on Ubuntu 16.04 undHow To Create a Self-Signed SSL Certificate for Nginx in Ubuntu 16.04.