
WAF haute performance basé sur la stack OpenResty
lua-resty-waf - WAF haute performance construit sur la pile OpenResty
REMARQUE : lua-resty-waf est essentiellement abandonné. Ce projet avait son utilité à une époque où ModSecurity pour Nginx n'était pas une option viable ; ce n'est plus le cas. Une tentative de revitalisation du projet a eu lieu en 2020, mais je ne dispose pas des ressources nécessaires pour la mener à bien ; ce travail est partiellement achevé dans la branche redux.
lua-resty-waf est un WAF proxy inverse construit sur la pile OpenResty. Il utilise l'API Lua de Nginx pour analyser les informations des requêtes HTTP et les traiter selon une structure de règles flexible. lua-resty-waf est distribué avec un ensemble de règles qui imite le CRS de ModSecurity, ainsi que quelques règles personnalisées créées lors du développement et des tests initiaux, et un petit ensemble de correctifs virtuels pour les menaces émergentes. De plus, lua-resty-waf est distribué avec des outils permettant de traduire automatiquement les règles ModSecurity existantes, ce qui permet aux utilisateurs d'étendre l'implémentation de lua-resty-waf sans avoir à apprendre une nouvelle syntaxe de règles.
lua-resty-waf a été initialement développé par Robert Paprocki pour son mémoire de master à la Western Governor's University.
lua-resty-waf nécessite plusieurs modules Lua resty tiers, bien qu'ils soient tous fournis avec lua-resty-waf et n'aient donc pas besoin d'être installés séparément. Il est recommandé d'installer lua-resty-waf sur un système exécutant le bundle logiciel OpenResty ; lua-resty-waf n'a pas été testé sur des plateformes construites à partir de paquets Nginx source et module Lua Nginx séparés.
Pour des performances optimales de compilation des expressions régulières, il est recommandé de construire Nginx/OpenResty avec une version de PCRE prenant en charge la compilation JIT. Si votre système d'exploitation ne la fournit pas, vous pouvez compiler directement une PCRE compatible JIT dans votre build Nginx/OpenResty. Pour ce faire, référencez le chemin vers les sources PCRE dans l'indicateur de configuration --with-pcre. Par exemple :```sh
Vous pouvez télécharger les sources de PCRE depuis le [site web de PCRE](http://www.pcre.org/). Voir aussi cet [article de blog](https://www.cryptobells.com/building-openresty-with-pcre-jit/) pour un guide pas à pas sur la construction d'OpenResty avec une bibliothèque PCRE compatible JIT.
## Performances
lua-resty-waf a été conçu en gardant à l'esprit l'efficacité et l'évolutivité. Il exploite le modèle de traitement asynchrone de Nginx et une conception efficace pour traiter chaque transaction le plus rapidement possible. Les tests de charge ont montré que les déploiements mettant en œuvre tous les ensembles de règles fournis, conçus pour imiter la logique du CRS ModSecurity, traitent les transactions en environ 300 à 500 microsecondes par requête ; cela correspond aux performances annoncées par [le WAF de Cloudflare](https://www.cloudflare.com/waf). Les tests ont été effectués sur une configuration matérielle raisonnable (CPU E3-1230, 32 Go de RAM, 2 x 840 EVO en RAID 0), atteignant un maximum d'environ 15 000 requêtes par seconde. Voir [cet article de blog](http://www.cryptobells.com/freewaf-a-high-performance-scalable-open-web-firewall) pour plus d'informations.
La charge de travail de lua-resty-waf est presque exclusivement liée au CPU. L'empreinte mémoire dans la VM Lua (hors stockage persistant adossé à `lua-shared-dict`) est d'environ 2 Mo.
## Installation
Un simple Makefile est fourni :```
# make && sudo make install
Sinon, installez via Luarocks:```
lua-resty-waf fait usage du gestionnaire de paquets [OPM](https://github.com/openresty/opm), disponible dans les distributions modernes d'OpenResty. Les outils clients OPM nécessitent que l'outil en ligne de commande `resty` soit disponible dans la variable d'environnement `PATH` de votre système.
Notez que par défaut, lua-resty-waf s'exécute en mode SIMULATE, afin d'éviter d'affecter immédiatement une application ; les utilisateurs qui souhaitent activer les actions des règles doivent explicitement définir le mode opérationnel sur ACTIVE.