ModSecurity 3 mit Nginx auf Ubuntu 22.04

Die Sicherheit von Websites und Webanwendungen kann für jeden Systemadministrator eine Herausforderung sein. Es gibt viele Open-Source-Tools, die deine Website vor DDoS-Angriffen schützen. ModSecurity ist eine kostenlose und quelloffene Web Application Firewall (WAF), die deine Website vor verschiedenen Arten von Angriffen wie Cross-Site Scripting (XSS), SQL Injection, Session Hijacking und vielen anderen schützt.

In dieser Anleitung zeige ich dir, wie du ModSecurity mit Nginx auf Ubuntu 22.04 installierst.

Voraussetzungen

  • Ein Server, auf dem Ubuntu 22.04 läuft.
  • Ein Root-Passwort ist auf dem Server konfiguriert.

Erste Schritte

Zunächst wird empfohlen, alle Softwarepakete auf die neueste Version zu aktualisieren und aufzurüsten. Du kannst alle Pakete mit folgendem Befehl aktualisieren:

apt update -y
apt upgrade -y

Sobald alle Pakete aktualisiert sind, installierst du weitere benötigte Pakete mit dem folgenden Befehl:

apt install g++ flex bison curl apache2-dev doxygen libyajl-dev ssdeep liblua5.2-dev libgeoip-dev libtool dh-autoreconf libcurl4-gnutls-dev libxml2 libpcre++-dev libxml2-dev git liblmdb-dev libpkgconf3 lmdb-doc pkgconf zlib1g-dev libssl-dev -y

Wenn du damit fertig bist, kannst du mit dem nächsten Schritt fortfahren.

ModSecurity auf Ubuntu 22.04 installieren

Standardmäßig ist das ModSecurity-Paket nicht im Ubuntu-Standard-Repository enthalten. Du musst es also aus dem Quellcode kompilieren.

Lade zunächst die neueste Version von ModSecurity mit dem folgenden Befehl herunter:

wget https://github.com/SpiderLabs/ModSecurity/releases/download/v3.0.8/modsecurity-v3.0.8.tar.gz

Sobald der Download abgeschlossen ist, entpackst du die heruntergeladene Datei mit dem folgenden Befehl:

tar -xvzf modsecurity-v3.0.8.tar.gz

Als Nächstes navigierst du in das entpackte Verzeichnis und konfigurierst es mit dem folgenden Befehl:

cd modsecurity-v3.0.8
./build.sh
./configure

Installiere sie mit dem folgenden Befehl:

make
make install

Nginx mit ModSecurity 3-Unterstützung installieren

Als Nächstes musst du Nginx mit ModSecurity-Unterstützung installieren. Lade zuerst den ModSecurity-nginx Connector mit folgendem Befehl herunter:

cd ~
git clone https://github.com/SpiderLabs/ModSecurity-nginx.git

Als Nächstes lädst du den Nginx-Quellcode mit dem folgenden Befehl herunter:

wget https://nginx.org/download/nginx-1.20.2.tar.gz

Entpacke den Nginx-Quellcode mit folgendem Befehl:

tar xzf nginx-1.20.2.tar.gz

Als Nächstes erstellst du einen Benutzer für Nginx mit dem folgenden Befehl:

useradd -r -M -s /sbin/nologin -d /usr/local/nginx nginx

Wechsle als Nächstes in das Verzeichnis des Nginx-Quellcodes und konfiguriere ihn mit dem folgenden Befehl:

cd nginx-1.20.2
./configure --user=nginx --group=nginx --with-pcre-jit --with-debug --with-compat --with-http_ssl_module --with-http_realip_module --add-dynamic-module=/root/ModSecurity-nginx --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log

Als Nächstes installierst du es mit dem folgenden Befehl:

make
make modules
make install

Als Nächstes erstellst du einen symbolischen Link von Nginx mit dem folgenden Befehl:

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

Als Nächstes überprüfst du die Nginx-Version mit folgendem Befehl

nginx -V

Du erhältst die Nginx-Version in der folgenden Ausgabe:

nginx version: nginx/1.20.2
built by gcc 11.2.0 (Ubuntu 11.2.0-19ubuntu1) 
built with OpenSSL 3.0.2 15 Mar 2022
TLS SNI support enabled
configure arguments: --user=nginx --group=nginx --with-pcre-jit --with-debug --with-compat --with-http_ssl_module --with-http_realip_module --add-dynamic-module=/root/ModSecurity-nginx --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log

Wenn du fertig bist, kannst du Nginx mit ModSecurity konfigurieren.

Nginx mit ModSecurity konfigurieren

Als Nächstes kopierst du die Beispielkonfigurationsdateien mit dem folgenden Befehl:

cp ~/modsecurity-v3.0.8/modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf
cp ~/modsecurity-v3.0.8/unicode.mapping /usr/local/nginx/conf/

Als nächstes erstellst du ein Backup der Nginx-Konfigurationsdatei:

cp /usr/local/nginx/conf/nginx.conf{,.bak}

Als Nächstes bearbeitest du die Nginx-Konfigurationsdatei:

nano /usr/local/nginx/conf/nginx.conf

Entferne die Standardzeilen und füge die folgenden Zeilen hinzu:

load_module modules/ngx_http_modsecurity_module.so;
user  nginx;
worker_processes  1;
pid        /run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  nginx.example.com;
        modsecurity  on;
        modsecurity_rules_file  /usr/local/nginx/conf/modsecurity.conf;
        access_log  /var/log/nginx/access_example.log;
        error_log  /var/log/nginx/error_example.log;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

Speichere und schließe die Datei und aktiviere die ModSecurity mit dem folgenden Befehl:

sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' /usr/local/nginx/conf/modsecurity.conf

Wenn du damit fertig bist, kannst du mit dem nächsten Schritt fortfahren.

ModSecurity Core Rule Set installieren

Das OWASP ModSecurity Core Rule Set bietet eine Reihe von Regeln zur Erkennung und zum Schutz vor einer Vielzahl von Angriffen, einschließlich der OWASP Top Ten, mit einem Minimum an Fehlalarmen.

Lade zunächst das OWASP-Regelset mit dem folgenden Befehl herunter:

cd
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git /usr/local/nginx/conf/owasp-crs

Als Nächstes benennst du die Datei crs-setup.conf.example in crs-setup.conf um:

cp /usr/local/nginx/conf/owasp-crs/crs-setup.conf{.example,}

Als Nächstes definierst du die Regeln mit dem folgenden Befehl:

echo -e "Include owasp-crs/crs-setup.conf
Include owasp-crs/rules/*.conf" >> /usr/local/nginx/conf/modsecurity.conf

Als Nächstes überprüfst du Nginx mit folgendem Befehl auf eventuelle Konfigurationsfehler:

nginx -t

Wenn alles in Ordnung ist, erhältst du die folgende Ausgabe:

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

Wenn du fertig bist, kannst du mit dem nächsten Schritt fortfahren.

Erstelle eine Systemd-Dienstdatei für Nginx

Als Nächstes musst du eine systemd-Dienstdatei erstellen, um den Nginx-Dienst zu verwalten. So kannst du den Nginx-Dienst über systemd starten und stoppen. Du kannst sie mit dem folgenden Befehl erstellen:

nano /etc/systemd/system/nginx.service

Füge die folgenden Zeilen ein:

[Unit]
Description=A high performance web server and a reverse proxy server
Documentation=man:nginx(8)
After=network.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/local/nginx/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/local/nginx/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=multi-user.target

Speichere und schließe die Datei und lade dann den systemd-Daemon neu, damit die Änderungen übernommen werden:

systemctl daemon-reload

Als Nächstes startest und aktivierst du Nginx mit dem folgenden Befehl:

systemctl start nginx
systemctl enable nginx

Du kannst den Nginx-Status mit folgendem Befehl überprüfen:

systemctl status nginx

Du solltest die folgende Ausgabe sehen:

? nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/etc/systemd/system/nginx.service; disabled; vendor preset: enabled)
     Active: active (running) since Tue 2022-10-11 15:40:39 UTC; 6s ago
       Docs: man:nginx(8)
    Process: 68438 ExecStartPre=/usr/local/nginx/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 68439 ExecStart=/usr/local/nginx/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
   Main PID: 68440 (nginx)
      Tasks: 2 (limit: 4579)
     Memory: 20.0M
        CPU: 293ms
     CGroup: /system.slice/nginx.service
             ??68440 "nginx: master process /usr/local/nginx/sbin/nginx -g daemon on; master_process on;"
             ??68441 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" >

Oct 11 15:40:38 ubuntu2204 systemd[1]: Starting A high performance web server and a reverse proxy server...
Oct 11 15:40:39 ubuntu2204 systemd[1]: Started A high performance web server and a reverse proxy server.

Wenn du fertig bist, kannst du mit dem nächsten Schritt fortfahren.

Überprüfe ModSecurity

Nachdem du Modsecurity mit Nginx installiert und konfiguriert hast. Es ist an der Zeit, es zu testen. Führe den folgenden Befehl aus, um die Modsecurity gegen Command Injection zu testen:

curl localhost?doc=/bin/ls

Wenn alles in Ordnung ist, erhältst du die Meldung „403 Forbidden“.

<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.20.2</center>
</body>
</html>

Du kannst auch das Modesecurity-Protokoll mit folgendem Befehl überprüfen:

tail /var/log/modsec_audit.log

Du solltest das ModSecurity-Protokoll in der folgenden Ausgabe sehen:

ModSecurity: Warning. Matched "Operator `PmFromFile' with parameter `unix-shell.data' against variable `ARGS:doc' (Value: `/bin/ls' ) [file "/usr/local/nginx/conf/owasp-crs/rules/REQUEST-932-APPLICATION-ATTACK-RCE.conf"] [line "496"] [id "932160"] [rev ""] [msg "Remote Command Execution: Unix Shell Code Found"] [data "Matched Data: bin/ls found within ARGS:doc: /bin/ls"] [severity "2"] [ver "OWASP_CRS/3.2.0"] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-shell"] [tag "platform-unix"] [tag "attack-rce"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "OWASP_CRS/WEB_ATTACK/COMMAND_INJECTION"] [tag "WASCTC/WASC-31"] [tag "OWASP_TOP_10/A1"] [tag "PCI/6.5.2"] [hostname "127.0.0.1"] [uri "/"] [unique_id "166550286018.572845"] [ref "o1,6v10,7t:urlDecodeUni,t:cmdLine,t:normalizePath,t:lowercase"]
ModSecurity: Access denied with code 403 (phase 2). Matched "Operator `Ge' with parameter `5' against variable `TX:ANOMALY_SCORE' (Value: `5' ) [file "/usr/local/nginx/conf/owasp-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "80"] [id "949110"] [rev ""] [msg "Inbound Anomaly Score Exceeded (Total Score: 5)"] [data ""] [severity "2"] [ver "OWASP_CRS/3.2.0"] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-generic"] [hostname "127.0.0.1"] [uri "/"] [unique_id "166550286018.572845"] [ref ""]

---IcTYGSZl---I--

---IcTYGSZl---J--

---IcTYGSZl---Z--

Schlussfolgerung

Herzlichen Glückwunsch! Du hast erfolgreich ModSecurity mit Nginx auf Ubuntu 22.04 installiert. Jetzt kannst du ModSecurity in deiner Produktionsumgebung einsetzen, um dich vor DDoS-Angriffen zu schützen. Wenn du noch Fragen hast, kannst du dich gerne an mich wenden.

Das könnte dich auch interessieren …