
WAF de alto rendimiento construido sobre la pila OpenResty
lua-resty-waf - WAF de alto rendimiento construido sobre el stack de OpenResty
NOTA: lua-resty-waf está esencialmente abandonado. Este proyecto tenía utilidad en una época en la que ModSecurity para Nginx no era una opción viable; ya no es el caso. Hubo un intento de revitalizar el proyecto en 2020, pero no tengo los recursos para completarlo; este trabajo está parcialmente completo en la rama redux.
lua-resty-waf es un WAF de proxy inverso construido con el stack de OpenResty. Utiliza la API Lua de Nginx para analizar la información de las solicitudes HTTP y procesarlas contra una estructura de reglas flexible. lua-resty-waf se distribuye con un conjunto de reglas que imita el CRS de ModSecurity, además de algunas reglas personalizadas creadas durante el desarrollo y las pruebas iniciales, y un pequeño parche virtual para amenazas emergentes. Adicionalmente, lua-resty-waf se distribuye con herramientas para traducir automáticamente reglas existentes de ModSecurity, lo que permite a los usuarios ampliar la implementación de lua-resty-waf sin necesidad de aprender una nueva sintaxis de reglas.
lua-resty-waf fue desarrollado inicialmente por Robert Paprocki para su tesis de maestría en Western Governor's University.
lua-resty-waf requiere varios módulos Lua resty de terceros, aunque todos vienen empaquetados con lua-resty-waf, por lo que no necesitan instalarse por separado. Se recomienda instalar lua-resty-waf en un sistema que ejecute el paquete de software OpenResty; lua-resty-waf no ha sido probado en plataformas construidas con paquetes separados de código fuente de Nginx y del módulo Lua de Nginx.
Para obtener un rendimiento óptimo de compilación de expresiones regulares, se recomienda compilar Nginx/OpenResty con una versión de PCRE que soporte compilación JIT. Si tu sistema operativo no la proporciona, puedes compilar PCRE con capacidad JIT directamente en tu compilación de Nginx/OpenResty. Para ello, indica la ruta al código fuente de PCRE en el flag de configuración --with-pcre. Por ejemplo:```sh
Puedes descargar el código fuente de PCRE desde el [sitio web de PCRE](http://www.pcre.org/). Consulta también esta [entrada de blog](https://www.cryptobells.com/building-openresty-with-pcre-jit/) para ver una guía paso a paso sobre cómo compilar OpenResty con una librería PCRE con JIT habilitado.
## Rendimiento
lua-resty-waf fue diseñado pensando en la eficiencia y la escalabilidad. Aprovecha el modelo de procesamiento asíncrono de Nginx y un diseño eficiente para procesar cada transacción lo más rápido posible. Las pruebas de carga han demostrado que los despliegues que implementan todos los conjuntos de reglas proporcionados, diseñados para imitar la lógica detrás del ModSecurity CRS, procesan transacciones en aproximadamente 300-500 microsegundos por petición; esto equivale al rendimiento anunciado por el [WAF de Cloudflare](https://www.cloudflare.com/waf). Las pruebas se ejecutaron sobre una pila de hardware razonable (CPU E3-1230, 32 GB de RAM, 2 x 840 EVO en RAID 0), alcanzando un máximo de aproximadamente 15,000 peticiones por segundo. Consulta [esta entrada de blog](http://www.cryptobells.com/freewaf-a-high-performance-scalable-open-web-firewall) para más información.
La carga de trabajo de lua-resty-waf está casi exclusivamente limitada por CPU. La huella de memoria en la máquina virtual de Lua (excluyendo el almacenamiento persistente respaldado por `lua-shared-dict`) es de aproximadamente 2 MB.
## Instalación
Se proporciona un sencillo Makefile:```
# make && sudo make install
Alternativamente, instala mediante Luarocks:```
lua-resty-waf hace uso del gestor de paquetes [OPM](https://github.com/openresty/opm), disponible en las distribuciones modernas de OpenResty. Las herramientas cliente de OPM requieren que la herramienta de línea de comandos `resty` esté disponible en la variable de entorno `PATH` de tu sistema.
Ten en cuenta que, por defecto, lua-resty-waf se ejecuta en modo SIMULATE, para evitar afectar inmediatamente a una aplicación; los usuarios que deseen habilitar las acciones de las reglas deben establecer explícitamente el modo operativo en ACTIVE.