Как установить ModSecurity для Nginx на Debian/Ubuntu
Каждый разработчик желает развертывать безопасные веб-приложения, защищенные от угроз. В большинстве случаев это легче сказать, чем сделать. Частота взломов веб-сайтов продолжает расти, поскольку хакеры продолжают использовать все имеющиеся в их распоряжении векторы атак.
Безопасность веб-приложений может стать огромной проблемой, особенно с учетом распространенности вредоносных инструментов, таких как руткиты, сканеры, боты и другие вредоносные программы. Хотя взлом может показаться вопросом времени, если не «если», то разумно принять некоторые достойные меры безопасности для защиты ваших веб-приложений.
Один из инструментов, который может обеспечить достойный уровень защиты от атак, называется ModSecurity. Это бесплатный Брандмауэр веб-приложений с открытым исходным кодом (WAF), который защищает ваши веб-приложения от широкого спектра атак уровня 7, таких как межсайтовый скриптинг (XSS), SQL-внедрение, перехват сеанса и многое другое.
В этом руководстве мы покажем вам, как установить и настроить ModSecurity для работы с Nginx в дистрибутивах Linux на базе Debian, таких как Ubuntu.
Шаг 1. Установите зависимости
Чтобы начать установку, для успешной установки требуется ряд программных зависимостей. Но сначала обновите списки пакетов и репозитории следующим образом.
sudo apt update
Затем установите зависимости следующим образом.
sudo apt install make gcc build-essential autoconf automake libtool libfuzzy-dev ssdeep gettext pkg-config libcurl4-openssl-dev liblua5.3-dev libpcre3 libpcre3-dev libxml2 libxml2-dev libyajl-dev doxygen libcurl4 libgeoip-dev libssl-dev zlib1g-dev libxslt-dev liblmdb-dev libpcre++-dev libgd-dev
Шаг 2. Установите последнюю версию Nginx
Следующим шагом будет установка веб-браузера Nginx. Чтобы установить последнюю версию, мы собираемся установить ее из PPA ondrej/nginx-mainline w, который в настоящее время поддерживается разработчиком Debian с 2000 года.
Чтобы добавить PPA в вашу локальную систему Ubuntu, выполните команду:
sudo add-apt-repository ppa:ondrej/nginx-mainline -y
Затем обновите списки пакетов и установите последнюю версию Nginx, как показано ниже.
sudo apt update
sudo apt install nginx-core nginx-common nginx nginx-full
Обычно включен только репозиторий по умолчанию. Целесообразно включить репозиторий исходного кода, чтобы вы могли позже загрузить исходный код Nginx на следующем шаге.
Для этого измените файл репозитория Nginx.
sudo vim /etc/apt/sources.list.d/ondrej-ubuntu-nginx-mainline-*.list
Найдите и раскомментируйте эту строку, чтобы включить репозиторий исходного кода:
deb-src http://ppa.launchpad.net/ondrej/nginx-mainline/ubuntu/ focal main
Теперь файл должен выглядеть так, как показано.
Сохраните изменения и выйдите.
Затем обновите индекс пакета.
sudo apt update
Шаг 3. Загрузите исходный пакет Nginx.
Чтобы скомпилировать динамический модуль ModSecurity, нам необходимо загрузить пакет исходного кода Nginx. Для этого мы сначала создадим каталог Nginx по пути /usr/local/src/ для размещения файла пакета исходного кода Nginx.
sudo mkdir -p /usr/local/src/nginx
Затем назначьте права доступа к каталогу, как показано. Обязательно замените имя пользователя своим фактическим именем пользователя sudo.
sudo chown username:username -R /usr/local/src/
После этого перейдите в исходный каталог Nginx:
cd /usr/local/src/nginx
Продолжите и загрузите пакеты исходных файлов Nginx:
sudo apt source nginx
Скорее всего, вы столкнетесь со следующей ошибкой:
W: Download is performed unsandboxed as root as file 'nginx_1.19.5.orig.tar.gz' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied)
Это не что-то, что могло бы вас взволновать. Поэтому просто игнорируйте ошибку.
Вы можете просмотреть исходный файл с помощью команды ls.
ls -l
Убедитесь, что версия исходного кода совпадает с установленной версией Nginx.
nginx -v
Шаг 4. Установите библиотеку Libmodsecurity3.
Libmodesecurity — это библиотека Modsecurity, которая управляет HTTP-фильтрацией для ваших приложений. Есть два способа его установки. Вы можете использовать менеджер пакетов apt, как показано ниже.
sudo apt install libmodsecurity3
Другой подход — установить его из источника, который предпочтительнее, поскольку он предоставляет вам последнюю версию. Чтобы начать установку Libmodsecurity из исходного кода, клонируйте репозиторий git, как показано:
git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity /usr/local/src/ModSecurity/
Перейдите в клонированный каталог:
cd /usr/local/src/ModSecurity/
Сделайте упор на установку субмодулей
sudo git submodule init
sudo git submodule update
После этого создайте среду, используя приведенные ниже команды.
sudo ./build.sh
sudo ./configure
Еще раз проигнорируйте ошибку, показанную ниже.
fatal: No names found, cannot describe anything.
Затем скомпилируйте исходный код и установите другие утилиты, используя следующую команду make. Это занимает около 25 минут и требует некоторого терпения.
sudo make -j4
После завершения установите библиотеки.
sudo make install
Шаг 5. Загрузите и скомпилируйте коннектор ModSecurity v3 Nginx.
Следующим шагом будет загрузка и компиляция коннектора ModSecurity Nginx. Коннектор, как следует из названия, связывает библиотеку Libmodsecurity с веб-сервером Nginx. Чтобы загрузить соединитель Modsecurity, клонируйте его из репозитория GitHub следующим образом.
git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git /usr/local/src/ModSecurity-nginx/
Перейдите в клонированный каталог.
cd /usr/local/src/nginx/nginx-1.21.3/
Продолжите и установите зависимости сборки
sudo apt build-dep nginx
sudo apt install uuid-dev
Затем скомпилируйте модуль ModSecurity Nginx Connector с флагом --with-compat
. Опция --with-compat
делает модуль ModSecurity Nginx Connector двоично совместимым с текущей библиотекой Nginx.
sudo ./configure --with-compat --add-dynamic-module=/usr/local/src/ModSecurity-nginx
Как только это будет сделано, создайте модуль ModSecurity Nginx Connector с помощью команды make.
sudo make modules
Модуль сохраняется как objs/ngx_http_modsecurity_module.so. Вам необходимо скопировать этот модуль в каталог /usr/share/nginx/modules/ следующим образом.
sudo cp objs/ngx_http_modsecurity_module.so /usr/share/nginx/modules/
Шаг 6. Загрузите модуль соединителя ModSecurity Nginx.
Чтобы загрузить модуль соединителя Nginx, сначала откройте основной файл конфигурации Nginx.
sudo vim /etc/nginx/nginx.conf
Добавьте следующую строку чуть ниже первых нескольких строк.
load_module modules/ngx_http_modsecurity_module.so;
Кроме того, добавьте следующие строки в раздел http {...}
. Это включает ModSecurity для всех виртуальных хостов Nginx.
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
Сохраните изменения и выйдите из файла.
Далее создайте каталог /etc/nginx/modsec/, в котором будет храниться конфигурация ModSecurity.
sudo mkdir /etc/nginx/modsec/
Затем скопируйте файл конфигурации ModSecurity следующим образом.
sudo cp /usr/local/src/ModSecurity/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf
Затем откройте файл конфигурации.
sudo vim /etc/nginx/modsec/modsecurity.conf
Найдите строку, начинающуюся с директивы SecRuleEngine.
SecRuleEngine DetectionOnly
Эта строка предписывает ModSecurity регистрировать только HTTP-транзакции, но не предпринимает никаких действий в случае атаки веб-приложения. Вам необходимо изменить это, чтобы Modsecurity не только обнаруживал, но и блокировал веб-атаки.
Измените строку на строку ниже
SecRuleEngine On
Сохраните изменения и выйдите из файла.
Затем создайте файл /etc/nginx/modsec/main.conf.
sudo vim /etc/nginx/modsec/main.conf
Добавьте эту строку для ссылки на файл конфигурации /etc/nginx/modsec/modsecurity.conf.
Include /etc/nginx/modsec/modsecurity.conf
Сохраните изменения и выйдите из файла.
Кроме того, скопируйте файл сопоставления Юникода.
sudo cp /usr/local/src/ModSecurity/unicode.mapping /etc/nginx/modsec/
Затем проверьте конфигурацию Nginx.
sudo nginx -t
Тест должен пройти успешно. Если нет, вернитесь и проверьте, все ли внесенные изменения верны.
Затем, наконец, перезапустите Nginx, чтобы применить все внесенные изменения.
sudo systemctl restart nginx
И убедитесь, что Nginx работает должным образом.
sudo systemctl status nginx
Шаг 7. Загрузите набор основных правил OWASP.
Чтобы ModSecurity защитил ваши веб-приложения, вам необходимо указать правила, которые будут обнаруживать подозрительные действия и блокировать их. Для начала желательно установить существующие наборы правил, которые помогут вам освоиться.
Основной набор правил OWASP (CRS) – это бесплатный набор правил с открытым исходным кодом, поддерживаемый сообществом, который предоставляет правила для отражения распространенных векторов атак, таких как внедрение SQL-кода, Межсайтовый скриптинг (XSS).
Загрузите основной набор правил OWASP с Github, как показано, с помощью команды wget.
wget https://github.com/coreruleset/coreruleset/archive/v3.3.0.tar.gz
Извлеките сжатый файл.
tar xvf v3.3.0.tar.gz
Обязательно переместите несжатый каталог по пути /etc/nginx/modsec/.
sudo mv coreruleset-3.3.0/ /etc/nginx/modsec/
Затем переименуйте файл crs-setup.conf.example в crs-setup.conf.
sudo mv /etc/nginx/modsec/coreruleset-3.3.0/crs-setup.conf.example /etc/nginx/modsec/coreruleset-3.3.0/crs-setup.conf
Снова вернитесь к файлу конфигурации ModSecurity.
sudo vim /etc/nginx/modsec/main.conf
И добавьте следующие строки.
Include /etc/nginx/modsec/coreruleset-3.3.0/crs-setup.conf
Include /etc/nginx/modsec/coreruleset-3.3.0/rules/*.conf
Теперь в файле должно быть 3 строки:
Сохраните файл и еще раз перезапустите Nginx.
sudo systemctl restart nginx
Шаг 8. Тестирование ModSecurity
Наконец, мы собираемся провести тест ModSecurity и подтвердить, что он может обнаруживать и блокировать подозрительный HTTP-трафик.
Мы собираемся отредактировать файл конфигурации ModSecurity и создать правило блокировки, которое будет блокировать доступ к определенному URL-адресу при доступе через веб-браузер.
sudo vim /etc/nginx/modsec/modsecurity.conf
Добавьте эту строку чуть ниже директивы SecRuleEngine On.
SecRule ARGS:testparam "@contains test" "id:254,deny,status:403,msg:'Test Successful'"
Вы можете установить для тегов id и msg нужные значения.
Сохраните изменения и перезапустите Nginx.
sudo systemctl restart nginx
Теперь запустите браузер и перейдите по указанному ниже URL-адресу с суффиксом ?testparam=test
.
http://server-ip/?testparam=test
Вы должны получить ошибку 403 «Запрещено». Это означает, что вы пытаетесь получить доступ к запрещенному ресурсу на веб-сервере.
Кроме того, вы можете проверить журналы ошибок Nginx, чтобы убедиться, что клиент заблокирован.
cat /var/log/nginx/error.log | grep "Test Successful"
Это был обзор того, как можно настроить Modsecurity с помощью Nginx в Debian и Ubuntu. Мы надеемся, что это было полезно.