🌐 Nginx WAF с ModSecurity и OWASP CRS

Мануал

В этом руководстве рассказывается о том, как включить и протестировать набор основных правил Open Web Application Security Project Core Rule Set (OWASP CRS) для использования с Nginx и ModSecurity.

Мы создадим проект Docker Compose и развернем контейнер Nginx с поддержкой ModSecurity и CRS. Все будет сделано только с использованием инструментов с открытым исходным кодом.

Ранее мы рассмотрели:

🐳 Установка ModSecurity 3 с Apache в контейнере Docker

Термины

Для лучшего понимания того, что здесь происходит, мы должны определить некоторые термины.

Nginx

Nginx – это самый популярный веб-сервер.

Он может обслуживать статический контент, обрабатывать https-запросы и делать многое другое.

WAF

Означает межсетевой экран веб-приложений.

По сравнению с обычными брандмауэрами WAF не защищают интернет-трафик (уровень 3 и 4 ISO), но защищают трафик http/s (уровень 7).

ModSecurity

ModSecurity – это кросс-платформенный модуль брандмауэра веб-приложений с открытым исходным кодом.

OWASP

OWASP – это некоммерческая организация, которая работает над повышением безопасности программного обеспечения.

CRS

Core Rule Set (CRS) – это набор общих правил обнаружения атак для использования с ModSecurity или совместимыми брандмауэрами веб-приложений.

Предварительные условия

Это руководство предполагает, что Docker и Docker Compose установлены, и вы знаете, что такое Git, контейнеры Docker, Bash, веб-серверы и файлы логов.

Файлы

Наш пример проекта состоит из различных файлов.

Вот древовидное представление того, что мы собираемся создать:

nginx-modsecurity-crs
├── docker-compose.yml
└── etc
    ├── modsecurity
    │   ├── RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf
    │   ├── crs # git submodule
    │   └── crs-setup.conf
    ├── modsecurity.d
    │   ├── include.conf
    │   └── modsecurity.conf
    └── nginx
        └── conf.d
            └── default.template

Шаг за шагом мы добавим эти файлы и, наконец, развернем и протестируем Nginx WAF.

Сначала мы настроим репозиторий нашего проекта, включим CRS и привяжем его версию.

cd ~
mkdir nginx-modsecurity-crs && cd nginx-modsecurity-crs
git init
git submodule add https://github.com/SpiderLabs/owasp-modsecurity-crs.git etc/modsecurity/crs
cd etc/modsecurity/crs/
git checkout v3.2.0
cd ~/nginx-modsecurity-cr

Давайте начнем с конфигурационного файла Nginx.

etc/nginx/conf.d/default.template

server {
    listen 443 ssl;
    server_name  ${SERVERNAME};
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;
    ssl_certificate /etc/nginx/conf/server.crt;
    ssl_certificate_key /etc/nginx/conf/server.key;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

Этот файл настраивает простой веб-сервер с защитой tls для тестирования.

etc/modsecurity.d/modsecurity.conf

Скопируйте файл modsecurity из репозитория кода.

etc/modsecurity.d/include.conf

# Include the recommended configuration
Include /etc/modsecurity.d/modsecurity.conf
# OWASP CRS v3 rules
Include /etc/modsecurity/crs-setup.conf
Include /etc/modsecurity/crs/rules/*.conf
Include /etc/modsecurity/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf

По умолчанию мы включаем все правила OWASP CRS.

etc/modsecurity/crs-setup.conf

Скопируйте файл crs-setup.conf из репозитория кода.

etc/modsecurity/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf

# https://github.com/SpiderLabs/owasp-modsecurity-crs/blob/v3.2/dev/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example
#
# Examples:
# SecRuleRemoveById 942100
# SecRuleRemoveByTag "attack-sqli"
# SecRuleUpdateTargetById 942100 "!ARGS:password"
# SecRuleUpdateTargetByTag "attack-sqli" "!ARGS:password"

Этот файл необходим, если вы хотите отключить ложные срабатывания. Подробнее см. в следующей главе.

docker-compose.yml

Это файл Docker Compose, который запускает контейнер Nginx с ModSecurity и CRS.

Это все, что нам нужно.

Запустите Docker Compose и перейдите к главе Тестирование.

docker-compose up -d

Тестирование

По умолчанию контейнер Nginx запускается в режиме аудита.

Перед включением механизма безопасности вы должны убедиться, что ModSecurity не блокирует никаких ложных срабатываний.

Поэтому вы проверяете ваше веб-приложение в режиме аудита.

Давайте пройдемся по аудиту.

Просмотрите журнал аудита.

docker exec -it nginx-modsecurity-crs_waf_1 tail -f /var/log/modsec_audit.log

Запуск правила безопасности с помощью curl.

curl -I 'https://localhost/?param="><script>alert(1);</script>' --insecure

Запрос не был заблокирован, и вы должны получить ответ следующего содержания:

HTTP/1.1 200 OK
Server: nginx/1.15.12
Date: Wed, 26 Feb 2020 13:42:17 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 16 Apr 2019 13:08:19 GMT
Connection: keep-alive
ETag: "5cb5d3c3-264"
Accept-Ranges: bytes

Вывод журнала аудита выглядит следующим образом:

ModSecurity: Warning. detected XSS using libinjection. 
[file "/etc/modsecurity/crs/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf"]
[line "37"] [id "941100"] [rev ""] [msg "XSS Attack Detected via libinjection"] 
[data "Matched Data: XSS data found within ARGS:param: "><script>alert(1);</script>"] 
[severity "2"] [ver "OWASP_CRS/3.2.0"] [maturity "0"] [accuracy "0"] [tag "application-multi"] 
[tag "language-multi"] [tag "platform-multi"] [tag "attack-xss"] [tag "OWASP_CRS"] 
[tag "OWASP_CRS/WEB_ATTACK/XSS"] [tag "WASCTC/WASC-8"] [tag "WASCTC/WASC-22"] 
[tag "OWASP_TOP_10/A3"] [tag "OWASP_AppSensor/IE1"] [tag "CAPEC-242"] [hostname "172.22.0.1"] 
[uri "/"] [unique_id "158272291834.052399"] 
[ref "v12,28t:utf8toUnicode,t:urlDecodeUni,t:htmlEntityDecode,t:jsDecode,t:cssDecode,t:removeNulls"]

XSS-атака была обнаружена правилом номер 941100.

Теперь вам нужно решить, отключить это правило, обновив файл etc/modsecurity/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf, или обновить веб-приложение.

Если ваше приложение было протестировано и в журнале аудита нет новых записей, то механизм безопасности может быть включен.

Для этого отредактируйте конфигурацию ModSecuity.

etc/modsecurity.d/modsecurity.conf

...
SecRuleEngine On
...

Перезапустите контейнер Nginx.

docker-compose restart

Запуск правила безопасности.

curl -I 'https://localhost/?param="><script>alert(1);</script>' --insecure

И вы должны получить такой ответ:

HTTP/1.1 403 Forbidden
Server: nginx/1.15.12
Date: Wed, 26 Feb 2020 13:35:17 GMT
Content-Type: text/html
Content-Length: 154
Connection: keep-alive

Запрос был успешно заблокирован.

Теперь вы можете легко настроить WAF первого класса без зависимости от сторонних продуктов.

Это так просто.

см. также:

🐛 Перехват загрузки вредоносных файлов с помощью ModSecurity и ClamAV

Добавить комментарий