Ⅲ. Nemesida WAF API | Немезида ВАФ

Руководство по установке, настройке и эксплуатации модуля Nemesida WAF API, предназначенного для:

  • приема информации об атаках и выявленных уязвимостях;
  • управления поведенческими моделями;
  • получения статистики об атаках и централизованного сбора и обработки журналов всех компонентов Немезида ВАФ;
  • управления настройками Немезида ВАФ и веб-сервера Nginx;
  • управления настройками сканера уязвимостей Nemesida WAF Scanner.

Доменное имя api.example.com используется в качестве примера обозначения сервера с установленным модулем Nemesida WAF API.

Установка и настройка модуля Nemesida WAF API
Nemesida WAF API предназначен для передачи информации от модулей Немезида ВАФ (заблокированные запросы, выявленные уязвимости, статус работы модуля машинного обучения) в базу данных PostgreSQL для последующей интеграции с различными сервисами, такими как Личный кабинет, системами класса SIEM и т.д.

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

1. Установите и настройте СУБД PostgreSQL:

Автоматическая установкаDebian, UbuntuRHEL

1. Загрузите скрипт;

2. Запустите скрипт установки командой:

# /bin/bash ./2-api-deploy.sh 'pg_srv_ip=%PostgreSQL server address%' 'pg_srv_port=%PostgreSQL port%' 'pg_api_pwd=%Password%' 'api_proxy=%Proxy server address%'

где:

  • pg_srv_ip — IP-адрес сервера с БД waf;
  • pg_srv_port — порт сервера с БД waf;
  • pg_api_pwd — пароль пользователя nw_api для БД waf;
  • api_proxy — (Опционально) IP-адрес прокси сервера для доступа компонента к внешним ресурсам (например, http://proxy.example.com:3128).
# apt update && apt upgrade
# apt install postgresql

Создайте БД, пользователя и пароль для подключения модуля Nemesida WAF API:

# 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;\""
# su - postgres -c "psql waf -c \"GRANT ALL ON ALL TABLES IN SCHEMA public TO nw_api;\""
# su - postgres -c "psql waf -c \"GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO nw_api;\""
# su - postgres -c "psql waf -c \"GRANT CREATE ON SCHEMA public TO nw_api;\""

Если БД используется на отдельном сервере, то необходимо предоставить к ней доступ. Для этого внесите изменения в файл конфигурации PostgreSQL pg_hba.conf.

Пример:

# IPv4 local connections:
host    all             all             10.1.1.1/32            md5
Настройте политику SELinux или деактивируйте ее командой:

# setenforce 0

после чего приведите файл /etc/selinux/config к виду:

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

Установите и настройте СУБД PostgreSQL:

# dnf update
# dnf install postgresql-devel 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
# systemctl enable postgresql

Создайте БД, пользователя и пароль для подключения модуля Nemesida WAF API:

# 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;\""
# su - postgres -c "psql waf -c \"GRANT ALL ON ALL TABLES IN SCHEMA public TO nw_api;\""
# su - postgres -c "psql waf -c \"GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO nw_api;\""
# su - postgres -c "psql waf -c \"GRANT CREATE ON SCHEMA public TO nw_api;\""

Если БД используется на отдельном сервере, то необходимо предоставить к ней доступ. Для этого внесите изменения в файл конфигурации PostgreSQL pg_hba.conf.

Пример:

# IPv4 local connections:
host    all             all             10.1.1.1/32            md5

2. Установите модуль:

Перед установкой модуля обязательно проверьте доступ к созданной БД, произведя подключение к ней командой: psql -h <server_ip> -U nw_api waf. При подключении введите пароль пользователя nw_api.

Автоматическая установкаDebianUbuntuRHELDockerYandex Cloud VM
Для развертывания Nemesida WAF API можно воспользоваться скриптом автоматической установки:

1. Загрузите скрипт;

2. Запустите скрипт установки командой:

# /bin/bash ./2-api-deploy.sh 'pg_srv_ip=xxx' 'pg_srv_port=xxx' 'pg_api_pwd=x.x.x.x' 'api_proxy=xxx:xx'

где:

  • pg_srv_ip — IP-адрес сервера с БД waf;
  • pg_srv_port — порт сервера с БД waf;
  • pg_api_pwd — пароль пользователя nw_api для БД waf;
  • api_proxy — (Опционально) IP-адрес прокси сервера для доступа компонента к внешним ресурсам.

Установите пакеты:

# apt install apt-transport-https gnupg2 curl

Подключите репозиторий Немезида ВАФ:

Debian 11
# echo "deb https://nemesida-security.com/repo/nw/debian bullseye non-free" > /etc/apt/sources.list.d/NemesidaWAF.list
# curl -s https://nemesida-security.com/repo/nw/gpg.key | gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/trusted.gpg --import
# chmod 644 /etc/apt/trusted.gpg.d/trusted.gpg
# apt update
Debian 12
# echo "deb https://nemesida-security.com/repo/nw/debian bookworm nwaf" > /etc/apt/sources.list.d/NemesidaWAF.list
# curl -s https://nemesida-security.com/repo/nw/gpg.key | gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/trusted.gpg --import
# chmod 644 /etc/apt/trusted.gpg.d/trusted.gpg
# apt update

Установите пакеты:

# apt install nginx python3-pip python3-dev postgresql-server-dev-all python3-venv memcached
# apt install nwaf-api

Во время установки модуля дополнительно устанавливаются следующие pip-пакеты:
flask func-timeout netaddr psycopg2-binary pymemcache pyopenssl cryptography python-decouple requests validators pandas pyarrow jsonref

Установите пакеты:

# apt install apt-transport-https gnupg2 curl

Подключите репозиторий Немезида ВАФ и установите пакеты:

Ubuntu 20.04
# echo "deb [arch=amd64] https://nemesida-security.com/repo/nw/ubuntu focal non-free" > /etc/apt/sources.list.d/NemesidaWAF.list
# curl -s https://nemesida-security.com/repo/nw/gpg.key | gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/trusted.gpg --import
# chmod 644 /etc/apt/trusted.gpg.d/trusted.gpg
# apt update
# apt install nginx python3.9 python3-pip python3.9-dev postgresql-server-dev-all python3.9-venv build-essential memcached
Ubuntu 22.04
# echo "deb [arch=amd64] https://nemesida-security.com/repo/nw/ubuntu jammy non-free" > /etc/apt/sources.list.d/NemesidaWAF.list
# curl -s https://nemesida-security.com/repo/nw/gpg.key | gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/trusted.gpg --import
# chmod 644 /etc/apt/trusted.gpg.d/trusted.gpg
# apt update
# apt install nginx python3 python3-pip python3-dev postgresql-server-dev-all python3-venv build-essential memcached
Ubuntu 24.04
# echo "deb [arch=amd64] https://nemesida-security.com/repo/nw/ubuntu noble nwaf" > /etc/apt/sources.list.d/NemesidaWAF.list
# curl -s https://nemesida-security.com/repo/nw/gpg.key | gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/trusted.gpg --import
# chmod 644 /etc/apt/trusted.gpg.d/trusted.gpg
# apt update
# apt install nginx python3 python3-pip python3-dev postgresql-server-dev-all python3-venv build-essential memcached

Установите пакеты:

# apt install nwaf-api

Во время установки модуля дополнительно устанавливаются следующие pip-пакеты:
flask func-timeout netaddr psycopg2-binary pymemcache pyopenssl cryptography python-decouple requests validators pandas pyarrow jsonref

Подключите репозиторий Немезида ВАФ, приведя файл /etc/yum.repos.d/NemesidaWAF.repo к виду:

[NemesidaWAF]
name=Nemesida WAF Packages for RHEL
baseurl=https://nemesida-security.com/repo/nw/rhel/$releasever/$basearch/
gpgkey=https://nemesida-security.com/repo/nw/gpg.key
enabled=1
gpgcheck=1

Установите пакеты:

RHEL 8 и деривативы
# dnf install epel-release
# dnf update
# dnf install nginx python39 python39-devel python39-setuptools python39-pip postgresql-devel gcc memcached
RHEL 9 и деривативы
# dnf install epel-release
# dnf update
# dnf install nginx python3 python3-devel python3-setuptools python3-pip postgresql-devel gcc memcached

Установите пакеты:

# dnf install nwaf-api

Во время установки модуля дополнительно устанавливаются следующие pip-пакеты:
flask func-timeout netaddr psycopg2-binary pymemcache pyopenssl cryptography python-decouple requests validators pandas pyarrow jsonref

Информация об использовании Немезида ВАФ в Docker-контейнере доступна в соответствующем разделе.
Информация об использовании Немезида ВАФ в виде Yandex Cloud VM доступна в соответствующем разделе.

3. Разрешите обращения:
При локальном развертывании БД:
— к внешним ресурсам;
— к серверу Memcached 127.0.0.1:11211;
— к серверу с СУБД PostgreSQL 127.0.0.1:5432.
При развертывании БД на отдельном сервере:
— к внешним ресурсам;
— к серверу Memcached 127.0.0.1:11211;
— к серверу с СУБД PostgreSQL <server_ip>:5432.

4. Внесите необходимые изменения в файл /var/www/nw-api/settings.py для подключения к СУБД PostgreSQL.

При использовании скрипта автоматической установки редактирование файла не требуется.

Параметры settings.py
Параметр
Описание
PROXY
Адрес прокси-сервера (опционально).

Пример:

PROXY = 'http://proxy.example.com:3128'

Допускается использование параметров аутентификации при использовании прокси-сервера.

Пример:

PROXY = 'http://<user>:<password>@proxy.example.com:3128'

DB_HOST
DB_PORT
DB_NAME
DB_USER
DB_PASS
Параметры для подключения к БД модуля Nemesida WAF API.
RO_MODE
Режим взаимодействия с БД в режиме «только чтение».

Параметр активируется на одном из серверов с установленным модулем Nemesida WAF API для повышения отказоустойчивости в случаях, если другой сервер с установленным модулем Nemesida WAF API будет недоступен.

Активация параметра включает в себя репликацию PostgeSQL.


MEMCACHED_HOST
MEMCACHED_PORT
Параметры для подключения к серверу Memcached.

5. Активируйте виртуальный хост:

# mv /etc/nginx/conf.d/nwaf-api.conf.disabled /etc/nginx/conf.d/nwaf-api.conf
# nginx -t && service nginx reload

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

# systemctl restart nw-api rldscupd nginx memcached
# systemctl status nw-api rldscupd nginx memcached

Сервис rldscupd предназначен для получения дополнительных данных о событиях (описание аномалий, GeoIP-данные и т.д.).

Информация об ошибках в работе Nemesida WAF API содержится в журналах регистрации событий модуля /var/log/uwsgi/nw-api/*.log.

В целях безопасности необходимо ограничить обращения к Nemesida WAF API:

  • разрешить обращения только с доверенных IP-адресов;
  • разрешить обращения к http://api.example.com:8080/nw-api/attack только для серверов фильтрующей ноды и Nemesida AI MLC.

Интеграция модуля Nemesida WAF API
Для интеграции Nemesida WAF API с ПО Немезида ВАФ выполните следующие действия:

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

nwaf_api_proxy http://proxy.example.com:3128;
nwaf_api_conf host=http://api.example.com:8080/nw-api/;

где api.example.com:8080/nw-api/ — адрес и порт сервера, на котором установлен модуль Nemesida WAF API, а http://proxy.example.com:3128 — адрес прокси-сервера для обращения к Nemesida WAF API.

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

api_uri = http://api.example.com:8080/nw-api/
api_proxy = http://proxy.example.com:3128

3. На сервере с установленным модулем Nemesida WAF Scanner внесите изменения в конфигурационный файл /opt/nws/main.conf, приведя параметры к виду:

api_host = http://api.example.com:8080/nw-api/
api_proxy = http://proxy.example.com:3128

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

Управление настройками Немезида ВАФ

🔗 Общие сведения

Используя вызовы API, можно управлять настройками Немезида ВАФ:

  • настройками фильтрующей ноды;
  • настройками Nemesida AI MLC;
  • настройками API Firewall;
  • поведенческими моделями;
  • синхронизацией между серверами настроек фильтрующей ноды и Nemesida AI MLC;
  • правилами исключения сигнатур и расширенными правилами блокировки.

Управление настройками осуществляется с помощью специально составленных запросов. Каждый запрос должен содержать лицензионный ключ установленной копии Немезида ВАФ.

🔗 Настройка фильтрующей ноды

Позволяет управлять настройками фильтрующей ноды. Поддерживает следующие команды управления:

Получить настройки
Пример запроса:

# curl http://api.example.com:8080/nw-api/v2/get_dyn_settings --data 'key=%Лицензионный ключ%'

Формат ответа:

{
  "status": "success",
  "active": boolean,
  "nwaf_limit": [string, ...],
  "nwaf_ip_wl": [string, ...],
  "nwaf_ip_lm": [string, ...],
  "nwaf_geoip_mla_disable": [string, ...],
  "nwaf_host_wl": [string, ...],
  "nwaf_host_lm": [string, ...],
  "nwaf_url_wl": [string, ...],
  "nwaf_rfc_violation_wl": [string, ...],
  "nwaf_rfc_violation_lm": [string, ...],
  "nwaf_b64_decode_disable": [string, ...],
  "nwaf_mla_host_lm": [string, ...],
  "nwaf_ai_extra_host_wl": [string, ...],
  "nwaf_ai_extra_host_lm": [string, ...]
  "nwaf_bf_detect_host_lm": [string, ...],
  "nwaf_ddos_detect_host_lm": [string, ...],
  "nwaf_rmq_host_exclude": [string, ...],
  "nwaf_body_exclude": [string, ...],
  "nwaf_body_bin_exclude": [string, ...],
  "nwaf_post_body_exclude": [string, ...],
  "nwaf_put_body_exclude": [string, ...],
  "nwaf_openapi_ip_wl": [string, ...],
  "nwaf_openapi_ip_lm": [string, ...],
  "nwaf_openapi_url_wl": [string, ...],
  "nwaf_openapi_url_lm": [string, ...]
}

или

{"status": "fail", "description": "%описание ошибки%"}

Пример ответа:

{
  "status": "success",
  "active": true,
  "nwaf_limit": ["domain=example.com rate=5r/m block_time=600", ...],
  "nwaf_ip_wl": ["127.0.0.1", ...],
  "nwaf_ip_lm": ["127.0.0.1", ...],
  "nwaf_geoip_mla_disable": ["example.com", ...],
  "nwaf_host_wl": ["example.com", ...],
  "nwaf_host_lm": ["example.com", ...],
  "nwaf_url_wl": ["example.com/uploads.php", ...],
  "nwaf_rfc_violation_wl": ["*.example.com/login/index.php", ...],
  "nwaf_rfc_violation_lm": ["*.example.com/login/index.php", ...],
  "nwaf_b64_decode_disable": ["example.com/uploads/ z:BODY|URL", ...],
  "nwaf_mla_host_lm": ["example.com", ...],
  "nwaf_ai_extra_host_wl": ["example.com", ...],
  "nwaf_ai_extra_host_lm": ["example.com", ...]
  "nwaf_bf_detect_host_lm": ["example.com", ...],
  "nwaf_ddos_detect_host_lm": ["example.com", ...],
  "nwaf_rmq_host_exclude": ["example.com", ...],
  "nwaf_body_exclude": ["example.com/uploads.php", ...],
  "nwaf_body_bin_exclude": ["example.com/uploads.php", ...],
  "nwaf_post_body_exclude": ["example.com", ...],
  "nwaf_put_body_exclude": ["example.com", ...],
  "nwaf_openapi_ip_wl": ["127.0.0.1", ...],
  "nwaf_openapi_ip_lm": ["127.0.0.1", ...],
  "nwaf_openapi_url_wl": ["example.com/uploads.php", ...],
  "nwaf_openapi_url_lm": ["example.com/uploads.php", ...]
}
Задать настройки
Пример запроса:
# curl http://api.example.com:8080/nw-api/v2/set_dyn_settings --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "set": {
    "active": true,
    "nwaf_limit": ["domain=example.com rate=5r/m block_time=600", ...],
    "nwaf_ip_wl": ["127.0.0.1", ...],
    "nwaf_ip_lm": ["127.0.0.1", ...],
    "nwaf_geoip_mla_disable": ["example.com", ...],
    "nwaf_host_wl": ["example.com", ...],
    "nwaf_host_lm": ["example.com", ...],
    "nwaf_url_wl": ["example.com/uploads.php", ...],
    "nwaf_rfc_violation_wl": ["*.example.com/login/index.php", ...],
    "nwaf_rfc_violation_lm": ["*.example.com/login/index.php", ...],
    "nwaf_b64_decode_disable": ["example.com/uploads/ z:BODY|URL", ...],
    "nwaf_mla_host_lm": ["example.com", ...],
    "nwaf_ai_extra_host_wl": ["example.com", ...],
    "nwaf_ai_extra_host_lm": ["example.com", ...]
    "nwaf_bf_detect_host_lm": ["example.com", ...],
    "nwaf_ddos_detect_host_lm": ["example.com", ...],
    "nwaf_rmq_host_exclude": ["example.com", ...],
    "nwaf_body_exclude": ["example.com/uploads.php", ...],
    "nwaf_body_bin_exclude": ["example.com/uploads.php", ...],
    "nwaf_post_body_exclude": ["example.com", ...],
    "nwaf_put_body_exclude": ["example.com", ...],
    "nwaf_openapi_ip_wl": ["127.0.0.1", ...],
    "nwaf_openapi_ip_lm": ["127.0.0.1", ...],
    "nwaf_openapi_url_wl": ["example.com/uploads.php", ...],
    "nwaf_openapi_url_lm": ["example.com/uploads.php", ...]
  }
}'

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}

Для управления доступны следующие параметры:

Поддерживаемые параметры
Параметр
Описание параметра
nwaf_limit

Устанавливает лимит заблокированных запросов. При превышении допустимого количества запросов, определенного опцией rate, IP-адрес будет заблокирован на время (в секундах), указанное в block_time.

Пример:

{... "nwaf_limit": ["rate=5r/m block_time=600"] ...}

Параметр domain является опциональным и требуется только для установки лимита заблокированных запросов для конкретного домена. Для этого необходимо привести параметр к виду: nwaf_limit rate=... block_time=... domain=.... Допускается использовать строгое соответствие и wildcard-значения: *, example.com, .example.com, *.example.com.

Пример:

{... "nwaf_limit": ["domain=example.com rate=5r/m block_time=600"] ...}

Для параметра domain допускается использовать строгое соответствие и wildcard-значения: example.com, .example.com, *.example.com, *.

Условия срабатывания опции выбираются на основе следующего порядка приоритета значений параметра domain от высшего к низшему:

  • example.com — срабатывание опции для домена;
  • .example.com — срабатывание опции для домена example.com и его поддоменов;
  • *.example.com — срабатывание опции только для поддоменов домена example.com, исключая основной домен;
  • * — срабатывание опции для всех доменов.

Если задать несколько опций:

{... "nwaf_limit": ["domain=.example.comrate=5r/m block_time=600", "domain=*.example.com rate=15r/m block_time=600"] ...}

то при обращении на web.example.com для блокирования IP-адреса будет достаточно заблокировать 5 запросов за минуту, а не 15 т.к. .example.com имеет больший приоритет.

Для установки разных лимитов для разных доменов необходимо указать параметры для каждого из них.

Пример:

{... "nwaf_limit": ["domain=a.example.com rate=5r/m block_time=300", "domain=example.com rate=5r/m block_time=300"] ...}

или

{... "nwaf_limit": ["rate=10r/m block_time=600", "domain=example.com rate=5r/m block_time=300"] ...}

В последнем примере будут установлены лимиты на 5 блокировок в минуту для домена example.com (с последующей блокировкой IP-адреса атакующего на 300 секунд), а также лимиты на 10 блокировок в минуту для всех остальным доменов (с последующей блокировкой IP-адреса атакующего на 600 секунд).

При выявлении атак методом перебора (BT 7), флуда (BT 9) и DDoS (BT 10) параметр rate не учитывается, блокировка будет производиться при первом срабатывании.

Для корректного применения опции не допускаются следующие варианты ее применения:

1. Применение опции для одного домена с разными значениями rate и block_time.

Пример:

{... "nwaf_limit": ["domain=example.com rate=50r/m block_time=600", "domain=example.com rate=15r/s block_time=1500"] ...}

2. Одновременное добавление значений опции с параметром domain=* и без него.

Пример:

{... "nwaf_limit": ["domain=* rate=5r/m block_time=300", "rate=5r/m block_time=300"] ...}
nwaf_ip_wl

Деактивация механизма анализа запроса средствами Немезида ВАФ для конкретного IP-адреса или подсети.

Пример:

{... "nwaf_ip_wl": ["127.0.0.1", "192.168.0.1"] ...}

При использовании "nwaf_ip_wl": "domain=example.com 127.0.0.1" механизм анализа будет деактивирован только при обращении с конкретного IP-адреса на конкретный домен. Значение domain является опциональным. Допускается использовать строгое соответствие и wildcard-значения: *, example.com, .example.com, *.example.com. Допускается использование IPv4/IPv6 адресов, в том числе использование CIDR (например, x.x.x.x/24) и диапазона IP-адресов.

Пример:

{... "nwaf_ip_wl": ["127.0.0.1", "192.168.61.0/24", "domain=example.com 192.168.61.1-192.168.61.255"] ...}

Для снижения количества ложных срабатываний рекомендуется указывать статический IP-адрес пользователей (администраторов, контент-менеджеров, редакторов) в параметре nwaf_ip_wl. Запросы, попадающие под действие параметра не будут блокироваться, передаваться в RabbitMQ, и, как результат, анализироваться модулем Nemesida AI. При использовании параметра будьте предельно осторожны.

nwaf_ip_lm

Настройка обработки запросов для конкретного IP-адреса или подсети с фиксацией в СУБД, но без фактической блокировки (режим мониторинга).

Пример:

{... "nwaf_ip_lm": ["127.0.0.1", "192.168.0.1"] ...}

При использовании "nwaf_ip_lm": "domain=example.com 127.0.0.1" пропуск будет производиться только при обращении с конкретного IP-адреса на конкретный домен. Значение domain является опциональным. Допускается использовать строгое соответствие и wildcard-значения: *, example.com, .example.com, *.example.com. Допускается использование IPv4/IPv6 адресов, в том числе использование CIDR (например, x.x.x.x/24) и диапазона IP-адресов.

Пример:

{... "nwaf_ip_lm": ["127.0.0.1", "192.168.61.0/24", "domain=example.com 192.168.61.1-192.168.61.255"] ...}

Допускается использование IPv6 и IPv4-адресов.

nwaf_geoip_mla_disable

Определение географического местоположения на основе IP-адреса производится за счет обращения к онлайн GeoIP-базе, если информация об IP-адресе не была получена из файла /etc/nginx/nwaf/conf/global/cc.json. В случае ошибки или невозможности ее использования запрос на определение передается в модуль Nemesida AI MLA. Для запросов, попадающих под действие параметра, определение географического местоположения с использованием Nemesida AI MLA будет деактивировано.

Пример:

{... "nwaf_geoip_mla_disable": ["example.com"] ...}

Допускается использовать строгое соответствие и wildcard-значения: *, example.com, .example.com, *.example.com.

Пример использования нескольких значений:

{... "nwaf_geoip_mla_disable": ["example.com", "*.example.com"] ...}
nwaf_host_wl

Деактивация механизма анализа запроса средствами Немезида ВАФ для виртуального хоста. При параметре nwaf_host_wl * пропуск будет производиться для всех виртуальных хостов.

Пример использования одного значения:

{... "nwaf_host_wl": ["*"] ...}

или

{... "nwaf_host_wl": ["example.com"] ...}

или

{... "nwaf_host_wl": ["*.example.com"] ...}

Пример использования нескольких значений:

{... "nwaf_host_wl": ["example.com", "a.example.com"] ...}

или

{... "nwaf_host_wl": ["example.com", "*.example.com"] ...}
nwaf_host_lm

Настройка обработки запросов для конкретного виртуального хоста с фиксацией в СУБД, но без фактической блокировки (режим мониторинга). При параметре nwaf_host_lm * пропуск будет производиться для всех виртуальных хостов.

Пример использования одного значения:

{... "nwaf_host_lm": ["*"] ...}

или

{... "nwaf_host_lm": ["example.com"] ...}

или

{... "nwaf_host_lm": ["*.example.com"] ...}

Пример использования нескольких значений:

{... "nwaf_host_lm": ["example.com", "a.example.com"] ...}

или

{... "nwaf_host_lm": ["example.com", "*.example.com"] ...}
nwaf_url_wl

Деактивация механизма анализа запроса средствами Немезида ВАФ для URL-адреса. При значении параметра * деактивация будет производиться при обращении на любой URL-адрес.

Пример:

{... "nwaf_url_wl": ["*"] ...}

или

{... "nwaf_url_wl": ["example.com/login/*"] ...}

или

{... "nwaf_url_wl": ["*.example.com/login/index.php"] ...}

При значении example.com/login/* будет учитываться вхождение URL-адреса, например, example.com/login/ааааа или example.com/login/bbbbb.

Пример использования нескольких значений:

{... "nwaf_url_wl": ["example.com/login/*", "*.example.com/login/index.php"] ...}

Если при записи URL-адреса необходимо использовать знак * в качестве обычного символа, то необходимо выполнить его экранирование, например, запись example.com/admin/uploads/aa\\*a будет соответствовать example.com/login/aa*a.

nwaf_rfc_violation_wl

Деактивация механизма блокирования запроса средствами Немезида ВАФ для URL-адреса при несоответствии RFC.

Пример:

{... "nwaf_rfc_violation_wl": ["*"] ...}

или

{... "nwaf_rfc_violation_wl": ["example.com"] ...}

или

{... "nwaf_rfc_violation_wl": ["example.com/login/*"] ...}

или

{... "nwaf_rfc_violation_wl": ["*.example.com/login/index.php"] ...}

При значении example.com/login/* будет учитываться вхождение URL-адреса, например, example.com/login/ааааа или example.com/login/bbbbb.

При значении example.com деактивация будет производиться для всех URL-адресов виртуального хоста example.com.

При параметре * деактивация будет производиться для всех виртуальных хостов.

Пример использования нескольких значений:

{... "nwaf_rfc_violation_wl": ["example.com", "*.example.com/login/index.php"] ...}

Если при записи URL-адреса необходимо использовать знак * в качестве обычного символа, то необходимо выполнить его экранирование, например, запись example.com/admin/uploads/aa\\*a будет соответствовать example.com/admin/uploads/aa*a.

nwaf_rfc_violation_lm

Настройка обработки запросов для виртуального хоста или URL-адреса с фиксацией в СУБД, но без фактической блокировки (режим мониторинга) при несоответствии RFC.

Пример:

{... "nwaf_rfc_violation_lm": ["*"] ...}

или

{... "nwaf_rfc_violation_lm": ["example.com"] ...}

или

{... "nwaf_rfc_violation_lm": ["example.com/login/*"] ...}

или

{... "nwaf_rfc_violation_lm": ["*.example.com/login/index.php"] ...}

При значении example.com/login/* будет учитываться вхождение URL-адреса, например, example.com/login/ааааа или example.com/login/bbbbb.

При значении example.com обработка запросов в режиме мониторинга будет производиться для всех URL-адресов виртуального хоста example.com.

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

Пример использования нескольких значений:

{... "nwaf_rfc_violation_lm": ["example.com", "*.example.com/login/index.php"] ...}

Если при записи URL-адреса необходимо использовать знак * в качестве обычного символа, то необходимо выполнить его экранирование, например, запись example.com/admin/uploads/aa\\*a будет соответствовать example.com/admin/uploads/aa*a.

nwaf_b64_decode_disable

Параметр деактивирует дополнительное Base64-декодирование содержимого зон ARGS, BODY, URL, HEADERS при сигнатурном анализе запросов перед его передачей в модуль Nemesida AI MLA для дополнительного анализа. Если запрос содержит сигнатуры в явном виде, он будет передан в Nemesida AI MLA. Если запрос содержит сигнатуры, закодированные в Base64 в одной из выбранных зон, запрос не будет передан в Nemesida AI MLA.

Пример:

{... "nwaf_b64_decode_disable": ["*.example.com z:BODY|URL|ARGS|HEADERS"] ...}

или

{... "nwaf_b64_decode_disable": ["example.com/uploads/ z:BODY|URL"] ...}

или

{... "nwaf_b64_decode_disable": ["z:HEADERS"] ...}

При применении параметра учитывается точное совпадение пути (vhost/path).

Для записи домена допускается использовать строгое соответствие и wildcard-значения: *, example.com, .example.com, *.example.com.

Пример использования нескольких значений:

{... "nwaf_b64_decode_disable": ["*.example.com z:BODY|URL|ARGS|HEADERS", "example.com z:BODY|URL"] ...}

Для зоны URL рекомендуется отключать Base64-декодирование, чтобы исключить избыточную отправку запросов в Nemesida AI MLA, приводящую к повышенному потреблению аппаратных ресурсов сервера.

nwaf_mla_host_lm

Параметр, активирующий режим LM (режим мониторинга) для запросов, определенных модулем Nemesida AI MLA как нелегитимные.

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

Пример использования одного значения:

{... "nwaf_mla_host_lm": ["*"] ...}

или

{... "nwaf_mla_host_lm": ["example.com"] ...}

или

{... "nwaf_mla_host_lm": ["*.example.com"] ...}

Пример использования нескольких значений:

{... "nwaf_mla_host_lm": ["example.com", "a.example.com"] ...}

или

{... "nwaf_mla_host_lm": ["example.com", "*.example.com"] ...}
nwaf_ai_extra_host_wl

Параметр, активирующий режим WL для запросов, определенных модулем Nemesida AI MLC как нелегитимные.

В случае, если имя виртуального хоста из запроса попадает под действие параметра, то такой запрос не фиксируется в СУБД и не блокируется.

Пример использования одного значения:

{... "nwaf_ai_extra_host_wl": ["*"] ...}

или

{... "nwaf_ai_extra_host_wl": ["example.com"] ...}

или

{... "nwaf_ai_extra_host_wl": ["*.example.com"] ...}

Пример использования нескольких значений:

{... "nwaf_ai_extra_host_wl": ["example.com", "a.example.com"] ...}

или

{... "nwaf_ai_extra_host_wl": ["example.com", "*.example.com"] ...}
nwaf_ai_extra_host_lm

Параметр, активирующий режим LM (режим мониторинга) для запросов, определенных модулем Nemesida AI MLC как нелегитимные.

В случае, если имя виртуального хоста из запроса попадает под действие параметра, то такой запрос фиксируется в СУБД, но не блокируется.

Пример использования одного значения:

{... "nwaf_ai_extra_host_lm": ["*"] ...}

или

{... "nwaf_ai_extra_host_lm": ["example.com"] ...}

или

{... "nwaf_ai_extra_host_lm": ["*.example.com"] ...}

Пример использования нескольких значений:

{... "nwaf_ai_extra_host_lm": ["example.com", "a.example.com"] ...}

или

{... "nwaf_ai_extra_host_lm": ["example.com", "*.example.com"] ...}
nwaf_bf_detect_host_lm

Параметр, активирующий режим LM для запросов, определенных модулем Nemesida AI MLC как атаки методом перебора (BT 7) и флуд (BT 9).

В случае, если имя виртуального хоста из запроса попадает под действие параметра, то такой запрос фиксируется в СУБД, но не блокируется.

Пример использования одного значения:

{... "nwaf_bf_detect_host_lm": ["*"] ...}

или

{... "nwaf_bf_detect_host_lm": [".example.com"] ...}

или

{... "nwaf_bf_detect_host_lm": ["*.example.com"] ...}

Пример использования нескольких значений:

{... "nwaf_bf_detect_host_lm": ["example.com", "*.example.org"] ...}
nwaf_ddos_detect_host_lm

Параметр, активирующий режим LM для запросов, определенных модулем Nemesida AI MLC как DDoS-атаки (BT 10).

В случае, если имя виртуального хоста из запроса попадает под действие параметра, то такой запрос фиксируется в СУБД, но не блокируется.

Пример использования одного значения:

{... "nwaf_ddos_detect_host_lm": ["*"] ...}

или

{... "nwaf_ddos_detect_host_lm": [".example.com"] ...}

или

{... "nwaf_ddos_detect_host_lm": ["*.example.com"] ...}

Пример использования нескольких значений:

{... "nwaf_ddos_detect_host_lm": ["example.com", "example.org"] ...}
nwaf_rmq_host_exclude

Параметр, исключающий отправку некоторых запросов на сервер RabbitMQ (очередь nwaf).

В случае, если имя виртуального хоста из запроса попадает под действие параметра, то такой запрос не передается в очередь nwaf, и, соответственно, не обрабатывается модулем Nemesida AI MLC (не анализируется на предмет аномалий и атак методом перебора, не участвует при построении поведенческих моделей).

Пример использования одного значения:

{... "nwaf_rmq_host_exclude": ["*"] ...}

или

{... "nwaf_rmq_host_exclude": ["example.com"] ...}

или

{... "nwaf_rmq_host_exclude": ["*.example.com"] ...}

Пример использования нескольких значений:

{... "nwaf_rmq_host_exclude": ["example.com", "a.example.com"] ...}

или

{... "nwaf_rmq_host_exclude": ["example.com", "*.example.com"] ...}
nwaf_body_exclude

Параметр, исключающий анализ зоны BODY, а также отправку её содержимого в модули Nemesida AI MLA, Nemesida AI MLC и модуль ClamAV. Опция полезна, если нет возможности изменить значение параметра client_body_buffer_size в файле /etc/nginx/nginx.conf.

Пример:

{... "nwaf_body_exclude": ["*"] ...}

или

{... "nwaf_body_exclude": ["*.example.com/uploads.php"] ...}

или

{... "nwaf_body_exclude": ["example.com/admin/*"] ...}

При значении example.com/admin/* будет учитываться вхождение URL-адреса, например, example.com/admin/ааааа или example.com/admin/bbbbb.

Пример использования нескольких значений:

{... "nwaf_body_exclude": ["*", "*.example.com/admin/*"] ...}

Если при записи URL-адреса необходимо использовать знак * в качестве обычного символа, то необходимо выполнить его экранирование символами \\, например, запись example.com/admin/uploads/aa\\*a будет соответствовать example.com/admin/uploads/aa*a.

При значении * исключение анализа зоны BODY будет применяться для любого адреса.

nwaf_body_bin_exclude

Параметр, исключающий анализ бинарного содержимого зоны BODY, а также его отправку в модули Nemesida AI MLA и Nemesida AI MLC.

Пример:

{... "nwaf_body_bin_exclude": ["*"] ...}

или

{... "nwaf_body_bin_exclude": ["*.example.com/uploads.php"] ...}

или

{... "nwaf_body_bin_exclude": ["example.com/admin/*"] ...}

При значении example.com/admin/* будет учитываться вхождение URL-адреса, например, example.com/admin/ааааа или example.com/admin/bbbbb.

Пример использования нескольких значений:

{... "nwaf_body_bin_exclude": ["*", "*.example.com/uploads.php"] ...}

Если при записи URL-адреса необходимо использовать знак * в качестве обычного символа, то необходимо выполнить его экранирование символами \\, например, запись example.com/admin/uploads/aa\\*a будет соответствовать example.com/admin/uploads/aa*a.

При значении * исключение анализа зоны BODY будет применяться для любого адреса.

nwaf_post_body_exclude

Параметр, исключающий анализ сигнатурным методом содержимого зоны BODY для POST-запросов, а также отправку содержимого зоны в модули Nemesida AI MLA и Nemesida AI MLC. Опция полезна при взаимодействии с веб-приложениями ownCloud или аналогичными, позволяющими клиенту производить загрузку файла на сервер по протоколу HTTP.

Пример:

{... "nwaf_post_body_exclude": ["*"] ...}

или

{... "nwaf_post_body_exclude": ["example.com"] ...}

или

{... "nwaf_post_body_exclude": "*.example.com" ...}
{... "nwaf_post_body_exclude": ["*.example.com"] ...}

Пример использования нескольких значений:

{... "nwaf_post_body_exclude": ["example.com", "a.example.com"] ...}

или

{... "nwaf_post_body_exclude": ["example.com", "*.example.com"] ...}

Допускается использовать строгое соответствие и wildcard-значения: *, example.com, .example.com, *.example.com.

nwaf_put_body_exclude

Параметр, исключающий анализ сигнатурным методом содержимого зоны BODY для PUT-запросов, а также отправку содержимого зоны в модули Nemesida AI MLA и Nemesida AI MLC. Опция полезна при взаимодействии с веб-приложениями ownCloud или аналогичными, позволяющими клиенту производить загрузку файла на сервер по протоколу HTTP.

Пример:

{... "nwaf_put_body_exclude": ["*"] ...}

или

{... "nwaf_put_body_exclude": ["example.com"] ...}

или

{... "nwaf_put_body_exclude": ["*.example.com"] ...}

Пример использования нескольких значений:

{... "nwaf_put_body_exclude": ["example.com", "a.example.com"] ...}

или

{... "nwaf_put_body_exclude": ["example.com", "*.example.com"] ...}

Допускается использовать строгое соответствие и wildcard-значения: *, example.com, .example.com, *.example.com.

nwaf_openapi_ip_wl

Нелегитимные запросы, поступающие с определенного IP-адреса и попадающие под действие параметра, не фиксируются в журналах и не блокируются при анализе запроса на соответствие его спецификации в формате OpenAPI.

Допускается использование IPv4/IPv6 адресов, в том числе использование CIDR (например, x.x.x.x/24) и диапазона IP-адресов.

Пример:

{... "nwaf_openapi_ip_wl": ["10.0.0.1"] ...}

или

{... "nwaf_openapi_ip_wl": ["domain=*.example.com 10.0.0.1"] ...}

Значение domain является опциональным.

Допускается использовать строгое соответствие и wildcard-значения: *, example.com, .example.com, *.example.com.

Пример использования нескольких значений:

{... "nwaf_openapi_ip_wl": ["10.0.0.1", "domain=*.example.com 10.0.0.1"] ...}
nwaf_openapi_ip_lm

Нелегитимные запросы, поступающие с определенного IP-адреса и попадающие под действие параметра, фиксируются в журналах, но не блокируются при анализе запроса на соответствие его спецификации в формате OpenAPI.

Допускается использование IPv4/IPv6 адресов, в том числе использование CIDR (например, x.x.x.x/24) и диапазона IP-адресов.

Пример:

{... "nwaf_openapi_ip_lm": ["10.0.0.1"] ...}

или

{... "nwaf_openapi_ip_lm": ["domain=*.example.com 10.0.0.1"] ...}

Значение domain является опциональным.

Допускается использовать строгое соответствие и wildcard-значения: *, example.com, .example.com, *.example.com.

Пример использования нескольких значений:

{... "nwaf_openapi_ip_lm": ["10.0.0.1", "domain=*.example.com 10.0.0.1"] ...}
nwaf_openapi_url_wl

Нелегитимные запросы, поступающие на определенный URL-адрес и попадающие под действие параметра, не фиксируются в журналах и не блокируются при анализе запроса на соответствие его спецификации в формате OpenAPI.

Пример:

{... "nwaf_openapi_url_wl": ["*"] ...}

или

{... "nwaf_openapi_url_wl": ["example.com/admin/*"] ...}

или

{... "nwaf_openapi_url_wl": ["example.com/admin/admin.php"] ...}

Для записи домена допускается использовать строгое соответствие и wildcard-значения: *, example.com, .example.com, *.example.com.

При значении example.com/admin/* будет учитываться вхождение URL-адреса, например, example.com/admin/ааааа или example.com/admin/bbbbb.

Пример использования нескольких значений:

{... "nwaf_openapi_url_wl": ["*.example.com/admin/*", "example.com/admin/admin.php"] ...}

Если при записи URL-адреса необходимо использовать знак * в качестве обычного символа, то необходимо выполнить его экранирование символами \\, например, запись example.com/admin/uploads/aa\\*a будет соответствовать example.com/admin/uploads/aa*a.

При значении * параметр будет применяться для любого URL-адреса.

nwaf_openapi_url_lm

Нелегитимные запросы, поступающие на определенный URL-адрес и попадающие под действие параметра, фиксируются в журналах, но не блокируются при анализе запроса на соответствие его спецификации в формате OpenAPI.

Пример:

{... "nwaf_openapi_url_lm": ["*"] ...}

или

{... "nwaf_openapi_url_lm": ["example.com/admin/*"] ...}

или

{... "nwaf_openapi_url_lm": ["example.com/admin/admin.php"] ...}

Для записи домена допускается использовать строгое соответствие и wildcard-значения: *, example.com, .example.com, *.example.com.

Пример использования нескольких значений:

{... "nwaf_openapi_url_lm": ["*.example.com/admin/*", "example.com/admin/admin.php"] ...}

При значении example.com/admin/* будет учитываться вхождение URL-адреса, например, example.com/admin/ааааа или example.com/admin/bbbbb.

Если при записи URL-адреса необходимо использовать знак * в качестве обычного символа, то необходимо выполнить его экранирование символами \\, например, запись example.com/admin/uploads/aa\\*a будет соответствовать example.com/admin/uploads/aa*a.

При значении * параметр будет применяться для любого URL-адреса.

Получить хэш-сумму текущих настроек
Проверка хэш-суммы требуется для подтверждения актуальности конфигурации. Изменение значения означает, что настройки были изменены.

Пример запроса:

# curl http://api.example.com:8080/nw-api/get_dyn_settings_hash --data 'key=%Лицензионный ключ%'

Пример ответа:

{'status': 'success', 'hash': '8ddd2b342d3190a866ee35afb249919a'}
Удалить настройки
Пример запроса:

# curl http://api.example.com:8080/nw-api/v2/set_dyn_settings --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "del": ""
}'

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}

🔗 Управление списком заблокированных IP-адресов

Функционал позволяет создавать списки для блокировки запросов на основе IP-адреса источника запроса.

Получить список IP-адресов для блокировки
Пример запроса:

# curl http://api.example.com:8080/nw-api/v2/get_dyn_bl --data 'key=%Лицензионный ключ%'

Формат ответа:

{
  "status": "success",
  "active": boolean,
  "modify": integer,
  "bl": [string, ...]
}

или

{"status": "fail", "description": "%описание ошибки%"}

Пример ответа:

{
  "status": "success",
  "active": true,
  "modify": 1719335019,
  "bl": ["domain=example.com 1.1.1.1 api=yes", ...]
}

Задать список IP-адресов для блокировки
Пример запроса:

# curl http://api.example.com:8080/nw-api/v2/set_dyn_bl --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "set": {
    "active": true,
    "bl": [
      "domain=example.com 1.1.1.1",
      "2.2.2.2",
      "3.3.3.0/24",
      "4.4.4.4-5.5.5.5 api=yes"
    ]
  }
}'

api=yes — параметр отправки событий о блокировках при обращении с указанного IP-адреса(ов) в Nemesida WAF API.

Запросы с IP-адреса 1.1.1.1 будут заблокированы только для домена example.com. Обращения с IP-адресов 2.2.2.2, 3.3.3.0/24 и 4.4.4.4-5.5.5.5 будут блокироваться для всех доменов, включая example.com.

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}
Получить хэш-сумму текущих настроек
Проверка хэш-суммы требуется для подтверждения актуальности конфигурации. Изменение значения означает, что настройки были изменены.

Пример запроса:

# curl http://api.example.com:8080/nw-api/get_dyn_bl_hash --data 'key=%Лицензионный ключ%'

Пример ответа:

{'status': 'success', 'hash': '8ddd2b342d3190a866ee35afb249919a'}
Удалить все IP-адреса
Пример запроса:

# curl http://api.example.com:8080/nw-api/v2/set_dyn_bl --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "del": ""
}'

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}

🔗 Управление списком автоматически заблокированных IP-адресов

Функционал позволяет управлять списком автоматически заблокированных IP-адресов для всех фильтрующих нод.

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

# curl http://api.example.com:8080/nw-api/get_dyn_sync_ban --data 'key=%Лицензионный ключ%'

Формат ответа:

{
  "status": "success",
  "ban_data": [
    {
      "ip-address": string,
      "ttl": integer,
      "is_banned": boolean,
      "domain": string,
      "timestamp": integer
    },
    ...
  ]
}

или

{"status": "fail", "description": "%описание ошибки%"}

ip-address — IP-адрес;
ttl — оставшееся время блокировки в секундах;
is_banned — параметр указывает, заблокирован ли IP-адрес;
domain — виртуальный хост (доменное имя), обращения к которому блокируются для IP-адреса. DEFAULT означает, что для IP-адреса блокируются обращения на любой виртуальный хост;
timestamp — дата добавления IP-адреса в список в формате Unix Timestamp.

Пример ответа:

{
  "status": "success",
  "ban_data": [
    {
      "ip-address": "127.0.0.1",
      "ttl": 30,
      "is_banned": true,
      "domain": "example.com",
      "timestamp": 1730871907
    },
    ...
  ]
}
Удалить IP-адрес из списка
Пример запроса:

# curl http://api.example.com:8080/nw-api/del_dyn_sync_ban --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "ip-address": "127.0.0.1"
}'

ip-address — IP-адрес для удаления в формате IPv4/IPv6. Допускается использование * для удаления всех IP-адресов.

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}

🔗 Правила исключения сигнатур

Позволяет настроить правила исключения сигнатур. С помощью созданного правила исключения нельзя исключить срабатывание расширенного правила блокирования запросов. Поддерживает следующие команды управления:

Получить список правил
Пример запроса:

# curl http://api.example.com:8080/nw-api/v2/get_dyn_wl --data 'key=%Лицензионный ключ%'

Формат ответа:

{
  "status": "success",
  "wl": [
    {
      "active": boolean,
      "modify": integer,
      "id": integer,
      "mz": string,
      "rl_id": string,
      "domain": string,
      "extension": string
    }
  ]
}

или

{"status": "none"}

Пример ответа:

{
  "status": "success",
  "wl": [
    {
      "active": true,
      "modify": 1719335019,
      "id": 1,
      "mz": "ARGS",
      "rl_id": "1",
      "domain": "example.com",
      "extension": "$URL:/api/users/index.php|$BODY_X:id=[a-z0-9]+"
    }
  ]
}
Создать правило
Пример запроса:

# curl http://api.example.com:8080/nw-api/v2/set_dyn_wl --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "add": {
    "active": true,
    "rl_id": "1",
    "domain": "example.com",
    "mz": ["url", "args"],
    "extension": ["$URL:/api/users/index.php", "$BODY_X:id=[a-zA-Z0-9]+"]
  }
}'

Пример ответа:

{"status": "success", "id": 20}

или

{"status": "fail", "description": "%описание ошибки%"}

Для управления доступны следующие параметры:

Поддерживаемые параметры
Параметр
Описание параметра

active

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

Пример:

{... "active": true ...}

rl_id

ID сигнатуры, к которой применяется правило исключения. При использовании значения * правило исключения будет применяться ко всем сигнатурам. Обязательный параметр.

Пример:

{... "rl_id": "1" ...}

или

{... "rl_id": "*" ...}

domain
Установка принадлежности правила к домену. Для опции domain допускается использовать строгое соответствие и wildcard-значения: *, example.com, .example.com, *.example.com. Обязательный параметр.

Пример:

{... "domain": "example.com" ...}

или

{... "domain": "*" ...}

mz

Зона применения правила. Обязательный параметр.

Для применения сигнатуры к нескольким зонам используйте разделитель: «mz:URL|BODY».

При использовании значения NoMLA в зоне применения правил («mz:NoMLA») сигнатура не будет влиять на отправку запроса в модуль машинного обучения Nemesida AI MLA для обработки.

Пример:

{... "mz": ["URL", "ARGS", "BODY", "HEADERS", "cookie", "user-agent", "Content-type", "x-forward-for", "range", "referer", "NoMLA"] ...}

extension

Дополнительное условие (уточнение) применения правила.

Уточнение применяется в виде вхождения заданного шаблона. Несколько уточнений взаимодействуют между собой по принципу логического «и» (&) (для срабатывания правила обязательно выполнение основного условия и всех добавленных уточнений). В уточнениях допускается использование регулярных выражений, используя постфикс _X. Например, регулярное выражение $Cookie_X:id=[a-z0-9]+, применяется в зоне уточнения Cookie и будет означать, что дополнительным условием срабатывания правила исключения будет наличие строки (например, id=abcd07dj45rff) в зоне Cookie, согласно шаблону регулярного выражения.

Пример:

{... "extension": ["$BODY:abc|$Cookie_X:id=[a-z0-9]+"] ...}

Необдуманное добавление правил исключения сигнатуры небезопасно и может привести к пропускам атак. Поэтому рекомендуется максимально конкретизировать условия срабатывания правила, используя уточнения.

Обновить правило
Пример запроса:

# curl http://api.example.com:8080/nw-api/v2/set_dyn_wl --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "upd": {
    "id": 20,
    "mz": ["url"]
  }
}'

id — ID правила, который генерируется при создании правила исключения.

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}
Получить хэш-сумму текущих настроек
Проверка хэш-суммы требуется для подтверждения актуальности конфигурации. Изменение значения означает, что настройки были изменены.

Пример запроса:

# curl http://api.example.com:8080/nw-api/get_dyn_wl_hash --data 'key=%Лицензионный ключ%'

Пример ответа:

{'status': 'success', 'hash': '8ddd2b342d3190a866ee35afb249919a'}
Удалить правило
Пример запроса:

# curl http://api.example.com:8080/nw-api/v2/set_dyn_wl --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "del": {
    "id": 8
  }
}'

id — ID правила, который генерируется при создании правила исключения.

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}

🔗 Расширенные правила блокировки запросов

Механизм расширенных правил блокирования запросов позволяет при составлении персональных правил использовать дополнительные условия для более точного результата. Например, можно составить правило, по которому запрос будет заблокирован если:

  • соответствует географическому местоположению на основе IP-адреса (определение страны по IP-адресу атакующего);
  • происходит обращение на определенный домен или URL;
  • содержит определенный заголовок (например, User-Agent, Cookie, Referer и т.д.) и/или содержимое этих заголовков.

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

Поддерживает следующие команды управления:

Получить список правил
Пример запроса:

# curl http://api.example.com:8080/nw-api/v2/get_dyn_erl --data 'key=%Лицензионный ключ%'

Формат ответа:

{
  "status": "success",
  "erl": [
    {
      "active": boolean
      "id": integer,
      "ip": string,
      "lm": boolean,
      "ua": string,
      "api": boolean,
      "url": string,
      "args": string,
      "body": string,
      "noban": boolean,
      "cookie": string,
      "domain": string,
      "modify": integer,
      "country": string,
      "referer": string,
      "block_tor": boolean,
      "no_cookie": boolean,
      "block_proxy": boolean,
      "other_headers": string
    }
  ]
}

или

{"status": "fail", "description": "%описание ошибки%"}

Пример ответа:

{
  "status": "success",
  "erl": [
    {
      "active": true,
      "modify": 1730973337,
      "id": 100048,
      "ip": "127.0.0.1",
      "lm": true,
      "ua": "TW96aWxsYSA1LzA=",
      "api": true,
      "url": "L3VzZXJzL2xvZ2luLnBocA==",
      "args": "VVJM",
      "body": "c29tZV90ZXh0",
      "noban": true,
      "cookie": "aWQ9YW5ubWszNDU0R2Fmbmo2",
      "domain": "ZXhhbXBsZS5jb20=",
      "country": "UlU=|VVM=",
      "referer": "aHR0cDovL2V4YW1wbGUuY29t",
      "block_tor": true,
      "no_cookie": false,
      "block_proxy": true,
      "other_headers": "dXNlcl9JRA==:|YWRtaW4=|YWRtaW5pc3RyYXRvcg=="
    }
  ]
}
Создать правило
Пример запроса:

# curl http://api.example.com:8080/nw-api/v2/set_dyn_erl --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "add": {
    "active": true,
    "ip": ["|1.1.1.1"],
    "lm": true,
    "ua": ["|TW96aWxsYSA1LzA="],
    "api": true,
    "url": ["L3VzZXJzL2xvZ2luLnBocA=="],
    "args": ["VVJM"],
    "body": ["|dGVzdF9ib2R5"],
    "noban": true,
    "cookie": ["|aWQ9YW5ubWszNDU0R2Fmbmo2"],
    "domain": ["|example.com"],
    "country": ["|RU", "|US"],
    "referer": ["|aHR0cDovL2V4YW1wbGUuY29t"],
    "block_tor": true,
    "no_cookie": false,
    "block_proxy": true,
    "other_headers": ["dXNlcl9JRA==:|YWRtaW4=|YWRtaW5pc3RyYXRvcg=="]
  }
}'
# curl http://api.example.com:8080/nw-api/v2/set_dyn_erl --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "add": {
    "active": true,
    "ip": ["|!1.1.1.0/24"],
    "domain": ["&example.com"],
  }
}'

Запрос будет заблокирован, если на example.com поступит запрос c любого IP-адреса, кроме 1.1.1.1-1.1.1.255.

Из-за особенностей обработки запросов функционал не предназначен для работы с большим количеством IP-адресов. Если необходимо блокировать обращения для списка IP-адресов — воспользуйтесь функционалом добавления IP-адреса в список «Заблокированные IP».

# curl http://api.example.com:8080/nw-api/v2/set_dyn_erl --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "add": {
    "active": true,
    "ip": ["|1.1.1.1"],
    "domain": ["|example.com"],
    "other_headers": ["dGVzdC1oZWFkZXI=:YWJj"]
  }
}'

Запрос будет заблокирован правилом в случае, если на example.com поступит запрос с IP-адреса 1.1.1.1 и заголовок test-header содержит строку abc.

# curl http://api.example.com:8080/nw-api/v2/set_dyn_erl --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "add": {
    "active": true,
    "сountry": ["|RU", "|CH"],
    "domain": ["|example.com"],
    "other_headers": ["dGVzdC1oZWFkZXI=:YWJj"],
    "cookie": ["|!dGVzdF9jb29raWU="],
    "referer": ["|!aHR0cDovL2V4YW1wbGUuY29t"]
  }
}'

Запрос будет заблокирован правилом в случае, если на example.com поступит запрос с IP-адреса из региона RU или CH, заголовок test-header содержит строку abc, заголовок Cookie не содержит строку test_cookie и заголовок Referer не содержит http://example.com.

# curl http://api.example.com:8080/nw-api/v2/set_dyn_erl --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "add": {
    "active": true,
    "ip": ["|1.1.1.1"],
    "other_headers": ["VGVzdC1GaWVsZA==:"],
    "referer": ["|aHR0cDovL2V4YW1wbGUuY29tLw=="],
    "ua": ["|TW96aWxsYS81LjA="],
    "cookie": ["|dGVzdF9jb29raWU="],
    "body": ["|YmM9MyZjYz0x"],
    "args": ["|P3BhZ2U9Mw=="],
    "url": ["|aW50ZXJuYWx0ZXN0"],
    "domain": ["|example.com"],
    "api": false,
    "country": ["|RU", "|CH"]
  }
}'

Запрос будет заблокирован правилом в случае, если на example.com поступит запрос c IP-адреса 1.1.1.1 из региона RU или CH, который будет содержать:

  • заголовок Referer с содержимым http://example.com/;
  • заголовок Test-Field с любым содержимым;
  • заголовок User-Agent с содержимым Mozilla/5.0;
  • заголовок Cookie с содержимым test_cookie;
  • содержимое тела запроса bc=3&cc=1;
  • аргумент запроса ?page=3.

Пример ответа:

{"status": "success", "id": 100053}

или

{"status": "fail", "description": "%описание ошибки%"}

Для управления доступны следующие параметры:

Поддерживаемые параметры
Параметр
Описание параметра

active

Параметр активирует/деактивирует правило.

Пример:

{... "active": true ...}

ip

IP-адрес атакующего, при обращении с которого будет применяться правило к запросу.

Допускается использование IPv4/IPv6 адресов, в том числе использование CIDR (например, x.x.x.x/24) и диапазона IP-адресов.

Пример:

{... "ip": ["|1.1.1.1"] ...}

или

{... "ip": ["|1.1.1.1", "|2.2.2.2-3.3.3.3", "|10.0.0.0/24"] ...}

country

Страна, определяемая на основе GeoIP-данных, откуда поступает запрос в формате двухбуквенного кода страны. При использовании значения, RU к запросам с Российского IP-адреса будет применяться правило на основе GeoIP-данных об IP-адресе.

Пример:

{... "country": ["|RU", "|US"] ...}

domain

Имя виртуального хоста, при обращении к которому будет применяться правило.

Допускается использовать строгое соответствие и wildcard-значения: *, example.com, .example.com, *.example.com.

Пример:

{... "domain": ["|example.com", "|*.example.ru"] ...}

url

Вхождение строки в содержимое зоны URL, при котором будет применяться правило к запросу.

Значение для параметра передается в формате Base64.

Пример:

{... "url": ["|aW50ZXJuYWx0ZXN0", "|YWRtaW4vdXBsb2FkLnBocA==" ] ...}

args

Вхождение строки в содержимое зоны ARGS, при котором будет применяться правило к запросу.

Значение для параметра передается в формате Base64.

Пример:

{... "args": ["|P3BhZ2U9Mw==", "|dXNlcj1hZG1pbg=="] ...}

body

Вхождение строки в содержимое зоны BODY, при котором будет применяться правило к запросу.

Значение для параметра передается в формате Base64.

Пример:

{... "body": ["|dGVzdF9ib2R5", "|dXNlcj1hZG1pbg=="] ...}

cookie

Вхождение строки в содержимое зоны Cookie, при котором будет применяться правило к запросу.

Значение для параметра передается в формате Base64.

Пример:

{... "cookie": ["|UEhQU0VTU0lE", "|dGVzdF9jb29raWU="] ...}

Для корректного применения правила запрещено одновременно использовать опции cookie и no_cookie.


no_cookie

Cо значением true правило применяется только к запросу с пустой зоной Cookie.

Пример:

{... "no_cookie": true ...}

Для корректного применения правила запрещено одновременно использовать опции cookie и no_cookie.


ua

Вхождение строки в содержимое зоны User-Agent, при котором будет применяться правило к запросу.

Значение для параметра передается в формате Base64.

Пример:

{... "ua": ["|TW96aWxsYS81LjA=", "|TW96aWxsYS81LjQ="] ...}

referer

Вхождение строки в содержимое зоны Referer, при котором будет применяться правило к запросу.

Значение для параметра передается в формате Base64.

Пример:

{... "referer": ["|aHR0cDovL2V4YW1wbGUuY29t", "|aHR0cDovL3dlYi5leGFtcGxlLmNvbQ=="] ...}

other_headers

Вхождение строки в содержимое зоны HEADERS, за исключением зон Cookie, User-Agent и Referer при котором будет применяться правило к запросу.

Значения названия заголовка и содержимого заголовка передается в формате Base64.

Пример:

{... "other_headers": ["aGVhZGVyX25hbWU=:YWJj", "dGVzdC1oZWFkZXI=:YWJj"] ...}

Для поля other_headers содержимое секций header_name и header_value являются опциональными, но необходимо указать хотя бы одну из секций. Например, при наличии заголовка header_name будет проверяться содержимое header_value только заголовка header_name, а при отсутствии — содержимое всех заголовков.

Все элементы списка взаимодействуют друг с другом по принципу логического «и» (&).

Если header_name задан без header_value, то применение правила произойдет при любом значении заголовка header_name (блокировка по наличию заголовка).

Пример:

{... "other_headers": ["aGVhZGVyX25hbWU=:"] ...}

Более подробная информация доступна в соответствующем разделе руководства.


block_tor

Параметр активирует срабатывание правила для IP-адресов, которые являются выходным узлом сети Tor.

Допускается применение опции без других параметров.

Пример:

{... "block_tor": true ...}

block_proxy

Параметр активирует срабатывание правила для IP-адресов, которые являются Proxy/VPN-сервисом или выходным узлом сети Tor выходным узлом сети Tor.

Допускается применение опции без других параметров.

Пример:

{... "block_proxy": true ...}

api

Cо значением true срабатывание правила будет добавлено в отчет об атаках.

Пример:

{... "api": true ...}

lm

Cо значением true срабатывание правила фиксируются в журналах, но не блокируются (режим мониторинга).

Пример:

{... "lm": true ...}

noban

Cо значением true срабатывание правила не будет увеличивать счетчик rate условия автоматической блокировки IP-адреса.

Пример:

{... "noban": true ...}

Для всех параметров (кроме параметров, поддерживающих значения true/false) допускается использовать несколько значений в одном параметре, используя логические операторы условий «не» (!), «и» (&), «или» (|). Операторы не имеют приоритета и выполняются по очереди, слева направо.

При проверке срабатывания расширенного правила блокирования запроса все поля, кроме ip, country, api, lm, noban, block_tor и block_proxy, проверяются на вхождение содержимого поля из правила блокирования в проверяемое поле запроса.

Например, при "url": ["base64(/abc)"] будет заблокирован запрос с вхождением /abcd в URL.

Срабатывание правила производится только в случае выполнения всех условий, указанных в правиле, иначе запрос будет пропущен.

Принцип работы other_headers
Опция other_headers позволяет задать заголовок и его содержимое для проверки соответствия в запросе (за исключением заголовков Cookie, User-Agent и Referer).

Формат опции:

{... "other_headers": ["base64(header_name):base64(header_value)", "base64(header_name):base64(header_value)" ...] ...}

base64(header_name) — название заголовка в base64;
base64(header_value) — значение заголовка в base64.

Для опции other_headers содержимое секций base64(header_name) и base64(header_value) являются опциональными, но необходимо задать хотя бы одну из секций. Например, при наличии заголовка header_name будет проверяться содержимое header_value только заголовка header_name, а при отсутствии — содержимое всех заголовков.

Все элементы списка взаимодействуют друг с другом по принципу логического «и» (&).

Пример:

{... "other_headers": ["base64(example1_header):", "base64(example2_header):"] ...}

При таком значении запрос будет заблокирован при одновременном наличии заголовков example1_header и example2_header с любыми значениями.

Каждый элемент списка не может содержать больше 1 названия заголовка, но каждое название заголовка может иметь несколько значений, которые разделяются логическими операторами условий «не» (!), «и» (&), «или» (|).

Пример:

{... "other_headers": ["base64(example_header):base64(abcd)"] ...}

При таком значении запрос будет заблокирован при наличии abcd в заголовке example_header.


Пример:

{... "other_headers": [":base64(abcd)"] ...}

При таком значении запрос будет заблокирован при наличии abcd в любом заголовке.


Если base64(header_name) указан без последующего значения, то блокирование запроса произойдет при любом значении заголовка header_name (блокировка по наличию заголовка).

Пример:

{... "other_headers": ["base64(example_header):"] ...}

Пример:

{... "other_headers": ["base64(example1_header):base64(abc)", "base64(example2_header):base64(def)"] ...}

При таком значении запрос будет заблокирован при наличии заголовков example1_header, который содержит abc и example2_header, который содержит def.


Для имени заголовка допустимо применение логического оператора !!, означающего отсутствие заголовка с таким именем в запросе. Блокирование запроса сработает в том случае, если среди всех заголовков запроса отсутствует заголовок с указанным именем. При этом, значение заголовка игнорируется, даже если присутствует в правиле.

Пример:

{... "other_headers": ["!!base64(example_header):"] ...}

Пример:

{... "other_headers": ["base64(example_header):base64(abc)&base64(def)"] ...}

При таком значении запрос будет заблокирован при наличии заголовка example_header, который содержит abc и def.


Пример:

{... "other_headers": ["base64(example_header):!base64(abc)"] ...}

При таком значении запрос будет заблокирован при наличии заголовка example_header, который не содержит abc.


Пример:

{... "other_headers": ["base64(example_header):!base64(a)&!base64(b)&!base64(c)"] ...}

При таком значении запрос будет заблокирован при наличии заголовка example_header, который не содержит a, b и c.


Пример:

{... "other_headers": ["base64(example_header):!base64(a)|base64(b)"] ...}

При таком значении запрос будет заблокирован при наличии заголовка example_header, который не содержит a или содержит b.

Обновить правило
Пример запроса:

# curl http://api.example.com:8080/nw-api/v2/set_dyn_erl --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "upd": {
    "active": true,
    "id": 1,
    "ip": ["|1.1.1.1"]
  }
}'

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}
Получить хэш-сумму текущих настроек
Проверка хэш-суммы требуется для подтверждения актуальности конфигурации. Изменение значения означает, что настройки были изменены.

Пример запроса:

# curl http://api.example.com:8080/nw-api/get_dyn_erl_hash --data 'key=%Лицензионный ключ%'

Пример ответа:

{'status': 'success', 'hash': '8ddd2b342d3190a866ee35afb249919a'}
Удалить правило
Пример запроса:

# curl http://api.example.com:8080/nw-api/v2/set_dyn_erl --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "del": {
    "id": 1
  }
}'

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}

🔗 Настройка Nemesida AI MLC

Позволяет управлять настройками модуля Nemesida AI MLC. Поддерживает следующие команды управления:

Получить настройки
Пример запроса:

# curl http://api.example.com:8080/nw-api/v2/get_mlc_settings --data 'key=%Лицензионный ключ%'

Формат ответа:

{
  "status": "success",
  "active": boolean,
  "modify": integer,
  "main__ai_extra": boolean,
  "openapi__vhosts_list": [string, ...],
  "ddos__enable": boolean,
  "ddos__wl_ip": [string, ...],
  "ddos__wl_url": [string, ...],
  "ddos__interval": integer,
  "ddos__latest_only": boolean,
  "ddos__send_possible": boolean,
  "brute__enable": boolean,
  "brute__wl_ip": [string, ...],
  "brute__wl_host": [string, ...],
  "brute__brute_detect": [string, ...],
  "brute__flood_detect": [string, ...],
  "brute__bf_detect": [object, ...], 
  "brute__interval": integer,
  "brute__max_val": integer,
  "brute__latest_only": boolean,
  "brute__send_possible": boolean
}

или

{"status": "fail", "description": "%описание ошибки%"}

Пример ответа:

{
  "status": "success",
  "active": true,
  "modify": 1719335019,
  "main__ai_extra": true,
  "openapi__vhosts_list": ["example.com", ...],
  "ddos__enable": true,
  "ddos__wl_ip": ["127.0.0.1", ...],
  "ddos__wl_url": ["example.com/feed", ...],
  "ddos__interval": 120,
  "ddos__latest_only": true,
  "ddos__send_possible": true,
  "brute__enable": true,
  "brute__wl_ip": ["127.0.0.1", ...],
  "brute__wl_host": ["example.com", ...],
  "brute__brute_detect": ["example.com/auth", ...],
  "brute__flood_detect": ["example.com/auth", ...],
  "brute__bf_detect": [{"url": "*", "brute": true, "flood": false, "zone": ["args", "body"], "condition": {"body": ["auth_form", "user_login"]}}, ...], 
  "brute__interval": 30,
  "brute__max_val": 10,
  "brute__latest_only": true,
  "brute__send_possible": true
}
Задать настройки
Пример запроса:

# curl http://api.example.com:8080/nw-api/v2/set_mlc_settings --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "set": {
    "active": true,
    "main__ai_extra": true,
    "openapi__vhosts_list": ["example.com", ...],
    "ddos__enable": true,
    "ddos__wl_ip": ["127.0.0.1", ...],
    "ddos__wl_url": ["example.com/feed", ...],
    "ddos__interval": 120,
    "ddos__latest_only": true,
    "ddos__send_possible": true,
    "brute__enable": true,
    "brute__wl_ip": ["127.0.0.1", ...],
    "brute__wl_host": ["example.com", ...],
    "brute__brute_detect": ["example.com/auth", ...],
    "brute__flood_detect": ["example.com/auth", ...],
    "brute__bf_detect": [{"url": "*", "brute": true, "flood": false, "zone": ["args", "body"], "condition": {"body": ["auth_form", "user_login"]}}, ...], 
    "brute__interval": 30,
    "brute__max_val": 10,
    "brute__latest_only": true,
    "brute__send_possible": true
  }
}'

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}

Для управления доступны следующие параметры:

Поддерживаемые параметры
Параметр
Описание параметра

main__ai_extra

Активация/деактивация функционала дополнительного анализа запросов, позволяющего выявлять пропущенные атаки и производить временное блокирование их источника по IP-адресу. При неактивном функционале дополнительного анализа все незаблокированные запросы будут включены в обучающую выборку (за исключением запросов, попадающих под действие режима WL, или нелегитимных запросов, попавших под действия режима LM).

Пример:

{... "main__ai_extra": true ...}

openapi__vhosts_list

Параметр задает список виртуальных хостов, для которых будут созданы спецификации в формате OpenAPI.

Пример:

{... "openapi__vhosts_list": ["example.com", "example.ru"] ...}

Для записи виртуального хоста допускается использовать строгое соответствие и wildcard-значения: *, example.com, .example.com, *.example.com.


ddos__enable
Активация/деактивация выявления DDoS-атак.

Пример:

{... "ddos__enable": true ...}
ddos__wl_ip
Параметр, определяющий список IP-адресов, для которых функционал будет отключен. Допускается использование IPv4/IPv6 адресов, в том числе использование CIDR (например, x.x.x.x/24). Каждое последующее значение указывается через пробел.

Пример:

{... "ddos__wl_ip": ["1.1.1.1", "1.1.1.0/24", "1.1.1.0-1.1.2.254"] ...}
ddos__wl_url
Параметр, в котором задаются адреса как в формате vhost, так и в формате vhost/path, где:

vhost — имя виртуального хоста, для которого функционал выявления DDoS-атак будет отключен.
path — вхождение адреса ресурса.

Допускается использовать строгое соответствие и wildcard-значения: example.com, .example.com, *.example.com.

Пример:

{... "ddos__wl_url": ["example.com/feed", ".example.com/feed", "*.example.com/feed", "*/feed"] ...}
ddos__interval
Временной интервал (в секундах), в течение которого производится анализ запросов.

Пример:

{... "ddos__interval": 120 ...}

При удалении параметра будет установлено значение по умолчанию — 120 секунд.

ddos__latest_only
Активация передачи в Nemesida WAF API только последнего заблокированного запроса по каждому IP-адресу. При значении false в Nemesida WAF API передаются все заблокированные запросы по каждому IP-адресу.

Пример:

{... "ddos__latest_only": true ...}
ddos__send_possible
Активация механизма передачи в Nemesida WAF API запросов с типом Possible DDoS. При значении false запросы в Nemesida WAF API передаваться не будут.

Пример:

{... "ddos__send_possible": true ...}

Приставка Possible добавляется к названию атаки в том случае, если её тип не был достоверно установлен.


brute__enable
Активация/деактивация функционала выявления атак методом перебора.

Пример:

{... "brute__enable": true ...}
brute__wl_host
Деактивация функционала выявления атак методом перебора для конкретных виртуальных хостов. Допускается использовать строгое соответствие и wildcard-значения: example.com, .example.com, *.example.com.

Пример:

{... "brute__wl_host": ["example.com", ".example.org", "*.example.us"] ...}
brute__wl_ip
Параметр, определяющий список IP-адресов, для которых функционал будет отключен. Допускается использование IPv4/IPv6 адресов, в том числе использование CIDR (например, x.x.x.x/24). Каждое последующее значение указывается через пробел.

Пример:

{... "brute__wl_ip": ["1.1.1.1", "1.1.1.0/24", "1.1.1.0-1.1.2.254"] ...}
brute__interval
Временной интервал (в секундах), в течение которого производится анализ запросов.

Пример:

{... "brute__interval": 30 ...}

При удалении параметра будет установлено значение по умолчанию — 30 секунд.

brute__max_val
Количество запросов с каждого конкретного IP-адреса, при достижении значения которого производится анализ на наличие признаков атаки.

Пример:

{... "brute__max_val": 10 ...}

При удалении параметра будет установлено значение по умолчанию — 10 запросов.

brute__brute_detect
Параметр, определяющий список адресов для выявления атак методом перебора в формате vhost/path, где path — вхождение адреса ресурса на веб-сервере. Для виртуального хоста допускается использование строгого соответствия и wildcard-значения: example.com, .example.com, *.example.com.

Пример:

{... "brute__brute_detect": ["example.com/auth", ".example.com/auth"] ...}

или

{... "brute__brute_detect": ["*.example.com/auth"] ...}

Таким образом, при установленном значении example.com/auth, мониторинг атак методом перебора будет производиться как для example.com/auth, так и для example.com/auth/reset_password.

Параметр применяется для выявления атак методом перебора, но не блокирует повторяющиеся запросы с одинаковым содержимым в зонах ARGS или BODY.

Использовать значения без указания URL-адреса конкретного ресурса (например, example.com или example.com/) запрещено в целях обеспечения корректной работы опции.

brute__flood_detect
Параметр, имеет схожий с параметром brute_detect функционал, но предназначен для выявления попыток флуда или аналогичных атак с повторением запроса. Единственное различие заключается в том, что в процессе анализа запросов, попадающих под действие параметра flood_detect, не происходит удаление дублей.

Таким образом, в случае повторной отправки идентичных запросов (например, множественные попытки восстановления пароля по СМС), запросы, имеющие схожее содержание и попадающие под действие параметра flood_detect, не будут удалены, в отличие от запросов, имеющие схожее содержание, но попадающих под действие параметра brute_detect.

Пример:

{... "brute__flood_detect": ["example.com/auth", ".example.com/auth"] ...}

или

{... "brute__flood_detect": ["*.example.com/auth"] ...}

Использовать значения без указания URL-адреса конкретного ресурса (например, example.com или example.com/) запрещено в целях обеспечения корректной работы опции.

brute__bf_detect
Параметр, определяющий список URL-адресов для выявления атак методом перебора и флуда в формате vhost/path, где path — вхождение адреса ресурса на веб-сервере. Для виртуального хоста допускается использование строгого соответствия и wildcard-значения: example.com, .example.com, *.example.com.

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

zone — позволяет задать зону анализа (ARGS, BODY). Механизм анализа будет запущен только в том случае, если в выбранной зоне присутствуют значения из списка опции condition.

Пример:

"zone": ["args", "body"]

При пустом значении анализ будет активирован для обеих зон.

condition — позволяет задать список полей, наличие которых обязательно в выбранной зоне HTTP-запроса (согласно значению опции zone) для попадания запроса в выборку, используемую механизмом анализа. Значения опции сочетаются по принципу логического «и» (&).

Пример:

{..."zone": ["body"], "condition": ["auth_form", "user_login"]...}

означает, что механизм анализа запросов будет активирован только для запросов, где в зоне BODY будут присутствовать поля auth_form и user_login с любыми значениями.

Пример:

{...  "brute__bf_detect" :[{"url": "*", "brute": true, "flood": false, "zone": ["args", "body"], "condition": {"body": ["auth_form", "user_login"]}} ...}

Пример использования нескольких значений:

{..."brute__bf_detect" :[{"url": "*", "brute": true, "flood": false, "zone": ["body"], "condition": {"body": ["auth_form", "user_login"]}}, {"url": "example.com/abc", "brute": false, "flood": true, "zone": ["args", "body"], "condition": {"body": ["auth_form", "user_login"]}}]...}
brute__latest_only
Активация передачи в Nemesida WAF API только последнего заблокированного запроса по каждому IP-адресу. При значении false в Nemesida WAF API передаются все заблокированные запросы по каждому IP-адресу.

Пример:

{... "brute__latest_only": true ...}
brute__send_possible
Активация механизма передачи в Nemesida WAF API запросов с типом Possible Brute force/Possible Flood. При значении false запросы в Nemesida WAF API передаваться не будут.

Пример:

{... "brute__send_possible": true ...}

Приставка Possible добавляется к названию атаки в том случае, если её тип не был достоверно установлен.

Получить хэш-сумму текущих настроек
Проверка хэш-суммы требуется для подтверждения актуальности конфигурации. Изменение значения означает, что настройки были изменены.

Пример запроса:

# curl http://api.example.com:8080/nw-api/get_mlc_settings_hash --data 'key=%Лицензионный ключ%'

Пример ответа:

{'status': 'success', 'hash': '8ddd2b342d3190a866ee35afb249919a'}
Удалить настройки
Пример запроса:

# curl http://api.example.com:8080/nw-api/v2/set_mlc_settings --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "del": ""
}'

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}

🔗 Управление поведенческими моделями

Некорректное обучение поведенческих моделей или значительные изменения в веб-приложении могут привести ко множеству ложных срабатываний. Для повышения точности определения атак рекомендуется выполнять переобучение моделей раз в неделю. Команды ниже позволяют производить действия над моделями.

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

# curl http://api.example.com:8080/nw-api/v2/get_vhosts_list --data 'key=%Лицензионный ключ%'

Формат ответа:

{
  "status": "success",
  "vhosts_list": [string, ...]
}

Пример ответа:

{
  "status": "success",
  "vhosts_list": ["example.com", ...]
}
Задать список виртуальных хостов
Пример запроса:

# curl http://api.example.com:8080/nw-api/v2/set_vhosts_list --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "vhosts_list": ["example.com", "example.org"]
}'

vhosts_list — список виртуальных хостов, для которых будут созданы и применены модели.

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}

При создании списка виртуальных хостов допускается использование wildcard-значений. Модель применяется в следующем порядке приоритета от высшего к низшему:

  • example.com — построение и применение модели для домена;
  • .example.com — построение и применение модели для домена example.com и его поддоменов;
  • *.example.com — построение и применение модели только для поддоменов домена example.com, исключая основной домен;
  • * — построение и применение модели для всех доменов.
Получить список виртуальных хостов для которых доступны поведенческие модели
Пример запроса:

# curl http://api.example.com:8080/nw-api/v2/get_models_list_uri --data 'key=%Лицензионный ключ%'

Формат ответа:

{
  "status": "success",
  "models": [string, ...]
}

Пример ответа:

{
  "status": "success",
  "models": ["example.com", ...]
}
Удалить модель для виртуального хоста example.com
Пример запроса:

# curl http://api.example.com:8080/nw-api/v2/del_models_uri --header "Content-type: application/json" --data '{
  "key": "%Лицензионный ключ%",
  "model": "example.com"
}'

model — название поведенческой модели, которую необходимо удалить.

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}
Дообучение моделей с использованием резервной копии обучающей выборки
Для корректного построения моделей требуется порядка 400.000-800.000 уникальных запросов. Если во время обучения количество запросов было недостаточным, то можно его перезапустить и воспользоваться запросами из прошлой выборки. Для этого выполните 4 шага:

1. Остановите сервис Nemesida AI MLC:

# service mlc_main stop

2. Переместите файл /opt/mlc/ml/backup/[vhost].d_[timestamp], где [timestamp] — дата создания резервной копии обучающей выборки, созданной Nemesida AI MLC перед началом построения модели, в /opt/mlc/ml/[vhost].d. Например, для модели example.com:

# mv /opt/mlc/ml/backup/example.com.d_1613587613 /opt/mlc/ml/example.com.d

3. Запустите обучение:

# curl http://api.example.com:8080/nw-api/v2/set_training_uri --header "Content-type: application/json" --data '{
  "key": "%Лицензионный ключ%",
  "vhost": "example.com",
  "duration": 4,
  "complete": false
}'

4. Запустите сервис Nemesida AI MLC:

# service mlc_main start
Скопировать поведенческую модель для виртуального хоста
Пример запроса:

# curl http://api.example.com:8080/nw-api/v2/rep_models_uri --header "Content-type: application/json" --data '{
  "key": "%Лицензионный ключ%",
  "src_model": "example.com",
  "dst_model": "example.org"
}'

src_model — виртуальный хост, поведенческая модель которого копируется;
dst_model — виртуальный хост, для которого необходимо скопировать модель.

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}
Получить статус обучения модели для виртуального хоста
Пример запроса:

# curl http://api.example.com:8080/nw-api/v2/get_training_uri --data 'key=%Лицензионный ключ%'

Формат ответа:

{
  "status": "success",
  "training": [
    {
      "vhost": string,
      "duration": integer,
      "complete": boolean,
      "progress": integer
    },
    ...
  ]
}

Пример ответа:

{
  "status": "success",
  "training": [
    {
      "vhost": "example.com",
      "duration": 4,
      "complete": false,
      "progress": 95
    },
    ...
  ]
}
Установить для виртуального хоста example.com период обучения 4 дня
Пример запроса:

# curl http://api.example.com:8080/nw-api/v2/set_training_uri --header "Content-type: application/json" --data '{
  "key": "%Лицензионный ключ%",
  "vhost": "example.com",
  "duration": 4,
  "complete": false
}'

duration — период обучения в днях.
complete — статус обучения модели.

или

# curl http://api.example.com:8080/nw-api/v2/set_training_uri --header "Content-type: application/json" --data '{
  "key": "%Лицензионный ключ%",
  "vhost": "example.com",
  "duration": 4
}'

или

# curl http://api.example.com:8080/nw-api/v2/set_training_uri --header "Content-type: application/json" --data '{
  "key": "%Лицензионный ключ%",
  "vhost": "example.com",
  "complete": false
}'

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}
Активировать обучение модели для виртуального хоста *.example.com
Пример запроса:

# curl http://api.example.com:8080/nw-api/v2/set_training_uri --header "Content-type: application/json" --data '{
  "key": "%Лицензионный ключ%",
  "vhost": "*.example.com",
  "duration": 4,
  "complete": false
}'

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}
Задать период обучения и активировать обучение модели для виртуального хоста .example.com
Пример запроса:

# curl http://api.example.com:8080/nw-api/v2/set_training_uri --header "Content-type: application/json" --data '{
  "key": "%Лицензионный ключ%",
  "vhost": ".example.com",
  "duration": 2,
  "complete": false
}'

Выполнение команды со значением параметра complete: false позволяет запустить процесс переобучения модели, если оно было завершено, а complete: true — прерывает процесс обучения.

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

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}

Корректировка поведенческой модели
При обработке запросов модулем машинного обучения крайне редко могут возникать ложные срабатывания (блокировка легитимного запроса модулем машинного обучения). В случае их возникновения для корректировки применения поведенческой модели требуется выполнить экспорт запросов.

Получить список запросов
Пример запроса:

# curl http://api.example.com:8080/nw-api/get_mt_attack --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "startTime": 1730986421,
  "endTime": 1730987421,
  "limit": 100,
  "bt": [12, ...],
  "ip": ["127.0.0.1", ...],
  "cc": ["RU", ...],
  "vhost": ["example.com", ...],
  "method": ["GET", ...],
  "agent": ["MLA", ...],
  "mz": ["args", ...],
  "request_id": ["e19699c37b4c26f53a9fab3a24f573c8", ...],
  "bodyLimit": 1024,
  "url": ["example.com/index.php", ...],
  "args": ["abc", ...],
  "body": ["some_text", ...],
  "cookie": ["id=123jmci5", ...],
  "other_headers": ["user_ID=admin", ...],
  "referer": ["http://example.com", ...],
  "ua": ["Mozilla/5.0", ...],
  "search": ["abc", ...]
}'

Опциональные параметры:

  • startTime и endTime — начальная и конечная дата в формате Unix Timestamp, за который будет запрошена информация;
  • limit — максимальное количество выводимых записей;
  • btидентификатор блокировки. Поиск проводится по строгому соответствию каждого элемента списка;
  • ip — IP-адрес. Поиск проводится по строгому соответствию каждого элемента списка;
  • cc — код страны. Поиск проводится по строгому соответствию каждого элемента списка;
  • vhost — виртуальный хост, доменное имя. Поиск проводится по строгому соответствию каждого элемента списка;
  • method — метод отправки HTTP-запроса. Поиск проводится по строгому соответствию каждого элемента списка;
  • agent — название компонента, обработавшего запрос. Поиск проводится по строгому соответствию каждого элемента списка;
  • mz — зона выявления аномалии. Поиск проводится по строгому соответствию каждого элемента списка;
  • request_id — уникальный идентификатор запроса. Поиск проводится по строгому соответствию каждого элемента списка;
  • bodyLimit — размер выводимого тела запроса;
  • url — поиск вхождения строки в URL-адресе. Поиск проводится по вхождению каждого элемента списка;
  • args — поиск вхождения строки в аргументах запроса. Поиск проводится по вхождению каждого элемента списка;
  • body — поиск вхождения строки в теле запроса. Поиск проводится по вхождению каждого элемента списка;
  • cookie — поиск вхождения строки в заголовке Сookie. Поиск проводится по вхождению каждого элемента списка;
  • other_headers — поиск вхождения строки в заголовках (кроме Cookie, User-Agent и Referer). Поиск проводится по вхождению каждого элемента списка;
  • referer — поиск вхождения строки в заголовке Referer. Поиск проводится по вхождению каждого элемента списка;
  • ua — поиск вхождения строки в заголовке User-Agent. Поиск проводится по вхождению каждого элемента списка;
  • search — поиск вхождения строки для каждого элемента из списка среди зон запроса (url, args, body, cookie, other_headers, referer, ua). Поиск проводится по вхождению каждого элемента списка.

Поиск значений, передаваемых в виде списка, производится по принципу логического ИЛИ.

Формат ответа:

{
  "status": "success",
  "count": integer,
  "waf_id": string,
  "attacks": [
    {
      "id": integer,
      "timestamp": integer,
      "request_id": string,
      "agent": string,
      "mz": array,
      "bt": integer,
      "ip": string,
      "cc": string,
      "vhost": string,
      "method": string,
      "url": string,
      "args": string,
      "body": string,
      "cookie": string,
      "other_headers": string,
      "ua": string,
      "referer": string,
      "mz_origin": string
    },
    ...
  ]
}

или

{"status": "fail", "description": "%описание ошибки%"}

Пример ответа:

{
  "status": "success",
  "count": 104,
  "waf_id": 119835378,
  "attacks": [
    {
      "id": 1,
      "timestamp": 1730986421,
      "request_id": "e19699c37b4c26f53a9fab3a24f573c8",
      "agent": "MLA",
      "mz": ["args", ...],
      "bt": 12,
      "ip": "127.0.0.1",
      "cc": "RU",
      "vhost": "example.com",
      "method": "POST",
      "url": "/index.php",
      "args": "abc",
      "body": "some_text",
      "cookie": "id=123jmci5",
      "other_headers": "user_ID=admin",
      "ua": "Mozilla/5.0",
      "referer": "http://example.com",
      "mz_origin": "{'body': 'dW5pb24vKmFhYWFhKi9zZWxlY3Q='}"
    },
    ...
  ]
}
  • id — идентификатор записи в БД;
  • mz_origin — оригинальное содержимое зон, в которых была выявлена аномалия.
Экспортировать запрос
Пример запроса:

# curl http://api.example.com:8080/nw-api/set_mt_fp --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "vhost": "example.com",
  "mz": "args",
  "mz_data": "abc"
}'

Обязательные параметры:

  • vhost — виртуальный хост, доменное имя;
  • mz — зона, в которой была выявлена аномалия;
  • mz_data — содержимое зоны, в которой была выявлена аномалия. Не допускается экспорт с пустым значением поля.

Пример ответа:

{"status": "success", "id": %идентификатор созданной записи%}

или

{"status": "fail", "description": "%описание ошибки%"}
Удалить запрос
Пример запроса:

# curl http://api.example.com:8080/nw-api/del_mt_attack --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "id": [1, ...]
}'

Пример ответа:

{"status": "success", "deleted": integer}

или

{"status": "fail", "description": "%описание ошибки%"}

Обязательные параметры:

  • id — идентификатор записи в БД.

Значения, передаваемые в виде списка, применяются по принципу логического ИЛИ.

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

# curl http://api.example.com:8080/nw-api/get_mt_fp --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "limit": 100,
  "id": [1, ...],
  "vhost": ["example.com", ...]
}'

Опциональные параметры:

  • limit — максимальное количество выводимых записей;
  • id — идентификатор запроса. Поиск проводится по строгому соответствию каждого элемента списка;
  • vhost — виртуальный хост, доменное имя. Поиск проводится по строгому соответствию каждого элемента списка.

Поиск значений, передаваемых в виде списка, производится по принципу логического ИЛИ.

Формат ответа:

{
  "status": "success",
  "count": integer,
  "waf_id": string,
  "fp": [
    {
      "id": integer,
      "timestamp": integer,
      "vhost": string,
      "mz": string,
      "mz_data": string
    },
    ...
  ]
}

или

{"status": "fail", "description": "%описание ошибки%"}

Пример ответа:

{
  "status": "success",
  "count": 25,
  "waf_id": 119835378,
  "fp": [
    {
      "id": 1,
      "timestamp": 173096451,
      "vhost": "example.com",
      "mz": "args",
      "mz_data": "abc"
    },
    ...
  ]
}
  • id — идентификатор записи в БД;
  • mz_data — содержимое зоны экспортированного запроса.
Удалить экспортированный запрос
Пример запроса:

# curl http://api.example.com:8080/nw-api/del_mt_fp --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "id": [1, ...]
}'

Пример ответа:

{"status": "success", "deleted": 3}

или

{"status": "fail", "description": "%описание ошибки%"}
  • id — идентификатор записи в БД.

Значения, передаваемые в виде списка, применяются по принципу логического ИЛИ.

Управление параметрами API Firewall
Функционал позволяет, используя вызовы API, управлять настройками API Firewall (создавать, удалять, изменять, просматривать спецификации и т.д.).

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

# curl http://api.example.com:8080/nw-api/get_openapi_schemas --header 'Content-type: application/json' --data '{"key": "%Лицензионный ключ%"}'

Формат ответа:

{
  "schemas": [
    {
      "schema_name": string,
      "schema": string
    },
    ...
  ]
}

или

{"status": "fail", "description": "%описание ошибки%"}

Пример ответа:

{
  "schemas": [
    {
      "schema_name": "example.com",
      "schema": "b3BlbmFwaSBzY2hlbWEgaW4gYmFzZTY0"
    },
    ...
  ]
}
Получить хэш-сумму текущих настроек
Проверка хэш-суммы требуется для подтверждения актуальности конфигурации. Изменение значения означает, что настройки были изменены.

Пример запроса:

# curl http://api.example.com:8080/nw-api/get_openapi_schemas_hash --header 'Content-type: application/json' --data '{"key": "%Лицензионный ключ%"}'

Пример ответа:

{'status': 'success', 'hash': '8ddd2b342d3190a866ee35afb249919a'}
Создать или изменить спецификацию
Пример запроса:

# curl http://api.example.com:8080/nw-api/set_openapi_schema --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "set": {
    "schema_name": "example.com",
    "schema": "b3BlbmFwaSBzY2hlbWEgaW4gYmFzZTY0"
  }
}'

Для корректной работы в качестве имени спецификации необходимо использовать доменное имя, заданное в спецификации. Например, если в спецификации задан параметр servers со значением:

"servers": [
  {
    "url": "http://example.com"
  }
]

то имя спецификации должно быть example.com.

Допускается использовать строгое соответствие и wildcard-значения: *, example.com, .example.com, *.example.com.

После создания или изменения спецификации необходимо задать список URL-адресов для фильтрующей ноды, при обращении на которые будет выполняться анализ на соответствие запроса его спецификации. Если список URL-адресов не задан или не соответствует спецификации, то анализ запроса проводиться не будет.

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}
Задать список URL-адресов для проверки
Пример запроса:

# curl http://api.example.com:8080/nw-api/set_openapi_url --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "url": [
    "example.com/admin",
    "example.com/admin/info",
    "example.com/v1/client/info"
  ]
}'

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}
Получить хэш-сумму текущих настроек
Проверка хэш-суммы требуется для подтверждения актуальности конфигурации. Изменение значения означает, что настройки были изменены.

Пример запроса:

# curl http://api.example.com:8080/nw-api/get_openapi_url_hash --header 'Content-type: application/json' --data '{"key": "%Лицензионный ключ%"}'

Пример ответа:

{'status': 'success', 'hash': '8ddd2b342d3190a866ee35afb249919a'}
Изменить имя спецификации
Пример запроса:

# curl http://api.example.com:8080/nw-api/set_openapi_schema --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "set": {
    "schema_name": "example.com",
    "old_name": "example.ru"
  }
}'

Для корректной работы в качестве имени спецификации необходимо использовать доменное имя, заданное в спецификации. Например, если в спецификации задан параметр servers со значением:

"servers": [
  {
    "url": "http://example.com"
  }
]

то имя спецификации должно быть example.com.

Допускается использовать строгое соответствие и wildcard-значения: *, example.com, .example.com, *.example.com.

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}
Удалить спецификацию
Пример запроса:

# curl http://api.example.com:8080/nw-api/set_openapi_schema --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "del": {
    "schema_name": "example.com"
  }
}'

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}
Получить список спецификаций, созданных Nemesida AI MLC
Пример запроса:

# curl http://api.example.com:8080/nw-api/get_openapi_schema_paths --header 'Content-type: application/json' --data '{"key": "%Лицензионный ключ%"}'

Nemesida AI MLC анализирует запросы и на основе соответствующего списка виртуальных хостов автоматически генерирует спецификации для каждого пути запроса.

Формат ответа:

{
  "paths": [
    {
      "schema_name": string,
      "url": string,
      "schema": string
    },
    ...
  ]
}

или

{"paths": []}

Пример ответа:

{
  "paths": [
    {
      "schema_name": "example.com",
      "url": "/index/",
      "schema": "b3BlbmFwaSBzY2hlbWEgaW4gYmFzZTY0"
    },
    ...
  ]
}


Пример ответа с декодированным содержимым спецификации:

{
  "paths": [
    {
      "schema_name": "example.com",
      "url": "/url_1/",
      "schema": {
        "example.com": {
          "/url_1/": {
            "post": {
              "requestBody": {
                "content": {
                  "*/*": {
                    "schema": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "integer"
                        },
                        "order": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "id",
                        "order"
                      ]
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    ...
  ]
}
Исключить URL-адрес при составлении спецификации
Пример запроса:

# curl http://api.example.com:8080/nw-api/set_openapi_exclude_paths --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "set": {
    "exclude_paths": ["/url_1/", "/url_2/"]
  }
}'

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}
Получить список исключенных URL-адресов
Пример запроса:

# curl http://api.example.com:8080/nw-api/get_openapi_exclude_paths --header 'Content-type: application/json' --data '{"key": "%Лицензионный ключ%"}'

Формат ответа:

{
  "exclude_paths": [string, ...]
}

Пример ответа:

{
  "exclude_paths": ["/url_1/", ...]
}
Получить хэш-сумму текущих настроек
Проверка хэш-суммы требуется для подтверждения актуальности конфигурации. Изменение значения означает, что настройки были изменены.

Пример запроса:

# curl http://api.example.com:8080/nw-api/get_openapi_exclude_paths_hash --header 'Content-type: application/json' --data '{"key": "%Лицензионный ключ%"}'

Пример ответа:

{'status': 'success', 'hash': '8ddd2b342d3190a866ee35afb249919a'}

Управление настройками веб-сервера Nginx
Используя вызовы API, можно управлять настройками Nginx. Каждый запрос должен содержать лицензионный ключ установленной копии Немезида ВАФ.

🔗 Глобальные настройки Nginx

Секция позволяет задать глобальные настройки Nginx, которые будут располагаться в /etc/nginx/nwaf/conf/nginx/nginx.conf. Поддерживает следующие команды управления:

Получить настройки
Пример запроса:

# curl http://api.example.com:8080/nw-api/nginx/get_nginx --data 'key=%Лицензионный ключ%'

Формат ответа:

{
  "status": "success",
  "configuration": [
    {
      "active": boolean,
      "resolver": string,
      "limit_req_zone": [string, ...],
      "real_ip_header": string,
      "resolver_timeout": string,
      "set_real_ip_from": [string, ...],
      "client_max_body_size": string
    }
  ]
}

или

{"status": "fail", "description": "%описание ошибки%"}

Пример ответа:

{
  "status": "success",
  "configuration": [
    {
      "active": true,
      "resolver": "127.0.0.1 [::1]:5353 valid=30s",
      "limit_req_zone": ["$binary_remote_addr zone=mylimit_1:10m rate=10r/s", ...],
      "real_ip_header": "X-Forwarded-For",
      "resolver_timeout": "30s",
      "set_real_ip_from": ["192.168.1.0/24", ...],
      "client_max_body_size": "100m"
    }
  ]
}
Задать настройки
Пример запроса:

# curl http://api.example.com:8080/nw-api/nginx/set_nginx --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "set": {
    "active": true,
    "resolver": "127.0.0.1 [::1]:5353 valid=30s",
    "resolver_timeout": "30s",
    "set_real_ip_from": [
      "192.168.1.0/24",
      "192.168.2.1"
    ],
    "real_ip_header": "X-Forwarded-For",
    "client_max_body_size": "100m",
    "limit_req_zone": [
      "$binary_remote_addr zone=mylimit_1:10m rate=10r/s",
      "$binary_remote_addr zone=mylimit_2:10m rate=10r/s"
    ]
  }
}'

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}

Для управления доступны следующие параметры:

Поддерживаемые параметры
Параметр
Описание параметра

Адрес DNS-сервера. Значение valid (в секундах) означает как долго ответ DNS-сервера будет считаться действительным.

Параметр устанавливает значение (в секундах), в течение которого Nginx будет ожидать ответа от DNS-сервера.

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

Допускается использование IPv6 и IPv4-адресов.

Задаёт поле заголовка запроса, значение которого будет использоваться для замены адреса клиента.

Параметр задаёт максимально допустимый размер тела запроса клиента в мегабайтах. Если размер больше заданного, то клиенту возвращается ошибка 413 (Request Entity Too Large). Установка параметра со значением 0 отключает проверку размера тела запроса клиента.

Задаёт параметры зоны разделяемой памяти, которая хранит состояние для разных значений ключа. В качестве ключа можно использовать текст, переменные и их комбинации. Запросы с пустым значением ключа не учитываются.

Получить хэш-сумму текущих настроек
Проверка хэш-суммы требуется для подтверждения актуальности конфигурации. Изменение значения означает, что настройки были изменены.

Пример запроса:

# curl http://api.example.com:8080/nw-api/nginx/get_nginx_hash --data 'key=%Лицензионный ключ%'

Пример ответа:

{"status": "success", "hash": "8ddd2b342d3190a866ee35afb249919a"}
Сбросить настройки
Пример запроса:

# curl http://api.example.com:8080/nw-api/nginx/set_nginx --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "set": {
    "resolver": null,
    "resolver_timeout": null,
    "set_real_ip_from": null,
    "real_ip_header": null,
    "client_max_body_size": null,
    "limit_req_zone": null
  }
}'

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}

🔗 Настройка виртуального хоста

Параметр name — имя конфигурации, которое будет располагаться в /etc/nginx/nwaf/conf/nginx/%name%.conf.

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

Получить настройки
Пример запроса:

# curl http://api.example.com:8080/nw-api/nginx/get_vhost --data 'key=%Лицензионный ключ%'

Формат ответа:

{
  "status": "success",
  "configuration": [
    {
      "active": boolean,
      "name": string,
      "root": string,
      "index": string,
      "listen": [string, ...],
      "add_header": {string, ...},
      "error_page": {string, ...},
      "locations": [
        {
          "location": string,
          "pass_type": string,
          "path": string,
          "index": string,
          "add_header": {string, ...},
          "error_page": {string, ...},
          "limit_req": string,
          "limit_req_status": integer
        },
        ...
      ],
      "server_name": string,
      "ssl_ciphers": string,
      "dhparam_name": string,
      "ssl_protocols": string,
      "certificate_name": string,
      "ssl_session_timeout": string
    }
  ]
}

или

{"status": "fail", "description": "%описание ошибки%"}

Пример ответа:

{
  "status": "success",
  "configuration": [
    {
      "active": true,
      "name": "example.com",
      "root": "/var/www/site",
      "index": "index index.html index.php",
      "listen": ["localhost:443 default_server ssl http2", ...],
      "add_header":{
        "Content-type": "text/html; charset=utf-8",
        ...
      },
      "error_page": {
        "404 502": "=200 /404.html",
        ...
      },
      "locations": [
        {
          "location": "/static_1",
          "pass_type": "root",
          "path": "/var/www/html",
          "index": "index index.html index.php",
          "add_header":{
            "Content-type": "text/html; charset=utf-8",
            ...
          },
          "error_page": {
            "404 502": "=200 /404.html",
            ...
          },
          "limit_req": "zone=mylimit_1 burst=20 nodelay",
          "limit_req_status": 444
        },
        ...
      ],
      "server_name": "www.example.com example.com",
      "ssl_ciphers": "AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5",
      "dhparam_name": "dhparam",
      "ssl_protocols": "TLSv1 TLSv1.1 TLSv1.2",
      "certificate_name": "SSL",
      "ssl_session_timeout": "10m"
    }
  ]
}
Задать настройки
Пример запроса:

# curl http://api.example.com:8080/nw-api/nginx/set_vhost --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "set": {
    "active": true,
    "name": "%Имя конфигурации%",
    "listen": [
      "localhost:80 default_server",
      "[::1]:443 default_server ssl http2"
    ],
    "server_name": "www.example.com example.com",
    "certificate_name": "%name%",
    "dhparam_name": "%name%",
    "ssl_session_timeout": "10m",
    "ssl_ciphers": "AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5",
    "ssl_protocols": "TLSv1 TLSv1.1 TLSv1.2",
    "root": "/var/www/site",
    "index": "index.php index.html",
    "add_header": {
      "Content-Encoding": "gzip",
      "Content-type": "text/html; charset=utf-8"
    },
    "error_page": {
      "404 502": "=200 /404.html",
      "504": "=200 @bad_gateway"
    },
    "locations": [
      {
        "location": "/static_1",
        "pass_type": "root",
        "path": "/var/www/html",
        "index": "index.php",
        "add_header": {
          "Content-Encoding": "gzip",
          "Content-type": "text/html; charset=utf-8"
        },
        "error_page": {
          "504": "=200 @bad_gateway",
          "404 502": "=200 /404.html"
        },
        "limit_req": "zone=mylimit_1 burst=20 nodelay",
        "limit_req_status": 444
      },
      {
        "location": "/static_2",
        "pass_type": "alias",
        "path": "/var/www/static_2",
        "autoindex": "on",
        "limit_req": "zone=mylimit_1 burst=20 nodelay",
        "limit_req_status": 444
      },
      {
        "location": "/abc_1",
        "pass_type": "proxy_pass",
        "proxy_pass": "http://main_proxy",
        "proxy_http_version": 1.0,
        "proxy_set_header": {
          "X-Real_IP": "$remote_address",
          "Host": "$http_host"
        },
        "proxy_connect_timeout": "60s",
        "proxy_send_timeout": "60s",
        "proxy_read_timeout": "60s",
        "proxy_intercept_errors": "on",
        "limit_req": "zone=mylimit_1 burst=20 nodelay",
        "limit_req_status": 444
      },
      {
        "location": "/abc_2",
        "pass_type": "memcached_pass",
        "memcached_pass": "memc_upstream",
        "limit_req": "zone=mylimit_1 burst=20 nodelay",
        "limit_req_status": 444
      }
    ]
  }
}'

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}

Для управления доступны следующие параметры:

Поддерживаемые параметры
Параметр
Описание параметра
name

Имя конфигурации.

Параметр задаёт адрес, на которых сервер будет принимать запросы.

Адрес может быть задан в виде доменного имени/IP-адреса и порта (опционально), только порта или в виде пути UNIX-сокета.

127.0.0.1:8000
127.0.0.1
8000
*:8000
localhost:8000
[::]:8000
[::1]
unix:/var/run/nginx.sock

Значение default_server, означает, что сервер будет сервером по умолчанию для указанной пары адрес:порт. Если же параметра default_server нет, то сервером по умолчанию будет первый сервер, в котором описана пара адрес:порт.

Параметр ssl указывает на то, что все соединения, принимаемые на данном порту, должны работать в режиме SSL. Это позволяет задать компактную конфигурацию для сервера, работающего сразу в двух режимах — HTTP и HTTPS.

Параметр http2 позволяет принимать на этом порту HTTP/2-соединения. Обычно, следует также указать параметр ssl, однако Nginx можно также настроить и на приём HTTP/2-соединений без SSL.

Пример:

"listen": ["[::1]:443 default_server ssl http2"]

Имя сервера.

Допускается использование wildcard-значений для замены первой или последней части имени.

certificate_name

Каноническое имя SSL-сертификата и приватного ключа для сервера. Имя задается при создании, в разделе настройки SSL-сертификатов.

Каноническое имя pem-файла, необходимого для работы Forward Secrecy (если злоумышленник узнает какой-либо сеансовый ключ, то он сможет получить доступ лишь к данным, защищенным этим ключом). Имя задается при создании в разделе настройки DHParam.

Параметр задаёт время, в течение которого клиент может повторно использовать параметры сессии.

Параметр задает разрешённые шифры. Шифры задаются в формате, поддерживаемом библиотекой OpenSSL.

Параметр разрешает использование указанных протоколов.

Параметр задаёт корневой каталог для запросов.

Параметр определяет файлы, которые будут использоваться в качестве индекса. В имени файла можно использовать переменные. Наличие файлов проверяется в порядке их перечисления. В конце списка может стоять файл с абсолютным путём.

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

Обязательные:

location — префикс, на основе которого будет происходить сравнение с URI запроса.

Пример:

"location": "/"
"location": "/user/"

proxy_type — тип обработки запросов.
Поддерживается 4 типа обработки: root, alias, proxy_pass, memcached_pass.

  • root — обработка запросов на локальном веб-сервере. При использовании этого типа обработки запросов необходимо использовать опцию path для задания корневого каталога для запросов.

    Пример:

    "path": "/var/www/site"
    

    При значении path /var/www/site и location /user/ запрос ресурса /user/index.html будет возвращать содержимое файла /var/www/site/user/index.html.

    Опционально:
    index — файлы, которые будут использоваться в качестве индекса. В имени файла можно использовать переменные. Наличие файлов проверяется в порядке их перечисления. В конце списка может стоять файл с абсолютным путём. Если параметр не задан, то по умолчанию будет использоваться значение параметра из секции server.

    Пример:

    "index": "index index.html index.php"
    

    autoindex — разрешение на листинг каталога.

    Пример:

    "autoindex": "on"
    

    add_header — задает поле заголовка для ответа, при условии кода ответа 200, 201, 204, 206, 301, 302, 303, 304, 307 или 308. Если задан параметр always, то поле заголовка будет добавлено независимо от кода ответа.

    Пример:

    "Content-Encoding": "gzip",
    "Content-type": "text/html; charset=utf-8"
    

    error_page — задаёт URI, который будет показываться для указанных ошибок. В значении URI можно использовать переменные.

    Пример:

    "504": "=200 @bad_gateway",
    "404 502": "=200 /404.html"
    
  • alias — путь, которым будет заменен указанный location. При использовании этого типа обработки запросов необходимо использовать опцию path для задания каталога для запросов.

    Пример:

    "path": "/var/www/site"
    

    При значении alias /var/www/site и location /user/ запрос ресурса /user/index.html будет возвращать содержимое файла /var/www/site/index.html.

  • proxy_pass — адрес проксируемого сервера, куда будут перенаправляться запросы при обращении к location.

    Адрес может быть задан в виде доменного имени/IP-адреса и порта (опционально), UNIX-сокета или названия апстрима. К адресу сервера допускается добавлять URI.

    Пример:

    "proxy_pass": "http://127.0.0.1:8080/remote/"
    "proxy_pass": "http://unix:/tmp/backend.socket:/uri/"
    "proxy_pass": "http://upstream_name"
    

    Опционально:
    proxy_http_version — версия протокола HTTP для проксирования. По умолчанию используется версия 1.0.

    Пример:

    "proxy_http_version": 1.0
    

    proxy_connect_timeout — таймаут для установления соединения с проксируемым сервером.

    Пример:

    "proxy_connect_timeout": "60s"
    

    proxy_intercept_errors — при активации параметра ответы от проксируемого сервера с кодом ответа 300 и выше будут перехватываться и перенаправляться на обработку с помощью директивы error_page.

    Пример:

    "proxy_intercept_errors": "on"
    

    proxy_send_timeout — таймаут передачи запроса проксируемому серверу.

    Пример:

    "proxy_send_timeout": "60s"
    

    proxy_read_timeout — таймаут при чтении ответа проксируемого сервера.

    Пример:

    "proxy_read_timeout": "60s"
    
  • memcached_pass — адрес сервера memcached, куда будут перенаправляться запросы при обращении к location.

    Адрес может быть задан в виде доменного имени/IP-адреса и порта (обязательно), UNIX-сокета или названия апстрима.

    Пример:

    "memcached_pass": "localhost:11211"
    "memcached_pass": "unix:/tmp/memcached.socket"
    "memcached_pass": "http://upstream_name"
    

Необязательные:

limit_req — зона разделяемой памяти (zone) и максимальный размер всплеска запросов (burst). Если скорость поступления запросов превышает описанную в зоне, то их обработка cдерживается так, чтобы запросы обрабатывались с заданной скоростью.

Пример:

"limit_req": "zone=mylimit_1 burst=20 nodelay"

Параметр необходмо сначала задать в глобальных настройках Nginx.

limit_req_status — код ответа, используемый при отклонении запросов.

Пример:

"limit_req_status": 444
Сбросить отдельные настройки
Пример запроса:

# curl http://api.example.com:8080/nw-api/nginx/set_vhost --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "set": {
    "name": "%Имя конфигурации%",
    "listen": null,
    "server_name": null,
    "certificate_name": null,
    "dhparam_name": null,
    "ssl_session_timeout": null,
    "ssl_ciphers": null,
    "ssl_protocols": null,
    "root": null,
    "index": null,
    "add_header": null,
    "error_page": null,
    "locations": null
  }
}'

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}
Получить хэш-сумму текущих настроек
Проверка хэш-суммы требуется для подтверждения актуальности конфигурации. Изменение значения означает, что настройки были изменены.

Пример запроса:

# curl http://api.example.com:8080/nw-api/nginx/get_vhost_hash --data 'key=%Лицензионный ключ%'

Пример ответа:

{"status": "success", "hash": "8ddd2b342d3190a866ee35afb249919a"}
Удалить конфигурацию
Пример запроса:

# curl http://api.example.com:8080/nw-api/nginx/set_vhost --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "del": {
    "name": "%Имя конфигурации%"
  }
}'

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}

🔗 Настройка балансировки нагрузки

Параметр name — имя конфигурации с параметрами балансировки нагрузки, который будет располагаться в /etc/nginx/nwaf/conf/nginx/%name%.conf.

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

Получить настройки
Пример запроса:

# curl http://api.example.com:8080/nw-api/nginx/get_upstream --data 'key=%Лицензионный ключ%'

Формат ответа:

{
  "status": "success",
  "configuration": [
    {
      "name": string,
      "balancing_method": string
      "servers": [
        {
          "server": string,
          "weight": integer,
          "max_fails": integer,
          "fail_timeout": string,
          "backup": boolean,
          "down": boolean
        },
        ...
      ]
    }
  ]
}

или

{"status": "fail", "description": "%описание ошибки%"}

Пример ответа:

{
  "status": "success",
  "configuration": [
    {
      "name": "upstream_main",
      "balancing_method": "ip_hash"
      "servers": [
        {
          "server": "backend1.example.com",
          "weight": 3,
          "max_fails": 5,
          "fail_timeout": "60s",
          "backup": false,
          "down": true
        },
        ...
      ]
    }
  ]
}
Задать настройки
Пример запроса:

# curl http://api.example.com:8080/nw-api/nginx/set_upstream --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "set": {
    "name": "%Имя конфигурации%",
    "balancing_method": "ip_hash",
    "servers": [
      {
        "server": "backend1.example.com",
        "weight": 3
      },
      {
        "server": "127.0.0.1:8080",
        "fail_timeout": "60s"
      },
      {
        "server": "192.0.2.1",
        "max_fails": 5
      },
      {
        "server": "backend3.example.com",
        "weight": 3,
        "fail_timeout": "60s",
        "max_fails": 5
      },
      {
        "server": "backend4.example.com"
      },
      {
        "server": "backend5.example.com",
        "backup": true
      },
      {
        "server": "backend4.example.com",
        "down": true
      }
    ]
  }
}'

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}

Для управления доступны следующие параметры:

Поддерживаемые параметры
Параметр
Описание параметра

Название группы серверов для балансировки нагрузки.

balancing_method

Метод распределения нагрузки между серверами. Допускается использовать одно из значений: ip_hash, least_conn или random.

Список серверов, которые используются для обработки запросов, а также их параметры:

  • server — адрес сервера. Адрес может быть задан в виде доменного имени/IP-адреса и порта (опционально) или UNIX-сокета. Допускается использование IPv6 и IPv4-адресов;
  • weight — числовой показатель приоритета выбора сервера при обработке запроса;
  • fail_timeout — время (в секундах), в течение которого должно произойти заданное число неудачных попыток работы с сервером для того, чтобы сервер считался недоступным;
  • max_fails — максимальное число неудачных попыток связи с сервером за время, заданное параметром fail_timeout;
  • down — помечает сервер как постоянно недоступный;
  • backup — помечает сервер как запасной. На него будут передаваться запросы в случае, если не работают основные серверы.
Сбросить отдельные настройки
Пример запроса:

# curl http://api.example.com:8080/nw-api/nginx/set_upstream --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "set": {
    "name": "%Имя конфигурации%",
    "balancing_method": null,
    "servers": null
  }
}'

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}
Получить хэш-сумму текущих настроек
Проверка хэш-суммы требуется для подтверждения актуальности конфигурации. Изменение значения означает, что настройки были изменены.

Пример запроса:

# curl http://api.example.com:8080/nw-api/nginx/get_upstream_hash --data 'key=%Лицензионный ключ%'

Пример ответа:

{"status": "success", "hash": "8ddd2b342d3190a866ee35afb249919a"}
Удалить конфигурацию
Пример запроса:

# curl http://api.example.com:8080/nw-api/nginx/set_upstream --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "del": {
    "name": "%Имя конфигурации%"
  }
}'

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}

🔗 Настройка SSL-сертификатов

Параметр name — имя конфигурации для SSL-сертификатов и их приватных ключей, которые будут располагаться в /etc/nginx/nwaf/conf/nginx/ssl/certs/%name%.crt и /etc/nginx/nwaf/conf/nginx/ssl/private/%name%.key.

В целях безопасности выполнение команды получения конфигурации не возвращает полное содержимое поля certificate_key. Полная информация о приватном ключе certificate_key запрашивается компонентом Nemesida AI MLA по URL-адресу http://api.example.com:8080/nw-api/nginx/secure/get_certificate, доступ к которому рекомендуется разрешить только для сервера фильтрующей ноды.

Секция предназначена для настройки параметров SSL-сертификатов и их приватных ключей. Поддерживает следующие команды управления:

Получить конфигурацию
Пример запроса:

# curl http://api.example.com:8080/nw-api/nginx/get_certificate --data 'key=%Лицензионный ключ%'

Формат ответа:

{
  "status": "success",
  "configuration": [
    {
      "name": string,
      "certificate": string,
      "certificate_key": string
    }
  ]
}

или

{"status": "fail", "description": "%описание ошибки%"}

Пример ответа:

{
  "status": "success",
  "configuration": [
    {
      "name": "SSL",
      "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS...",
      "certificate_key": "LS0tLS1CRUdJTiBQUklWQVRF..."
    }
  ]
}
Задать конфигурацию
Пример запроса:

# curl http://api.example.com:8080/nw-api/nginx/set_certificate --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "set": {
    "name": "%Имя конфигурации%",
    "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURVekNDQWpzQ0ZGei9jNjhLYk9USnlYOWpibWZMbjdmK1YwdWtNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1IOHgKQ3pBSkJnTlZCQVlUQWtGVk1RNHdEQVlEVlFRSURBVkJVMEZGUmpFTk1Bc0dBMVVFQnd3RVQzSmxiREVSTUE4RwpBMVVFQ2d3SVUxTlNSMEZCUldZeERqQU1CZ05WQkFzTUJYTnlaWFJuTVE0d0RBWURWUVFEREFWM1pUUm1aekVlCk1Cd0dDU3FHU0liM0RRRUpBUllQWVdSdGFXNUFZV1J0YVc0dVkyOXRNQjRYRFRJek1EY3hOekV3TlRZME0xb1gKRFRJMk1EUXhNVEV3TlRZME0xb3dUVEVMTUFrR0ExVUVCaE1DUTBFeERUQUxCZ05WQkFnTUJFNXZibVV4Q3pBSgpCZ05WQkFjTUFrNUNNUTB3Q3dZRFZRUUtEQVJPYjI1bE1STXdFUVlEVlFRRERBcGxlR0Z0Y0d4bExuSjFNSUlCCklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFySitBMkZ3cHFjMDhNVnRhVzZKeUsvbDkKQy9NWXFJRXZtRjZvdUt5V01ZRWFGMmlPK0l2VG1pN2hETkxQakR2ekhKRHJMYTZycjhJMkdMN0Nxdi9tdkN5NQpKZVBaSVZxeU9PQ0NLUEJFVXFrUkl4NUwvQ0hLMnVieHlxL1ZIWUExRysxanVqNzNINXZqUHM4anRyeFFNVG5OCkNacVBycmdoOTRlU0ViRmpER2JyZGlGSFpURmwyT01QdTlBVEJoRjF3dStwYS8yN3BJVm91S21BTnVTa0pTaUoKM29wRTkzZFJDYkUvWVhoTjJKTlNjdmdzcjBVbXBRd2t5VDJ4bGVKbHV0Sm5PZkZiK1NsdWFHVlloOUtncEwrcQorN2x3MFk0OEtYNnJGeXUzNko1RjBxNUN6T1hoMS9BZWFneStJQTdGanVSOU9tTFEvQVlwSGE1QmZMK0Fid0lECkFRQUJNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUNnV1VGTVZrMkVSaHF3WGpBT0YxVCt1cWZJM3pKZkVrTHAKYlZieW90d2dRMnZPU2VZdlAyU1dqdjZCMDExZEFONWNYTUIvOFhOVEdhdUNSajN1cEtTTUtvd1JaY1hjdUlKMApocUNDc01JZGw1bDFBQVFJWCtPTTJTeEpKdHVRK0dkWlhkQ294RStzN20zSHNCQ3UwbWRzY3doU0hGSnRmbXRhCit6eFJ4VmY5QkU3NDJSUE5ydXNFZmxwdVQ2Rm14QkpMUy9WYzVLOWtQMngwdjZQTjZYMUF4M09vRGhrQ3Nma2cKeXpwSFhtK3J1ZWJmcnNvcFdwUzJBM083T09CRk1lTVhZeHl3WjJUR2hmanh3R3ZGZml0ZnhFNnpTUnZnQ1A5WQphaUM5RUlMSXpodUdDNDFXNFFZYTJBUzNoaVF4Qms0eDcyeGZ1cXpmc212OE5Zd0lzY3BxCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K",
    "certificate_key": "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2QUlCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktZd2dnU2lBZ0VBQW9JQkFRQ3NuNERZWENtcHpUd3gKVzFwYm9uSXIrWDBMOHhpb2dTK1lYcWk0ckpZeGdSb1hhSTc0aTlPYUx1RU0wcytNTy9NY2tPc3RycXV2d2pZWQp2c0txLythOExMa2w0OWtoV3JJNDRJSW84RVJTcVJFakhrdjhJY3JhNXZIS3I5VWRnRFViN1dPNlB2Y2ZtK00rCnp5TzJ2RkF4T2MwSm1vK3V1Q0gzaDVJUnNXTU1adXQySVVkbE1XWFk0dys3MEJNR0VYWEM3NmxyL2J1a2hXaTQKcVlBMjVLUWxLSW5laWtUM2QxRUpzVDloZUUzWWsxSnkrQ3l2UlNhbERDVEpQYkdWNG1XNjBtYzU4VnY1S1c1bwpaVmlIMHFDa3Y2cjd1WERSamp3cGZxc1hLN2ZvbmtYU3JrTE01ZUhYOEI1cURMNGdEc1dPNUgwNll0RDhCaWtkCnJrRjh2NEJ2QWdNQkFBRUNnZ0VBWENKSjM3RFpIK01GeElZd3BRWUFFQTU2T24yR1pMR0cyTGwxTGhRWG1kYUIKT1lzNSs5aU5tUlo2VWFEVzI4OUhnN0NwaFZsY0UxUUNFWlVIUzhPSHdGblNmREd2TzBrd0pJRlhsMGdkLzB4egpkQjRBaWxMeTlZRWIvb1Y0cHVVOTgyanh1SDlRNE5NUUovN2czZkNHa0s5OEN5c3VreDkrS2FKM1NQQTNvRzhSCnlLNDVKckRZK1l4WktLNS9EZmtrZlRGdXF6TDkxSzdIcFdBKzkxc3FnRUM5c0hqTzJyME9KUmlEK1lFekFLZisKb0hsSHZmTjhrblBSTDZRMWFJaUgvL1o3S053YTlmOHFvK0prZmR3bExaS21KS21ScEtqQUppMWd1ckZSaklzUgpQeU5sTm43VHljQmZUKzIvS3hoNm1pR2F1UWg1ZC9saXg2QVJLMjhTdVFLQmdRRFNSQkxmQ3RiYWR2OThtWWJsCnREUS95OUZoSWo0WHJML2xPZVhJaEZEbFpKc3U4R3dpSzZZczNqWFQvOEhwUlZUbll6TkdtdUhUNk5Pb1lkakoKWk5IWDFINHlCT2xMV3oyQ3RvNk1aMWJSWkVlcHplV29GM2txMWc2TmNabmJYdk4xNmNhSXJzTG9LY0NYQ2h6UwpFQ245TytrS1FBYk1PL3d2WXVMUWJpRlU4d0tCZ1FEU0syc09WWGIrbm83MVZmR1BUSDJpQUV2bWxFRlZwVkNhClNxMmtWZE9hQkVOR3BnWnRwNmZ4Lzh5bUlPbGczWnZpQ2JQZnVhK2FGOENqVUYzaGRkcDFRdTI3RjdCaGswbGUKUXNrRGVBaEU4KzVxWWZtWEUwZUo1dE11bmtYUHM2b2o3eHRTTlR2c01CZEwwK3AwVUtia0EzaDVvLzlqdytkLwp2OHRpYytKMWxRS0JnQ1RNd1RqRUh1SlJYVm1qVFJhNnVVSkpHN1lTVmlleWxrczZITnRCUFI5SXdsZ3V2OTRqCklZeE12OE1BeWlGWGZ3cVlOQXN4WkVEQVNQcjVWUVc2WFhlV3V4ZHFBS0t0cjFCSFB4K1hubnc3UHNlYlA0eHgKdjBVZC9hSUh0ZFBOQkhNb25SU2k4WDNNZ09adVlLanJKMDRveEJxRkppdHNmRENXNy9kbXJ2SzlBb0dBZVR4OApsQmN1L25BZXpWMVhiQzlXcFpZQU1ySEJBcFBMYkVXNTV2dHZoZ0FCZ3dhUTNMNkMvZkZ1YjBLNi9acTRxbXFvCmJWMWk4OFBSNXlPY0ZFdjB5Z0hpdXpOT0Z1dHN2a2hPUm9iK1ZqQlVqdCtYcDlPQ1NBVjBPd2NvQkVtQzB4bkMKSytqemVTckF0WWc0VGdLY1V4bkJiSUh5OSt6eFpOc1JpdWlJY1FVQ2dZQUpQN3pBck5IQ0FVYWwwOUQvQVFjbAppMGVxQnkvZ2xJOXlIS1BVcDFlU1BnUnhSL3Y4ZVBPOGM2azA5YkM3bk1TeDQ5bEVWWnhvT1lkM3ZkSyszQXZCCnByZWZscnZXTk5hSWhBMHdsZTRjWXdObHlMZDVKRU5zeDZ1RTBwNUd4UVRLeEZNUE16L2JaSlU0YzZkUWsyUDIKNFdVME1SLzRLdU9KMjJOZWJObmlWUT09Ci0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K"
  }
}'

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}

Для управления доступны следующие параметры:

Поддерживаемые параметры
Параметр
Описание параметра
name

Каноническое имя SSL-сертификата и его приватного ключа, которое будет использоваться в качестве имен соответствующих файлов.

SSL-cертификат и цепочку SSL-сертификатов (опционально) в формате Base64. Параметр задается вместе с параметром certificate_key.

Приватный ключ SSL-сертификата в формате Base64. Параметр задается вместе с параметром certificate.

Получить хэш-сумму текущих настроек
Проверка хэш-суммы требуется для подтверждения актуальности конфигурации. Изменение значения означает, что настройки были изменены.

Пример запроса:

# curl http://api.example.com:8080/nw-api/nginx/get_certificate_hash --data 'key=%Лицензионный ключ%'

Пример ответа:

{"status": "success", "hash": "8ddd2b342d3190a866ee35afb249919a"}
Удалить конфигурацию
Пример запроса:

# curl http://api.example.com:8080/nw-api/nginx/set_certificate --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "del": {
    "name": "%Имя конфигурации%"
  }
}'

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}

🔗 Настройка DHParam

Параметр name — имя конфигурации с параметрами DHParam, который будет располагаться в /etc/nginx/nwaf/conf/nginx/ssl/dhparam/%name%.pem.

В целях безопасности выполнение команды получения конфигурации не возвращает полное содержимое поля dhparam. Полная информация о dhparam запрашивается компонентом Nemesida AI MLA по URL-адресу http://api.example.com:8080/nw-api/nginx/secure/get_dhparam, доступ к которому рекомендуется разрешить только для сервера фильтрующей ноды.

Секция предназначена для настройки параметра DHParam. Поддерживает следующие команды управления:

Получить конфигурацию
Пример запроса:

# curl http://api.example.com:8080/nw-api/nginx/get_dhparam --data 'key=%Лицензионный ключ%'

Формат ответа:

{
  "status": "success",
  "configuration": [
    {
      "name": string,
      "dhparam": string
    }
  ]
}

или

{"status": "fail", "description": "%описание ошибки%"}

Пример ответа:

{
  "status": "success",
  "configuration": [
    {
      "name": "dhparam",
      "dhparam": "LS0tLS1CRUdJTiBESCBQQVJBTUVURVJT..."
    }
  ]
}
Задать конфигурацию
Пример запроса:

# curl http://api.example.com:8080/nw-api/nginx/set_dhparam --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "set": {
    "name": "%Имя конфигурации%",
    "dhparam": "LS0tLS1CRUdJTiBESCBQQVJBTUVURVJTLS0tLS0KTUlHSEFvR0JBT1lpNi9OQmljaHU5UDlPS3BpZ1RLQTB4WjNUWnZKQ3pWNzMvWkxCMkgvRFFzc2xUNWgyWEltcQpiazR0SHRGc2ViNDU0S29IR3JoM2FCbzFmcXB5REJQMDcxR0M3eE12c2xUQXVBanVIRmFVckd6NVNDTWRRN3A3CnJvaWNJdExNWE5razQ1WWpzazRPZjZHVXhDZXQ1MkdqSHo3a01yemdvbUtWTldjdU5BRGJBZ0VDCi0tLS0tRU5EIERIIFBBUkFNRVRFUlMtLS0tLQo="
  }
}'

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}

Для управления доступны следующие параметры:

Поддерживаемые параметры
Параметр
Описание параметра
name

Каноническое имя pem-файла, необходимого для работы Forward Secrecy. Forward Secrecy означает, что если злоумышленник узнает какой-либо сеансовый ключ, то он сможет получить доступ лишь к данным, защищенным этим ключом.

Значение ключа в формате Base64.

Получить хэш-сумму текущих настроек
Проверка хэш-суммы требуется для подтверждения актуальности конфигурации. Изменение значения означает, что настройки были изменены.

Пример запроса:

# curl http://api.example.com:8080/nw-api/nginx/get_dhparam_hash --data 'key=%Лицензионный ключ%'

Пример ответа:

{"status": "success", "hash": "8ddd2b342d3190a866ee35afb249919a"}
Удалить конфигурацию
Пример запроса:

# curl http://api.example.com:8080/nw-api/nginx/set_dhparam --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "del": {
    "name": "%Имя конфигурации%"
  }
}'

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}

Сборщик событий работы компонентов Немезида ВАФ

Доступно только для тарифа Энтерпрайз.

Функционал предназначен для централизованного приема, хранения и обработки журналов всех компонентов Немезида ВАФ.

Получить список событий работы компонентов Немезида ВАФ
Пример запроса:

# curl http://api.example.com:8080/nw-api/get_event --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "startTime": 1234567891,
  "endTime": 1987654321,
  "limit": 100,
  "offset": 1,
  "level": ["info", ...],
  "ip": ["1.1.1.1", ...],
  "uuid": ["198be506d69ba8a9bdbcf87b22ef5bc", ...],
  "agent": ["dyn", ...],
  "category": ["settings", ...]
}'

Опциональные параметры:

  • startTime — начальная дата в формате Unix Timestamp, за который будет запрошена информация;
  • endTime — конечная дата в формате Unix Timestamp, за который будет запрошена информация;
  • limit — максимальное количество выводимых записей;
  • offset — смещение для вывода последующих записей;
  • level — уровень серьезности сообщения;
  • ip — IP-адрес сервера, где установлен компонент;
  • uuid — идентификатор сервера, где установлен компонент;
  • agent — название компонента;
  • category — категория события.

Добавленные параметры сочетаются по принципу логического «и» (&), а их значения — по принципу логического «или» (|).

Формат ответа:

{
  "status": "success",
  "count": integer,
  "waf_id": string,
  "events": [
    {
      "id": integer,
      "ip": string,
      "uuid": string,
      "agent": string,
      "level": string,
      "category": string,
      "timestamp": integer,
      "description": string
    }
  ]
}

Пример ответа:

{
  "status": "success",
  "count": 28,
  "waf_id": "1674726761",
  "events": [
    {
      "id": 2798306,
      "ip": "1.1.1.1",
      "uuid": "bd4f447720189ca3c5a42e1395fa6021",
      "agent": "dyn",
      "level": "debug",
      "category": "nginx",
      "timestamp": 1688404169,
      "description": "This is log 1"
    }
  ]
}
Поддерживаемые параметры
Временной интервал:

  • startTime — начальная дата в формате Unix Timestamp, за который будет запрошена информация;
  • endTime — конечная дата в формате Unix Timestamp, за который будет запрошена информация.

Количество записей:

  • limit — максимальное количество выводимых записей;
  • offset — смещение для вывода последующих записей. При значении 0 и значении limit 100 будут выводиться записи с порядковым номером 1-100, при значении 1 — записи с порядковым номером 101-200 и т.д. Использование параметра без указания максимального количества выводимых записей (limit) невозможно.

Ранжирование событий:

  • level — уровень серьезности события;
    • debug — события с отладочной информацией;
    • info — информационные сообщения о состоянии компонента;
    • warn — предупреждения о потенциальной проблеме в работе компонента;
    • error — сообщения об ошибках в работе компонента;
    • fatal — сообщения о критических ошибках в работе компонента, приводящие к сбою в работе.
  • category — категория события:
    • Фильтрующая нода:
      • auth — события, связанные с проверкой программного ключа, тарифного плана и т.д.;
      • os — события взаимодействия с операционной системой (память, диск);
      • network — события, связанные с сетью (невозможно установить соединение, отправки, таймауты, обрывы, запуск/остановка сокета/порта);
      • api — события, связанные со взаимодействием с Nemesida WAF API;
      • settings — события, связанные с настройками модуля;
      • nginx — события, связанные со взаимодействием с Nginx (несоответствие настроек, необходимых для работы фильтрующей ноды, нарушения RFC);
      • signature — события, связанные с сигнатурным анализом;
      • clamav — события, связанные со взаимодействием с ClamAV;
      • mla — события, связанные со взаимодействием с Nemesida AI MLA;
      • mlc — события, связанные со взаимодействием с Nemesida AI MLC;
      • rabbitmq — события, связанные со взаимодействием с RabbitMQ;
      • autoban — события, связанные механизмом автоматической блокировки;
      • geo — события, связанные с функционалом GeoIP;
      • openapi — события, связанные с работой OpenAPI;
      • parsing — события, связанные с декодом и нормализацией данных;
      • analysis — события, связанные с обработкой запроса, но не вошедшие ни в одну группу (signature, ml, openapi и т.д.);
      • misc — события, не вошедшие ни в одну категорию (например, вывод информаци об UUID, WAF ID, количестве сигнатур и т.д.).
    • Nemesida AI MLA:
      • auth — события, связанные с проверкой программного ключа, тарифного плана и т.д.;
      • os — события взаимодействия с операционной системой (память, диск);
      • network — события, связанные с сетью (невозможно установить соединение, отправки, таймауты, обрывы, запуск/остановка сокета/порта);
      • api — события, связанные со взаимодействием с Nemesida WAF API;
      • settings — события, связанные с настройками модуля;
      • dyn — события, связанные со взаимодействием с фильтрующей нодой;
      • ml — события, связанные с работой машинного обучения;
      • geo — события, связанные с функционалом GeoIP;
      • mgmt — события, связанные с функционалом сервисного интерфейса управления;
      • openapi — события, связанные с работой OpenAPI;
      • parsing — события, связанные с декодом и нормализацией данных;
      • analysis — события, связанные с обработкой запроса, но не вошедшие ни в одну группу (signature, ml, openapi и т.д.);
      • misc — события, не вошедшие ни в одну категорию (например, вывод информаци об UUID, WAF ID и т.д.).
    • Nemesida AI MLC:
      • auth — события, связанные с проверкой программного ключа, тарифного плана и т.д.;
      • os — события взаимодействия с операционной системой (память, диск);
      • network — события, связанные с сетью (невозможно установить соединение, отправки, таймауты, обрывы, запуск/остановка сокета/порта);
      • api — события, связанные со взаимодействием с Nemesida WAF API;
      • settings — события, связанные с настройками модуля;
      • dyn — события, связанные со взаимодействием с фильтрующей нодой;
      • rabbitmq — события, связанные со взаимодействием с RabbitMQ;
      • ml — события, связанные с работой машинного обучения;
      • geo — события, связанные с функционалом GeoIP;
      • bf — события, связанные с работой Brute-force/Flood анализа;
      • ddos — события, связанные с выявлением DDoS-атак;
      • openapi — события, связанные с работой OpenAPI;
      • parsing — события, связанные с декодом и нормализацией данных;
      • analysis — события, связанные с обработкой запроса, но не вошедшие ни в одну группу (signature, ml, openapi и т.д.);
      • misc — события, не вошедшие ни в одну категорию (например, вывод информаци об UUID, WAF ID и т.д.).
  • Nemesida WAF Scanner:
    • auth — события, связанные с проверкой программного ключа, тарифного плана и т.д.;
    • os — события взаимодействия с операционной системой (память, диск);
    • network — события, связанные с сетью (невозможно установить соединение, отправки, таймауты, обрывы, запуск/остановка сокета/порта);
    • api — события, связанные со взаимодействием с Nemesida WAF API;
    • settings — события, связанные с настройками модуля;
    • scan — события, связанные с работой компонента;
    • %ModuleName% — события, связанные с работой определенного модуля сканирования;
    • parsing — события, связанные с декодом и нормализацией данных;
    • db — события, связанные cо взаимодействием с базой данных;
    • misc — события, не вошедшие ни в одну категорию (например, вывод информаци об UUID, WAF ID и т.д.).

Идентификация компонентов:

  • ip — IP-адрес сервера, где установлен компонент;
  • uuid — идентификатор сервера, где установлен компонент;
  • agent — название компонента:
    • dyn — Фильтрующая нода;
    • mla — Nemesida AI MLA;
    • mlc — Nemesida AI MLC;
    • cabinet — Личный кабинет;
    • nws — Nemesida WAF Scanner.
Удалить события
Пример запроса:

# curl http://api.example.com:8080/nw-api/del_event --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "timestamp": 1686655813,
  "id": [1, 2, 3],
  "ip": [
    "1.1.1.1",
    "2.2.2.2"
  ],
  "uuid": [
    "198be506d69ba8a9bdbcf87b22ef5bc",
    "198be506d69ba8a9bdbcf87b22ef5bb"
  ],
  "agent": [
    "dyn",
    "mla"
  ],
  "level": [
    "info",
    "error"
  ],
  "category": [
    "os",
    "api"
  ]
}'

Опциональные параметры:

  • timestamp — дата в формате Unix Timestamp, до которой (включительно) все события будут удалены;
  • id — ID записей, которые будут удалены;
  • ip — IP-адрес сервера, где установлен компонент;
  • uuid — идентификатор сервера, где установлен компонент;
  • agent — название компонента;
  • level — уровень серьезности сообщения;
  • category — категория события.

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}

Добавленные параметры сочетаются по принципу логического «и» (&), а их значения — по принципу логического «или» (|).

Все события старше 90 дней удаляются автоматически.

Получение информации об атаках

Функционал позволяет получить информацию о заблокированных запросах, включая статистику за период.

Получить список атак
Пример запроса:

# curl http://api.example.com:8080/nw-api/get_attack --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "startTime": 1677211703,
  "endTime": 1677211703,
  "limit": 100,
  "offset": 1,
  "bt": [1, ...],
  "ip": ["1.1.1.1", ...],
  "cc": ["RU", ...],
  "vhost": ["example.com", ...],
  "method": ["post", ...],
  "rule_id": [1, ...],
  "signatureType": ["sqli", ...],
  "mz": ["args", ...],
  "request_id": ["b2afdac78f17e017dd2b6dfafcb5a974", ...],
  "group_id": ["b2afdac78f17e017dd2b6dfafcb5a974", ...],
  "blocked": true,
  "possible": true,
  "bodyLimit": 1024,
  "url": ["/uploads.php", ...],
  "args": ["abc", ...],
  "body": ["abc", ...],
  "cookie": ["abc", ...],
  "other_headers": ["abc", ...],
  "referer": ["http://127.0.0.1", ...],
  "ua": ["Mozilla/5.0", ...],
  "search": ["abc", ...],
}'

Опциональные параметры:

  • startTime и endTime — начальная и конечная дата в формате Unix Timestamp, за который будет запрошена информация;
  • limit — максимальное количество выводимых записей;
  • offset — смещение для вывода последующих записей. При значении 0 и значении limit 100 будут выводиться записи с порядковым номером 1-100, при значении 1 — записи с порядковым номером 101-200 и т.д. Использование параметра без указания максимального количества выводимых записей (limit) невозможно.
  • btидентификатор блокировки;
  • ip — IP-адрес;
  • cc — код страны;
  • vhost — виртуальный хост, доменное имя;
  • method — метод отправки HTTP-запроса;
  • rule_id — идентификатор выявленной сигнатуры;
  • signatureType — тип выявленной сигнатуры;
  • mz — зона выявления аномалии;
  • request_id — уникальный идентификатор запроса;
  • group_id — идентификатор группы запросов, определенных Nemesida AI MLC как brute-force или DDoS-атака;
  • blocked — идентификатор статуса фактической блокировки запроса;
  • possible — фильтр отображения потенциальных атак, которые не были достоверно определены как атаки;
  • bodyLimit — размер выводимого тела запроса;
  • url — поиск вхождения строки в URL-адресе;
  • args — поиск вхождения строки в аргументах запроса;
  • body — поиск вхождения строки в теле запроса;
  • cookie — поиск вхождения строки в заголовке Сookie;
  • other_headers — поиск вхождения строки в заголовках (кроме Cookie, User-Agent и Referer);
  • referer — поиск вхождения строки в заголовке Referer;
  • ua — поиск вхождения строки в заголовке User-Agent;
  • search — поиск вхождения строки для каждого элемента из списка среди зон запроса (url, args, body, cookie, other_headers, referer, ua).

Поиск значений, передаваемых в виде списка, производится по принципу логического ИЛИ.

Формат ответа:

{
  "status": "success",
  "count": integer,
  "waf_id": string,
  "attacks": [
    {
      "id": integer,
      "timestamp": integer,
      "request_id": string,
      "group_id": string,
      "rule_id": integer,
      "description": string,
      "long_description": string,
      "blocked": boolean,
      "possible": boolean,
      "lm": boolean,
      "mz": array,
      "bt": integer,
      "ip": string,
      "cc": string,
      "vhost": string,
      "method": string,
      "url": string,
      "args":string,
      "body": string,
      "cookie": string,
      "other_headers": string,
      "ua": string,
      "referer": string
    },
    ...
  ]
}

или

{"status": "fail", "description": "%описание ошибки%"}

Пример ответа:

{
  "status": "success",
  "count": integer,
  "waf_id": string,
  "attacks": [
    {
      "id": 1,
      "timestamp": 173098845,
      "request_id": "b2afdac78f17e017dd2b6dfafcb5a974",
      "group_id": "b2afdac78f17e017dd2b6dfafcb5a974",
      "rule_id": 1,
      "description": "SQLi",
      "long_description": "some_text",
      "blocked": true,
      "possible": false,
      "lm": false,
      "mz": ["args", ...],
      "bt": 2,
      "ip": "1.1.1.1",
      "cc": "RU",
      "vhost": "example.com",
      "method": "POST",
      "url": "/uploads.php",
      "args": "abc",
      "body": "abc",
      "cookie": "abc",
      "other_headers": "abc",
      "ua": "Mozilla/5.0",
      "referer": "http://127.0.0.1"
    },
    ...
  ]
}

id — идентификатор записи в БД.

Запросить статистику атак
Пример запроса:

# curl http://api.example.com:8080/nw-api/get_attack_stats --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "startTime": 173098845,
  "endTime": 173096645
}'

Опциональные параметры:
startTime и endTime — начальная и конечная дата в формате Unix Timestamp, за который будет запрошена информация.

Формат ответа:

{
    "status": "success",
    "bt": [
        {
            "bt": integer,
            "period": integer
        },
        ...
    ],
    "ip": [
        {
            "ip": string,
            "period": integer
        },
        ...
    ],
    "cc": [
        {
            "cc": string,
            "period": integer
        },
        ...
    ],
    "vhost": [
        {
            "vhost": string,
            "period": integer
        },
        ...
    ]
}

или

{"status": "fail", "description": "%описание ошибки%"}

Пример ответа:

{
    "status": "success",
    "bt": [
        {
            "bt": 1,
            "period": 30
        },
        ...
    ],
    "ip": [
        {
            "ip": "1.1.1.1",
            "period": 45
        },
        ...
    ],
    "cc": [
        {
            "cc": "RU",
            "period": 11
        },
        ...
    ],
    "vhost": [
        {
            "vhost": "example.com",
            "period": 123
        },
        ...
    ]
}

period — количество событий по каждому bt/сс/vhost/ip за выбранный период;
btидентификатор блокировки;
ip — IP-адрес;
cc — код страны;
vhost — виртуальный хост, доменное имя.

Если период, за который необходимо получить данные, не задан параметрами startTime и endTime, то информация будет выводиться за последние 24 часа, 7 и 30 дней.

Формат ответа:

{
  "status": "success",
  "bt": [
    {
      "bt": integer,
      "lastDay": integer,
      "last7Days": integer,
      "last30Days": integer
    },
    ...
  ],
  "ip": [
    {
      "ip": string,
      "lastDay": integer,
      "last7Days": integer,
      "last30Days": integer
    },
    ...
  ],
  "cc": [
    {
      "cc": string,
      ...
      "lastDay": integer,
      "last7Days": integer,
      "last30Days": integer
    },
    ...
  ],
  "vhost": [
    {
      "vhost": string,
      "lastDay": integer,
      "last7Days": integer,
      "last30Days": integer
    },
    ...
  ]
}

или

{"status": "fail", "description": "%описание ошибки%"}

Пример ответа:

{
  "status": "success",
  "bt": [
    {
      "bt": 1,
      "lastDay": 12,
      "last7Days": 24,
      "last30Days": 145
    },
    ...
  ],
  "ip": [
    {
      "ip": "1.1.1.1",
      "lastDay": 12,
      "last7Days": 24,
      "last30Days": 145
    },
    ...
  ],
  "cc": [
    {
      "cc": "RU",
      ...
      "lastDay": 12,
      "last7Days": 24,
      "last30Days": 145
    },
    ...
  ],
  "vhost": [
    {
      "vhost": "example.com",
      "lastDay": 12,
      "last7Days": 24,
      "last30Days": 145
    },
    ...
  ]
}


lastDay/last7Days/last30Days — количество событий по каждому bt/сс/vhost/ip за последние 24 часа, 7 и 30 дней;
btидентификатор блокировки;
ip — IP-адрес;
cc — код страны;
vhost — виртуальный хост, доменное имя.

Удалить атаки
Пример запроса:

# curl http://api.example.com:8080/nw-api/del_attack --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "id": [1, ...]
}'

Пример ответа:

{"status": "success", "deleted": 15}

или

{"status": "fail", "description": "%описание ошибки%"}

Обязательные параметры:

  • id — идентификатор записи в БД.

Поиск значений, передаваемых в виде списка, производится по принципу логического ИЛИ.

Управление настройками Nemesida WAF Scanner

Доступно только для тарифа Энтерпрайз.

Функционал предназначен для управления настройками сканирования в компоненте Nemesida WAF Scanner.

Получить настройки
Пример запроса:

# curl http://api.example.com:8080/nw-api/nws/get_target --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%"
}'

Формат ответа:

{
  "status": "success",
  "targets": [
    {
      "active": boolean,
      "target": string,
      "scan_proxy": string,
      "auth_params": {
        "active": boolean,
        "url": string,
        "username_field": string,
        "username_value": string,
        "password_field": string,
        "password_value": string
      },
      "exclude_modules": [string, ...]
    },
    {
      "active": boolean,
      "target": string
      ...
    }
  ]
}

или

{"status": "fail", "description": "%описание ошибки%"}

Пример ответа:

{
  "status": "success",
  "targets": [
    {
      "active": true,
      "target": example.com,
      "scan_proxy": "http://proxy.example.com:3128",
      "auth_params": {
        "active": true,
        "url": "http://example.com/login.php",
        "username_field": "username",
        "username_value": "admin",
        "password_field": "password",
        "password_value": "123456"
      },
      "exclude_modules": ["sqli", ...]
    },
    ...
  ]
}
Задать настройки
Пример запроса:

# curl http://api.example.com:8080/nw-api/nws/set_target --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "active": true,
  "target": "http://example.com",
  "scan_proxy": "http://example.com:3128",
  "auth_params": {
    "active": true,
    "url": "/login.php",
    "username_field": "username",
    "username_value": "admin",
    "password_field": "password",
    "password_value": "123456"
  },
  "exclude_modules": [
    "ba", "ca", "lfi", "rce", "rfi", "sde", "sqli", "ssti", "xss"
  ]
}'

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}

Для управления доступны следующие параметры:

Поддерживаемые параметры
Параметр
Описание параметра
target

Адрес веб-приложения в формате schema://domain[:port].

Пример:

{... "target": "http://example.com" ...}

или

{... "target": "https://example.com:443" ...}
scan_proxy

Адрес прокси-сервера (опционально) для обращения к веб-приложению.

Пример:

{... "scan_proxy": "http://proxy.example.com:3128" ...}
auth_params

Опции аутентификации:

  • active — применить параметры аутентификации;
  • url — адрес страницы веб-приложения для выполнения процедуры аутентификации;
  • username_field — название поля для ввода имени пользователя;
  • username_value — имя пользователя;
  • password_field — название для поля ввода пароля пользователя;
  • password_value — пароль пользователя.

Если веб-приложение использует собственные названия полей для ввода имени и пароля пользователя, то их необходимо указать в параметрах username_field и password_field.

exclude_modules

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

Пример:

{... "exclude_modules": ["sqli", "xss", "rce", "lfi", "rfi"] ...}
Сбросить отдельные настройки
Пример запроса:

# curl http://api.example.com:8080/nw-api/nws/set_target --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "set": {
    "target": "http://example.com",
    "scan_proxy": null,
    "auth_params": {
      "active": true,
      "url": null,
      "username_field": null,
      "username_value": null,
      "password_field": null,
      "password_value": null
    },
    "exclude_modules": []
  }
}'

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}
Удалить настройки
Пример запроса:

# curl http://api.example.com:8080/nw-api/nws/del_target --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "target": "%Адрес веб-приложения%"
}'

Пример ответа:

{"status": "success"}

или

{"status": "fail", "description": "%описание ошибки%"}