Использование Nginx в качестве веб-сервера для Nemesida WAF позволяет задействовать дополнительный функционал для повышения защищенности веб-приложения, например, блокирование (бан) нежелательных источников запросов, зафиксированных Nemesida WAF. Такие блокировки усложняют попытки атаковать веб-приложение.

Необходимые инструменты: psql-клиент, curl и jq.

1. Выборка источников по типу блокирования

Запросы, выявленные Nemesida WAF, передаются на Nemesida WAF API, после чего сохраняются в БД Postgres. Для выборки по определенным критериям необходимых для внесения в "черный список" (BL) адресов можно использовать следующий скрипт:

Получаем список адресов из БД по типу атаки
#!/bin/bash

## VHOST
HOUR="$1"

## Config
HOST=''
USER=''
PASSWORD=''
DB='waf'
TABLE='attack'
FILE="/tmp/`date +%s`"

## Export PG password
export PGPASSWORD="$PASSWORD"

## Set default period
if [ "$HOUR" == "" ]; then HOUR="12"; fi

## Get IP
psql -h "$HOST" -U "$USER" -d "$DB" -t -c "select ip from $TABLE where ( bt = '7' and timestamp >= NOW() - '$HOUR hour'::INTERVAL );" \
| sed -r 's/\s+\|\s+/\t/g' \
| sed -r 's/\s+\|\s+/\t/g' \
| sed -r 's/^\s+//g' \
| sort -u \
| sed '/^$/d' \
| sed -r 's/(\S+)/\1	1;/g' \

exit

Скрипт производит выборку запросов, выявленных Nemesida WAF как атаки методом перебора (BT 7), и используется следующим образом: ./script 24 >> /etc/nginx/example.com.bm, где:

  • 24 - время в часах, за которое производить выборку (если параметр не указан, скрипт произведет выборку за последние 12 часов)
  • /etc/nginx/example.com.bm - файл с черным списком адресов, в который будет добавлены IP-адреса из выборки
  • . В скрипт необходимо внести информацию о параметрах подключения к PostgreSQL (HOST, USER и PASSWORD)

2. Добавляем информацию о стране

После всех обработок файл /etc/nginx/example.com.bm будет иметь вид: x.x.x.x 1; # RU, где:

  • x.x.x.x - IP-адрес, внесенный в BL
  • 1 - идентификатор активности (0 - неактивен, 1 - активен, блокируется)
  • # RU - код страны

Пока файл /etc/nginx/example.com.bm содержит только список адресов и идентификатор активности: x.x.x.x 1;. Следующий скрипт установит код страны (необязательное действие, используется для удобства управления списком):

Добавляем информацию о стране
#!/bin/bash

## BM list
bm="/etc/nginx/vhosts/example.com.bm"

## Update list
for ip in $(cat "$bm" | grep -v "#" | awk '{print $1}')
do
 country=$(curl -s "https://ip.pentestit.ru/json?ip=$ip" | sed -r 's/.+country\":"(\w+)\".+/\1/')
 echo "Processing for $ip in $bm ($country)"
 sed -i -r "s/($ip.+)/\1 # $country/" "$bm"
done

В качестве GeoIP-базы используется ip.pentestit.ru.

3. Подключение BL-файла к Nginx

Для блокирования обращений к серверу с адресов из файла /etc/nginx/example.com.bm добавьте в секцию http {...} в файле /etc/nginx/nginx.conf строки:

geo $remote_addr $blacklist_ip {
 include example.com.bm;
}

В файл вируального хоста (например, /etc/nginx/conf.d/example.com.conf) в секцию server {...} неободимо добавить:

## Blocked IP
if ($blacklist_ip) { return 403; }

После перезапуска Nginx все запросы с адресов из списка example.com.bm будут блокироваться.

Кроме этого, Nginx позволяет заблокировать доступ по стране, используя модуль ngx_http_geoip_module.