Руководство по установке, настройке и эксплуатации модулей «Nemesida WAF API» и «Личный кабинет Nemesida WAF».

Доменное имя example.com вместе с поддоменами в руководстве используется в качестве примера.

Установка и настройка модуля «Nemesida WAF API»
Локальная версия «Nemesida WAF API» предназначена для передачи информации о заблокированных запросах от модулей «Nemesida WAF» в локальную базу данных, которая может быть использована для интеграции в локальными сервисами визуализации, такими как «Личный кабинет Nemesida WAF», размещенный на стороне клиента. Такая схема взаимодействия позволяет не передавать данные об атаках за пределы инфраструктуры клиента. Ниже представлено краткое руководство по введению в эксплуатацию локальной версии «Nemesida WAF API» на серверах под управлением ОС Linux.

Для установки локальной версии «Nemesida WAF API» необходимо выполнить следующие действия:

1. Разрешите обращения к https://nemesida-security.com.
2. Выполните установку модуля:

Debian 9, Ubuntu 18.04CentOS 7

Подключите репозиторий и произведите установку модуля:

# apt install apt-transport-https
# echo "deb https://repository.pentestit.ru/nw/debian stretch non-free" > /etc/apt/sources.list.d/NemesidaAPI.list
# wget -O- https://repository.pentestit.ru/nw/gpg.key | apt-key add -
# apt install nginx python3-flask python3-psycopg2 python3-requests uwsgi-plugin-python3 
# apt update
# apt install nwaf-api

Установка niginx будет производится автоматически с созданием виртуального хоста в каталоге /etc/nginx/conf.d/ . По завершению установки переименуйте конфигурационный файл виртуального хоста nwaf-api.conf.disabledв nwaf-api.conf и перезапустите nginx.

Произведите установку и настройку СУБД «PostgreSQL»:

# apt install postgresql
# su - postgres -c "psql -c \"CREATE DATABASE waf;\""
# su - postgres -c "psql -c \"CREATE ROLE nw_api PASSWORD 'YOUR_PASSWORD';\""
# su - postgres -c "psql -c \"GRANT ALL ON DATABASE waf to nw_api;\"" 
# su - postgres -c "psql -c \"ALTER ROLE nw_api WITH LOGIN;\""

Создайте структуру базы данных:

# cat /var/www/nw-api/api.sql | su postgres -c "psql waf"

Внесите необходимые изменения в файл /var/www/nw-api/settings.py для подключения к СУБД «PostgreSQL», где:
DB_HOST — адрес СУБД;
DB_PASS — пароль пользователя nw_api, заданный в п.1, для подключения к СУБД;
PROXY — адрес прокси сервера (если используется) для подключения к nemesida-secuirty.com.

Создайте файл /etc/yum.repos.d/NemesidaWAF.repo с информацией о репозитории следующего содержания:

[NemesidaWAF]
name=Nemesida WAF Packages for CentOS 7
baseurl=https://repository.pentestit.ru/nw/centos/7/$basearch
gpgkey=https://repository.pentestit.ru/nw/gpg.key
enabled=1
gpgcheck=1

Создайте файл /etc/yum.repos.d/nginx.repo с информацией о репозитории следующего содержания:

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

Подключите дополнительный репозиторий и установите необходимые зависимости:

# yum install epel-release && yum update
# yum install python34-pip python34-requests python34 uwsgi-logger-file uwsgi uwsgi-plugin-python34
# pip3 install psycopg2 flask
# yum install nwaf-api

Установка nginx будет производиться автоматически с созданием виртуального хоста в каталоге /etc/nginx/conf.d/. По завершению установки переименуйте конфигурационный файл виртуального хоста nwaf-api.conf.disabled в nwaf-api.conf и перезапустите nginx.

Произведите установку и настройку СУБД «PostgreSQL»:

# yum install postgresql-server
# postgresql-setup initdb
# sed -i "s|host    all             all             127.0.0.1/32            ident|host    all             all             127.0.0.1/32            md5|" /var/lib/pgsql/data/pg_hba.conf
# sed -i "s|host    all             all             ::1/128                 ident|host    all             all             ::1/128                 md5|" /var/lib/pgsql/data/pg_hba.conf
# systemctl start postgresql.service
# systemctl enable postgresql.service
# su - postgres -c "psql -c \"CREATE DATABASE waf;\""
# su - postgres -c "psql -c \"CREATE ROLE nw_api PASSWORD 'YOUR_PASSWORD';\""
# su - postgres -c "psql -c \"GRANT ALL ON DATABASE waf to nw_api;\"" 
# su - postgres -c "psql -c \"ALTER ROLE nw_api WITH LOGIN;\""

Создайте структуру базы данных:

# cat /var/www/nw-api/api.sql | su postgres -c "psql waf"

Внесите необходимые изменения в файл /var/www/nw-api/settings.py для подключения к СУБД «PostgreSQL», где:
DB_HOST — адрес СУБД;
DB_PASS — пароль пользователя nw_api, заданный в п.1, для подключения к СУБД;
PROXY — адрес прокси сервера (если используется) для подключения к nemesida-secuirty.com.

3. Перезагрузите сервер и проверьте работу модуля:

# systemctl status nw-api

Интеграция модуля «Nemesida WAF API»

Для интеграции локальной версии «Nemesida WAF API» с ПО «Nemesida WAF» выполните следующие действия:

1. На сервере с установленным модулем «Nemesida WAF» внесите изменения в конфигурационный файл /etc/nginx/nwaf/conf/global/nwaf.conf, приведя параметр к виду:

nwaf_api_conf host=http://nwaf-api.example.com:8080 ...

2. На сервере с установленным модулем «Nemesida WAF» внесите изменения в конфигурационный файл /etc/nginx/nwaf/mla.conf, приведя параметр к виду:

cab_status_post = http://nwaf-api.example.com:8080/nw-api/waf_mode

3. На сервере с установленным модулем «Nemesida AI MLC» внесите изменения в конфигурационный файл /opt/mlc/mlc.conf, приведя параметр к виду:

learn_status = http://nwaf-api.example.com:8080/nw-api/learning_progress

4. После внесения изменений необходимо перезапустить сервисы или перезагрузить сервер.

nwaf-api.example.com:8080 — адрес и порт сервера, на котором установлен модуль «Nemesida WAF API».

Установка и настройка модуля «Личный кабинет»
Перед установкой модуля «Личный кабинет Nemesida WAF» необходимо произвести установку и настройку модуля «Nemesida WAF API».

Ниже представлено краткое руководство по введению в эксплуатацию локальной версии «Личный кабинет Nemesida WAF» на серверах под управлением ОС Debian 9 и CentOS 7. Для установки модуля «Личный кабинет Nemesida WAF» необходимо выполнить следующие действия:

1. Подключите репозиторий и произведите установку модуля:

Debian 9, Ubuntu 18.04CentOS 7

Установите модуль и необходимые зависимости:

# apt install apt-transport-https
# echo "deb https://repository.pentestit.ru/nw/debian stretch non-free" > /etc/apt/sources.list.d/NemesidaWAF.list
# wget -O- https://repository.pentestit.ru/nw/gpg.key | apt-key add -
# apt update && apt upgrade
# apt install nginx postgresql memcached libmemcached-dev uwsgi python3 uwsgi-plugin-python3 python3-reportbug python3-pip
# apt install nwaf-cabinet

Установка nginx будет производиться автоматически с созданием виртуального хоста в каталоге /etc/nginx/conf.d/. По завершению установки переименуйте конфигурационный файл виртуального хоста cabinet.conf.disabled в cabinet.conf и перезапустите nginx.

Выполните настройку СУБД «Postgres»:

# su - postgres -c "psql -c \"CREATE DATABASE cabinet;\""
# su - postgres -c "psql -c \"CREATE ROLE nw_cabinet PASSWORD 'YOUR_PASSWORD';\""
# su - postgres -c "psql -c \"GRANT ALL ON DATABASE cabinet to nw_cabinet;\""
# su - postgres -c "psql -c \"ALTER ROLE nw_cabinet WITH LOGIN;\""

Подключите дополнительный репозиторий и установите необходимые зависимости:
Создайте файл /etc/yum.repos.d/NemesidaWAF.repo с информацией о репозитории следующего содержания:

[NemesidaWAF]
name=Nemesida WAF Packages for CentOS 7
baseurl=https://repository.pentestit.ru/nw/centos/7/$basearch
gpgkey=https://repository.pentestit.ru/nw/gpg.key
enabled=1
gpgcheck=1

Создайте файл /etc/yum.repos.d/nginx.repo с информацией о репозитории следующего содержания:

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

Произведите установку модуля:

# yum install epel-release && yum update
# yum install python34-pip python34 nginx memcached libmemcached-devel uwsgi uwsgi-plugin-python34
# yum install nwaf-cabinet

Установка nginx будет производиться автоматически с созданием виртуального хоста в каталоге /etc/nginx/conf.d/. По завершению установки переименуйте конфигурационный файл виртуального хоста cabinet.conf.disabled в cabinet.conf и перезапустите nginx.

Произведите настройку СУБД «PostgreSQL»:

# postgresql-setup initdb
# sed -i "s|host    all             all             127.0.0.1/32            ident|host    all             all             127.0.0.1/32            md5|" /var/lib/pgsql/data/pg_hba.conf
# sed -i "s|host    all             all             ::1/128                 ident|host    all             all             ::1/128                 md5|" /var/lib/pgsql/data/pg_hba.conf
# systemctl start postgresql.service
# systemctl enable postgresql.service
# su - postgres -c "psql -c \"CREATE DATABASE cabinet;\""
# su - postgres -c "psql -c \"CREATE ROLE nw_cabinet PASSWORD 'YOUR_PASSWORD';\""
# su - postgres -c "psql -c \"GRANT ALL ON DATABASE cabinet to nw_cabinet;\""
# su - postgres -c "psql -c \"ALTER ROLE nw_cabinet WITH LOGIN;\""

2. Внесите необходимые изменения в файл /var/www/app/cabinet/settings.py.

Параметры «settings.py»
Параметр
Описание
ALLOWED_HOSTS
Параметры для обеспечения безопасности «Django». Укажите FQDN-значение («example.com») или IP-адрес сервера, по которому доступен модуль.

HTTP_PROXY_CONF
Адрес прокси-сервера (опционально).

DB_NAME_CABINET
DB_USER_CABINET
DB_PASS_CABINET
DB_HOST_CABINET
Параметры для подключения к БД модуля «Личный кабинет Nemesida WAF».

DB_NAME_CONF
DB_USER_CONF
DB_PASS_CONF
DB_HOST_CONF
Параметры для подключения к БД модуля «Nemesida WAF API».

EMAIL_HOST
EMAIL_PORT
EMAIL_HOST_USER
EMAIL_HOST_PASSWORD
EMAIL_USE_TLS
SMTP_TO_CONF
Параметры подключения к почтовому серверу для отправки уведомлений о событиях на электронную почту (опционально), где:
EMAIL_HOST — адрес подключения к SMTP-серверу;
EMAIL_PORT — порт подключение к SMTP-серверу;
EMAIL_HOST_USER — имя пользователя почтового сервера, от имени которого будут отправляться сообщения;
EMAIL_HOST_PASSWORD — пароль пользователя почтового сервера, от имени которого будут отправляться сообщения;
EMAIL_USE_TLS — активация протокола TLS при аутентификации на SMTP-сервере (значение True или False);
SMTP_TO_CONF — почтовый адрес, на который будут отправляться сообщения.

VTS_SERVERS
VTS_URL
Параметры для сбора информации с модуля VTS (опционально), где:
VTS_SERVERS — список серверов, с которых модуль будет производить забор данных.
Пример: VTS_SERVERS = ['w1.example.com', 'w2.example.com'];

VTS_URL — адрес страницы, по которому доступна информация модуля VTS.

Обращение к серверам производится по протоколам HTTP/HTTPS. После настройки параметров необходимо перезапустить сервис:

systemctl enable vts
service vts restart

3. Разрешите обращения:
— к серверу https://ip.pentestit.ru/;
— к серверам из списка VTS_SERVERS по HTTP или HTTPS протоколам.

4. Выполните миграцию и установите пароль администратора:

# cd /var/www/app
# python3 manage.py migrate
# python3 manage.py createsuperuser

5. Перезагрузите сервер и проверьте работу модуля:

# systemctl status cabinet cabinet_ipinfo cabinet_attack_nottification cabinet_vts

Эксплуатация «Личного кабинета»

В «Личном кабинете Nemesida WAF», доступного по адресу YOUR_SERVER/waf/personal/, содержится информация о работе основных («Nemesida WAF», «Nemesida WAF Scanner», «Nemesida WAF AI») и вспомогательных модулей «Nemesida WAF».

Таблица и график атак

Раздел содержит информацию об аномальных запросах к защищаемому веб-приложению: атаки, связанные с попыткой поиска или эксплуатации уязвимостей, атаки перебора паролей, а также попытки передать вредоносный код (в зависимости от режима работы модулей «Nemesida WAF»). и пиктограммы свидетельствую о том, что модуль «Nemesida WAF AI» для конкретного виртуального хоста находится в процессе обучения или уже активен соответственно.

Информация об атаках в виде группированного списка

При повторном клике на иконку происходит переключение отображения событий в группированный или обычный вид.

Информация об атаках в виде обычного списка

Область поиска и выбор событий за определенный период доступны в верхней части страницы. Производить поиск можно как обычном режиме (без указания специальных параметров), так и в расширенном, используя следующие директивы:
h — виртуальный хост, доменное имя (host);
u — путь (url);
t — тип атаки (type);
p — параметр, в котором была выявлена уязвимость (param).

Для ограничения вывода информации в поле поиска доступны логические операторы «!» (исключение) и «and» (объединение).

Примеры возможных запросов

Запрос выведет информацию только по домену example.com и IP-адресу атакующего 1.2.3.4

h:example.com and ip:1.2.3.4

Запрос выведет информацию по атакам на домены 1.example.com и 2.example.com кроме атак, эксплуатирующих уязвимости класса SQL-инъекции.

h:1.example.com and h:2.example.com t:!SQLi

Запрос выведет информацию по атакам, эксплуатирующим уязвимости класса SQL-инъекция на домен example.com с IP-адресов 1.2.3.4 и 4.3.2.1

h:example.com t:SQLi ip:1.2.3.4 and ip:4.3.2.1

Во вкладке представлен сводный график по выявленным атакам, а также TOP 20 адресов, с которых было зафиксировано наибольшее количество аномальных запросов.

Информация об атаках в виде графика

Результаты работы сканера уязвимостей

Информация о работе модуля «Nemesida WAF Scanner» доступна во вкладке

Статистика работы сканера уязвимостей

Статистика работы модуля «Nginx virtual host traffic status»

На вкладке доступна информация о трафике при взаимодействии с upstream-серверами «nginx».

Статистика работы модуля VTS

Формирование детального отчета в формате PDF

При переходе на вкладку будет сформирован детальный отчет о работе «Nemesida WAF» и его компонентов. Отчет формируется в формате многостраничного PDF-файла.

Панель администратора

Пользователям модуля, входящих в группу «Администраторы», при переходе на вкладку доступен специальный раздел, в котором они могут управлять пользователями и их параметрами, а также производить обработку поступающих запросов.

Вывод дополнительной информации о работе модуля

В случае возникновения проблем при работе модуля необходимо внести изменения в файл /var/www/app/cabinet/settings_extra.py:

...
LOGGING = {
...
   'level': 'INFO'
...
   'level': 'INFO'
...

и перезапустить сервис:

# service cabinet restart

Диагностическая информация будет отображаться в журнале /var/log/uwsgi/cabinet/debug.log.

Описание структуры базы данных модуля «Nemesida WAF API»

Информация о событиях, поступающих в модуль «Nemesida WAF API», размещается в базе данных waf в таблицах attack, ml и scan_report.

attack

Таблица attack предназначена для размещения в СУБД информации о выявленных аномалиях работы модулей «Nemesida WAF» и «Nemesida AI».

Параметр
Описание
date_time
Дата фиксации аномалии.
ip
Адрес источника запроса.
rule_id
Идентификатор правила, по которому производилась фиксация аномалии.
attack_model
Цифровой идентификатор метода определения аномалий (сигнатурный анализ, машинное обучение и т.д.).
zone
Зона возникновения аномалии (URL, Args, Body и т.д.).
protocol
Протокол (HTTP или HTTPS).
method
Тип HTTP-запроса (GET, POST и т.д.).
uri
URI запроса.
content_length
vhost
useragent
referer
cookies
Заголовки HTTP-запроса.
content
Тело запроса.
wl
Зарезервированный параметр.
comment
Описание аномалии.
learning
Параметр, определяющий, попадает ли запрос под действие режиме LM.
waf_id
Идентификатор модуля «Nemesida WAF».
request_id
Идентификатор запроса.
ml

Таблица ml предназначена для размещения в СУБД информации о статусе обучения модуля «Nemesida AI».

Параметр
Описание
waf_id
Идентификатор модуля «Nemesida WAF».
ml_status
Статус работы модуля «Nemesida AI» (0 — не активен, 1 — активен).
ml_learning_progress
Статус обучения модуля «Nemesida AI» в процентах.
vhost
Виртуальный хост.
scan_report

Таблица scan_report предназначена для размещения в СУБД информации о статусе работы модуля «Nemesida WAF Scanner».

Параметр
Описание
id
Идентификатор записи.
scan_date
Дата сканирования.
content
Уровень критичности обнаруженной уязвимости.
domain
Виртуальный хост.
method
Тип HTTP-запроса (GET, POST и т.д.).
param
Аргументы запроса.
payload
Содержание «полезной нагрузки» запроса.
type
Тип обнаруженной уязвимости (SQLi, XSS и т.д.).
url
URI запроса.
data
Тело запроса (для POST-запросов).
waf_id
Идентификатор модуля «Nemesida WAF».