
Высокопроизводительный WAF, построенный на стеке OpenResty
lua-resty-waf - высокопроизводительный WAF, построенный на стеке OpenResty
ПРИМЕЧАНИЕ: lua-resty-waf по сути заброшен. Этот проект был полезен в то время, когда ModSecurity для Nginx не был жизнеспособным вариантом; сейчас это уже не так. В 2020 году была попытка оживить проект, но у меня нет ресурсов, чтобы завершить её; эта работа частично выполнена в ветке redux.
lua-resty-waf - это обратный прокси-WAF, построенный на стеке OpenResty. Он использует Nginx Lua API для анализа информации HTTP-запросов и обработки на основе гибкой структуры правил. lua-resty-waf распространяется с набором правил, имитирующим ModSecurity CRS, а также с несколькими пользовательскими правилами, созданными в ходе первоначальной разработки и тестирования, и небольшим виртуальным набором исправлений для новых угроз. Кроме того, lua-resty-waf распространяется с инструментарием для автоматического перевода существующих правил ModSecurity, что позволяет пользователям расширять реализацию lua-resty-waf без необходимости изучать новый синтаксис правил.
lua-resty-waf был первоначально разработан Робертом Папроцки (Robert Paprocki) для его магистерской диссертации в Western Governor's University.
lua-resty-waf требует несколько сторонних модулей resty lua, хотя все они поставляются вместе с lua-resty-waf, и поэтому их не нужно устанавливать отдельно. Рекомендуется устанавливать lua-resty-waf на систему с программным пакетом OpenResty; lua-resty-waf не тестировался на платформах, собранных с использованием отдельных пакетов исходного кода Nginx и модуля Nginx Lua.
Для оптимальной производительности компиляции регулярных выражений рекомендуется собирать Nginx/OpenResty с версией PCRE, поддерживающей JIT-компиляцию. Если ваша ОС не предоставляет такой версии, вы можете собрать PCRE с поддержкой JIT непосредственно в вашу сборку Nginx/OpenResty. Для этого укажите путь к исходному коду PCRE в флаге конфигурации --with-pcre. Например:```sh
Вы можете загрузить исходный код PCRE с [сайта PCRE](http://www.pcre.org/). Также смотрите этот [пост в блоге](https://www.cryptobells.com/building-openresty-with-pcre-jit/) с пошаговым руководством по сборке OpenResty с библиотекой PCRE с поддержкой JIT.
## Производительность
lua-resty-waf проектировался с учётом эффективности и масштабируемости. Он использует асинхронную модель обработки Nginx и эффективную архитектуру, чтобы обрабатывать каждую транзакцию как можно быстрее. Нагрузочное тестирование показало, что развёртывания, использующие все предоставляемые наборы правил, которые призваны имитировать логику ModSecurity CRS, обрабатывают транзакции примерно за 300–500 микросекунд на запрос; это соответствует производительности, заявленной для [WAF Cloudflare](https://www.cloudflare.com/waf). Тесты проводились на разумном аппаратном стеке (CPU E3-1230, 32 ГБ ОЗУ, 2 x 840 EVO в RAID 0), достигая примерно 15 000 запросов в секунду. Более подробную информацию см. в [этом посте в блоге](http://www.cryptobells.com/freewaf-a-high-performance-scalable-open-web-firewall).
## Установка
Предоставляется простой Makefile:```
# make && sudo make install
Как вариант, установите через Luarocks:```
lua-resty-waf использует пакетный менеджер [OPM](https://github.com/openresty/opm), доступный в современных дистрибутивах OpenResty. Клиентские инструменты OPM требуют, чтобы инструмент командной строки `resty` был доступен в переменной окружения `PATH` вашей системы.
Обратите внимание, что по умолчанию lua-resty-waf работает в режиме SIMULATE, чтобы немедленно не влиять на приложение; пользователи, желающие включить действия правил, должны явно установить рабочий режим в ACTIVE.
## Synopsis```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()