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.