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, UbuntuCentOS
# 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;\""
Настройте политику 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
CentOS 8 Stream
Установите и настройте СУБД 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
CentOS 9 Stream
Установите и настройте СУБД 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.0/24            md5

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

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

DebianUbuntuCentOSDockerYandex Cloud VM
# 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 && apt upgrade
# apt install nginx python3-pip python3-dev postgresql-server-dev-all python3-venv memcached
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 upgrade
# 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

# 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
# wget -O- https://nemesida-security.com/repo/nw/gpg.key | apt-key add -
# apt update && apt upgrade
# apt install nginx python3.8 python3-pip python3.8-dev postgresql-server-dev-all python3.8-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 upgrade
# apt install nginx python3.10 python3-pip python3.10-dev postgresql-server-dev-all python3.10-venv build-essential memcached 
 # apt install nwaf-api

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

Настройте политику 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
CentOS 8 Stream
Подключите репозиторий и установите пакеты:

# rpm -Uvh https://nemesida-security.com/repo/nw/centos/nwaf-release-centos-8-1-6.noarch.rpm
# dnf update
# dnf install nginx python39 python39-pip python39-devel postgresql-devel gcc memcached
CentOS 9 Stream
Подключите репозиторий и установите пакеты:

# rpm -Uvh https://nemesida-security.com/repo/nw/centos/nwaf-release-centos-9-1-6.noarch.rpm
# dnf update
# dnf install nginx python3 python3-pip python3-devel postgresql-devel gcc memcached
# dnf install nwaf-api

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

Информация об использовании Немезида ВАФ в 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_sys_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/get_dyn_settings?format=json --data 'key=%Лицензионный ключ%'

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

{"nwaf_ip_wl": "127.0.0.1", "nwaf_limit": "nwaf_limit domain=example.com rate=3r/s block_time=300, nwaf_limit rate=5r/s block_time=300", "nwaf_body_exclude": "a.example.com/upload/1/", "nwaf_rfc_violation_lm": "*, .example.com/uploads/uploads.php", "nwaf_rfc_violation_wl": "example.com, *.example.com/uploads/", "nwaf_b64_decode_disable": "example.com z:BODY|URL|ARGS|HEADERS", "status": "success"}

или

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

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

set — параметры настроек в формате JSON.

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

{"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" ...}

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

Пример:

{... "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 не учитывается, блокировка будет производиться при первом срабатывании.

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, 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, 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_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.

Если при записи 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.

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

Если при записи 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.

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

Если при записи 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.

Для зоны 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.

Если при записи 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.

Если при записи 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, 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_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_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.

Если при записи 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.

При значении 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/set_dyn_settings --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "del": "nwaf_ip_wl"
}'

del — параметр настроек в формате JSON.

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

{"status": "success"}

или

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

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

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

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

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

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

{"status": "success", "active": true, "bl": ["10.0.0.1-10.0.0.25", "2.2.2.2", "10.0.0.15 domain=example.com", "domain=example.com 1.1.1.1", "4.4.4.4-5.5.5.5 api=yes", "10.0.0.15", "3.3.3.0/24", "domain=example.com 3.3.3.3-4.4.4.4", "domain=example.com 10.0.0.15", "domain=example.com 3.4.5.6"]}

или

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

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

# curl http://api.example.com:8080/nw-api/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"
    ]
  }
}'

set — параметры настроек в формате JSON.
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": "%описание ошибки%"}
Удалить все IP-адреса
Пример запроса:

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

del — параметр настроек в формате JSON.

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

{"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": "127.0.0.1",
      "ttl": 30,
      "is_banned": true,
      "domain": "1.example.com",
      "timestamp": 1234567890
    },
    {
      "ip-address": "127.0.0.2",
      "ttl": 30,
      "is_banned": true,
      "domain": "2.example.com",
      "timestamp": 1234567891
    },
    {
      "ip-address": "127.0.0.3",
      "ttl": 30,
      "is_banned": true,
      "domain": "DEFAULT",
      "timestamp": 1234567892
    }
  ]
}

или

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

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

Удалить 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/get_dyn_wl?format=json --data 'key=%Лицензионный ключ%'

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

{"status": "success", "wl": [{"mz": "ARGS", "rl_id": "515", "active": true, "domain": "example.com.com", "modify": "2023-06-22T18:55:13.800437", "extension": null, "rid": 20}]}

или

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

# curl http://api.example.com:8080/nw-api/set_dyn_wl --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "add": {
    "rl_id": "1",
    "domain": "example.com",
    "mz": "url",
    "extension": "$URL_X:/test"
  }
}'

add — параметры настроек в формате JSON.

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

{"status": "success", "rid": 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/set_dyn_wl --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "upd": {
    "rid": "20",
    "mz": "URL"
  }
}'

upd — параметры настроек в формате JSON;
rid — ID правила, который генерируется при создании правила исключения.

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

{"status": "success"}

или

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

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

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

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

{"status": "success"}

или

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

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

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

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

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

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

  • ip — IP-адрес атакующего;
  • api — отправлять результат срабатывания правила в модуль Nemesida WAF API;
  • lm — обработка правила в режиме LM (фиксируется срабатывание правила, но запрос не блокируется);
  • noban — со значением false при срабатывании правила запрос будет заблокирован, но счетчик rate параметра nwaf_limit, необходимый для блокировки IP-адреса источника запросов, не будет увеличиваться;
  • no_cookie — со значением true правило применяется только к запросу с пустой зоной Cookie;
  • country — страна;
  • domain — домен;
  • url — вхождение строки в содержимое зоны URL;
  • args — вхождение строки в содержимое зоны ARGS;
  • body — вхождение строки в содержимое зоны BODY;
  • cookies — вхождение строки в содержимое зоны Cookie;
  • ua — вхождение строки в содержимое зоны User-Agent;
  • referer — вхождение строки в содержимое зоны Referer;
  • other_headers — вхождение строки в содержимое зоны HEADERS, за исключением зон Cookie, User-Agent и Referer.

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

Пример:

{... "domain": "base64(*.example.com)" ...}

При таком значении правило будет применяться ко всем поддоменам (a.example.com, b.example.com и т.д.), исключая основной домен example.com. Если значение поля domain пустое, то правило будет применяться ко всем запросам.

Префикс base64 перед параметром означает, что значение параметра при составлении правила необходимо передавать в формате base64. Например: "domain": "base64(*.example.com)" будет выглядеть как "domain": "Ki5leGFtcGxlLmNvbQ=="

Для всех параметров (кроме api,lm, noban и no_cookie) допускается использовать несколько значений в одном параметре, используя логические операторы условий «не» (!), «и» (&), «или» (|). Операторы не имеют приоритета и выполняются по очереди, слева направо.

Пример:

{... "ip": "192.168.61.0/24|192.168.62.0/24" ...}

При таком значении правило будет применяться ко всем IP-адресам из диапазонов 192.168.61.1-192.168.61.255 или 192.168.62.1-192.168.62.255.


Пример:

{... "country": "!base64(RU)&!base64(US)" ...}

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


Пример:

{... "cookie": "!base64(abc)&!base64(def)" ...}

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

При проверке срабатывания расширенного правила блокирования запроса все поля, кроме ip, country, api, lm и noban, проверяются на вхождение содержимого поля из правила блокирования в проверяемое поле запроса. Например, при "url": "base64(/abc)" будет заблокирован запрос с вхождением /abcd в URL.

other_headers

Формат поля:

{... "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 только этого заголовка, а при отсутствии — содержимое всех заголовков.

Пример:

{... "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(example1_header):","base64(example2_header):"] ...}

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


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

Пример:

{... "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/get_dyn_erl?format=json --data 'key=%Лицензионный ключ%'

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

{"status": "success", "erl": [{"id": 100052, "ip": "1.1.1.1|3.3.3.3", "lm": false, "ua": null, "api": true, "url": null, "args": null, "body": null, "noban": false, "active": true, "cookie": null, "domain": null, "modify": "2023-06-28T15:07:46.002211", "country": null, "referer": null, "no_cookie": false, "other_headers": null, "rid": 100052}]}

или

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

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

add — параметры настроек в формате JSON.

# curl http://api.example.com:8080/nw-api/set_dyn_erl --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "add": {
    "ip": "!1.1.1.0/24",
    "domain": "ZXhhbXBsZS5jb20=",
    "active": true
  }
}'

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

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

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

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

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

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

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

Запрос будет заблокирован правилом в случае, если на 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", "rid": 100053}

или

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

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

upd — параметры настроек в формате JSON.

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

{"status": "success"}

или

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

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

del — параметры настроек в формате JSON.

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

{"status": "success"}

или

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

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

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

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

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

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

{"ddos__wl_ip": "10.0.0.2", "ddos__enable": true, "ddos__wl_url": "[\"example.com\"]", "brute__enable": true, "brute__max_val": 10, "ddos__interval": 120, "main__ai_extra": false, "brute__interval": 30, "ddos__latest_only": false, "brute__latest_only": false, "brute__brute_detect": "[\"example.com/index.php\", \"example.by\"]", "brute__flood_detect": "[\"example.com/index.php\", \"example.by\", \"example.com/wp-login.php\"]", "ddos__send_possible": false, "brute__send_possible": false, "openapi__vhosts_list": "[\"example.com\", \"example.ru\"]", "status": "success"}

или

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

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

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

{"status": "success", "vhosts_list": "["example.com", "example.ru"]"}

или

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

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

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

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

{"status": "success"}

или

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

# curl http://api.example.com:8080/nw-api/set_mlc_settings --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "set": {
    "main__ai_extra": "false",
    "brute__interval": "11",
    "brute__brute_detect": [
      "example.com/a1",
      "example.com/b1"
    ],
    "active": true
  }
}'

set — параметры настроек в формате JSON.

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

{"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"] ...}

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

Пример:

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

Пример:

{... "ddos__wl_ip": "127.0.0.1 192.168.1.0/24" ...}
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__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.

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"] ...}
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/set_mlc_settings --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "del": "brute_detect"
}'

del — параметры настроек в формате JSON.

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

{"status": "success"}

или

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

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

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

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

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

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

["example.ru"]

или

[]
Удалить модель для виртуального хоста example.com
Пример запроса:

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

vhost — имя виртуального хоста, для которого необходимо удалить поведенческую модель.

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

{"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/set_training_uri --data 'key=%Лицензионный ключ%&vhost=*.example.com&complete=no'

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

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

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

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

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

{"status": "success"}

или

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

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

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

{'status': 'success', 'duration': 4, 'complete': True, 'progress': 11}

или

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

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

duration — период обучения в днях.

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

{"status": "success"}

или

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

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

complete — статус обучения модели.

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

{"status": "success"}

или

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

# curl http://api.example.com:8080/nw-api/set_training_uri --data 'key=%Лицензионный ключ%&vhost=.example.com&duration=4&complete=no'

Выполнение команды со значением параметра complete=no позволяет запустить процесс переобучения модели, а complete=yes — прерывает процесс обучения.

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

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

{"status": "success"}

или

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

Управление параметрами 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": "example.ru", "schema": null}, {"schema_name": "example.com", "schema": "eyJvcGVuYXBpIjogIjMuMC4xIiwgImluZm8iOilY2lwaGVyT25seSJdfSwgIlg1MDlLZXlVc2FnZUZsYWdzQ3NyRGlmZmVyZW5jZSI6IHsidHlwZSI6ICJvYmplY3QiLCAicHJvcGVydGllcyI6IHsiRXhwZWN0ZWRWYWx1ZSI6IHsiJHJlZiI6ICIjL2NvbXBvbmVudHMvc2NoZW1hcy9YNTA5S2V5VXNhZ2VGbGFncyJ9LCAiQ3NyVmFsdWUiOiB7IiRyZWYiOiAiIy9jb21wb25lbnRzL3NjaGVtYXMvWDUwOUtleVVzYWdlRmxhZ3MifX0sICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlLCAiZGVzY3JpcHRpb24iOiAiXHUwNDFlXHUwNDQyXHUwNDNiXHUwNDM4XHUwNDQ3XHUwNDM4XHUwNDRmIFx1MDQzZlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQ0MFx1MDQzMCBcdTA0MzdcdTA0MzBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0MzAgXHUwNDNkXHUwNDMwIFx1MDQzMlx1MDQ0Ylx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQzYSBcdTA0NDFcdTA0MzVcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDRcdTA0MzhcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzAifX0sICJzZWN1cml0eVNjaGVtZXMiOiB7ImJhc2ljQXV0aCI6IHsidHlwZSI6ICJodHRwIiwgImRlc2NyaXB0aW9uIjogIklucHV0IHlvdXIgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHRvIGFjY2VzcyB0aGlzIEFQSSIsICJzY2hlbWUiOiAiYmFzaWMifX19LCAic2VjdXJpdHkiOiBbeyJiYXNpY0F1dGgiOiBbXX1dLCAic2VydmVycyI6IFt7InVybCI6ICIvIn1dfQ=="}]}

или

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

# curl http://api.example.com:8080/nw-api/set_openapi_schema --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "set": {
    "schema_name": "%Имя спецификации%",
    "schema": "%base64(Спецификация)%"
  }
}'

Для корректной работы в качестве имени спецификации необходимо использовать доменное имя, заданное в спецификации. Например, если в спецификации задан параметр 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/set_openapi_schema --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "set": {
    "schema_name": "%Имя спецификации%",
    "old_name": "%Имя спецификации%"
  }
}'

Для корректной работы в качестве имени спецификации необходимо использовать доменное имя, заданное в спецификации. Например, если в спецификации задан параметр 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": "%Имя спецификации%"
  }
}'

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

{"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 со спецификациями, представленные в виде конечного URL-адреса ресурса (исключая базовый путь) и метода получения доступа к ресурсу (например: GET, POST, PUT, DELETE).

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

{"paths": ["example.com/url_1/", "example.com/url_2"]}

или

{"paths": []}
Исключить 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": ["/test_84/", "/test_85/"]}

или

{"exclude_paths": []}

Управление настройками веб-сервера 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": true,
      "resolver": "127.0.0.1 [::1]:5353 valid=30s",
      "limit_req_zone": [
        "$binary_remote_addr zone=mylimit_1:10m rate=10r/s",
        "$binary_remote_addr zone=mylimit_2:10m rate=10r/s"
      ],
      "real_ip_header": "X-Forwarded-For",
      "resolver_timeout": "30s",
      "set_real_ip_from": [
        "192.168.1.0/24",
        "192.168.2.1"
      ],
      "client_max_body_size": "100m"
    }
  ]
}

или

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

# 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/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": [
    {
      "name": "example.com",
      "root": "/var/www/site",
      "index": "index index.html index.php",
      "active": true,
      "listen": [
        "localhost:80 default_server",
        "[::1]:443 default_server ssl http2"
      ],
      "add_header": {
        "Content-Encoding": "gzip",
        "Content-Type": "text/html; charset=utf-8"
      },
      "error_page": {
        "504": "=200 @bad_gateway",
        "404 502": "=200 /404.html"
      },
      "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
        }
      ],
      "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"
    }
  ]
}

или

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

# curl http://api.example.com:8080/nw-api/nginx/set_vhost --header 'Content-type: application/json' --data '{
  "key": "%Лицензионный ключ%",
  "set": {
    "name": "%Имя конфигурации%",
    "active": true,
    "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/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": "upstream_main",
      "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
        }
      ],
      "balancing_method": "ip_hash"
    }
  ]
}

или

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

# 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/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": "SSL",
      "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURVekNDQWpzQ0ZGei9jNjhLYk9USnlYOWpibWZMbjdmK1YwdWtNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1IOHgKQ3pBSkJnTlZCQVlUQWtGVk1RNHdEQVlEVlFRSURBVkJVMEZGUmpFTk1Bc0dBMVVFQnd3RVQzSmxiREVSTUE4RwpBMVVFQ2d3SVUxTlNSMEZCUldZeERqQU1CZ05WQkFzTUJYTnlaWFJuTVE0d0RBWURWUVFEREFWM1pUUm1aekVlCk1Cd0dDU3FHU0liM0RRRUpBUllQWVdSdGFXNUFZV1J0YVc0dVkyOXRNQjRYRFRJek1EY3hOekV3TlRZME0xb1gKRFRJMk1EUXhNVEV3TlRZME0xb3dUVEVMTUFrR0ExVUVCaE1DUTBFeERUQUxCZ05WQkFnTUJFNXZibVV4Q3pBSgpCZ05WQkFjTUFrNUNNUTB3Q3dZRFZRUUtEQVJPYjI1bE1STXdFUVlEVlFRRERBcGxlR0Z0Y0d4bExuSjFNSUlCCklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFySitBMkZ3cHFjMDhNVnRhVzZKeUsvbDkKQy9NWXFJRXZtRjZvdUt5V01ZRWFGMmlPK0l2VG1pN2hETkxQakR2ekhKRHJMYTZycjhJMkdMN0Nxdi9tdkN5NQpKZVBaSVZxeU9PQ0NLUEJFVXFrUkl4NUwvQ0hLMnVieHlxL1ZIWUExRysxanVqNzNINXZqUHM4anRyeFFNVG5OCkNacVBycmdoOTRlU0ViRmpER2JyZGlGSFpURmwyT01QdTlBVEJoRjF3dStwYS8yN3BJVm91S21BTnVTa0pTaUoKM29wRTkzZFJDYkUvWVhoTjJKTlNjdmdzcjBVbXBRd2t5VDJ4bGVKbHV0Sm5PZkZiK1NsdWFHVlloOUtncEwrcQorN2x3MFk0OEtYNnJGeXUzNko1RjBxNUN6T1hoMS9BZWFneStJQTdGanVSOU9tTFEvQVlwSGE1QmZMK0Fid0lECkFRQUJNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUNnV1VGTVZrMkVSaHF3WGpBT0YxVCt1cWZJM3pKZkVrTHAKYlZieW90d2dRMnZPU2VZdlAyU1dqdjZCMDExZEFONWNYTUIvOFhOVEdhdUNSajN1cEtTTUtvd1JaY1hjdUlKMApocUNDc01JZGw1bDFBQVFJWCtPTTJTeEpKdHVRK0dkWlhkQ294RStzN20zSHNCQ3UwbWRzY3doU0hGSnRmbXRhCit6eFJ4VmY5QkU3NDJSUE5ydXNFZmxwdVQ2Rm14QkpMUy9WYzVLOWtQMngwdjZQTjZYMUF4M09vRGhrQ3Nma2cKeXpwSFhtK3J1ZWJmcnNvcFdwUzJBM083T09CRk1lTVhZeHl3WjJUR2hmanh3R3ZGZml0ZnhFNnpTUnZnQ1A5WQphaUM5RUlMSXpodUdDNDFXNFFZYTJBUzNoaVF4Qms0eDcyeGZ1cXpmc212OE5Zd0lzY3BxCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K",
      "certificate_key": "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2QUlCQURBTioqKioqSjIyTmViTm5pVlE9PQotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tCg=="
    }
  ]
}

или

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

# 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/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": "dhparam",
      "dhparam": "LS0tLS1CRUdJTiBESCBQQVJBTUVURVJTLS0tLS0KTUlHSEFvR0JBTyoqKioqV2N1TkFEYkFnRUMKLS0tLS1FTkQgREggUEFSQU1FVEVSUy0tLS0tCg=="
    }
  ]
}

или

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

# 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/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",
    "error"
  ],
  "ip": [
    "1.1.1.1",
    "2.2.2.2"
  ],
  "uuid": [
    "198be506d69ba8a9bdbcf87b22ef5bc",
    "198be506d69ba8a9bdbcf87b22ef5bb"
  ],
  "agent": [
    "dyn",
    "mlc"
  ],
  "category": [
    "auth",
    "settings"
  ]
}'

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

  • startTime — начальная дата в формате Unix Timestamp, за который будет запрошена информация;
  • endTime — конечная дата в формате Unix Timestamp, за который будет запрошена информация;
  • limit — максимальное количество выводимых записей;
  • offset — смещение для вывода последующих записей;
  • level — уровень серьезности сообщения;
  • ip — IP-адрес сервера, где установлен компонент;
  • uuid — идентификатор сервера, где установлен компонент;
  • agent — название компонента;
  • category — категория события.

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

{
  "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,
    2,
    3,
    7,
    9
  ],
  "ip": [
    "1.1.1.1",
    "2.2.2.2",
    "3.3.3.3"
  ],
  "cc": [
    "RU",
    "US",
    "UK"
  ],
  "vhost": [
    "example.com",
    "api.example.com",
    "shop.example.com"
  ]
}'

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

  • startTime и endTime — начальная и конечная дата в формате Unix Timestamp, за который будет запрошена информация;
  • limit — максимальное количество выводимых записей;
  • offset — смещение для вывода последующих записей. При значении 0 и значении limit 100 будут выводиться записи с порядковым номером 1-100, при значении 1 — записи с порядковым номером 101-200 и т.д. Использование параметра без указания максимального количества выводимых записей (limit) невозможно.
  • btидентификатор блокировки;
  • ip — IP-адрес;
  • cc — код страны;
  • vhost — виртуальный хост, доменное имя.

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

{
  "status": "success",
  "count": "1234",
  "waf_id": "1234567890",
  "attacks": [
    {
      "id": 1,
      "timestamp": 1677211703,
      ...
      "description": "%данные в открытом виде%",
      "long_description": "%данные в открытом виде%"
    },
    {
      "id": 2,
      "timestamp": 1234567891,
      ...
      "description": "%данные в открытом виде%",
      "long_description": "%данные в открытом виде%"
    },
    ...
  ]
}

или

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

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

Опциональные параметры:
startTime и endTime — начальная и конечная дата в формате Unix Timestamp, за который будет запрошена информация.

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

{
  "status": "success",
  "bt": [
    {
      "bt": 1,
      ...
      "period": 14
    },
    {
      "bt": 2,
      ...
      "period": 14
    }
  ],
  "ip": [
    {
      "ip": "1.1.1.1",
      ...
      "period": 14
    },
    {
      "ip": "2.2.2.2",
      ...
      "period": 14
    }
  ],
  "cc": [
    {
      "cc": "RU",
      ...
      "period": 14
    },
    {
      "cc": "US",
      ...
      "period": 14
    }
  ],
  "vhost": [
    {
      "vhost": "example.com",
      ...
      "period": 14
    }
  ]
}

или

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

period — количество событий по каждому bt/сс/vhost/ip за выбранный период;
btидентификатор блокировки;
ip — IP-адрес;
cc — код страны;
vhost — виртуальный хост, доменное имя.

Если период, за который необходимо получить данные, не задан параметрами startTime и endTime, то информация будет выводиться за последние 24 часа, 7 и 30 дней.

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

{
  "status": "success",
  "bt": [
    {
      "bt": 1,
      ...
      "lastDay": 1,
      "last7Days": 13,
      "last30Days": 84
    },
    {
      "bt": 2,
      ...
      "lastDay": 1,
      "last7Days": 13,
      "last30Days": 84
    }
  ],
  "ip": [
    {
      "ip": "1.1.1.1",
      ...
      "lastDay": 1,
      "last7Days": 13,
      "last30Days": 84
    },
    {
      "ip": "2.2.2.2",
      ...
      "lastDay": 1,
      "last7Days": 13,
      "last30Days": 84
    }
  ],
  "cc": [
    {
      "cc": "RU",
      ...
      "lastDay": 1,
      "last7Days": 13,
      "last30Days": 84
    },
    {
      "cc": "US",
      ...
      "lastDay": 1,
      "last7Days": 13,
      "last30Days": 84
    }
  ],
  "vhost": [
    {
      "vhost": "example.com",
      ...
      "lastDay": 1,
      "last7Days": 13,
      "last30Days": 84
    }
  ]
}

или

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

btидентификатор блокировки;
ip — IP-адрес;
cc — код страны;
vhost — виртуальный хост, доменное имя.

Управление настройками 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": 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", "ssrf", "ssti", "xss"
      ]
    },
    {
      "active": true,
      "target": "https://1.example.com"
      ...
    }
  ]
}

или

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

# 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": "%описание ошибки%"}