В этом руководстве рассказывается о том, как включить и протестировать набор основных правил 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