
Hochleistungs-WAF auf Basis des OpenResty-Stacks
lua-resty-waf - Hochleistungs-WAF auf Basis des OpenResty-Stacks
HINWEIS: lua-resty-waf ist im Wesentlichen aufgegeben. Dieses Projekt war zu einer Zeit nützlich, als ModSecurity für Nginx keine praktikable Option war; das ist heute nicht mehr der Fall. Es gab 2020 einen Versuch, das Projekt wiederzubeleben, aber ich habe nicht die Mittel, dies abzuschließen; diese Arbeit ist im redux-Zweig teilweise abgeschlossen.
lua-resty-waf ist eine Reverse-Proxy-WAF, die auf dem OpenResty-Stack aufbaut. Sie verwendet die Nginx-Lua-API, um HTTP-Anforderungsinformationen zu analysieren und sie anhand einer flexiblen Regelstruktur zu verarbeiten. lua-resty-waf wird mit einem Regelsatz ausgeliefert, der dem ModSecurity CRS nachempfunden ist, sowie mit einigen benutzerdefinierten Regeln, die während der anfänglichen Entwicklung und des Testens erstellt wurden, und einem kleinen virtuellen Patchset für aufkommende Bedrohungen. Darüber hinaus wird lua-resty-waf mit Werkzeugen ausgeliefert, die vorhandene ModSecurity-Regeln automatisch übersetzen, sodass Benutzer die lua-resty-waf-Implementierung erweitern können, ohne eine neue Regelsyntax erlernen zu müssen.
lua-resty-waf wurde ursprünglich von Robert Paprocki für seine Masterarbeit an der Western Governor's University entwickelt.
lua-resty-waf benötigt mehrere Drittanbieter-Resty-Lua-Module, die jedoch alle mit lua-resty-waf gebündelt sind und daher nicht separat installiert werden müssen. Es wird empfohlen, lua-resty-waf auf einem System zu installieren, auf dem das OpenResty-Softwarepaket läuft; lua-resty-waf wurde nicht auf Plattformen getestet, die mit separaten Nginx-Quell- und Nginx-Lua-Modul-Paketen erstellt wurden.
Für eine optimale Regex-Kompilierungsleistung wird empfohlen, Nginx/OpenResty mit einer PCRE-Version zu erstellen, die JIT-Kompilierung unterstützt. Wenn Ihr Betriebssystem dies nicht bereitstellt, können Sie ein JIT-fähiges PCRE direkt in Ihre Nginx/OpenResty-Erstellung einbauen. Verweisen Sie dazu im Konfigurations-Flag --with-pcre auf den Pfad zum PCRE-Quellcode. Zum Beispiel:```sh
Sie können die PCRE-Quelle von der [PCRE-Website](http://www.pcre.org/) herunterladen. Siehe auch diesen [Blogbeitrag](https://www.cryptobells.com/building-openresty-with-pcre-jit/) für eine Schritt-für-Schritt-Anleitung zum Erstellen von OpenResty mit einer JIT-fähigen PCRE-Bibliothek.
## Leistung
lua-resty-waf wurde mit Blick auf Effizienz und Skalierbarkeit entwickelt. Es nutzt das asynchrone Verarbeitungsmodell von Nginx und ein effizientes Design, um jede Transaktion so schnell wie möglich zu verarbeiten. Belastungstests haben gezeigt, dass Bereitstellungen, die alle bereitgestellten Regelsätze implementieren, die die Logik hinter dem ModSecurity CRS nachbilden sollen, Transaktionen in etwa 300-500 Mikrosekunden pro Anfrage verarbeiten; das entspricht der Leistung, die von [Cloudflare-WAF](https://www.cloudflare.com/waf) beworben wird. Die Tests wurden auf einem vernünftigen Hardware-Stack (E3-1230 CPU, 32 GB RAM, 2 x 840 EVO in RAID 0) durchgeführt und erreichten maximal etwa 15.000 Anfragen pro Sekunde. Weitere Informationen finden Sie in [diesem Blogbeitrag](http://www.cryptobells.com/freewaf-a-high-performance-scalable-open-web-firewall).
Die Arbeitslast von lua-resty-waf ist fast ausschließlich CPU-gebunden. Der Speicherverbrauch in der Lua-VM (ohne den durch `lua-shared-dict` unterstützten persistenten Speicher) beträgt etwa 2MB.
## Installation
Ein einfaches Makefile wird bereitgestellt:```
# make && sudo make install
Alternativ über Luarocks installieren:```
lua-resty-waf nutzt den [OPM](https://github.com/openresty/opm)-Paketmanager, der in modernen OpenResty-Distributionen verfügbar ist. Die OPM-Client-Tools setzen voraus, dass das Befehlszeilentool `resty` in der Umgebungsvariable `PATH` Ihres Systems verfügbar ist.
Beachten Sie, dass lua-resty-waf standardmäßig im SIMULATE-Modus läuft, um eine unmittelbare Beeinträchtigung einer Anwendung zu verhindern; Benutzer, die Regelaktionen aktivieren möchten, müssen den Betriebsmodus explizit auf ACTIVE setzen.
## Überblick```lua
http {
init_by_lua_block {
-- use resty.core for performance improvement, see the status note above
require "resty.core"