Firewall веб-приложений для Nginx

Firewall веб-приложений (WAF) – это приложение, которое контролирует сетевой трафик на прикладном уровне.

OSI (Open Systems Interconnection) – одна из наиболее часто упоминаемых в дискуссиях о сетевом трафике в Интернете. Когда пакет пересекает уровень 6 (Presentation) и движется к уровню 7 (Application), он подвергается операциям расшифровки/декодирования. Каждая из этих операций может быть подвержена ошибочному декодированию и интерпретации, которые могут быть использованы для выхода из стандартного контекста приложения. Инъекции – это лишь один из видов таких уязвимостей, и уже долгое время они являются причиной беспокойства номер один, тем более что традиционные IPS-приложения не могут справиться с этими угрозами.

О ModSecurity

ModSecurity – это исторически сложившийся механизм Firewall веб-приложений. Он совместим с Apache, IIS и Nginx и поддерживается сторонней компанией. Firewall ссылается на список правил в потоке HTTP-заголовков, предоставляемых веб-сервером/прокси. На данный момент этот репозиторий был упрощен и содержит только основную библиотеку LibModSecurity. Сама библиотека может быть вызвана из вашей собственной серверной реализации напрямую или через обертки, специфичные для отдельных языков программирования.

Установите коннектор Nginx

Коннектор Nginx – это динамический модуль Nginx, который можно установить с помощью пакета nginx-mod-modsecurity. Он имеет libmodsecurity.so в качестве зависимости, поэтому для данного случая использования этот пакет является самим брандмауэром (firewall).

sudo dnf install -y nginx nginx-mod-modsecurity 
rpm -qR nginx-mod-modsecurity
config(nginx-mod-modsecurity) = 1.0.3-3.fc38
libc.so.6(GLIBC_2.4)(64bit)
libmodsecurity.so.3()(64bit)
nginx(abi) = 1.24.0
nginx-filesystem
...

После установки вы увидите, что коннектор добавляет несколько важных файлов в /etc/nginx.

rpm -ql nginx-mod-modsecurity
/etc/nginx/modsecurity.conf                   # waf config
/etc/nginx/nginx.conf.modsecurity             # nginx sample conf
/usr/lib64/nginx/modules/ngx_http_modsecurity_module.so   
/usr/share/nginx/modules/mod-modsecurity.conf
/usr/share/doc/nginx-mod-modsecurity/README.md  
...

Коннектор расширяет Nginx, предоставляя некоторые дополнительные директивы конфигурации. В следующих разделах будут продемонстрированы некоторые из примеров директив в файле nginx.conf.modsecurity. Полный список директив можно найти в файле README.md или на странице проекта на GitHub.

Включите firewall веб-приложений

nginx.conf.modsecurity – это конфигурация firewall для Nginx, которую мы собираемся запустить. Откомментируйте строки modsec*, как показано ниже.

sudo sed -i 's/#modsec/modsec/g' /etc/nginx/nginx.conf.modsecurity
grep -C2 modsecurity /etc/nginx/nginx.conf.modsecurity
        # Enable ModSecurity WAF, if need
        modsecurity on;
        # Load ModSecurity CRS, if need
        modsecurity_rules_file /etc/nginx/modsecurity.conf;

Запустите сервер в оболочке и просмотрите журналы, чтобы убедиться, что 7 правил по умолчанию, определенных в modsecurity.conf, загружены.

sudo nginx -c /etc/nginx/nginx.conf.modsecurity
head /var/log/nginx/error.log
2023/10/21 23:55:09 [notice] 46218#46218: ModSecurity-nginx v1.0.3 (rules loaded inline/local/remote: 0/7/0)
2023/10/21 23:55:09 [notice] 46218#46218: using the "epoll" event method
2023/10/21 23:55:09 [notice] 46218#46218: nginx/1.24.0
2023/10/21 23:55:09 [notice] 46218#46218: OS: Linux 6.5.7-200.fc38.x86_64

Проверьте правила по умолчанию, отправив некоторые данные, которые не соблюдают формат заголовка content-type.

curl -X POST http://localhost -H "Content-Type: application/json" --data "<xml></xml>"
[user@fedora ~]$ tail /var/log/modsec_audit.log
---rH5bFain---H--
ModSecurity: Warning. Matched "Operator `Eq' with parameter `0' against variable `REQBODY_ERROR' (Value: `1' ) [file "/etc/nginx/modsecurity.conf"] [line "75"] [id "200002"] [rev ""] [msg "Failed to parse request body."] [data "JSON parsing error: lexical error: invalid char in json text.\x0a"] [severity "2"] [ver ""] [maturity "0"] [accuracy "0"] [hostname "10.0.2.100"] [uri "/"] [unique_id "169795900388.487044"] [ref "v121,1"]

Расширение firewall веб-приложений с помощью набора основных правил OWASP

По умолчанию коннектор Nginx поставляется с 7 правилами. Набор основных правил OWASP v3.3.5 более обширен и охватывает множество сценариев.

Скопируйте архив и извлеките правила.

curl -fSL https://github.com/coreruleset/coreruleset/archive/refs/tags/v3.3.5.tar.gz --output /tmp/v3.3.5.tar.gz
sudo tar -C /etc/nginx -xvf /tmp/v3.3.5.tar.gz
tree -L 1 /etc/nginx/
/etc/nginx/
├── conf.d
├── default.d
├── modsecurity.conf          # waf config
├── nginx.conf                        
├── nginx.conf.modsecurity    # nginx waf enabled
├── coreruleset-3.3.5                 
├   ├── rules                 # rules directory
├       ...
├   ...

Теперь у вас есть каталог rules в папке конфигурации nginx со всеми текущими правилами OWASP. Далее сделайте так, чтобы Nginx знал об этих правилах. Следующие инструкции взяты из файла OWASP./INSTALL.

Создайте файл crs.conf и включите все соответствующие файлы конфигурации в файл конфигурации глобального firewall веб-приложений (modsecurity.conf).

sudo cp /etc/nginx/coreruleset-3.3.5/crs-setup.conf.example /etc/nginx/coreruleset-3.3.5/crs.conf
echo -e "\nInclude /etc/nginx/coreruleset-3.3.5/crs.conf"  | sudo tee -a /etc/nginx/modsecurity.conf
echo -e "\nInclude /etc/nginx/coreruleset-3.3.5/rules/*.conf" | sudo tee -a /etc/nginx/modsecurity.conf
tail /etc/nginx/modsecurity.conf
Include /etc/nginx/coreruleset-3.3.5/crs.conf 
Include /etc/nginx/coreruleset-3.3.5/rules/*.conf

Согласно документам, порядок включения этих файлов важен. Команда tee, показанная выше, поместила новые строки Include в конец файла modsecurity.conf. Теперь перезагрузите Nginx с этой новой конфигурацией.

sudo nginx -s stop && sudo nginx -c /etc/nginx/nginx.conf.modsecurity
tail /var/log/nginx/error.log
2023/10/22 10:53:23 [notice] 202#202: exit
2023/10/22 10:53:50 [notice] 230#230: ModSecurity-nginx v1.0.3 (rules loaded inline/local/remote: 0/921/0)
2023/10/22 10:53:50 [notice] 230#230: using the "epoll" event method
2023/10/22 10:53:50 [notice] 230#230: nginx/1.24.0
2023/10/22 10:53:50 [notice] 230#230: OS: Linux 6.5.7-200.fc38.x86_64
2023/10/22 10:53:50 [notice] 230#230: getrlimit(RLIMIT_NOFILE): 524288:524288
2023/10/22 10:53:50 [notice] 231#231: start worker processes

Напомним, что Nginx успешно загрузил 921 правило. Также необходимо провести некоторые тесты, чтобы убедиться, что правила действительно проверяются firewall’ом веб-приложений. Здесь мы снова ссылаемся на фрагмент Testing the Installation из файла ./INSTALL.

curl "http://localhost/?param=''><script>alert(1);</script>"
tail /var/log/modsec_audit.log
...
---8NSpdnLe---H--
...

Заключение

В этом развертывании используются стандартные правила плюс OWASP Core Rule Set v3.3.5. Firewall, продемонстрированный выше, работает в режиме обнаружения и регистрирует необычные действия. Запуск firewall в режиме предотвращения требует дополнительных изменений в modsecurity.conf. Обратитесь к ModSecurity Reference Manual v3.x для получения инструкций по включению режима предотвращения.

Зарубин Иван Эксперт по Linux и Windows

Парашютист со стажем. Много читаю и слушаю подкасты. Люблю посиделки у костра, песни под гитару и приближающиеся дедлайны. Люблю путешествовать.

Вдохновлен fedoramagazine.org

Похожие статьи

Комментарии (0)