
Установка mod_security для apache/nginx в Unix/Linux
ModSecurity — свободный фаервол веб-приложений с открытым исходным кодом (англ. Web Application Firewall, или WAF), который разработан с помощью SpiderLabs TrustWave и который обеспечивает защиту от различных атак на веб-приложения (веб сервера) и позволяет мониторить HTTP трафик в режиме реального времени и анализировать его для дальнейших действий. В своей статье «Установка mod security для apache/nginx в Unix/Linux» я расскажу как установить и использовать данное программное обеспечение для apache/nginx в Unix/Linux.
Установка mod security для apache
Для rpm и deb дистрибутивов имеется пакеты и можно установить одной командой.
Для Debian/Ubuntu:
$ sudo apt-get install libapache2-mod-security $ sudo a2enmod mod-security $ sudo /etc/init.d/apache2 force-reload
Для RedHat/Fedora/CentOS:
$ sudo yum install mod_security $ sudo /etc/init.d/httpd restart
Установка с исходного кода:
# cd /usr/local/src && wget https://www.modsecurity.org/tarball/2.9.1/modsecurity-2.9.1.tar.gz
У меня не было нужды компилировать с исходного кода, по этому, детальную установку я пока упущу.
Установка mod_security для nginx
С самого начала, ModSecurity написали для Apache. Но я сейчас расскажу как его установить для Nginx.
1. Установка mod security со скрипта.
Самый простой способ — это использовать готовый bash скрипт для установки и для начала, скачиваем его:
Используя http:
# cd /usr/local/src && wget -q -O - http://www.atomicorp.com/installers/atomic |sh
Используя https (используя SSL):
# cd /usr/local/src && wget -q -O - https://www.atomicorp.com/installers/atomic |sh
Так, идем далее — установим nginx.
Для CentOS/RHEL/Fedora:
# yum install nginx -y
Для Debian/Ubuntu:
# apt-get install nginx -y
2. Установка mod security с исходного кода.
Более правильный способ — это использовать данную утилиту с исходного кода и сейчас расскажу как это можно сделать.
Для CentOS/RedHat/Fedora
Производим скачивание архива с исходным кодом с основного сайта и на данный момент, я использую самый последний стабильный релиз. Вы можете использовать мою ссылку:
# cd /usr/local/src && wget https://www.modsecurity.org/tarball/2.9.1/modsecurity-2.9.1.tar.gz
Распакуем архив:
# tar -zxvf modsecurity-*.tar.gz && cd modsecurity-*
ПРИМЕЧАНИЕ: Сам модуль Nginx содержится в архивном пакете Apache. Для начала нужно скомпилировать ModSecurity с флагом «—enable-standalone-module» и после чего, браться за компилирование Nginx.
Чтобы скомпилировать модуль standalone с исходного кода для Linux, вы должны установить некоторые пакеты:
# yum install httpd httpd-devel pcre pcre-devel libxml2* gcc make automake autoconf libtool curl curl-devel -y
После чего приступаем к сборке модуля standalone:
# ./configure --enable-standalone-module --disable-mlogc # make
ЗАМЕЧАНИЕ! Путь, так же имя директории с mod_security может отличаться в зависимости от версии программы.
Собственно, либа standalone скомпилировалась отлично, переходим к сборке Nginx с mod security, для этого — открываем официальный сайт и скачиваем исходный код, я использую последнюю версию ( на момент написания статьи) и вы можете использовать мою ссылку если устраивает:
# cd /usr/local/src && wget http://nginx.org/download/nginx-1.9.9.tar.gz && tar -zxvf nginx-*.tar.gz && cd nginx-*
Выполняем конфигурирование всего:
# ./configure --add-module=/usr/local/src/modsecurity-2.9.1/nginx/modsecurity --prefix= --conf-path=/etc/nginx --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log
ИЛИ еще проще:
# ./configure --add-module=/usr/local/src/modsecurity-2.9.1/nginx/modsecurity
Затем, соберем все:
# make
PS: После данного этапа, вы можете собрать DEB/RPM, если не знаете как это сделать, прочтите мое чтиво:
Создание RPM или DEB пакетов с Checkinstall в Linux
Или, если это не нужно, то идем дальше и выполняем установку:
# make install
Если сделали пакет, то для него необходимо установить:
- perl(HTTP::Date) is needed by modsecurity-2.9.1-1.x86_64
- perl(LWP::Debug) is needed by modsecurity-2.9.1-1.x86_64
- perl(LWP::UserAgent) is needed by modsecurity-2.9.1-1.x86_64
- perl(URI) is needed by modsecurity-2.9.1-1.x86_64
Выполним установку необходимых компонентов:
# yum install perl-DateTime-Format-HTTP
Натройка Mod Security с Nginx
Затем, нужно скопировать «modsecurity.conf-recommended» и «unicode.mapping» в папку с nginx и для того чтобы узнать где они, я буду использовать утилиту locate (О ней можно прочитать тут: Установка locate и updatedb в Linux):
# locate modsecurity.conf-recommended # locate unicode.mapping
Или:
# find / -name modsecurity.conf-recommended # find / -name unicode.mapping
У меня они были в /usr/local/src/modsecurity-2.9.1/ директории и я сейчас скопирую их:
# cp /usr/local/src/modsecurity-2.9.1/modsecurity.conf-recommended /usr/local/nginx/conf/ # cp /usr/local/src/modsecurity-2.9.1/unicode.mapping /usr/local/nginx/conf/
Переименую файл c modsecurity.conf-recommended на modsecurity.conf командой:
# mv /usr/local/nginx/conf/modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf
На всякий случай, делаем бэкап самого nginx.conf.
Создаем init скрипт для запуска nginx:
# vim /etc/init.d/nginx
Прописываем:
#!/bin/sh # # nginx - this script starts and stops the nginx daemon # # chkconfig: - 85 15 # description: NGINX is an HTTP(S) server, HTTP(S) reverse \ # proxy and IMAP/POP3 proxy server # processname: nginx # config: /etc/nginx/nginx.conf # config: /etc/sysconfig/nginx # pidfile: /var/run/nginx.pid # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ "$NETWORKING" = "no" ] && exit 0 nginx="/usr/local/nginx/sbin/nginx" prog=$(basename $nginx) NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf" [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx lockfile=/var/lock/subsys/nginx make_dirs() { # make required directories user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -` if [ -z "`grep $user /etc/passwd`" ]; then useradd -M -s /bin/nologin $user fi options=`$nginx -V 2>&1 | grep 'configure arguments:'` for opt in $options; do if [ `echo $opt | grep '.*-temp-path'` ]; then value=`echo $opt | cut -d "=" -f 2` if [ ! -d "$value" ]; then # echo "creating" $value mkdir -p $value && chown -R $user $value fi fi done } start() { [ -x $nginx ] || exit 5 [ -f $NGINX_CONF_FILE ] || exit 6 make_dirs echo -n $"Starting $prog: " daemon $nginx -c $NGINX_CONF_FILE retval=$? echo [ $retval -eq 0 ] && touch $lockfile return $retval } stop() { echo -n $"Stopping $prog: " killproc $prog -QUIT retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval } restart() { configtest || return $? stop sleep 1 start } reload() { configtest || return $? echo -n $"Reloading $prog: " killproc $nginx -HUP RETVAL=$? echo } force_reload() { restart } configtest() { $nginx -t -c $NGINX_CONF_FILE } rh_status() { status $prog } rh_status_q() { rh_status >/dev/null 2>&1 } case "$1" in start) rh_status_q && exit 0 $1 ;; stop) rh_status_q || exit 0 $1 ;; restart|configtest) $1 ;; reload) rh_status_q || exit 7 $1 ;; force-reload) force_reload ;; status) rh_status ;; condrestart|try-restart) rh_status_q || exit 0 ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" exit 2 esac
Выставляем права на исполнение:
# chmod +x /etc/init.d/nginx
Запускаем сервер:
# /etc/init.d/nginx start
И так, вносим изменения:
# vim /usr/local/nginx/conf/nginx.conf
PS: так же можно в вирутальном хосте.
Приводим к виду:
location / { ModSecurityEnabled on; ModSecurityConfig modsecurity.conf; }
Нужно перезапустить nginx:
# nginx -t # service nginx restart
Проверяем работу и версию nginx:
# ./nginx -V nginx version: nginx/1.9.9 built by gcc 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC) configure arguments: --add-module=../modsecurity-2.9.1/nginx/modsecurity
так же, проверяем логи что пишет модуль:
2016/11/21 12:33:22 [notice] 25352#0: ModSecurity for nginx (STABLE)/2.9.1 (http://www.modsecurity.org/) configured. 2016/11/21 12:33:22 [notice] 25352#0: ModSecurity: APR compiled version="1.3.9"; loaded version="1.3.9" 2016/11/21 12:33:22 [notice] 25352#0: ModSecurity: PCRE compiled version="7.8 "; loaded version="7.8 2008-09-05" 2016/11/21 12:33:22 [notice] 25352#0: ModSecurity: LIBXML compiled version="2.7.6"
Видим, что все работает хорошо!
Для Debian/Ubuntu
Устанавливаем нужные компоненты:
# apt-get install build-essential libpcre3 libpcre3-dev libssl-dev libtool autoconf apache2-prefork-dev libxml2-dev libcurl4-openssl-dev
Вам, возможно, придется установить дополнительные зависимости в зависимости от конфигурации. Выберите папку где-будет храниться исходный код. (Я использую папку /usr/local/src). В настоящее время самая последняя версия ModSecurity это v2.9 поэтому мы скачивание эту версию:
# cd /usr/local/src && wget https://www.modsecurity.org/tarball/2.9.1/modsecurity-2.9.1.tar.gz
Распакуем архив:
# tar -zxvf modsecurity-*.tar.gz && cd modsecurity-*
Теперь компилируем ModSecurity как standalone модуль, который мы сможем включить, когда будем компилировать Nginx:
# cd /usr/local/src/ModSecurity-* # ./autogen.sh # ./configure --enable-standalone-module # make
Скачиваем и устанавливаем nginx:
# cd /usr/local/src && wget http://nginx.org/download/nginx-1.9.9.tar.gz && tar -zxvf nginx-*.tar.gz && cd nginx-*
Выполняем конфигурирование всего:
# ./configure \ --user=www-data \ --group=www-data \ --with-pcre-jit \ --with-debug \ --with-ipv6 \ --with-http_ssl_module \ --add-module=/usr/src/ModSecurity-2.9.1/nginx/modsecurity
Затем, соберем все:
# make && make install
Для старта веб-сервера, необходимо скачать и использовать init (upstart) скрипт:
# wget https://raw.github.com/JasonGiedymin/nginx-init-ubuntu/master/nginx -O /etc/init.d/nginx # chmod +x /etc/init.d/nginx # update-rc.d nginx defaults
Чтобы запустить используйте:
This script provides the following options for managing the Nginx service:
# service nginx restart
Настройка nginx
Открываем nginx.conf и меняем пользователя с nobody на «www-data»:
# vim /usr/local/nginx/conf/nginx.conf
Ищем:
user nobody;
Удаляем ее и вставляем:
user www-data;
Есть целый ряд других опций конфигурации в nginx.conf, которые вы можете изменить.
Я хотел бы сохранить виртуальные хосты в своих собственных каталогах, подобно тому, как он работает при установке Nginx с пакета и для этого, я создаю папки:
# mkdir /usr/local/nginx/conf/sites-available # mkdir /usr/local/nginx/conf/sites-enabled
Удалите примеры виртуальных хостов из nginx.conf (сделайте резервную копию сначала), а затем добавьте следующую строку в конец nginx.conf, перед закрывающей фигурной скобкой:
include /usr/local/nginx/conf/sites-enabled/*;
Теперь мы можем создавать виртуальные хосты в sites-available папке и после чего создать символическую ссылку в sites-enabled. Вот очень простой виртуальный хост:
server { listen 80; server_name local.server; location / { root html; index index.html index.htm; } }
Настройка ModSecurity
Я приводил пример использования для CentOS (немного выше статьи), нет ничего сложно, просто скопировать файлы и прописать настройки в виртуальном хосте.
На этом тема «Установка mod_security для apache/nginx в Unix/Linux» завершена.