Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
lua-resty-waf — Hochleistungs-WAF auf Basis des OpenResty-Stacks | Kitploit
Tools/GitHubGitHub/p0pr0ck5/lua-resty-waf
DefensivwerkzeugeWebsicherheitAPI-Sicherheit
GitHubp0pr0ck5/lua-resty-waf

lua-resty-waf

Hochleistungs-WAF auf Basis des OpenResty-Stacks

Repository anzeigen
1.3k305vor 2 JahrenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

Name

lua-resty-waf - Hochleistungs-WAF auf Basis des OpenResty-Stacks

Inhaltsverzeichnis

  • Name
  • Status
  • Beschreibung
  • Anforderungen
  • Leistung
  • Installation
  • Synopsis
  • Öffentliche Funktionen
    • lua-resty-waf.load_secrules()
    • lua-resty-waf.init()
  • Öffentliche Methoden
    • lua-resty-waf:new()
    • lua-resty-waf:set_option()
    • lua-resty-waf:set_var()
    • lua-resty-waf:sieve_rule()
    • lua-resty-waf:exec()
    • lua-resty-waf:write_log_events()
  • Optionen
    • add_ruleset
    • add_ruleset_string
    • allow_unknown_content_types
    • allowed_content_types
    • debug
    • debug_log_level
    • deny_status
    • disable_pcre_optimization
    • event_log_altered_only
    • event_log_buffer_size
    • event_log_level
    • event_log_ngx_vars
    • event_log_periodic_flush
    • event_log_request_arguments
    • event_log_request_body
    • event_log_request_headers
    • event_log_ssl
    • event_log_ssl_sni_host
    • event_log_ssl_verify
    • event_log_socket_proto
    • event_log_target
    • event_log_target_host
    • event_log_target_path
    • event_log_target_port
    • hook_action
    • ignore_rule
    • ignore_ruleset
    • mode
    • nameservers
    • process_multipart_body
    • req_tid_header
    • res_body_max_size
    • res_body_mime_types
    • res_tid_header
    • score_threshold
    • storage_backend
    • storage_keepalive
    • storage_keepalive_timeout
    • storage_keepalive_pool_size
    • storage_memcached_host
    • storage_memcached_port
    • storage_redis_host
    • storage_redis_port
    • storage_zone
  • Phasenbehandlung
  • Enthaltene Regelsätze
  • Regeldefinitionen
  • Hinweise
    • Community
    • Pull Requests
  • Roadmap
  • Einschränkungen
  • Lizenz
  • Fehler
  • Siehe auch

Status

Build Status Codewake CII Best Practices

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.

Beschreibung

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.

Anforderungen

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

./configure --with-pcre=/path/to/pcre/source --with-pcre-jit

root@kitploit:~
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:```

luarocks install lua-resty-waf

root@kitploit:~
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"

        -- require the base module
        local lua_resty_waf = require "resty.waf"

        -- perform some preloading and optimization
        lua_resty_waf.init()
    }

    server {
        location / {
            access_by_lua_block {
                local lua_resty_waf = require "resty.waf"

                local waf = lua_resty_waf:new()

                -- define options that will be inherited across all scopes
                waf:set_option("debug", true)
                waf:set_option("mode", "ACTIVE")

                -- this may be desirable for low-traffic or testing sites
                -- by default, event logs are not written until the buffer is full
                -- for testing, flush the log buffer every 5 seconds
                --
                -- this is only necessary when configuring a remote TCP/UDP
                -- socket server for event logs. otherwise, this is ignored
                waf:set_option("event_log_periodic_flush", 5)

                -- run the firewall
                waf:exec()
            }

            header_filter_by_lua_block {
                local lua_resty_waf = require "resty.waf"

                -- note that options set in previous handlers (in the same scope)
                -- do not need to be set again
                local waf = lua_resty_waf:new()

                waf:exec()
            }

            body_filter_by_lua_block {
                local lua_resty_waf = require "resty.waf"

                local waf = lua_resty_waf:new()

                waf:exec()
            }

            log_by_lua_block {
                local lua_resty_waf = require "resty.waf"

                local waf = lua_resty_waf:new()

                waf:exec()
            }
        }
    }
}

Öffentliche Funktionen

lua-resty-waf.load_secrules()

Übersetzt und initialisiert eine ModSecurity-SecRules-Datei von der Festplatte. Beachten Sie, dass das Regelwerk weiterhin über add_ruleset hinzugefügt werden muss (der Basisname der Datei muss als Schlüssel angegeben werden).

Beispiel:```lua http { init_by_lua_block { local lua_resty_waf = require "resty.waf"

root@kitploit:~
    -- this translates and calculates a ruleset called 'ruleset_name'
    local ok, errs = pcall(function()
        lua_resty_waf.load_secrules("/path/to/secrules/ruleset_name")
    end)

    -- errs is an array-like table
    if errs then
        for i = 1, #errs do
            ngx.log(ngx.ERR, errs[i])
        end
    end
}

server {
    location / {
        access_by_lua_block {
            local lua_resty_waf = require "resty.waf"

            local waf = lua_resty_waf:new()

            -- in order to use the loaded ruleset, it must be added via
            -- the 'add_ruleset' option
            waf:set_option("add_ruleset", "ruleset_name")
        }
    }
}

}

root@kitploit:~
Zusätzlich kann `load_secrules` ein optionales zweites Argument als Tabelle mit Optionen entgegennehmen, die an verschiedene Übersetzungsfunktionen übergeben werden. Die folgenden Optionen werden erkannt:

* *path*: Definiert einen Dateisystempfad, in dem nach Datendateien für Operatoren wie @pmFromFile gesucht wird. Wenn kein solcher Schlüssel definiert ist, wird das aktuelle Arbeitsverzeichnis (`.`) verwendet.
* *force*: Keinen Fehler ausgeben und nicht abbrechen, wenn das Übersetzen einer Regelvariable fehlschlägt.
* *loose*: Keinen Fehler ausgeben und nicht abbrechen, wenn das Übersetzen einer Regelaktion fehlschlägt.
* *quiet*: Keinen Fehler ausgeben und keine Warnung erzeugen, wenn das Übersetzen einer Regelaktion fehlschlägt.

Diese Funktion kann auch ein drittes Argument als Tabelle entgegennehmen, um Übersetzungsfehler für die spätere Verarbeitung abzufangen. Wenn diese Option nicht vorhanden ist oder keine Tabelle ist, werden Übersetzungsfehler stattdessen im Fehlerprotokoll protokolliert.

### lua-resty-waf.init()

Führt eine gewisse Vorabberechnung von Regeln und Regelsätzen durch, basierend auf dem, was über die standardmäßig verteilten Regelsätze verfügbar gemacht wurde. Es wird empfohlen, aber nicht verlangt, diese Funktion aufzurufen (wenn dies nicht geschieht, entsteht ein geringer Leistungsnachteil). Diese Funktion sollte niemals außerhalb dieses Geltungsbereichs aufgerufen werden.

*Beispiel*:```lua
http {
    init_by_lua_block {
        local lua_resty_waf = require "resty.waf"

        lua_resty_waf.init()
    }
}

Öffentliche Methoden

lua-resty-waf:new()

Erstellen Sie eine neue Instanz von lua-resty-waf. Sie müssen dies in jeder Request-Handler-Phase aufrufen, in der Sie lua-resty-waf ausführen möchten, und verwenden Sie das Rückgabeergebnis, um weitere Objektmethoden aufzurufen.

Beispiel:```lua location / { access_by_lua_block { local lua_resty_waf = require "resty.waf"

root@kitploit:~
    local waf = lua_resty_waf:new()
}

}

root@kitploit:~
### lua-resty-waf:set_option()

Konfigurieren Sie eine Option auf Basis des jeweiligen Geltungsbereichs (per-scope).

*Beispiel*:```lua
location / {
    access_by_lua_block {
        local lua_resty_waf = require "resty.waf"

        local waf = lua_resty_waf:new()

        -- enable debug logging only for this scope
        waf:set_option("debug", true)
    }
}

lua-resty-waf:set_var()

Definieren Sie eine Transaktionsvariable (gespeichert in der TX-Variablensammlung), bevor Sie die WAF ausführen. Dies kann verwendet werden, um Variablen zu definieren, die von komplexen Regelsätzen wie dem OWASP CRS verwendet werden.

Beispiel:```lua location / { access_by_lua_block { local lua_resty_waf = require "resty.waf"

root@kitploit:~
    local waf = lua_resty_waf:new()

    waf:set_var("FOO", "bar")
}

}

root@kitploit:~
Beachten Sie, dass das Vorhandensein einer Variablen – wie bei jeder anderen ModSecurity-Regel – keinerlei funktionale Änderung an der WAF-Verarbeitung bewirkt; es liegt in der Verantwortung des Regelautors, die `TX`-Variablen zu verstehen und zu verwenden.

### lua-resty-waf:sieve_rule()

Definiert einen Collection-Ausschluss für eine bestimmte Regel.

*Beispiel*:```lua
location / {
    access_by_lua_block {
        local lua_resty_waf = require "resty.waf"

        local waf = lua_resty_waf:new()

        local sieves = {
            {
                type   = "ARGS",
                elts   = "foo",
                action = "ignore",
            }
        }

        waf:sieve_rule("12345", sieves)
    }
}

See the Regel-Siebe Wiki-Seite für Details und fortgeschrittene Anwendungsbeispiele.

lua-resty-waf:exec()

Führt die Regel-Engine aus. Standardmäßig wird die Engine entsprechend der aktuell laufenden Phase ausgeführt. Eine optionale Tabelle kann übergeben werden, die es Benutzern ermöglicht, die Ausführung einer anderen Phase zu "mocken".

Beispiel:```lua location / { access_by_lua_block { local lua_resty_waf = require "resty.waf"

root@kitploit:~
    local waf = lua_resty_waf:new()

    -- execute according to access phase collections and rules
    waf:exec()
}

content_by_lua_block {
    local lua_resty_waf = require "waf"

    local waf = lua_resty_waf:new()

    -- execute header_filter rules, passing in a table of additional collections
    -- this assumes the 'request_headers' and 'status' Lua variables were
    -- declared and initialized elsewhere
    local opts = {
        phase = 'header_filter',
        collections = {
            REQUEST_HEADERS = request_headers,
            STATUS = status,
        }
    }

    waf:exec(opts)
}

}

root@kitploit:~
### lua-resty-waf:write_log_events()

Schreiben Sie alle Audit-Log-Einträge, die aus der Transaktion generiert wurden. Dies ist nur optional, wenn `exec` in einem `log_by_lua`-Handler aufgerufen wird.

*Beispiel*:```lua
location / {
    log_by_lua_block {
        local lua_resty_waf = require "resty.waf"

        local waf = lua_resty_waf:new()

        -- write out any event log entries to the
        -- configured target, if applicable
        waf:write_log_events()
    }
}

Optionen

add_ruleset

Standard: keine

Fügt ein zusätzliches Regelset hinzu, das während der Verarbeitung verwendet wird. Dies ermöglicht es Benutzern, benutzerdefinierte Regelsets zu implementieren, ohne das enthaltene Regeln-Verzeichnis zu überschreiben. Zusätzliche Regelsets müssen sich innerhalb eines Ordners namens "rules" befinden, der im lua_package_path liegt.

Beispiel:```lua http { -- the rule file 50000.json must live at -- /path/to/extra/rulesets/rules/50000.json lua_package_path '/path/to/extra/rulesets/?.lua;;';

root@kitploit:~
server {
    location / {
        access_by_lua_block {
            waf:set_option("add_ruleset", "50000_extra_rules")
        }
    }
}

}

root@kitploit:~
### add_ruleset_string

*Standard*: keine

Fügt einen zusätzlichen Regelsatz hinzu, der während der Verarbeitung verwendet wird. Dies ermöglicht Benutzern, benutzerdefinierte Regelsätze zu implementieren, ohne das mitgelieferte Regeln-Verzeichnis zu überschreiben. Regelsätze werden inline als Lua-String definiert, in Form einer übersetzten Regelsatz-JSON-Struktur.

*Beispiel*:```lua
location / {
    access_by_lua_block {
        waf:set_option("add_ruleset_string", "70000_extra_rules", [=[{"access":[{"action":"DENY","id":73,"operator":"REGEX","opts":{},"pattern":"foo","vars":[{"parse":{"values":1},"type":"REQUEST_ARGS"}]}],"body_filter":[],"header_filter":[]}]=])
    }
}

Beachten Sie, dass die Regelsatznamen vor der Verarbeitung sortiert werden und als Zeichenfolgen angegeben werden müssen. Regelsätze werden in aufsteigender Reihenfolge von niedrig nach hoch verarbeitet.

allow_unknown_content_types

Standard: false

Weist lua-resty-waf an, die Verarbeitung der Anfrage fortzusetzen, wenn ein Content-Type-Header gesendet wurde, der nicht in der Tabelle allowed_content_types enthalten ist. Solche Anfragen haben ihren Anfragetext nicht von lua-resty-waf verarbeitet (die REQUEST_BODY-Sammlung ist dann nil). Auf diese Weise müssen Benutzer nicht explizit alle möglichen Content-Type-Header auf die Whitelist setzen, die ihnen begegnen könnten.

Beispiel:```lua location / { access_by_lua_block { waf:set_option("allow_unknown_content_types", true) } }

root@kitploit:~
### allowed_content_types

*Standard*: keine

Definiert einen oder mehrere Content-Type-Header, die zusätzlich zu den Standard-Content-Types `application/x-www-form-urlencoded` und `multipart/form-data` erlaubt sind. Eine Anfrage, deren Content-Type einem der `allowed_content_types` entspricht, setzt die `REQUEST_BODY`-Sammlung auf einen einzelnen String (anstelle einer Tabelle); eine Anfrage, deren Content-Type keinem dieser Werte entspricht – oder nicht `application/x-www-form-urlencoded` oder `multipart/form-data` – wird abgelehnt.

*Beispiel*:```lua
location / {
    access_by_lua_block {
        -- define a single allowed Content-Type value
        waf:set_option("allowed_content_types", "text/xml")

        -- defines multiple allowed Content-Type values
        waf:set_option("allowed_content_types", { "text/html", "text/json", "application/json" })
    }
}

Beachten Sie, dass mehrere set_option-Aufrufe mit einem Parameter von allowed_content_types einfach die vorhandene Optionstabelle überschreiben. Wenn Sie also mehrere erlaubte Inhaltstypen definieren möchten, müssen Sie diese wie oben gezeigt als Lua-Tabelle definieren.

debug

Standard: false

Deaktiviert/aktiviert die Debug-Protokollierung. Debug-Protokollmeldungen werden in das error_log geschrieben. Beachten Sie, dass die Debug-Protokollierung sehr teuer ist und nicht in Produktionsumgebungen verwendet werden sollte.

Beispiel:```lua location / { access_by_lua_block { waf:set_option("debug", true) } }

root@kitploit:~
### debug_log_level

*Standard*: ngx.INFO

Setzt die nginx-Log-Level-Konstante, die für das Debug-Logging verwendet wird.

*Beispiel*:```lua
location / {
    access_by_lua_block {
        waf:set_option("debug_log_level", ngx.DEBUG)
    }
}

deny_status

Standard: ngx.HTTP_FORBIDDEN

Legt den Status fest, der beim Verweigern von Anfragen verwendet wird.

Beispiel:```lua location / { access_by_lua_block { waf:set_option("deny_status", ngx.HTTP_NOT_FOUND) } }

root@kitploit:~
### disable_pcre_optimization

*Default*: false

Entfernt die `oj`-Flags aus allen `ngx.re.match`-, `ngx.re.find`- und `ngx.re.sub`-Aufrufen. Dies kann in einigen Fällen nützlich sein, wenn ältere PCRE-Bibliotheken verwendet werden, führt jedoch zu einer schwerwiegenden Leistungsverschlechterung, sodass die Verwendung dringend abzuraten ist; stattdessen wird den Benutzern empfohlen, OpenResty mit einer modernen, JIT-fähigen PCRE-Bibliothek zu erstellen.

*Example*:```lua
location / {
    access_by_lua_block {
        waf:set_option("disable_pcre_optimization", true)
    }
}

Hinweis: Dieses Verhalten ist veraltet und wird in zukünftigen Versionen entfernt.

event_log_altered_only

Standard: true

Bestimmt, ob Protokolleinträge für Regelübereinstimmungen in einer Transaktion geschrieben werden, die von lua-resty-waf nicht verändert wurde. „Altered" ist definiert als das Eingreifen von lua-resty-waf bei einer Regel, deren Aktion ACCEPT oder DENY ist. Wenn diese Option nicht gesetzt ist, protokolliert lua-resty-waf Regelübereinstimmungen auch dann, wenn die Transaktion nicht verändert wurde. Standardmäßig schreibt lua-resty-waf nur dann Protokolleinträge für Übereinstimmungen, wenn die Transaktion verändert wurde.

Beispiel:```lua location / { access_by_lua_block { waf:set_option("event_log_altered_only", false) } }

root@kitploit:~
Beachte, dass `mode` keinen Einfluss darauf hat, ob eine Transaktion als verändert gilt. Das heißt, wenn eine Regel mit einer `DENY`-Aktion erfüllt wird, aber lua-resty-waf im `SIMULATE`-Modus läuft, gilt die Transaktion weiterhin als verändert, und Regelübereinstimmungen werden protokolliert.

### event_log_buffer_size

*Standard*: 4096

Definiert den Schwellenwert (in Bytes) für den Puffer, der zum Speichern von Ereignisprotokollen verwendet wird. Der Puffer wird geleert, sobald dieser Schwellenwert erreicht ist.

*Beispiel*:```lua
location / {
    access_by_lua_block {
        -- 8 KB event log message buffer
        waf:set_option("event_log_buffer_size", 8192)
    }
}

event_log_level

Standard: ngx.INFO

Setzt die nginx-Log-Level-Konstante, die für die Ereignisprotokollierung verwendet wird.

Beispiel:```lua location / { access_by_lua_block { waf:set_option("event_log_level", ngx.WARN) } }

root@kitploit:~
### event_log_ngx_vars

*Standard*: leer

Definiert, welche zusätzlichen Variablen aus `ngx.var` in das Log-Ereignis aufgenommen werden. Dies ist eine generische Möglichkeit, den Alert um zusätzlichen Kontext zu erweitern. Der Variablenname wird der Schlüssel des Eintrags unter einem `ngx`-Schlüssel im Log-Eintrag. Wenn die Variable nicht als nginx-Variable vorhanden ist, wird dem Ereignis kein Eintrag hinzugefügt.

*Beispiel*:```lua
location / {
    access_by_lua_block {
        waf:set_option("event_log_ngx_vars", "host")
        waf:set_option("event_log_ngx_vars", "request_id")
    }
}

Das resultierende Ereignis enthält diese zusätzlichen Elemente:```json { "ngx": { "host": "example.com", "request_id": "373bcce584e3c18a" } }

root@kitploit:~
### event_log_periodic_flush

*Standard*: keine

Definiert ein Intervall in Sekunden, in dem der Ereignisprotokollpuffer regelmäßig geleert wird. Wenn kein Wert konfiguriert ist, wird der Puffer nicht regelmäßig geleert und nur geleert, wenn der Schwellenwert `event_log_buffer_size` erreicht ist. Konfigurieren Sie diese Option für Websites mit sehr geringem Datenverkehr, die über einen langen Zeitraum möglicherweise keine Ereignisprotokolldaten empfangen, um zu verhindern, dass veraltete Daten im Puffer verbleiben.

*Beispiel*:```lua
location / {
    access_by_lua_block {
        -- flush the event log buffer every 30 seconds
        waf:set_option("event_log_periodic_flush", 30)
    }
}

event_log_request_arguments

Standard: false

Wenn auf true gesetzt, enthalten die Logeinträge die Anfrageargumente unter dem Schlüssel uri_args.

Beispiel:```lua location / { access_by_lua_block { waf:set_option("event_log_request_arguments", true) } }

root@kitploit:~
### event_log_request_body

*Standard*: false

Wenn auf `true` gesetzt, enthalten die Logeinträge den Anfragebody unter dem Schlüssel `request_body`.

*Beispiel*:```lua
location / {
    access_by_lua_block {
        waf:set_option("event_log_request_body", true)
    }
}

event_log_request_headers

Standard: false

Die Header der HTTP-Anfrage werden in das Log-Ereignis kopiert, unter dem Schlüssel request_headers.

Beispiel:```lua location / { access_by_lua_block { waf:set_option("event_log_request_headers", true) } }

root@kitploit:~
Das resultierende Ereignis enthält diese zusätzlichen Elemente:```json
{
"request_headers": {
    "accept": "*/*",
    "user-agent": "curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3"
}
}

event_log_ssl

Standard: false

Aktiviert SSL-Verbindungen beim Protokollieren über TCP/UDP.

Beispiel:```lua location / { access_by_lua_block { waf:set_option("event_log_ssl", true) } }

root@kitploit:~
### event_log_ssl_sni_host

*Standard*: keine

Legen Sie den SNI-Host für `lua-resty-logger-socket`-Verbindungen fest.

*Beispiel*:```lua
location / {
    access_by_lua_block {
        waf:set_option("event_log_ssl_sni_host", "loghost.example.com")
    }
}

event_log_ssl_verify

Standard: false

Aktiviert die Zertifikatsprüfung für SSL-Verbindungen bei der Protokollierung über TCP/UDP.

Beispiel:```lua location / { access_by_lua_block { waf:set_option("event_log_ssl_verify", true) } }

root@kitploit:~
### event_log_socket_proto

*Standard*: udp

Definiert, welches IP-Protokoll (TCP oder UDP) beim Versenden von Ereignisprotokollen über einen Remote-Socket verwendet wird. Unabhängig vom Protokoll wird dieselbe Puffer- und wiederkehrende Flush-Logik verwendet.

*Beispiel*:```lua
location / {
    access_by_lua_block {
        -- send logs via TCP
        waf:set_option("event_log_socket_proto", "tcp")
    }
}

event_log_target

Standard: error

Definiert das Ziel für Ereignisprotokolle. lua-resty-waf unterstützt derzeit das Protokollieren in das Fehlerprotokoll, eine separate Datei im lokalen Dateisystem oder einen entfernten TCP- oder UDP-Server. In den letzten beiden Fällen werden Ereignisprotokolle gepuffert und geleert, sobald ein definierter Schwellenwert erreicht ist (siehe unten für weitere Optionen zu Ereignisprotokollierungsoptionen).

Beispiel:```lua location / { access_by_lua_block { -- send event logs to the server's error_log location (default) waf:set_option("event_log_target", "error")

root@kitploit:~
    -- send event logs to a local file on disk
    waf:set_option("event_log_target", "file")

    -- send event logs to a remote server
    waf:set_option("event_log_target", "socket")
}

}

root@kitploit:~
Beachten Sie, dass aufgrund einer Einschränkung der verwendeten Protokollierungsbibliothek nur ein einzelner Ziel-Socket definiert werden kann. Das heißt, Sie dürfen nur ein `socket`-Ziel mit einer bestimmten Host/Port-Kombination konfigurieren; wenn Sie eine zweite Host/Port-Kombination konfigurieren, werden Daten nicht ordnungsgemäß protokolliert.

### event_log_target_host

*Standard*: keine

Definiert den Zielserver für Ereignisprotokolle, die auf einen entfernten Server abzielen.

*Beispiel*:```lua
location / {
    access_by_lua_block {
        waf:set_option("event_log_target_host", "10.10.10.10")
    }
}

event_log_target_path

Standard: keine

Definiert den Zielpfad für Ereignisprotokolle, die auf einen lokalen Dateisystem-Speicherort abzielen.

Beispiel:```lua location / { access_by_lua_block { waf:set_option("event_log_target_path", "/var/log/lua-resty-waf/event.log") } }

root@kitploit:~
Dieser Pfad muss sich an einem Ort befinden, der vom nginx-Benutzer beschreibbar ist. Beachten Sie, dass die Protokollierung auf der Festplatte naturgemäß zu erheblichen Leistungseinbußen in Umgebungen mit hoher Parallelität führen kann.

### event_log_target_port

*Standard*: keine

Definiert den Zielport für Ereignisprotokolle, die an einen entfernten Server gesendet werden.

*Beispiel*:```lua
location / {
    access_by_lua_block {
        waf:set_option("event_log_target_port", 9001)
    }
}

hook_action

Standard: none

Überschreibt die Funktionalität von Aktionen, die ausgeführt werden, wenn eine Regel übereinstimmt. Weitere Details finden Sie im Beispiel.

Beispiel:```lua

root@kitploit:~
location / {
    access_by_lua_block {
        local deny_override = function(waf, ctx)
            ngx.log(ngx.INFO, "Overriding DENY action")
            ngx.status = 404
        end

        -- override the DENY action with the function defined above
        waf:set_option("hook_action", "DENY", deny_override)
    }
}
root@kitploit:~
### ignore_rule

*Standard*: none

Weist das Modul an, eine angegebene Regel-ID zu ignorieren. Beachten Sie, dass das Ignorieren einer Regel in einer Kette dazu führt, dass die gesamte Kette ignoriert wird, und die Verarbeitung mit der nächsten Regel nach der Kette fortgesetzt wird.

*Beispiel*:```lua
location / {
    access_by_lua_block {
        waf:set_option("ignore_rule", 40294)
        waf:set_option("ignore_rule", {40002, 41036})
    }
}

Mehrere Regeln können ignoriert werden, indem eine Tabelle von Regel-IDs an set_option übergeben wird.

ignore_ruleset

Standard: keine

Weist das Modul an, ein gesamtes Regelset zu ignorieren. Dies kann nützlich sein, wenn einige Regelsets (wie die SQLi- oder XSS-CRS-Regelsets) zu anfällig für Fehlalarme sind oder nicht auf Ihre Anwendung zutreffen.

Beispiel:```lua location / { access_by_lua_block { waf:set_option("ignore_ruleset", "41000_sqli") } }

root@kitploit:~
### mode

*Standard*: SIMULATE

Legt den Betriebsmodus des Moduls fest. Die Optionen sind ACTIVE, INACTIVE und SIMULATE. Im ACTIVE-Modus werden Regel-Treffer protokolliert und Aktionen ausgeführt. Im SIMULATE-Modus durchläuft lua-resty-waf jede aktivierte Regel und protokolliert Regel-Treffer, führt jedoch die in einem bestimmten Lauf angegebene Aktion nicht aus. Der INACTIVE-Modus verhindert, dass das Modul ausgeführt wird.

Standardmäßig wird SIMULATE ausgewählt, wenn kein Modus explizit festgelegt ist; dies erfordert, dass neue Benutzer das Blockieren aktiv implementieren, indem sie den Modus auf ACTIVE setzen.

*Beispiel*:```lua
location / {
    access_by_lua_block {
        waf:set_option("mode", "ACTIVE")
    }
}

nameservers

Standard: keine

Legt die DNS-Resolver fest, die für RBL-Lookups verwendet werden sollen. Derzeit wird nur UDP/53-Verkehr unterstützt. Diese Option muss als numerische Adresse und nicht als Hostname definiert werden. Wenn diese Option nicht definiert ist, geben alle RBL-Lookup-Regeln false zurück.

Beispiel:```lua location / { access_by_lua_block { waf:set_option("nameservers", "10.10.10.10") } }

root@kitploit:~
### process_multipart_body

*Standard* true

Aktiviere die Verarbeitung von multipart/form-data-Anforderungsrumpf (falls vorhanden) mithilfe des Moduls `lua-resty-upload`. In Zukunft könnte lua-resty-waf diese Verarbeitung nutzen, um eine strengere Prüfung von Upload-Bodies durchzuführen; derzeit führt dieses Modul nur minimale Plausibilitätsprüfungen am Anforderungsrumpf durch und protokolliert kein Ereignis, wenn der Anforderungsrumpf ungültig ist. Deaktivieren Sie diese Option, wenn Sie diese Prüfung nicht benötigen oder wenn Fehler im Upstream-Modul Probleme mit HTTP-Uploads verursachen.

*Beispiel*:```lua
location / {
    access_by_lua_block {
        -- disable processing of multipart/form-data requests
        -- note that the request body will still be sent to the upstream
        waf:set_option("process_multipart_body", false)
    }
}

req_tid_header

Standard: false

Setzt einen HTTP-Header X-Lua-Resty-WAF-ID in der Upstream-Anfrage, mit dem Wert der Transaktions-ID. Diese ID korreliert mit der Transaktions-ID, die in den Debug-Logs vorhanden ist (falls gesetzt). Dies kann für die Anfrageverfolgung oder zu Debug-Zwecken nützlich sein.

Beispiel:```lua location / { access_by_lua_block { waf:set_option("req_tid_header", true) } }

root@kitploit:~
### res_body_max_size

*Standard*: 1048576 (1 MB)

Definiert die Content-Length-Schwelle, ab der Antworttexte nicht mehr verarbeitet werden. Diese Größe des Antworttexts wird durch den Content-Length-Header der Antwort bestimmt. Wenn dieser Header in der Antwort nicht vorhanden ist, wird der Antworttext niemals verarbeitet.

*Beispiel*:```lua
location / {
    access_by_lua_block {
        -- increase the max response size to 2 MB
        waf:set_option("res_body_max_size", 1024 * 1024 * 2)
    }
}

Beachten Sie, dass es von Natur aus erforderlich ist, den gesamten Antworttext zu puffern, um die Antwort ordnungsgemäß als Sammlung verwenden zu können. Daher wird nicht empfohlen, diesen Wert ohne triftigen Grund (und ausreichende Serverressourcen) deutlich zu erhöhen.

res_body_mime_types

Standard: "text/plain", "text/html"

Definiert die MIME-Typen, mit denen lua-resty-waf den Antworttext verarbeitet. Dieser Wert wird durch den Content-Type-Header bestimmt. Wenn dieser Header nicht vorhanden ist oder der Antworttyp nicht in dieser Liste enthalten ist, wird der Antworttext nicht verarbeitet. Durch Festlegen dieser Option wird der angegebene MIME-Typ zu den vorhandenen Standardeinstellungen von text/plain und text/html hinzugefügt.

Beispiel:```lua location / { access_by_lua_block { -- mime types that will be processed are now text/plain, text/html, and text/json waf:set_option("res_body_mime_types", "text/json") } }

root@kitploit:~
Mehrere MIME-Typen können hinzugefügt werden, indem eine Tabelle von Typen an `set_option` übergeben wird.

### res_tid_header

*Standard*: false

Setzt einen HTTP-Header `X-Lua-Resty-WAF-ID` in der Downstream-Antwort, wobei der Wert die Transaktions-ID ist. Diese ID korreliert mit der Transaktions-ID, die in den Debug-Logs vorhanden ist (falls festgelegt). Dies kann für die Anforderungsverfolgung oder zu Debug-Zwecken nützlich sein.

*Beispiel*:```lua
location / {
    access_by_lua_block {
        waf:set_option("res_tid_header", true)
    }
}

score_threshold

Standard: 5

Legt den Schwellenwert für die Anomaliebewertung fest. Wenn der Schwellenwert erreicht wird, lehnt lua-resty-waf die Anfrage ab.

Beispiel:```lua location / { access_by_lua_block { waf:set_option("score_threshold", 10) } }

root@kitploit:~
### storage_backend

*Standard*: dict

Definiere eine Engine für die persistente Variablenspeicherung. Derzeit verfügbare Optionen sind *dict* (ngx_lua Shared-Memory-Zone), *memcached* und *redis*.

*Beispiel*:```lua
location / {
    acccess_by_lua_block {
        waf:set_option("storage_backend", "memcached")
    }
}

storage_keepalive

Standard: true

Aktiviert oder deaktiviert TCP-Keepalive für Verbindungen zu entfernten persistenten Speicherhosts.

Beispiel:```lua location / { acccess_by_lua_block { waf:set_option("storage_keepalive", false) } }

root@kitploit:~
### storage_keepalive_timeout

*Standard*: 10000

Konfiguriert (in Millisekunden) das Timeout für den Cosocket-Keepalive-Pool für entfernte persistente Speicherhosts.

*Beispiel*:```lua
location / {
    acccess_by_lua_block {
        waf:set_option("storage_keepalive_timeout", 30000)
    }
}

storage_keepalive_pool_size

Standard: 100

Konfigurieren Sie die Poolgröße für den Cosocket-Keepalive-Pool für entfernte persistente Speicherhosts.

Beispiel:```lua location / { acccess_by_lua_block { waf:set_option("storage_keepalive_pool_size", 50) } }

root@kitploit:~
### storage_memcached_host

*Standard*: 127.0.0.1

Definieren Sie einen Host, der verwendet werden soll, wenn memcached als persistente Speicher-Engine für Variablen verwendet wird.

*Beispiel*:```lua
location / {
    acccess_by_lua_block {
        waf:set_option("storage_memcached_host", "10.10.10.10")
    }
}

storage_memcached_port

Standard: 11211

Definiert einen Port, der verwendet wird, wenn memcached als persistente Speicher-Engine für Variablen verwendet wird.

Beispiel:```lua location / { acccess_by_lua_block { waf:set_option("storage_memcached_port", 11221) } }

root@kitploit:~
### storage_redis_host

*Standard*: 127.0.0.1

Definieren Sie einen Host, der verwendet wird, wenn redis als persistenter Variablenspeicher verwendet wird.

*Beispiel*:```lua
location / {
    acccess_by_lua_block {
        waf:set_option("storage_redis_host", "10.10.10.10")
    }
}

storage_redis_port

Standard: 6379

Definiert einen Port, der verwendet wird, wenn Redis als persistente Speicher-Engine für Variablen verwendet wird.

Beispiel:```lua location / { acccess_by_lua_block { waf:set_option("storage_redis_port", 6397) } }

root@kitploit:~
### storage_zone

*Standard*: none

Definiert das `lua_shared_dict`, das zur Speicherung persistenter Daten verwendet wird. Diese Zone muss im `http{}`-Block der Konfiguration definiert werden.

*Beispiel*:_```lua
http {
    -- define a 64M shared memory zone to hold persistent storage data
    lua_shared_dict persistent_storage 64m;
}

location / {
    access_by_lua_block {
        waf:set_option("storage_zone", "persistent_storage")
    }
}

Multiple shared zones can be defined and used, though only one zone can be defined per configuration location. If a zone becomes full and the shared dictionary interface cannot add additional keys, the following will be entered into the error log:

Error adding key to persistent storage, increase the size of the lua_shared_dict

Phasenbehandlung

lua-resty-waf ist dafür ausgelegt, in mehreren Phasen des Anforderungslebenszyklus zu laufen. Regeln können in den folgenden Phasen verarbeitet werden:

  • access: Anforderungsinformationen wie URI, Anforderungsheader, URI-Argumente und Anforderungstext sind in dieser Phase verfügbar.
  • header_filter: Antwort-Header und HTTP-Status sind in dieser Phase verfügbar.
  • body_filter: Der Antworttext ist in dieser Phase verfügbar.
  • log: Ereignisprotokolle werden beim Abschluss dieser Phase automatisch geschrieben.

Diese Phasen entsprechen den jeweiligen Nginx-Lua-Handlern (access_by_lua, header_filter_by_lua, body_filter_by_lua und log_by_lua). Beachten Sie, dass der Betrieb von lua-resty-waf in einem Lua-Phasen-Handler, der nicht in dieser Liste aufgeführt ist, zu fehlerhaftem Verhalten führt. Alle Daten, die in einer früheren Phase verfügbar sind, sind auch in einer späteren Phase verfügbar. Das heißt, Daten, die in der access-Phase verfügbar sind, sind auch in den header_filter- und body_filter-Phasen verfügbar, aber nicht umgekehrt.

Enthaltene Regelsätze

lua-resty-waf wird mit einer Reihe von Regelsätzen verteilt, die darauf ausgelegt sind, die Funktionalität des ModSecurity CRS nachzubilden. Der Vollständigkeit halber sind diese Regelsätze hier aufgelistet:

  • 11000_whitelist: Lokale Richtlinien-Whitelist
  • 20000_http_violation: HTTP-Protokollverletzung
  • 21000_http_anomaly: HTTP-Protokollanomalien
  • 35000_user_agent: Bösartige/verdächtige User-Agents
  • 40000_generic_attack: Allgemeine Angriffe
  • 41000_sqli: SQLi
  • 42000_xss: XSS
  • 90000_custom: Benutzerdefinierte Regeln/Virtuelles Patching
  • 99000_scoring: Behandlung des Anomalie-Scores

Regeldefinitionen

lua-resty-waf analysiert Regeldefinitionen aus auf der Festplatte gespeicherten JSON-Blobs. Regeln werden basierend auf Zweck und Schweregrad gruppiert und als Regelsatz definiert. Die enthaltenen Regelsätze wurden erstellt, um einige Funktionen des ModSecurity CRS nachzubilden, insbesondere die base_rules-Definitionen. Darüber hinaus kann das enthaltene Skript modsec2lua-resty-waf.pl verwendet werden, um zusätzliche oder benutzerdefinierte Regelsätze in einen lua-resty-waf-kompatiblen JSON-Blob zu übersetzen.

Beachten Sie, dass das Übersetzungsskript mehrere Einschränkungen hinsichtlich nicht unterstützter Aktionen, Sammlungen und Operatoren aufweist. Eine aktuelle Liste bekannter Inkompatibilitäten finden Sie auf dieser Wiki-Seite.

Hinweise

Community

Es gibt einen Freenode-IRC-Kanal #lua-resty-waf. Travis CI sendet Benachrichtigungen hierher; Sie können in diesem Kanal gerne Fragen stellen oder Kommentare hinterlassen.

Darüber hinaus ist Q/A auf CodeWake verfügbar:

Codewake

Pull Requests

Bitte richten Sie alle Pull Requests an den Entwicklungszweig oder an einen Feature-Zweig, wenn der PR eine wesentliche Änderung darstellt. Commits an master sollten nur in Form von Dokumentationsaktualisierungen oder anderen Änderungen erfolgen, die keine Auswirkungen auf das Modul selbst haben (und sauber in den Entwicklungszweig gemerged werden können).

Roadmap

  • Erweiterter Virtual-Patch-Regelsatz: Erhöhung der Abdeckung neuer Bedrohungen.
  • Erweiterte Integrations-/Abnahmetests: Erhöhung der Abdeckung allgemeiner Bedrohungen und Nutzungsszenarien.
  • Erweiterte ModSecurity-Syntaxübersetzungen: Unterstützung weiterer Operatoren, Variablen und Aktionen.
  • Profile für gängige Anwendungen: Abgestimmte Regelsätze für gängige CMS/Anwendungen.
  • Unterstützung mehrerer Socket-/Datei-Logger-Ziele: Erfordert wahrscheinlich ein Forken des Projekts lua-resty-logger-socket.

Einschränkungen

lua-resty-waf befindet sich in kontinuierlicher Entwicklung und Verbesserung und kann daher in seiner Funktionalität und Leistung eingeschränkt sein. Derzeit bekannte Einschränkungen finden Sie im GitHub-Issue-Tracker dieses Repositorys.

Lizenz

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/

Bugs

Bitte melden Sie Fehler, indem Sie ein Ticket im GitHub-Issue-Tracker erstellen.

Siehe auch

  • Das OpenResty-Projekt: http://openresty.org/
  • Mein persönlicher Blog mit Updates und Anmerkungen zur lua-resty-waf-Entwicklung: http://www.cryptobells.com/tag/lua-resty-waf/
Tool herunterladen