
WAF de alto desempenho construído sobre a stack OpenResty
lua-resty-waf - WAF de alto desempenho construído sobre a stack OpenResty
NOTE: lua-resty-waf está essencialmente abandonado. Este projeto foi útil numa época em que o ModSecurity para Nginx não era uma opção viável; isso não é mais o caso. Houve uma tentativa de revitalizar o projeto em 2020, mas não tenho os recursos para concluí-la; esse trabalho está parcialmente completo no branch redux.
lua-resty-waf é um WAF de proxy reverso construído usando a stack OpenResty. Ele usa a API Lua do Nginx para analisar informações de requisições HTTP e processá-las contra uma estrutura de regras flexível. O lua-resty-waf é distribuído com um conjunto de regras que imita o CRS do ModSecurity, além de algumas regras personalizadas criadas durante o desenvolvimento e testes iniciais, e um pequeno patchset virtual para ameaças emergentes. Além disso, o lua-resty-waf é distribuído com ferramentas para traduzir automaticamente regras ModSecurity existentes, permitindo que os usuários estendam a implementação do lua-resty-waf sem a necessidade de aprender uma nova sintaxe de regras.
O lua-resty-waf foi inicialmente desenvolvido por Robert Paprocki para sua dissertação de mestrado na Western Governor's University.
O lua-resty-waf requer vários módulos Lua resty de terceiros, embora todos estejam empacotados com o lua-resty-waf e, portanto, não precisem ser instalados separadamente. É recomendável instalar o lua-resty-waf em um sistema que execute o pacote de software OpenResty; o lua-resty-waf não foi testado em plataformas construídas com pacotes separados do código-fonte do Nginx e do módulo Lua do Nginx.
Para obter desempenho ideal de compilação de regex, é recomendável compilar Nginx/OpenResty com uma versão do PCRE que suporte compilação JIT. Se o seu SO não fornecer isso, você pode compilar um PCRE com suporte a JIT diretamente no seu build Nginx/OpenResty. Para fazer isso, referencie o caminho para o código-fonte do PCRE na flag de configuração --with-pcre. Por exemplo:```sh
Você pode baixar o código-fonte do PCRE no [site do PCRE](http://www.pcre.org/). Consulte também esta [postagem no blog](https://www.cryptobells.com/building-openresty-with-pcre-jit/) para um guia passo a passo sobre como compilar o OpenResty com uma biblioteca PCRE com JIT habilitado.
## Desempenho
O lua-resty-waf foi projetado tendo em mente eficiência e escalabilidade. Ele aproveita o modelo de processamento assíncrono do Nginx e um design eficiente para processar cada transação o mais rápido possível. Testes de carga mostraram que implantações que implementam todos os conjuntos de regras fornecidos, que são projetados para imitar a lógica por trás do CRS do ModSecurity, processam transações em aproximadamente 300-500 microssegundos por requisição; isso equivale ao desempenho anunciado pelo [WAF da Cloudflare](https://www.cloudflare.com/waf). Os testes foram executados em uma configuração de hardware razoável (CPU E3-1230, 32 GB de RAM, 2 x 840 EVO em RAID 0), atingindo um máximo de aproximadamente 15.000 requisições por segundo. Consulte [esta postagem no blog](http://www.cryptobells.com/freewaf-a-high-performance-scalable-open-web-firewall) para mais informações.
A carga de trabalho do lua-resty-waf é quase exclusivamente limitada pela CPU. A pegada de memória na VM Lua (excluindo o armazenamento persistente apoiado por `lua-shared-dict`) é de aproximadamente 2 MB.
## Instalação
Um Makefile simples é fornecido:```
# make && sudo make install
Alternativamente, instale via Luarocks:```
lua-resty-waf utiliza o gerenciador de pacotes [OPM](https://github.com/openresty/opm), disponível nas distribuições modernas do OpenResty. As ferramentas cliente do OPM exigem que a ferramenta de linha de comando `resty` esteja disponível na variável de ambiente `PATH` do seu sistema.
Observe que, por padrão, o lua-resty-waf executa no modo SIMULATE, para evitar afetar imediatamente uma aplicação; usuários que desejam habilitar as ações de regras devem definir explicitamente o modo operacional para ACTIVE.
## Sinopse```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"