Analyse des Prinzips von Nginx unter Verwendung des Lua-Moduls zur Implementierung von WAF

Analyse des Prinzips von Nginx unter Verwendung des Lua-Moduls zur Implementierung von WAF

Vorwort: Ich habe kürzlich Funktionen zur Verschlüsselung von Daten geschrieben, aber mir fehlt immer noch das Wissen über Sicherheit. Ich bin zufällig mit WAF-bezogenem Wissen in Berührung gekommen. Es stellte sich heraus, dass Nginx WAF-Funktionen realisieren kann. Ich habe auch kurz die Sprache Lua gelernt. Teile es mit mir

1. Hintergrund von WAF

In der Vergangenheit verwendeten Unternehmen Firewalls normalerweise als erste Verteidigungslinie für ihre Sicherheit. Damals blockierten Firewalls nur einige Datenpakete auf der dritten Schicht (Netzwerkschicht). Da Webanwendungen jedoch immer funktionaler wurden, wurden Webserver aufgrund ihrer starken Rechenleistung, Verarbeitungsleistung und ihres hohen Wertes zum Hauptziel von Angriffen (siebte Schicht, Anwendungsschicht). Herkömmliche Firewalls können jedoch Angriffe, die Schwachstellen in Anwendungen ausnutzen, nicht verhindern. In diesem Zusammenhang entstand die WAF (Web Application Firewall).

2. Was ist WAF

Die Web Application Firewall (WAF) dient dem Schutz von Webanwendungen vor verschiedenen Angriffen auf Anwendungsebene, wie etwa Cross-Site-Scripting (XSS), SQL-Injection und Cookie-Poisoning. Anwendungen sind das Tor zu Ihren wichtigen Daten, daher sind Angriffe auf Anwendungen die Hauptursache für Sicherheitslücken. Mit WAF können Sie eine Reihe von Angriffen blockieren, die versuchen, durch Eindringen in das System Daten zu verlieren.

3. Funktionsprinzip

1. Der Benutzer sendet über den Browser eine Webseitenanforderung an den Webserver.

2. Bevor die Benutzeranfrage den Webserver erreicht, filtert WAF die Benutzeranfrage

3. WAF erhält die HTTP-Anforderungsparameter des Benutzers und vergleicht sie mit den in der Konfigurationsdatei definierten Regeln (z. B. der IP-Blacklist). Wenn eine Übereinstimmung gefunden wird, wird eine 403-Ablehnung zurückgegeben; andernfalls wird die Anforderung zugelassen.

4. Der WEB-Server antwortet auf die Anfrage des Benutzers und gibt die Seitendaten an den Benutzer zurück.

4. WAF-Funktion

WAF ist ein Produkt, das Schutz für Webanwendungen bietet, indem es eine Reihe von Sicherheitsrichtlinien für HTTP/HTTPS ausführt.

5. Unterschiede zwischen WAF und herkömmlichen Firewalls

1. Herkömmliche Firewalls arbeiten auf der Netzwerkebene (Schicht 3) und der Transportebene (Schicht 4)

2.WAF arbeitet auf der Anwendungsebene (Schicht 7)

3. Herkömmliche Firewalls filtern IP und Port

4.WAF filtert HTTP-Anfragen, einschließlich URL, IP, User-Agent usw.

6. WAF und DDos

Der vollständige Name von DDos lautet Distributed Denial of Service. Dabei wird hauptsächlich eine Gruppe von Computern eingesetzt, um Anfragen an ein einzelnes Zielsystem zu stellen. Dies führt dazu, dass die Ressourcen des Zielsystems erschöpft werden und normale Anfragen abgelehnt werden.

Gemäß dem OSI-Netzwerkmodell gibt es drei häufigste Arten von DDos: DDos der Schicht 3 (Netzwerkschicht), DDos der Schicht 4 (Transportschicht) und DDos der Schicht 7 (Anwendungsschicht).

WAF befasst sich hauptsächlich mit DDoS-Angriffen der Ebene 7 und ist im Umgang mit DDoS-Angriffen der Ebene 7 effizienter als andere Schutzmaßnahmen. WAF führt eine detaillierte Analyse des HTTP-Verkehrs durch, sodass es normale Zugriffsanforderungen modellieren und diese Modelle dann verwenden kann, um normale Anforderungen von Anforderungen zu unterscheiden, die von Angreifern mithilfe von Robotern oder Skripten ausgelöst werden.

7. Nginx WAF-Funktion

  • Unterstützt IP-Whitelist- und -Blacklist-Funktionen, verweigert den Zugriff auf IPs auf der Blacklist direkt (die neu hinzugefügte CDIP-Funktion unterstützt IP-Segmente)
  • Unterstützt URL-Whitelists, um URLs zu definieren, die nicht gefiltert werden müssen
  • Unterstützt User-Agent-Filterung, gleicht Einträge in benutzerdefinierten Regeln ab und verarbeitet sie dann
  • Unterstützt CC-Angriffsschutz, wenn die Anzahl der Besuche einer einzelnen URL innerhalb einer bestimmten Zeit den festgelegten Wert überschreitet (neu hinzugefügt für verschiedene Domänennamen)
  • Unterstützt Cookie-Filterung, Abgleich von Einträgen in benutzerdefinierten Regeln und anschließende Verarbeitung
  • Unterstützt URL-Filterung und passende Einträge in benutzerdefinierten Regeln. Wenn die vom Benutzer angeforderte URL diese enthält
  • Unterstützt die Filterung von URL-Parametern. Das Prinzip ist das gleiche wie oben.
  • Unterstützt die Protokollierung und zeichnet alle abgelehnten Vorgänge im Protokoll auf
  • Unterstützung für Blacklist-Cache hinzugefügt (Standard 600 Sekunden)

8. Nginx Waf-Schutzprozess

wenn whiteip() dann
sonstwenn blockip() dann
sonstwenndenycc() dann
sonst wenn ngx.var.http_Acunetix_Aspect dann
ngx.exit(444)
sonstwenn ngx.var.http_X_Scan_Memo dann
ngx.exit(444)
sonstwenn whiteurl() dann
sonstwenn ua() dann
sonstwenn url() dann
sonstwenn args() dann
sonstwenn cookie() dann
sonstwenn PostCheck dann

  • Überprüfen Sie die IP-Whitelist. Wenn sie gültig ist, wird sie nicht erkannt.
  • Überprüfen Sie die IP-Blacklist und lehnen Sie ab, wenn der Antrag fehlschlägt.
  • CC-Angriff prüfen, bei Übereinstimmung ablehnen
  • Überprüfen Sie, ob das http_Acunetix_Aspect-Scannen aktiviert ist
  • Überprüfen Sie, ob das Scannen von http_X_Scan_Memo aktiviert ist
  • Überprüfen Sie die Whitelist-URL-Prüfung.
  • Überprüfen Sie UA und lehnen Sie ab, wenn UA fehlschlägt.
  • Überprüfen Sie die URL-Parameterprüfung.
  • Cookies prüfen;
  • Beitrag prüfen;

9. WAF basierend auf Nginx

9.1 Installieren von Abhängigkeitspaketen

yum -y installiere gcc gcc-c++ autoconf automake make entpacken
yum -y installiere zlib zlib-devel openssl openssl-devel pcre pcre-devel

9.2 LuaJIT2.0 installieren

LuaJIT ist der Just-in-Time-Compiler von Lua. Einfach ausgedrückt ist LuaJIT eine effiziente virtuelle Lua-Maschine.

# Wechseln Sie in das Verzeichnis cd /usr/local/src/
 
# LuaJIT2.0 herunterladen
wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz
 
# Entpacken Sie tar xf LuaJIT-2.0.5.tar.gz und cd LuaJIT-2.0.5
 
# Kompilieren Sie make
 
# Installieren make install PREFIX=/usr/local/lj2
 
# Erstellen Sie einen Softlink ln -s /usr/local/lj2/lib/libluajit-5.1.so.2 /lib64/
 
# Umgebungsvariable hinzufügen export LUAJIT_LIB=/usr/local/lj2/lib/
exportiere LUAJIT_INC=/usr/local/lj2/include/luajit-2.0/

9.3 Installieren Sie ngx_devel_kit

Das Kit-Modul ist ein Modul, das die Kernfunktionen des Nginx-Servers erweitert. Darauf basierend können Drittanbieter-Modulentwicklungen schnell umgesetzt werden.

# Wechseln Sie in das Verzeichnis cd /user/local/src/
 
# Laden Sie v0.3.0.tar.gz herunter
wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.0.tar.gz -O ngx_devel_kit.tar.gz
 
# Entpacken Sie tar xf ngx_devel_kit.tar.gz

9.4 Installieren Sie das Lua-Nginx-Modul

ngx_lua_module ist ein Nginx-HTTP-Modul, das den Lua-Parser in Nginx einbettet, um in der Sprache Lua geschriebene Web-Backend-Skripte zu analysieren und auszuführen.

Prinzip des ngx_lua-Moduls

1. Jeder Worker (Arbeitsprozess) erstellt eine Lua-VM und alle Coroutinen im Worker teilen sich die VM.
2. Kapseln Sie die Nginx-E/A-Grundelemente ein und fügen Sie sie in die Lua-VM ein, sodass Lua-Code direkt auf sie zugreifen kann.
3. Jede externe Anfrage wird von einer Lua-Coroutine verarbeitet und die Daten zwischen den Coroutinen werden isoliert.
4. Wenn Lua-Code asynchrone Schnittstellen wie E/A-Operationen aufruft, wird er die aktuelle Coroutine anhalten (und die Kontextdaten schützen), ohne den Worker zu blockieren.
5. Wenn asynchrone Vorgänge wie E/A abgeschlossen sind, werden die relevanten Coroutine-Kontextdaten wiederhergestellt und der Vorgang fortgesetzt

Installieren

# Wechseln Sie in das Verzeichnis cd /user/local/src/
 
# Laden Sie v0.10.9rc7.tar.gz herunter
wget https://github.com/openresty/lua-nginx-module/archive/v0.10.9rc7.tar.gz
 
# Entpacken Sie tar -xzvf v0.10.9rc7.tar.gz

9.5 Nginx installieren

# Wechseln Sie in das Verzeichnis cd /user/local/src/
 
# Laden Sie wget http://nginx.org/download/nginx-1.21.0.tar.gz herunter
 
# Entpacken Sie tar xf nginx-1.21.0.tar.gz
 
# Wechseln Sie in das Nginx-Verzeichnis cd nginx-1.21.0
 
# Kompilieren ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_realip_module --with-pcre --add-module=/usr/local/src/lua-nginx-module-0.10.9rc7 --add-module=/usr/local/src/ngx_devel_kit-0.3.0 --with-stream
 
# Installieren Sie make && make install
 
# Fügen Sie die nginx-Konfiguration hinzu und fügen Sie den folgenden Inhalt im Serverblock hinzu [root@localhost_test_192.168.10.132 11:04:48 ~]# vim /usr/local/nginx/conf/nginx.conf
 
Standort /lua {
    Standardtyp „Text/Plain“;
 
    content_by_lua 'ngx.say("hallo, lua")';
}
 
# Syntax prüfen [root@localhost_test_192.168.10.132 09:59:33 /usr/local/src]# nginx -t
nginx: die Syntax der Konfigurationsdatei /usr/local/nginx/conf/nginx.conf ist in Ordnung
nginx: Test der Konfigurationsdatei /usr/local/nginx/conf/nginx.conf ist erfolgreich
 
# Starten Sie [root@localhost_test_192.168.10.132 11:08:35 ~]# nginx
 
# Testen Sie curl 127.0.0.1:80/lua

9.6 ngx_lua_waf installieren

# Wechseln Sie in das Verzeichnis cd /user/local/src/
 
# Laden Sie ngx_lua_waf in das conf-Verzeichnis wget herunter https://github.com/loveshell/ngx_lua_waf/archive/master.zip
 
# Entpacken und waf nennen
entpacken Sie master.zip -d /usr/local/nginx/conf/
 
# Ändern Sie den Verzeichnisnamen mv /usr/local/nginx/conf/ngx_lua_waf-master /usr/local/nginx/conf/waf
 
# Fügen Sie lua_package_path "/usr/local/nginx/conf/waf/?.lua" zum http-Abschnitt von nginx.conf hinzu;
lua_shared_dict-Limit 10 m;
init_by_lua_file /usr/local/nginx/conf/waf/init.lua;
Zugriff über Lua-Datei /usr/local/nginx/conf/waf/waf.lua;
 
# Fügen Sie den Benutzer www zur äußersten Ebene von nginx.conf hinzu;
 
# Erstellen Sie ein Protokollverzeichnis mkdir /usr/local/nginx/logs/hack
chown www /usr/local/nginx/logs/hack
 
# Lua_waf-Konfiguration [root@localhost_test_192.168.10.132 11:33:53 /usr/local/nginx/conf/waf]# cat config.lua
#Regelspeicherpfad RulePath = "/usr/local/nginx/conf/waf/wafconf/"
# Ob die Protokollierung von Angriffsinformationen aktiviert werden soll, muss logdir konfiguriert werden
Angriffsprotokoll = "ein"
# Protokollspeicherverzeichnis, das vom Benutzer erstellt werden muss und über Schreibberechtigungen für den Nginx-Benutzer logdir = "/usr/local/nginx/logs/hack/" verfügen muss
# Ob der URL-Zugriff blockiert werden soll UrlDeny="on"
# Ob nach dem Abfangen umgeleitet werden soll Redirect="on"
# Ob Cookie-Angriffe abgefangen werden sollen CookieMatch="on"
# Ob Post-Angriffe abgefangen werden sollen postMatch="on"
# Ob die URL-Whitelist aktiviert werden soll whiteModule="on"
# Geben Sie den Dateierweiterungstyp ein, der nicht hochgeladen werden darf black_fileExt={"php","jsp"}
#ip-Whitelist, mehrere IPs werden durch Kommas getrennt ipWhitelist={"127.0.0.1"}
#IP-Blacklist, mehrere IPs werden durch Kommas getrennt ipBlocklist={"192.168.10.1"}
# Ob das Abfangen von CC-Angriffen aktiviert werden soll (Sie müssen im http-Abschnitt von nginx.conf das lua_shared_dict-Limit von 10 m hinzufügen;)
CCDeny="aus"
# Stellen Sie die CC-Angriffsfrequenz in Sekunden ein.
# Standardmäßig kann dieselbe IP dieselbe Adresse nur 100 Mal in 1 Minute anfordern CCrate="100/60"
# Warnung Inhalt html = []
 
# Regeldatei [root@localhost_test_192.168.10.132 11:42:12 /usr/local/nginx/conf/waf]# ll wafconf/
insgesamt 24
-rw-r--r-- 1 root root 749 6. April 2016 args
-rw-r--r-- 1 root root 652 6. April 2016 Keks
-rw-r--r-- 1 root root 733 6. April 2016 Beitrag
-rw-r--r-- 1 root root 335 6. April 2016 URL
-rw-r--r-- 1 root root 177 6. April 2016 Benutzer-Agent
-rw-r--r-- 1 Wurzel Wurzel 8 6. April 2016 whiteurl
 
Die Regeln in den Argumenten lauten: get-Parameterfilterung, Cookie-Filterung ist die Cookie-Filterung für die Anforderungsfilterung, URL-Filterung ist die Regel für die Filterung nur in der get-Anforderungs-URL, Post-Filterung ist die Regel für die Filterung nur in der Post-Anforderung, Whiteurl ist die Whitelist und die darin enthaltenen URLs werden ohne Filterung abgeglichen, User-Agent ist die Filterregel für User-Agent # Load Nginx
[root@localhost_test_192.168.10.132 11:32:41]# nginx -s neu laden

9.7 Testergebnisse

Zugriff auf eine URL mit Parametern

http://192.168.10.132/?id=<script

Zusammenfassung: Nginx verwendet das Lua-Modul zur Implementierung von WAF, was sehr leistungsstark ist. Sie können den Code für die sekundäre Entwicklung ändern und ihn anpassen, um den gewünschten Effekt zu erzielen. Vielleicht möchten Sie es einmal ausprobieren.

Dies ist das Ende dieses Artikels über die grundlegende Analyse, wie Nginx das Lua-Modul zur Implementierung von WAF verwendet. Weitere relevante Inhalte zur Implementierung von WAF durch Nginx finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Verständnis des Nginx-Reverse-Proxy- und Lastenausgleichskonzepts und Modulnutzung
  • Implementierungsprinzip der NGINX-Berechtigungssteuerungsdateivorschau und des Downloads
  • Detaillierte Erläuterung der Nginx-Prozessverwaltungs- und Neuladeprinzipien
  • Detaillierte Erklärung der Funktionsweise von Nginx
  • Grundlegende Konzepte und Prinzipien von Nginx

<<:  Analyse der Methoden zur visuellen Strukturierung und Gestaltung von Kinder-Websites

>>:  JavaScript erklärt die Kapselung und Verwendung von Zeitlupenanimationen

Artikel empfehlen

Detaillierte Analyse der MySQL-Optimierung von like und = Leistung

Einführung Die meisten Leute, die schon einmal Da...

Einführung in RHCE-Bridging, passwortfreie Anmeldung und Portnummernänderung

Inhaltsverzeichnis 1. Konfigurieren Sie Bridging ...

Detaillierte Erklärung der MySQL-Grundoperationen (Teil 2)

Vorwort Dieser Artikel enthält 1. Mehrere wesentl...

Detaillierte Erklärung des Marquee-Attributs in HTML

Dieses Tag ist nicht Teil von HTML3.2 und wird nu...

vsCode generiert Vue-Vorlagen mit einem Klick

1. Verwenden Sie die Tastenkombination Strg + Ums...

Analyse der Vorteile von path.join() in Node.js

Sie fragen sich möglicherweise, warum Sie die Met...

mysql 5.7.5 m15 winx64.zip Installations-Tutorial

So installieren und konfigurieren Sie mysql-5.7.5...

Beispiel für die Implementierung des Lastausgleichs mit Nginx+SpringBoot

Einführung in den Lastenausgleich Bevor wir die L...

Vue implementiert das Hoch- und Herunterladen von Dateien

In diesem Artikelbeispiel wird der spezifische Co...

Gängige Master-Slave-Replikationsarchitekturen in MySQL 4

Inhaltsverzeichnis Replikationsarchitektur mit ei...

WeChat-Applet implementiert Sortierfunktion basierend auf Datum und Uhrzeit

Ich habe vor kurzem ein kleines Programmierprojek...

Analyse des Remote-Debuggings und des Timeout-Betriebsprinzips von Webdiensten

Remote-Debugging von Webdiensten In .NET ist die ...

Verbesserungen am Webserver zur Verbesserung der Website-Leistung

<br />Im ersten Abschnitt dieser Reihe haben...