ModSecurity – модуль брандмауэра веб-приложений (WAF) с открытым исходным кодом, который подходит для защиты Apache, Nginx и IIS от различных кибератак, которые используют потенциальные уязвимости в различных веб-приложениях.
В этой статье мы установим и сконфигурируем ModSecurity для Ubuntu 16.04.
Для начала выполним обновление пакетов:
# apt-get update -y # apt-get upgrade -y
установим необходимые пакеты зависимостей:
# apt-get install -y git build-essential libpcre3 libpcre3-dev libssl-dev libtool autoconf apache2-dev libxml2-dev libcurl4-openssl-dev automake pkgconf
Из-за некоторой нестабильности сообщалось относительно ModSecurity для Nginx официально рекомендуется использовать последнюю версию nginx_refactoring, когда это возможно.
скачаем nginx_refactoring:
# cd /usr/src # git clone -b nginx_refactoring https://github.com/SpiderLabs/ModSecurity.git
собираем modsecurity:
# cd ModSecurity # ./autogen.sh # ./configure --enable-standalone-module --disable-mlogc # make
скачаем и распокуем Nginx 1.10.3:
# cd /usr/src # wget https://nginx.org/download/nginx-1.10.3.tar.gz # tar -zxvf nginx-1.10.3.tar.gz && rm -f nginx-1.10.3.tar.gz
собираем Nhinx с модулями modsecurity и ssl:
# cd nginx-1.10.3/ # ./configure --user=www-data --group=www-data --add-module=/usr/src/ModSecurity/nginx/modsecurity --with-http_ssl_module # make # make install
добавляем дефолтного пользователя:
sed -i "s/#user nobody;/user www-data www-data;/" /usr/local/nginx/conf/nginx.conf
если Nginx установлен успешно, связанные файлы будут расположены:
nginx path prefix: "/usr/local/nginx" nginx binary file: "/usr/local/nginx/sbin/nginx" nginx modules path: "/usr/local/nginx/modules" nginx configuration prefix: "/usr/local/nginx/conf" nginx configuration file: "/usr/local/nginx/conf/nginx.conf" nginx pid file: "/usr/local/nginx/logs/nginx.pid" nginx error log file: "/usr/local/nginx/logs/error.log" nginx http access log file: "/usr/local/nginx/logs/access.log" nginx http client request body temporary files: "client_body_temp" nginx http proxy temporary files: "proxy_temp" nginx http fastcgi temporary files: "fastcgi_temp" nginx http uwsgi temporary files: "uwsgi_temp" nginx http scgi temporary files: "scgi_temp" так же, можно протестировать установку:
# /usr/local/nginx/sbin/nginx -t
если все нормально, увидим следующее:
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
Настраиваем Nginx
откроем на редактирование конфигурационный файл:
# gedit /usr/local/nginx/conf/nginx.conf
и привем его к виду:
location / { ModSecurityEnabled on; ModSecurityConfig modsec_includes.conf; #proxy_pass http://localhost:8011; #proxy_read_timeout 180s; root html; index index.html index.htm; }
Конфигурация Nginx выше – только демонстрационная конфигурация для использования Nginx как веб-сервер, а не как обратного прокси. Если вы используете Nginx в качестве обратного прокси, удалите # в последних двух строках и делайте надлежащие настройки.
создадим файл /usr/local/nginx/conf/modsec_includes.conf:
# cat <<EOF>> /usr/local/nginx/conf/modsec_includes.conf include modsecurity.conf include owasp-modsecurity-crs/crs-setup.conf include owasp-modsecurity-crs/rules/*.conf EOF Импортируем конфигурационные файлы ModSecurity:
# cp /usr/src/ModSecurity/modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf # cp /usr/src/ModSecurity/unicode.mapping /usr/local/nginx/conf/
изменим файл /usr/local/nginx/conf/modsecurity.conf :
# sed -i "s/SecRuleEngine DetectionOnly/SecRuleEngine On/" /usr/local/nginx/conf/modsecurity.conf
добавим набор правил OWASP:
# cd /usr/local/nginx/conf # git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git # cd owasp-modsecurity-crs # mv crs-setup.conf.example crs-setup.conf # cd rules # mv REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf # mv RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf
Проверим работоспособность ModSecurity
откроем 80 порт для внешнего доступа:
# ufw allow OpenSSH # ufw allow 80 # ufw default deny # ufw enable
пропишем в браузере:
http://localhost/?param="><script>alert(1);</script>
в логах можно найти соответствующую запись используя grep:
grep error /usr/local/nginx/logs/error.log