Руководство по установке, настройке и эксплуатации модуля Nemesida WAF API, предназначенного для:
- приема информации об атаках и выявленных уязвимостях;
- управления поведенческими моделями;
- получения статистики об атаках и централизованного сбора и обработки журналов всех компонентов Немезида ВАФ;
- управления настройками Немезида ВАФ и веб-сервера Nginx;
- управления настройками сканера уязвимостей Nemesida WAF Scanner.
- Установка и настройка модуля Nemesida WAF API
- Интеграция модуля Nemesida WAF API
- Управление настройками Немезида ВАФ
- Общие сведения
- Настройка фильтрующей ноды
- Управление списком заблокированных IP-адресов
- Управление списком автоматически заблокированных IP-адресов
- Правила исключения сигнатур
- Расширенные правила блокировки запросов
- Настройка Nemesida AI MLC
- Управление поведенческими моделями
- Корректировка поведенческой модели
- Управление настройками веб-сервера Nginx
- Сборщик событий работы компонентов Немезида ВАФ
- Получение информации об атаках
- Управление настройками Nemesida WAF Scanner
Доменное имя
api.example.com
используется в качестве примера обозначения сервера с установленным модулем Nemesida WAF API.
Для установки Nemesida WAF API необходимо выполнить следующие действия:
1. Установите и настройте СУБД PostgreSQL:
1. Загрузите скрипт;
2. Запустите скрипт установки командой:
# /bin/bash ./2-api-deploy.sh 'pg_srv_ip=%PostgreSQL server address%' 'pg_srv_port=%PostgreSQL port%' 'pg_api_pwd=%Password%' 'api_proxy=%Proxy server address%'
где:
pg_srv_ip
— IP-адрес сервера с БДwaf
;pg_srv_port
— порт сервера с БДwaf
;pg_api_pwd
— пароль пользователяnw_api
для БДwaf
;api_proxy
— (Опционально) IP-адрес прокси сервера для доступа компонента к внешним ресурсам (например,http://proxy.example.com:3128
).
# apt update && apt upgrade # apt install postgresql
Создайте БД, пользователя и пароль для подключения модуля Nemesida WAF API:
# su - postgres -c "psql -c \"CREATE DATABASE waf;\"" # su - postgres -c "psql -c \"CREATE ROLE nw_api PASSWORD 'YOUR_PASSWORD';\"" # su - postgres -c "psql -c \"GRANT ALL ON DATABASE waf TO nw_api;\"" # su - postgres -c "psql -c \"ALTER ROLE nw_api WITH LOGIN;\"" # su - postgres -c "psql waf -c \"GRANT ALL ON ALL TABLES IN SCHEMA public TO nw_api;\"" # su - postgres -c "psql waf -c \"GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO nw_api;\"" # su - postgres -c "psql waf -c \"GRANT CREATE ON SCHEMA public TO nw_api;\""
Если БД используется на отдельном сервере, то необходимо предоставить к ней доступ. Для этого внесите изменения в файл конфигурации PostgreSQL pg_hba.conf
.
Пример:
# IPv4 local connections: host all all 10.1.1.1/32 md5
# setenforce 0
после чего приведите файл /etc/selinux/config
к виду:
# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of three two values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted
Установите и настройте СУБД PostgreSQL:
# dnf update # dnf install postgresql-devel postgresql-server # postgresql-setup initdb # sed -i "s|host all all 127.0.0.1/32 ident|host all all 127.0.0.1/32 md5|" /var/lib/pgsql/data/pg_hba.conf # sed -i "s|host all all ::1/128 ident|host all all ::1/128 md5|" /var/lib/pgsql/data/pg_hba.conf # systemctl start postgresql # systemctl enable postgresql
Создайте БД, пользователя и пароль для подключения модуля Nemesida WAF API:
# su - postgres -c "psql -c \"CREATE DATABASE waf;\"" # su - postgres -c "psql -c \"CREATE ROLE nw_api PASSWORD 'YOUR_PASSWORD';\"" # su - postgres -c "psql -c \"GRANT ALL ON DATABASE waf TO nw_api;\"" # su - postgres -c "psql -c \"ALTER ROLE nw_api WITH LOGIN;\"" # su - postgres -c "psql waf -c \"GRANT ALL ON ALL TABLES IN SCHEMA public TO nw_api;\"" # su - postgres -c "psql waf -c \"GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO nw_api;\"" # su - postgres -c "psql waf -c \"GRANT CREATE ON SCHEMA public TO nw_api;\""
Если БД используется на отдельном сервере, то необходимо предоставить к ней доступ. Для этого внесите изменения в файл конфигурации PostgreSQL pg_hba.conf
.
Пример:
# IPv4 local connections: host all all 10.1.1.1/32 md5
2. Установите модуль:
Перед установкой модуля обязательно проверьте доступ к созданной БД, произведя подключение к ней командой:
psql -h <server_ip> -U nw_api waf
. При подключении введите пароль пользователяnw_api
.
1. Загрузите скрипт;
2. Запустите скрипт установки командой:
# /bin/bash ./2-api-deploy.sh 'pg_srv_ip=xxx' 'pg_srv_port=xxx' 'pg_api_pwd=x.x.x.x' 'api_proxy=xxx:xx'
где:
pg_srv_ip
— IP-адрес сервера с БДwaf
;pg_srv_port
— порт сервера с БДwaf
;pg_api_pwd
— пароль пользователяnw_api
для БДwaf
;api_proxy
— (Опционально) IP-адрес прокси сервера для доступа компонента к внешним ресурсам.
Установите пакеты:
# apt install apt-transport-https gnupg2 curl
Подключите репозиторий Немезида ВАФ:
# 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
# echo "deb https://nemesida-security.com/repo/nw/debian bookworm nwaf" > /etc/apt/sources.list.d/NemesidaWAF.list # curl -s https://nemesida-security.com/repo/nw/gpg.key | gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/trusted.gpg --import # chmod 644 /etc/apt/trusted.gpg.d/trusted.gpg # apt update
Установите пакеты:
# apt install nginx python3-pip python3-dev postgresql-server-dev-all python3-venv memcached # apt install nwaf-api
Во время установки модуля дополнительно устанавливаются следующие pip-пакеты:
flask func-timeout netaddr psycopg2-binary pymemcache pyopenssl cryptography python-decouple requests validators pandas pyarrow jsonref
# apt install apt-transport-https gnupg2 curl
Подключите репозиторий Немезида ВАФ и установите пакеты:
# echo "deb [arch=amd64] https://nemesida-security.com/repo/nw/ubuntu focal non-free" > /etc/apt/sources.list.d/NemesidaWAF.list # curl -s https://nemesida-security.com/repo/nw/gpg.key | gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/trusted.gpg --import # chmod 644 /etc/apt/trusted.gpg.d/trusted.gpg # apt update # apt install nginx python3.9 python3-pip python3.9-dev postgresql-server-dev-all python3.9-venv build-essential memcached
# echo "deb [arch=amd64] https://nemesida-security.com/repo/nw/ubuntu jammy non-free" > /etc/apt/sources.list.d/NemesidaWAF.list # curl -s https://nemesida-security.com/repo/nw/gpg.key | gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/trusted.gpg --import # chmod 644 /etc/apt/trusted.gpg.d/trusted.gpg # apt update # apt install nginx python3 python3-pip python3-dev postgresql-server-dev-all python3-venv build-essential memcached
# echo "deb [arch=amd64] https://nemesida-security.com/repo/nw/ubuntu noble nwaf" > /etc/apt/sources.list.d/NemesidaWAF.list # curl -s https://nemesida-security.com/repo/nw/gpg.key | gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/trusted.gpg --import # chmod 644 /etc/apt/trusted.gpg.d/trusted.gpg # apt update # apt install nginx python3 python3-pip python3-dev postgresql-server-dev-all python3-venv build-essential memcached
Установите пакеты:
# apt install nwaf-api
Во время установки модуля дополнительно устанавливаются следующие pip-пакеты:
flask func-timeout netaddr psycopg2-binary pymemcache pyopenssl cryptography python-decouple requests validators pandas pyarrow jsonref
Подключите репозиторий Немезида ВАФ, приведя файл /etc/yum.repos.d/NemesidaWAF.repo
к виду:
[NemesidaWAF] name=Nemesida WAF Packages for RHEL baseurl=https://nemesida-security.com/repo/nw/rhel/$releasever/$basearch/ gpgkey=https://nemesida-security.com/repo/nw/gpg.key enabled=1 gpgcheck=1
Установите пакеты:
# dnf install epel-release # dnf update # dnf install nginx python39 python39-devel python39-setuptools python39-pip postgresql-devel gcc memcached
# dnf install epel-release # dnf update # dnf install nginx python3 python3-devel python3-setuptools python3-pip postgresql-devel gcc memcached
Установите пакеты:
# dnf install nwaf-api
Во время установки модуля дополнительно устанавливаются следующие pip-пакеты:
flask func-timeout netaddr psycopg2-binary pymemcache pyopenssl cryptography python-decouple requests validators pandas pyarrow jsonref
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.
При использовании скрипта автоматической установки редактирование файла не требуется.
Пример:
PROXY = 'http://proxy.example.com:3128'
Допускается использование параметров аутентификации при использовании прокси-сервера.
Пример:
PROXY = 'http://<user>:<password>@proxy.example.com:3128'
DB_PORT
DB_NAME
DB_USER
DB_PASS
Параметр активируется на одном из серверов с установленным модулем Nemesida WAF API для повышения отказоустойчивости в случаях, если другой сервер с установленным модулем Nemesida WAF API будет недоступен.
Активация параметра включает в себя репликацию PostgeSQL.
MEMCACHED_PORT
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.
1. На сервере с фильтрующей нодой внесите изменения в конфигурационный файл /etc/nginx/nwaf/conf/global/nwaf.conf
, приведя параметры к виду:
nwaf_api_proxy http://proxy.example.com:3128; nwaf_api_conf host=http://api.example.com:8080/nw-api/;
где api.example.com:8080/nw-api/
— адрес и порт сервера, на котором установлен модуль Nemesida WAF API, а http://proxy.example.com:3128
— адрес прокси-сервера для обращения к Nemesida WAF API.
2. На сервере с установленным модулем Nemesida AI MLC внесите изменения в конфигурационный файл /opt/mlc/mlc.conf
, приведя параметры к виду:
api_uri = http://api.example.com:8080/nw-api/ api_proxy = http://proxy.example.com:3128
3. На сервере с установленным модулем Nemesida WAF Scanner внесите изменения в конфигурационный файл /opt/nws/main.conf
, приведя параметры к виду:
api_host = http://api.example.com:8080/nw-api/ api_proxy = http://proxy.example.com:3128
4. После внесения изменений необходимо перезапустить сервисы или перезагрузить сервер.
🔗 Общие сведения
Используя вызовы API, можно управлять настройками Немезида ВАФ:
- настройками фильтрующей ноды;
- настройками Nemesida AI MLC;
- настройками API Firewall;
- поведенческими моделями;
- синхронизацией между серверами настроек фильтрующей ноды и Nemesida AI MLC;
- правилами исключения сигнатур и расширенными правилами блокировки.
Управление настройками осуществляется с помощью специально составленных запросов. Каждый запрос должен содержать лицензионный ключ установленной копии Немезида ВАФ.
🔗 Настройка фильтрующей ноды
Позволяет управлять настройками фильтрующей ноды. Поддерживает следующие команды управления:
# curl http://api.example.com:8080/nw-api/v2/get_dyn_settings --data 'key=%Лицензионный ключ%'
Формат ответа:
{ "status": "success", "active": boolean, "nwaf_limit": [string, ...], "nwaf_ip_wl": [string, ...], "nwaf_ip_lm": [string, ...], "nwaf_geoip_mla_disable": [string, ...], "nwaf_host_wl": [string, ...], "nwaf_host_lm": [string, ...], "nwaf_url_wl": [string, ...], "nwaf_rfc_violation_wl": [string, ...], "nwaf_rfc_violation_lm": [string, ...], "nwaf_b64_decode_disable": [string, ...], "nwaf_mla_host_lm": [string, ...], "nwaf_ai_extra_host_wl": [string, ...], "nwaf_ai_extra_host_lm": [string, ...] "nwaf_bf_detect_host_lm": [string, ...], "nwaf_ddos_detect_host_lm": [string, ...], "nwaf_rmq_host_exclude": [string, ...], "nwaf_body_exclude": [string, ...], "nwaf_body_bin_exclude": [string, ...], "nwaf_post_body_exclude": [string, ...], "nwaf_put_body_exclude": [string, ...], "nwaf_openapi_ip_wl": [string, ...], "nwaf_openapi_ip_lm": [string, ...], "nwaf_openapi_url_wl": [string, ...], "nwaf_openapi_url_lm": [string, ...] }
или
{"status": "fail", "description": "%описание ошибки%"}
Пример ответа:
{ "status": "success", "active": true, "nwaf_limit": ["domain=example.com rate=5r/m block_time=600", ...], "nwaf_ip_wl": ["127.0.0.1", ...], "nwaf_ip_lm": ["127.0.0.1", ...], "nwaf_geoip_mla_disable": ["example.com", ...], "nwaf_host_wl": ["example.com", ...], "nwaf_host_lm": ["example.com", ...], "nwaf_url_wl": ["example.com/uploads.php", ...], "nwaf_rfc_violation_wl": ["*.example.com/login/index.php", ...], "nwaf_rfc_violation_lm": ["*.example.com/login/index.php", ...], "nwaf_b64_decode_disable": ["example.com/uploads/ z:BODY|URL", ...], "nwaf_mla_host_lm": ["example.com", ...], "nwaf_ai_extra_host_wl": ["example.com", ...], "nwaf_ai_extra_host_lm": ["example.com", ...] "nwaf_bf_detect_host_lm": ["example.com", ...], "nwaf_ddos_detect_host_lm": ["example.com", ...], "nwaf_rmq_host_exclude": ["example.com", ...], "nwaf_body_exclude": ["example.com/uploads.php", ...], "nwaf_body_bin_exclude": ["example.com/uploads.php", ...], "nwaf_post_body_exclude": ["example.com", ...], "nwaf_put_body_exclude": ["example.com", ...], "nwaf_openapi_ip_wl": ["127.0.0.1", ...], "nwaf_openapi_ip_lm": ["127.0.0.1", ...], "nwaf_openapi_url_wl": ["example.com/uploads.php", ...], "nwaf_openapi_url_lm": ["example.com/uploads.php", ...] }
# curl http://api.example.com:8080/nw-api/v2/set_dyn_settings --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "set": { "active": true, "nwaf_limit": ["domain=example.com rate=5r/m block_time=600", ...], "nwaf_ip_wl": ["127.0.0.1", ...], "nwaf_ip_lm": ["127.0.0.1", ...], "nwaf_geoip_mla_disable": ["example.com", ...], "nwaf_host_wl": ["example.com", ...], "nwaf_host_lm": ["example.com", ...], "nwaf_url_wl": ["example.com/uploads.php", ...], "nwaf_rfc_violation_wl": ["*.example.com/login/index.php", ...], "nwaf_rfc_violation_lm": ["*.example.com/login/index.php", ...], "nwaf_b64_decode_disable": ["example.com/uploads/ z:BODY|URL", ...], "nwaf_mla_host_lm": ["example.com", ...], "nwaf_ai_extra_host_wl": ["example.com", ...], "nwaf_ai_extra_host_lm": ["example.com", ...] "nwaf_bf_detect_host_lm": ["example.com", ...], "nwaf_ddos_detect_host_lm": ["example.com", ...], "nwaf_rmq_host_exclude": ["example.com", ...], "nwaf_body_exclude": ["example.com/uploads.php", ...], "nwaf_body_bin_exclude": ["example.com/uploads.php", ...], "nwaf_post_body_exclude": ["example.com", ...], "nwaf_put_body_exclude": ["example.com", ...], "nwaf_openapi_ip_wl": ["127.0.0.1", ...], "nwaf_openapi_ip_lm": ["127.0.0.1", ...], "nwaf_openapi_url_wl": ["example.com/uploads.php", ...], "nwaf_openapi_url_lm": ["example.com/uploads.php", ...] } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
Для управления доступны следующие параметры:
Устанавливает лимит заблокированных запросов. При превышении допустимого количества запросов, определенного опцией rate
, IP-адрес будет заблокирован на время (в секундах), указанное в block_time
.
Пример:
{... "nwaf_limit": ["rate=5r/m block_time=600"] ...}
Параметр domain
является опциональным и требуется только для установки лимита заблокированных запросов для конкретного домена. Для этого необходимо привести параметр к виду: nwaf_limit rate=... block_time=... domain=...
. Допускается использовать строгое соответствие и wildcard-значения: *
, example.com
, .example.com
, *.example.com
.
Пример:
{... "nwaf_limit": ["domain=example.com rate=5r/m block_time=600"] ...}
Для параметра domain
допускается использовать строгое соответствие и wildcard-значения: example.com
, .example.com
, *.example.com
, *
.
Условия срабатывания опции выбираются на основе следующего порядка приоритета значений параметра domain
от высшего к низшему:
example.com
— срабатывание опции для домена;.example.com
— срабатывание опции для доменаexample.com
и его поддоменов;*.example.com
— срабатывание опции только для поддоменов доменаexample.com
, исключая основной домен;*
— срабатывание опции для всех доменов.
Если задать несколько опций:
{... "nwaf_limit": ["domain=.example.comrate=5r/m block_time=600", "domain=*.example.com rate=15r/m block_time=600"] ...}
то при обращении на web.example.com
для блокирования IP-адреса будет достаточно заблокировать 5
запросов за минуту, а не 15
т.к. .example.com
имеет больший приоритет.
Для установки разных лимитов для разных доменов необходимо указать параметры для каждого из них.
Пример:
{... "nwaf_limit": ["domain=a.example.com rate=5r/m block_time=300", "domain=example.com rate=5r/m block_time=300"] ...}
или
{... "nwaf_limit": ["rate=10r/m block_time=600", "domain=example.com rate=5r/m block_time=300"] ...}
В последнем примере будут установлены лимиты на 5
блокировок в минуту для домена example.com
(с последующей блокировкой IP-адреса атакующего на 300 секунд), а также лимиты на 10
блокировок в минуту для всех остальным доменов (с последующей блокировкой IP-адреса атакующего на 600 секунд).
При выявлении атак методом перебора (BT 7), флуда (BT 9) и DDoS (BT 10) параметр rate
не учитывается, блокировка будет производиться при первом срабатывании.
Для корректного применения опции не допускаются следующие варианты ее применения:
1. Применение опции для одного домена с разными значениями rate
и block_time
.
Пример:
{... "nwaf_limit": ["domain=example.com rate=50r/m block_time=600", "domain=example.com rate=15r/s block_time=1500"] ...}
2. Одновременное добавление значений опции с параметром domain=*
и без него.
Пример:
{... "nwaf_limit": ["domain=* rate=5r/m block_time=300", "rate=5r/m block_time=300"] ...}
Деактивация механизма анализа запроса средствами Немезида ВАФ для конкретного IP-адреса или подсети.
Пример:
{... "nwaf_ip_wl": ["127.0.0.1", "192.168.0.1"] ...}
При использовании "nwaf_ip_wl": "domain=example.com 127.0.0.1"
механизм анализа будет деактивирован только при обращении с конкретного IP-адреса на конкретный домен. Значение domain
является опциональным. Допускается использовать строгое соответствие и wildcard-значения: *
, example.com
, .example.com
, *.example.com
. Допускается использование IPv4/IPv6 адресов, в том числе использование CIDR (например, x.x.x.x/24) и диапазона IP-адресов.
Пример:
{... "nwaf_ip_wl": ["127.0.0.1", "192.168.61.0/24", "domain=example.com 192.168.61.1-192.168.61.255"] ...}
Для снижения количества ложных срабатываний рекомендуется указывать статический IP-адрес пользователей (администраторов, контент-менеджеров, редакторов) в параметре nwaf_ip_wl
. Запросы, попадающие под действие параметра не будут блокироваться, передаваться в RabbitMQ, и, как результат, анализироваться модулем Nemesida AI. При использовании параметра будьте предельно осторожны.
Настройка обработки запросов для конкретного IP-адреса или подсети с фиксацией в СУБД, но без фактической блокировки (режим мониторинга).
Пример:
{... "nwaf_ip_lm": ["127.0.0.1", "192.168.0.1"] ...}
При использовании "nwaf_ip_lm": "domain=example.com 127.0.0.1"
пропуск будет производиться только при обращении с конкретного IP-адреса на конкретный домен. Значение domain
является опциональным. Допускается использовать строгое соответствие и wildcard-значения: *
, example.com
, .example.com
, *.example.com
. Допускается использование IPv4/IPv6 адресов, в том числе использование CIDR (например, x.x.x.x/24) и диапазона IP-адресов.
Пример:
{... "nwaf_ip_lm": ["127.0.0.1", "192.168.61.0/24", "domain=example.com 192.168.61.1-192.168.61.255"] ...}
Допускается использование IPv6 и IPv4-адресов.
Определение географического местоположения на основе IP-адреса производится за счет обращения к онлайн GeoIP
-базе, если информация об IP-адресе не была получена из файла /etc/nginx/nwaf/conf/global/cc.json
. В случае ошибки или невозможности ее использования запрос на определение передается в модуль Nemesida AI MLA. Для запросов, попадающих под действие параметра, определение географического местоположения с использованием Nemesida AI MLA будет деактивировано.
Пример:
{... "nwaf_geoip_mla_disable": ["example.com"] ...}
Допускается использовать строгое соответствие и wildcard-значения: *
, example.com
, .example.com
, *.example.com
.
Пример использования нескольких значений:
{... "nwaf_geoip_mla_disable": ["example.com", "*.example.com"] ...}
Деактивация механизма анализа запроса средствами Немезида ВАФ для виртуального хоста. При параметре nwaf_host_wl *
пропуск будет производиться для всех виртуальных хостов.
Пример использования одного значения:
{... "nwaf_host_wl": ["*"] ...}
или
{... "nwaf_host_wl": ["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": ["example.com"] ...}
или
{... "nwaf_host_lm": ["*.example.com"] ...}
Пример использования нескольких значений:
{... "nwaf_host_lm": ["example.com", "a.example.com"] ...}
или
{... "nwaf_host_lm": ["example.com", "*.example.com"] ...}
Деактивация механизма анализа запроса средствами Немезида ВАФ для URL-адреса. При значении параметра *
деактивация будет производиться при обращении на любой URL-адрес.
Пример:
{... "nwaf_url_wl": ["*"] ...}
или
{... "nwaf_url_wl": ["example.com/login/*"] ...}
или
{... "nwaf_url_wl": ["*.example.com/login/index.php"] ...}
При значении example.com/login/*
будет учитываться вхождение URL-адреса, например, example.com/login/ааааа
или example.com/login/bbbbb
.
Пример использования нескольких значений:
{... "nwaf_url_wl": ["example.com/login/*", "*.example.com/login/index.php"] ...}
Если при записи URL-адреса необходимо использовать знак *
в качестве обычного символа, то необходимо выполнить его экранирование, например, запись example.com/admin/uploads/aa\\*a
будет соответствовать example.com/login/aa*a
.
Деактивация механизма блокирования запроса средствами Немезида ВАФ для URL-адреса при несоответствии RFC.
Пример:
{... "nwaf_rfc_violation_wl": ["*"] ...}
или
{... "nwaf_rfc_violation_wl": ["example.com"] ...}
или
{... "nwaf_rfc_violation_wl": ["example.com/login/*"] ...}
или
{... "nwaf_rfc_violation_wl": ["*.example.com/login/index.php"] ...}
При значении example.com/login/*
будет учитываться вхождение URL-адреса, например, example.com/login/ааааа
или example.com/login/bbbbb
.
При значении example.com
деактивация будет производиться для всех URL-адресов виртуального хоста example.com
.
При параметре *
деактивация будет производиться для всех виртуальных хостов.
Пример использования нескольких значений:
{... "nwaf_rfc_violation_wl": ["example.com", "*.example.com/login/index.php"] ...}
Если при записи URL-адреса необходимо использовать знак *
в качестве обычного символа, то необходимо выполнить его экранирование, например, запись example.com/admin/uploads/aa\\*a
будет соответствовать example.com/admin/uploads/aa*a
.
Настройка обработки запросов для виртуального хоста или URL-адреса с фиксацией в СУБД, но без фактической блокировки (режим мониторинга) при несоответствии RFC.
Пример:
{... "nwaf_rfc_violation_lm": ["*"] ...}
или
{... "nwaf_rfc_violation_lm": ["example.com"] ...}
или
{... "nwaf_rfc_violation_lm": ["example.com/login/*"] ...}
или
{... "nwaf_rfc_violation_lm": ["*.example.com/login/index.php"] ...}
При значении example.com/login/*
будет учитываться вхождение URL-адреса, например, example.com/login/ааааа
или example.com/login/bbbbb
.
При значении example.com
обработка запросов в режиме мониторинга будет производиться для всех URL-адресов виртуального хоста example.com
.
При значении *
обработка запросов в режиме мониторинга будет производиться для всех виртуальных хостов.
Пример использования нескольких значений:
{... "nwaf_rfc_violation_lm": ["example.com", "*.example.com/login/index.php"] ...}
Если при записи URL-адреса необходимо использовать знак *
в качестве обычного символа, то необходимо выполнить его экранирование, например, запись example.com/admin/uploads/aa\\*a
будет соответствовать example.com/admin/uploads/aa*a
.
Параметр деактивирует дополнительное Base64
-декодирование содержимого зон ARGS
, BODY
, URL
, HEADERS
при сигнатурном анализе запросов перед его передачей в модуль Nemesida AI MLA для дополнительного анализа. Если запрос содержит сигнатуры в явном виде, он будет передан в Nemesida AI MLA. Если запрос содержит сигнатуры, закодированные в Base64
в одной из выбранных зон, запрос не будет передан в Nemesida AI MLA.
Пример:
{... "nwaf_b64_decode_disable": ["*.example.com z:BODY|URL|ARGS|HEADERS"] ...}
или
{... "nwaf_b64_decode_disable": ["example.com/uploads/ z:BODY|URL"] ...}
или
{... "nwaf_b64_decode_disable": ["z:HEADERS"] ...}
При применении параметра учитывается точное совпадение пути (vhost/path).
Для записи домена допускается использовать строгое соответствие и wildcard-значения: *
, example.com
, .example.com
, *.example.com
.
Пример использования нескольких значений:
{... "nwaf_b64_decode_disable": ["*.example.com z:BODY|URL|ARGS|HEADERS", "example.com z:BODY|URL"] ...}
Для зоны URL
рекомендуется отключать Base64
-декодирование, чтобы исключить избыточную отправку запросов в Nemesida AI MLA, приводящую к повышенному потреблению аппаратных ресурсов сервера.
Параметр, активирующий режим 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"] ...}
Параметр, активирующий режим 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"] ...}
Параметр, активирующий режим 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"] ...}
Параметр, активирующий режим 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"] ...}
Параметр, активирующий режим 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"] ...}
Параметр, исключающий отправку некоторых запросов на сервер 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"] ...}
Параметр, исключающий анализ зоны BODY
, а также отправку её содержимого в модули Nemesida AI MLA, Nemesida AI MLC и модуль ClamAV. Опция полезна, если нет возможности изменить значение параметра client_body_buffer_size
в файле /etc/nginx/nginx.conf
.
Пример:
{... "nwaf_body_exclude": ["*"] ...}
или
{... "nwaf_body_exclude": ["*.example.com/uploads.php"] ...}
или
{... "nwaf_body_exclude": ["example.com/admin/*"] ...}
При значении example.com/admin/*
будет учитываться вхождение URL-адреса, например, example.com/admin/ааааа
или example.com/admin/bbbbb
.
Пример использования нескольких значений:
{... "nwaf_body_exclude": ["*", "*.example.com/admin/*"] ...}
Если при записи URL-адреса необходимо использовать знак *
в качестве обычного символа, то необходимо выполнить его экранирование символами \\
, например, запись example.com/admin/uploads/aa\\*a
будет соответствовать example.com/admin/uploads/aa*a
.
При значении *
исключение анализа зоны BODY
будет применяться для любого адреса.
Параметр, исключающий анализ бинарного содержимого зоны BODY
, а также его отправку в модули Nemesida AI MLA и Nemesida AI MLC.
Пример:
{... "nwaf_body_bin_exclude": ["*"] ...}
или
{... "nwaf_body_bin_exclude": ["*.example.com/uploads.php"] ...}
или
{... "nwaf_body_bin_exclude": ["example.com/admin/*"] ...}
При значении example.com/admin/*
будет учитываться вхождение URL-адреса, например, example.com/admin/ааааа
или example.com/admin/bbbbb
.
Пример использования нескольких значений:
{... "nwaf_body_bin_exclude": ["*", "*.example.com/uploads.php"] ...}
Если при записи URL-адреса необходимо использовать знак *
в качестве обычного символа, то необходимо выполнить его экранирование символами \\
, например, запись example.com/admin/uploads/aa\\*a
будет соответствовать example.com/admin/uploads/aa*a
.
При значении *
исключение анализа зоны BODY
будет применяться для любого адреса.
Параметр, исключающий анализ сигнатурным методом содержимого зоны BODY
для POST
-запросов, а также отправку содержимого зоны в модули Nemesida AI MLA и Nemesida AI MLC. Опция полезна при взаимодействии с веб-приложениями ownCloud
или аналогичными, позволяющими клиенту производить загрузку файла на сервер по протоколу HTTP.
Пример:
{... "nwaf_post_body_exclude": ["*"] ...}
или
{... "nwaf_post_body_exclude": ["example.com"] ...}
или
{... "nwaf_post_body_exclude": "*.example.com" ...}
{... "nwaf_post_body_exclude": ["*.example.com"] ...}
Пример использования нескольких значений:
{... "nwaf_post_body_exclude": ["example.com", "a.example.com"] ...}
или
{... "nwaf_post_body_exclude": ["example.com", "*.example.com"] ...}
Допускается использовать строгое соответствие и wildcard-значения: *
, example.com
, .example.com
, *.example.com
.
Параметр, исключающий анализ сигнатурным методом содержимого зоны 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
.
Нелегитимные запросы, поступающие с определенного IP-адреса и попадающие под действие параметра, не фиксируются в журналах и не блокируются при анализе запроса на соответствие его спецификации в формате OpenAPI.
Допускается использование IPv4/IPv6 адресов, в том числе использование CIDR (например, x.x.x.x/24
) и диапазона IP-адресов.
Пример:
{... "nwaf_openapi_ip_wl": ["10.0.0.1"] ...}
или
{... "nwaf_openapi_ip_wl": ["domain=*.example.com 10.0.0.1"] ...}
Значение domain
является опциональным.
Допускается использовать строгое соответствие и wildcard-значения: *
, example.com
, .example.com
, *.example.com
.
Пример использования нескольких значений:
{... "nwaf_openapi_ip_wl": ["10.0.0.1", "domain=*.example.com 10.0.0.1"] ...}
Нелегитимные запросы, поступающие с определенного IP-адреса и попадающие под действие параметра, фиксируются в журналах, но не блокируются при анализе запроса на соответствие его спецификации в формате OpenAPI.
Допускается использование IPv4/IPv6 адресов, в том числе использование CIDR (например, x.x.x.x/24
) и диапазона IP-адресов.
Пример:
{... "nwaf_openapi_ip_lm": ["10.0.0.1"] ...}
или
{... "nwaf_openapi_ip_lm": ["domain=*.example.com 10.0.0.1"] ...}
Значение domain
является опциональным.
Допускается использовать строгое соответствие и wildcard-значения: *
, example.com
, .example.com
, *.example.com
.
Пример использования нескольких значений:
{... "nwaf_openapi_ip_lm": ["10.0.0.1", "domain=*.example.com 10.0.0.1"] ...}
Нелегитимные запросы, поступающие на определенный URL-адрес и попадающие под действие параметра, не фиксируются в журналах и не блокируются при анализе запроса на соответствие его спецификации в формате OpenAPI.
Пример:
{... "nwaf_openapi_url_wl": ["*"] ...}
или
{... "nwaf_openapi_url_wl": ["example.com/admin/*"] ...}
или
{... "nwaf_openapi_url_wl": ["example.com/admin/admin.php"] ...}
Для записи домена допускается использовать строгое соответствие и wildcard-значения: *
, example.com
, .example.com
, *.example.com
.
При значении example.com/admin/*
будет учитываться вхождение URL-адреса, например, example.com/admin/ааааа
или example.com/admin/bbbbb
.
Пример использования нескольких значений:
{... "nwaf_openapi_url_wl": ["*.example.com/admin/*", "example.com/admin/admin.php"] ...}
Если при записи URL-адреса необходимо использовать знак *
в качестве обычного символа, то необходимо выполнить его экранирование символами \\
, например, запись example.com/admin/uploads/aa\\*a
будет соответствовать example.com/admin/uploads/aa*a
.
При значении *
параметр будет применяться для любого URL-адреса.
Нелегитимные запросы, поступающие на определенный URL-адрес и попадающие под действие параметра, фиксируются в журналах, но не блокируются при анализе запроса на соответствие его спецификации в формате OpenAPI.
Пример:
{... "nwaf_openapi_url_lm": ["*"] ...}
или
{... "nwaf_openapi_url_lm": ["example.com/admin/*"] ...}
или
{... "nwaf_openapi_url_lm": ["example.com/admin/admin.php"] ...}
Для записи домена допускается использовать строгое соответствие и wildcard-значения: *
, example.com
, .example.com
, *.example.com
.
Пример использования нескольких значений:
{... "nwaf_openapi_url_lm": ["*.example.com/admin/*", "example.com/admin/admin.php"] ...}
При значении example.com/admin/*
будет учитываться вхождение URL-адреса, например, example.com/admin/ааааа
или example.com/admin/bbbbb
.
Если при записи URL-адреса необходимо использовать знак *
в качестве обычного символа, то необходимо выполнить его экранирование символами \\
, например, запись example.com/admin/uploads/aa\\*a
будет соответствовать example.com/admin/uploads/aa*a
.
При значении *
параметр будет применяться для любого URL-адреса.
Пример запроса:
# curl http://api.example.com:8080/nw-api/get_dyn_settings_hash --data 'key=%Лицензионный ключ%'
Пример ответа:
{'status': 'success', 'hash': '8ddd2b342d3190a866ee35afb249919a'}
# curl http://api.example.com:8080/nw-api/v2/set_dyn_settings --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "del": "" }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
🔗 Управление списком заблокированных IP-адресов
Функционал позволяет создавать списки для блокировки запросов на основе IP-адреса источника запроса.
# curl http://api.example.com:8080/nw-api/v2/get_dyn_bl --data 'key=%Лицензионный ключ%'
Формат ответа:
{ "status": "success", "active": boolean, "modify": integer, "bl": [string, ...] }
или
{"status": "fail", "description": "%описание ошибки%"}
Пример ответа:
{ "status": "success", "active": true, "modify": 1719335019, "bl": ["domain=example.com 1.1.1.1 api=yes", ...] }
# curl http://api.example.com:8080/nw-api/v2/set_dyn_bl --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "set": { "active": true, "bl": [ "domain=example.com 1.1.1.1", "2.2.2.2", "3.3.3.0/24", "4.4.4.4-5.5.5.5 api=yes" ] } }'
api=yes
— параметр отправки событий о блокировках при обращении с указанного IP-адреса(ов) в Nemesida WAF API.
Запросы с IP-адреса 1.1.1.1
будут заблокированы только для домена example.com
. Обращения с IP-адресов 2.2.2.2
, 3.3.3.0/24
и 4.4.4.4-5.5.5.5
будут блокироваться для всех доменов, включая example.com
.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
Пример запроса:
# curl http://api.example.com:8080/nw-api/get_dyn_bl_hash --data 'key=%Лицензионный ключ%'
Пример ответа:
{'status': 'success', 'hash': '8ddd2b342d3190a866ee35afb249919a'}
# curl http://api.example.com:8080/nw-api/v2/set_dyn_bl --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "del": "" }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
🔗 Управление списком автоматически заблокированных IP-адресов
Функционал позволяет управлять списком автоматически заблокированных IP-адресов для всех фильтрующих нод.
# curl http://api.example.com:8080/nw-api/get_dyn_sync_ban --data 'key=%Лицензионный ключ%'
Формат ответа:
{ "status": "success", "ban_data": [ { "ip-address": string, "ttl": integer, "is_banned": boolean, "domain": string, "timestamp": integer }, ... ] }
или
{"status": "fail", "description": "%описание ошибки%"}
ip-address
— IP-адрес;
ttl
— оставшееся время блокировки в секундах;
is_banned
— параметр указывает, заблокирован ли IP-адрес;
domain
— виртуальный хост (доменное имя), обращения к которому блокируются для IP-адреса. DEFAULT
означает, что для IP-адреса блокируются обращения на любой виртуальный хост;
timestamp
— дата добавления IP-адреса в список в формате Unix Timestamp
.
Пример ответа:
{ "status": "success", "ban_data": [ { "ip-address": "127.0.0.1", "ttl": 30, "is_banned": true, "domain": "example.com", "timestamp": 1730871907 }, ... ] }
# curl http://api.example.com:8080/nw-api/del_dyn_sync_ban --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "ip-address": "127.0.0.1" }'
ip-address
— IP-адрес для удаления в формате IPv4/IPv6. Допускается использование *
для удаления всех IP-адресов.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
🔗 Правила исключения сигнатур
Позволяет настроить правила исключения сигнатур. С помощью созданного правила исключения нельзя исключить срабатывание расширенного правила блокирования запросов. Поддерживает следующие команды управления:
# curl http://api.example.com:8080/nw-api/v2/get_dyn_wl --data 'key=%Лицензионный ключ%'
Формат ответа:
{ "status": "success", "wl": [ { "active": boolean, "modify": integer, "id": integer, "mz": string, "rl_id": string, "domain": string, "extension": string } ] }
или
{"status": "none"}
Пример ответа:
{ "status": "success", "wl": [ { "active": true, "modify": 1719335019, "id": 1, "mz": "ARGS", "rl_id": "1", "domain": "example.com", "extension": "$URL:/api/users/index.php|$BODY_X:id=[a-z0-9]+" } ] }
# curl http://api.example.com:8080/nw-api/v2/set_dyn_wl --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "add": { "active": true, "rl_id": "1", "domain": "example.com", "mz": ["url", "args"], "extension": ["$URL:/api/users/index.php", "$BODY_X:id=[a-zA-Z0-9]+"] } }'
Пример ответа:
{"status": "success", "id": 20}
или
{"status": "fail", "description": "%описание ошибки%"}
Для управления доступны следующие параметры:
Параметр активирует/деактивирует правило исключения.
Пример:
{... "active": true ...}
ID сигнатуры, к которой применяется правило исключения. При использовании значения *
правило исключения будет применяться ко всем сигнатурам. Обязательный параметр.
Пример:
{... "rl_id": "1" ...}
или
{... "rl_id": "*" ...}
domain
допускается использовать строгое соответствие и wildcard-значения: *
, example.com
, .example.com
, *.example.com
. Обязательный параметр.
Пример:
{... "domain": "example.com" ...}
или
{... "domain": "*" ...}
Зона применения правила. Обязательный параметр.
Для применения сигнатуры к нескольким зонам используйте разделитель: «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"] ...}
Дополнительное условие (уточнение) применения правила.
Уточнение применяется в виде вхождения заданного шаблона. Несколько уточнений взаимодействуют между собой по принципу логического «и» (&
) (для срабатывания правила обязательно выполнение основного условия и всех добавленных уточнений). В уточнениях допускается использование регулярных выражений, используя постфикс _X
. Например, регулярное выражение $Cookie_X:id=[a-z0-9]+
, применяется в зоне уточнения Cookie
и будет означать, что дополнительным условием срабатывания правила исключения будет наличие строки (например, id=abcd07dj45rff
) в зоне Cookie
, согласно шаблону регулярного выражения.
Пример:
{... "extension": ["$BODY:abc|$Cookie_X:id=[a-z0-9]+"] ...}
Необдуманное добавление правил исключения сигнатуры небезопасно и может привести к пропускам атак. Поэтому рекомендуется максимально конкретизировать условия срабатывания правила, используя уточнения.
# curl http://api.example.com:8080/nw-api/v2/set_dyn_wl --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "upd": { "id": 20, "mz": ["url"] } }'
id
— ID правила, который генерируется при создании правила исключения.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
Пример запроса:
# curl http://api.example.com:8080/nw-api/get_dyn_wl_hash --data 'key=%Лицензионный ключ%'
Пример ответа:
{'status': 'success', 'hash': '8ddd2b342d3190a866ee35afb249919a'}
# curl http://api.example.com:8080/nw-api/v2/set_dyn_wl --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "del": { "id": 8 } }'
id
— ID правила, который генерируется при создании правила исключения.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
🔗 Расширенные правила блокировки запросов
Механизм расширенных правил блокирования запросов позволяет при составлении персональных правил использовать дополнительные условия для более точного результата. Например, можно составить правило, по которому запрос будет заблокирован если:
- соответствует географическому местоположению на основе IP-адреса (определение страны по IP-адресу атакующего);
- происходит обращение на определенный домен или URL;
- содержит определенный заголовок (например,
User-Agent
,Cookie
,Referer
и т.д.) и/или содержимое этих заголовков.
Для более точного результата параметры можно комбинировать между собой. В таком случае правило сработает только в случае соответствия всех условий.
Поддерживает следующие команды управления:
# curl http://api.example.com:8080/nw-api/v2/get_dyn_erl --data 'key=%Лицензионный ключ%'
Формат ответа:
{ "status": "success", "erl": [ { "active": boolean "id": integer, "ip": string, "lm": boolean, "ua": string, "api": boolean, "url": string, "args": string, "body": string, "noban": boolean, "cookie": string, "domain": string, "modify": integer, "country": string, "referer": string, "block_tor": boolean, "no_cookie": boolean, "block_proxy": boolean, "other_headers": string } ] }
или
{"status": "fail", "description": "%описание ошибки%"}
Пример ответа:
{ "status": "success", "erl": [ { "active": true, "modify": 1730973337, "id": 100048, "ip": "127.0.0.1", "lm": true, "ua": "TW96aWxsYSA1LzA=", "api": true, "url": "L3VzZXJzL2xvZ2luLnBocA==", "args": "VVJM", "body": "c29tZV90ZXh0", "noban": true, "cookie": "aWQ9YW5ubWszNDU0R2Fmbmo2", "domain": "ZXhhbXBsZS5jb20=", "country": "UlU=|VVM=", "referer": "aHR0cDovL2V4YW1wbGUuY29t", "block_tor": true, "no_cookie": false, "block_proxy": true, "other_headers": "dXNlcl9JRA==:|YWRtaW4=|YWRtaW5pc3RyYXRvcg==" } ] }
# curl http://api.example.com:8080/nw-api/v2/set_dyn_erl --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "add": { "active": true, "ip": ["|1.1.1.1"], "lm": true, "ua": ["|TW96aWxsYSA1LzA="], "api": true, "url": ["L3VzZXJzL2xvZ2luLnBocA=="], "args": ["VVJM"], "body": ["|dGVzdF9ib2R5"], "noban": true, "cookie": ["|aWQ9YW5ubWszNDU0R2Fmbmo2"], "domain": ["|example.com"], "country": ["|RU", "|US"], "referer": ["|aHR0cDovL2V4YW1wbGUuY29t"], "block_tor": true, "no_cookie": false, "block_proxy": true, "other_headers": ["dXNlcl9JRA==:|YWRtaW4=|YWRtaW5pc3RyYXRvcg=="] } }'
# curl http://api.example.com:8080/nw-api/v2/set_dyn_erl --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "add": { "active": true, "ip": ["|!1.1.1.0/24"], "domain": ["&example.com"], } }'
Запрос будет заблокирован, если на example.com
поступит запрос c любого IP-адреса, кроме 1.1.1.1-1.1.1.255
.
Из-за особенностей обработки запросов функционал не предназначен для работы с большим количеством IP-адресов. Если необходимо блокировать обращения для списка IP-адресов — воспользуйтесь функционалом добавления IP-адреса в список «Заблокированные IP».
# curl http://api.example.com:8080/nw-api/v2/set_dyn_erl --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "add": { "active": true, "ip": ["|1.1.1.1"], "domain": ["|example.com"], "other_headers": ["dGVzdC1oZWFkZXI=:YWJj"] } }'
Запрос будет заблокирован правилом в случае, если на example.com
поступит запрос с IP-адреса 1.1.1.1
и заголовок test-header
содержит строку abc
.
# curl http://api.example.com:8080/nw-api/v2/set_dyn_erl --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "add": { "active": true, "сountry": ["|RU", "|CH"], "domain": ["|example.com"], "other_headers": ["dGVzdC1oZWFkZXI=:YWJj"], "cookie": ["|!dGVzdF9jb29raWU="], "referer": ["|!aHR0cDovL2V4YW1wbGUuY29t"] } }'
Запрос будет заблокирован правилом в случае, если на example.com
поступит запрос с IP-адреса из региона RU
или CH
, заголовок test-header
содержит строку abc
, заголовок Cookie
не содержит строку test_cookie
и заголовок Referer
не содержит http://example.com
.
# curl http://api.example.com:8080/nw-api/v2/set_dyn_erl --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "add": { "active": true, "ip": ["|1.1.1.1"], "other_headers": ["VGVzdC1GaWVsZA==:"], "referer": ["|aHR0cDovL2V4YW1wbGUuY29tLw=="], "ua": ["|TW96aWxsYS81LjA="], "cookie": ["|dGVzdF9jb29raWU="], "body": ["|YmM9MyZjYz0x"], "args": ["|P3BhZ2U9Mw=="], "url": ["|aW50ZXJuYWx0ZXN0"], "domain": ["|example.com"], "api": false, "country": ["|RU", "|CH"] } }'
Запрос будет заблокирован правилом в случае, если на example.com
поступит запрос c IP-адреса 1.1.1.1
из региона RU
или CH
, который будет содержать:
- заголовок
Referer
с содержимымhttp://example.com/
; - заголовок
Test-Field
с любым содержимым; - заголовок
User-Agent
с содержимымMozilla/5.0
; - заголовок
Cookie
с содержимымtest_cookie
; - содержимое тела запроса
bc=3&cc=1
; - аргумент запроса
?page=3
.
Пример ответа:
{"status": "success", "id": 100053}
или
{"status": "fail", "description": "%описание ошибки%"}
Для управления доступны следующие параметры:
Параметр активирует/деактивирует правило.
Пример:
{... "active": true ...}
IP-адрес атакующего, при обращении с которого будет применяться правило к запросу.
Допускается использование IPv4/IPv6 адресов, в том числе использование CIDR (например, x.x.x.x/24
) и диапазона IP-адресов.
Пример:
{... "ip": ["|1.1.1.1"] ...}
или
{... "ip": ["|1.1.1.1", "|2.2.2.2-3.3.3.3", "|10.0.0.0/24"] ...}
Страна, определяемая на основе GeoIP-данных, откуда поступает запрос в формате двухбуквенного кода страны. При использовании значения, RU
к запросам с Российского IP-адреса будет применяться правило на основе GeoIP-данных об IP-адресе.
Пример:
{... "country": ["|RU", "|US"] ...}
Имя виртуального хоста, при обращении к которому будет применяться правило.
Допускается использовать строгое соответствие и wildcard-значения: *
, example.com
, .example.com
, *.example.com
.
Пример:
{... "domain": ["|example.com", "|*.example.ru"] ...}
Вхождение строки в содержимое зоны URL
, при котором будет применяться правило к запросу.
Значение для параметра передается в формате Base64
.
Пример:
{... "url": ["|aW50ZXJuYWx0ZXN0", "|YWRtaW4vdXBsb2FkLnBocA==" ] ...}
Вхождение строки в содержимое зоны ARGS
, при котором будет применяться правило к запросу.
Значение для параметра передается в формате Base64
.
Пример:
{... "args": ["|P3BhZ2U9Mw==", "|dXNlcj1hZG1pbg=="] ...}
Вхождение строки в содержимое зоны BODY
, при котором будет применяться правило к запросу.
Значение для параметра передается в формате Base64
.
Пример:
{... "body": ["|dGVzdF9ib2R5", "|dXNlcj1hZG1pbg=="] ...}
Вхождение строки в содержимое зоны Cookie
, при котором будет применяться правило к запросу.
Значение для параметра передается в формате Base64
.
Пример:
{... "cookie": ["|UEhQU0VTU0lE", "|dGVzdF9jb29raWU="] ...}
Для корректного применения правила запрещено одновременно использовать опции
cookie
иno_cookie
.
Cо значением true
правило применяется только к запросу с пустой зоной Cookie
.
Пример:
{... "no_cookie": true ...}
Для корректного применения правила запрещено одновременно использовать опции
cookie
иno_cookie
.
Вхождение строки в содержимое зоны User-Agent
, при котором будет применяться правило к запросу.
Значение для параметра передается в формате Base64
.
Пример:
{... "ua": ["|TW96aWxsYS81LjA=", "|TW96aWxsYS81LjQ="] ...}
Вхождение строки в содержимое зоны Referer
, при котором будет применяться правило к запросу.
Значение для параметра передается в формате Base64
.
Пример:
{... "referer": ["|aHR0cDovL2V4YW1wbGUuY29t", "|aHR0cDovL3dlYi5leGFtcGxlLmNvbQ=="] ...}
Вхождение строки в содержимое зоны HEADERS
, за исключением зон Cookie
, User-Agent
и Referer
при котором будет применяться правило к запросу.
Значения названия заголовка и содержимого заголовка передается в формате Base64
.
Пример:
{... "other_headers": ["aGVhZGVyX25hbWU=:YWJj", "dGVzdC1oZWFkZXI=:YWJj"] ...}
Для поля other_headers
содержимое секций header_name
и header_value
являются опциональными, но необходимо указать хотя бы одну из секций. Например, при наличии заголовка header_name
будет проверяться содержимое header_value
только заголовка header_name
, а при отсутствии — содержимое всех заголовков.
Все элементы списка взаимодействуют друг с другом по принципу логического «и» (&
).
Если header_name
задан без header_value
, то применение правила произойдет при любом значении заголовка header_name
(блокировка по наличию заголовка).
Пример:
{... "other_headers": ["aGVhZGVyX25hbWU=:"] ...}
Более подробная информация доступна в соответствующем разделе руководства.
Параметр активирует срабатывание правила для IP-адресов, которые являются выходным узлом сети Tor
.
Допускается применение опции без других параметров.
Пример:
{... "block_tor": true ...}
Параметр активирует срабатывание правила для IP-адресов, которые являются Proxy
/VPN
-сервисом или выходным узлом сети Tor выходным узлом сети Tor
.
Допускается применение опции без других параметров.
Пример:
{... "block_proxy": true ...}
Cо значением true
срабатывание правила будет добавлено в отчет об атаках.
Пример:
{... "api": true ...}
Cо значением true
срабатывание правила фиксируются в журналах, но не блокируются (режим мониторинга).
Пример:
{... "lm": true ...}
Cо значением true
срабатывание правила не будет увеличивать счетчик rate
условия автоматической блокировки IP-адреса.
Пример:
{... "noban": true ...}
Для всех параметров (кроме параметров, поддерживающих значения true
/false
) допускается использовать несколько значений в одном параметре, используя логические операторы условий «не» (!
), «и» (&
), «или» (|
). Операторы не имеют приоритета и выполняются по очереди, слева направо.
При проверке срабатывания расширенного правила блокирования запроса все поля, кроме ip
, country
, api
, lm
, noban
, block_tor
и block_proxy
, проверяются на вхождение содержимого поля из правила блокирования в проверяемое поле запроса.
Например, при "url": ["base64(/abc)"]
будет заблокирован запрос с вхождением /abcd
в URL
.
Срабатывание правила производится только в случае выполнения всех условий, указанных в правиле, иначе запрос будет пропущен.
other_headers
позволяет задать заголовок и его содержимое для проверки соответствия в запросе (за исключением заголовков Cookie
, User-Agent
и Referer
).
Формат опции:
{... "other_headers": ["base64(header_name):base64(header_value)", "base64(header_name):base64(header_value)" ...] ...}
base64(header_name)
— название заголовка в base64
;
base64(header_value)
— значение заголовка в base64
.
Для опции other_headers
содержимое секций base64(header_name)
и base64(header_value)
являются опциональными, но необходимо задать хотя бы одну из секций. Например, при наличии заголовка header_name
будет проверяться содержимое header_value
только заголовка header_name
, а при отсутствии — содержимое всех заголовков.
Все элементы списка взаимодействуют друг с другом по принципу логического «и» (&
).
Пример:
{... "other_headers": ["base64(example1_header):", "base64(example2_header):"] ...}
При таком значении запрос будет заблокирован при одновременном наличии заголовков example1_header
и example2_header
с любыми значениями.
Каждый элемент списка не может содержать больше 1 названия заголовка, но каждое название заголовка может иметь несколько значений, которые разделяются логическими операторами условий «не» (!
), «и» (&
), «или» (|
).
Пример:
{... "other_headers": ["base64(example_header):base64(abcd)"] ...}
При таком значении запрос будет заблокирован при наличии abcd
в заголовке example_header
.
Пример:
{... "other_headers": [":base64(abcd)"] ...}
При таком значении запрос будет заблокирован при наличии abcd
в любом заголовке.
Если base64(header_name)
указан без последующего значения, то блокирование запроса произойдет при любом значении заголовка header_name
(блокировка по наличию заголовка).
Пример:
{... "other_headers": ["base64(example_header):"] ...}
Пример:
{... "other_headers": ["base64(example1_header):base64(abc)", "base64(example2_header):base64(def)"] ...}
При таком значении запрос будет заблокирован при наличии заголовков example1_header
, который содержит abc
и example2_header
, который содержит def
.
Для имени заголовка допустимо применение логического оператора !!
, означающего отсутствие заголовка с таким именем в запросе. Блокирование запроса сработает в том случае, если среди всех заголовков запроса отсутствует заголовок с указанным именем. При этом, значение заголовка игнорируется, даже если присутствует в правиле.
Пример:
{... "other_headers": ["!!base64(example_header):"] ...}
Пример:
{... "other_headers": ["base64(example_header):base64(abc)&base64(def)"] ...}
При таком значении запрос будет заблокирован при наличии заголовка example_header
, который содержит abc
и def
.
Пример:
{... "other_headers": ["base64(example_header):!base64(abc)"] ...}
При таком значении запрос будет заблокирован при наличии заголовка example_header
, который не содержит abc
.
Пример:
{... "other_headers": ["base64(example_header):!base64(a)&!base64(b)&!base64(c)"] ...}
При таком значении запрос будет заблокирован при наличии заголовка example_header
, который не содержит a
, b
и c
.
Пример:
{... "other_headers": ["base64(example_header):!base64(a)|base64(b)"] ...}
При таком значении запрос будет заблокирован при наличии заголовка example_header
, который не содержит a
или содержит b
.
# curl http://api.example.com:8080/nw-api/v2/set_dyn_erl --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "upd": { "active": true, "id": 1, "ip": ["|1.1.1.1"] } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
Пример запроса:
# curl http://api.example.com:8080/nw-api/get_dyn_erl_hash --data 'key=%Лицензионный ключ%'
Пример ответа:
{'status': 'success', 'hash': '8ddd2b342d3190a866ee35afb249919a'}
# curl http://api.example.com:8080/nw-api/v2/set_dyn_erl --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "del": { "id": 1 } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
🔗 Настройка Nemesida AI MLC
Позволяет управлять настройками модуля Nemesida AI MLC. Поддерживает следующие команды управления:
# curl http://api.example.com:8080/nw-api/v2/get_mlc_settings --data 'key=%Лицензионный ключ%'
Формат ответа:
{ "status": "success", "active": boolean, "modify": integer, "main__ai_extra": boolean, "openapi__vhosts_list": [string, ...], "ddos__enable": boolean, "ddos__wl_ip": [string, ...], "ddos__wl_url": [string, ...], "ddos__interval": integer, "ddos__latest_only": boolean, "ddos__send_possible": boolean, "brute__enable": boolean, "brute__wl_ip": [string, ...], "brute__wl_host": [string, ...], "brute__brute_detect": [string, ...], "brute__flood_detect": [string, ...], "brute__bf_detect": [object, ...], "brute__interval": integer, "brute__max_val": integer, "brute__latest_only": boolean, "brute__send_possible": boolean }
или
{"status": "fail", "description": "%описание ошибки%"}
Пример ответа:
{ "status": "success", "active": true, "modify": 1719335019, "main__ai_extra": true, "openapi__vhosts_list": ["example.com", ...], "ddos__enable": true, "ddos__wl_ip": ["127.0.0.1", ...], "ddos__wl_url": ["example.com/feed", ...], "ddos__interval": 120, "ddos__latest_only": true, "ddos__send_possible": true, "brute__enable": true, "brute__wl_ip": ["127.0.0.1", ...], "brute__wl_host": ["example.com", ...], "brute__brute_detect": ["example.com/auth", ...], "brute__flood_detect": ["example.com/auth", ...], "brute__bf_detect": [{"url": "*", "brute": true, "flood": false, "zone": ["args", "body"], "condition": {"body": ["auth_form", "user_login"]}}, ...], "brute__interval": 30, "brute__max_val": 10, "brute__latest_only": true, "brute__send_possible": true }
# curl http://api.example.com:8080/nw-api/v2/set_mlc_settings --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "set": { "active": true, "main__ai_extra": true, "openapi__vhosts_list": ["example.com", ...], "ddos__enable": true, "ddos__wl_ip": ["127.0.0.1", ...], "ddos__wl_url": ["example.com/feed", ...], "ddos__interval": 120, "ddos__latest_only": true, "ddos__send_possible": true, "brute__enable": true, "brute__wl_ip": ["127.0.0.1", ...], "brute__wl_host": ["example.com", ...], "brute__brute_detect": ["example.com/auth", ...], "brute__flood_detect": ["example.com/auth", ...], "brute__bf_detect": [{"url": "*", "brute": true, "flood": false, "zone": ["args", "body"], "condition": {"body": ["auth_form", "user_login"]}}, ...], "brute__interval": 30, "brute__max_val": 10, "brute__latest_only": true, "brute__send_possible": true } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
Для управления доступны следующие параметры:
Активация/деактивация функционала дополнительного анализа запросов, позволяющего выявлять пропущенные атаки и производить временное блокирование их источника по IP-адресу. При неактивном функционале дополнительного анализа все незаблокированные запросы будут включены в обучающую выборку (за исключением запросов, попадающих под действие режима WL
, или нелегитимных запросов, попавших под действия режима LM
).
Пример:
{... "main__ai_extra": true ...}
Параметр задает список виртуальных хостов, для которых будут созданы спецификации в формате OpenAPI
.
Пример:
{... "openapi__vhosts_list": ["example.com", "example.ru"] ...}
Для записи виртуального хоста допускается использовать строгое соответствие и wildcard-значения: *
, example.com
, .example.com
, *.example.com
.
Пример:
{... "ddos__enable": true ...}
x.x.x.x/24
). Каждое последующее значение указывается через пробел.
Пример:
{... "ddos__wl_ip": ["1.1.1.1", "1.1.1.0/24", "1.1.1.0-1.1.2.254"] ...}
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": 120 ...}
При удалении параметра будет установлено значение по умолчанию — 120
секунд.
false
в Nemesida WAF API передаются все заблокированные запросы по каждому IP-адресу.
Пример:
{... "ddos__latest_only": true ...}
Possible DDoS
. При значении false
запросы в Nemesida WAF API передаваться не будут.
Пример:
{... "ddos__send_possible": true ...}
Приставка Possible
добавляется к названию атаки в том случае, если её тип не был достоверно установлен.
Пример:
{... "brute__enable": true ...}
example.com
, .example.com
, *.example.com
.
Пример:
{... "brute__wl_host": ["example.com", ".example.org", "*.example.us"] ...}
x.x.x.x/24
). Каждое последующее значение указывается через пробел.
Пример:
{... "brute__wl_ip": ["1.1.1.1", "1.1.1.0/24", "1.1.1.0-1.1.2.254"] ...}
Пример:
{... "brute__interval": 30 ...}
При удалении параметра будет установлено значение по умолчанию — 30
секунд.
Пример:
{... "brute__max_val": 10 ...}
При удалении параметра будет установлено значение по умолчанию — 10
запросов.
vhost/path
, где path
— вхождение адреса ресурса на веб-сервере. Для виртуального хоста допускается использование строгого соответствия и wildcard-значения: example.com
, .example.com
, *.example.com
.
Пример:
{... "brute__brute_detect": ["example.com/auth", ".example.com/auth"] ...}
или
{... "brute__brute_detect": ["*.example.com/auth"] ...}
Таким образом, при установленном значении example.com/auth
, мониторинг атак методом перебора будет производиться как для example.com/auth
, так и для example.com/auth/reset_password
.
Параметр применяется для выявления атак методом перебора, но не блокирует повторяющиеся запросы с одинаковым содержимым в зонах ARGS
или BODY
.
Использовать значения без указания URL-адреса конкретного ресурса (например, example.com
или example.com/
) запрещено в целях обеспечения корректной работы опции.
brute_detect
функционал, но предназначен для выявления попыток флуда или аналогичных атак с повторением запроса. Единственное различие заключается в том, что в процессе анализа запросов, попадающих под действие параметра flood_detect
, не происходит удаление дублей.
Таким образом, в случае повторной отправки идентичных запросов (например, множественные попытки восстановления пароля по СМС), запросы, имеющие схожее содержание и попадающие под действие параметра flood_detect
, не будут удалены, в отличие от запросов, имеющие схожее содержание, но попадающих под действие параметра brute_detect
.
Пример:
{... "brute__flood_detect": ["example.com/auth", ".example.com/auth"] ...}
или
{... "brute__flood_detect": ["*.example.com/auth"] ...}
Использовать значения без указания URL-адреса конкретного ресурса (например, example.com
или example.com/
) запрещено в целях обеспечения корректной работы опции.
vhost/path
, где path
— вхождение адреса ресурса на веб-сервере. Для виртуального хоста допускается использование строгого соответствия и wildcard-значения: example.com
, .example.com
, *.example.com
.
Также поддерживаются дополнительные опции для более гибкой настройки условия запуска механизма анализа.
zone
— позволяет задать зону анализа (ARGS
, BODY
). Механизм анализа будет запущен только в том случае, если в выбранной зоне присутствуют значения из списка опции condition
.
Пример:
"zone": ["args", "body"]
При пустом значении анализ будет активирован для обеих зон.
condition
— позволяет задать список полей, наличие которых обязательно в выбранной зоне HTTP-запроса (согласно значению опции zone
) для попадания запроса в выборку, используемую механизмом анализа. Значения опции сочетаются по принципу логического «и» (&
).
Пример:
{..."zone": ["body"], "condition": ["auth_form", "user_login"]...}
означает, что механизм анализа запросов будет активирован только для запросов, где в зоне BODY
будут присутствовать поля auth_form
и user_login
с любыми значениями.
Пример:
{... "brute__bf_detect" :[{"url": "*", "brute": true, "flood": false, "zone": ["args", "body"], "condition": {"body": ["auth_form", "user_login"]}} ...}
Пример использования нескольких значений:
{..."brute__bf_detect" :[{"url": "*", "brute": true, "flood": false, "zone": ["body"], "condition": {"body": ["auth_form", "user_login"]}}, {"url": "example.com/abc", "brute": false, "flood": true, "zone": ["args", "body"], "condition": {"body": ["auth_form", "user_login"]}}]...}
false
в Nemesida WAF API передаются все заблокированные запросы по каждому IP-адресу.
Пример:
{... "brute__latest_only": true ...}
Possible Brute force/Possible Flood
. При значении false
запросы в Nemesida WAF API передаваться не будут.
Пример:
{... "brute__send_possible": true ...}
Приставка Possible
добавляется к названию атаки в том случае, если её тип не был достоверно установлен.
Пример запроса:
# curl http://api.example.com:8080/nw-api/get_mlc_settings_hash --data 'key=%Лицензионный ключ%'
Пример ответа:
{'status': 'success', 'hash': '8ddd2b342d3190a866ee35afb249919a'}
# curl http://api.example.com:8080/nw-api/v2/set_mlc_settings --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "del": "" }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
🔗 Управление поведенческими моделями
Некорректное обучение поведенческих моделей или значительные изменения в веб-приложении могут привести ко множеству ложных срабатываний. Для повышения точности определения атак рекомендуется выполнять переобучение моделей раз в неделю. Команды ниже позволяют производить действия над моделями.
# curl http://api.example.com:8080/nw-api/v2/get_vhosts_list --data 'key=%Лицензионный ключ%'
Формат ответа:
{ "status": "success", "vhosts_list": [string, ...] }
Пример ответа:
{ "status": "success", "vhosts_list": ["example.com", ...] }
# curl http://api.example.com:8080/nw-api/v2/set_vhosts_list --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "vhosts_list": ["example.com", "example.org"] }'
vhosts_list
— список виртуальных хостов, для которых будут созданы и применены модели.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
При создании списка виртуальных хостов допускается использование wildcard-значений. Модель применяется в следующем порядке приоритета от высшего к низшему:
example.com
— построение и применение модели для домена;.example.com
— построение и применение модели для доменаexample.com
и его поддоменов;*.example.com
— построение и применение модели только для поддоменов доменаexample.com
, исключая основной домен;*
— построение и применение модели для всех доменов.
# curl http://api.example.com:8080/nw-api/v2/get_models_list_uri --data 'key=%Лицензионный ключ%'
Формат ответа:
{ "status": "success", "models": [string, ...] }
Пример ответа:
{ "status": "success", "models": ["example.com", ...] }
# curl http://api.example.com:8080/nw-api/v2/del_models_uri --header "Content-type: application/json" --data '{ "key": "%Лицензионный ключ%", "model": "example.com" }'
model
— название поведенческой модели, которую необходимо удалить.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
1. Остановите сервис Nemesida AI MLC:
# service mlc_main stop
2. Переместите файл /opt/mlc/ml/backup/[vhost].d_[timestamp]
, где [timestamp]
— дата создания резервной копии обучающей выборки, созданной Nemesida AI MLC перед началом построения модели, в /opt/mlc/ml/[vhost].d
. Например, для модели example.com
:
# mv /opt/mlc/ml/backup/example.com.d_1613587613 /opt/mlc/ml/example.com.d
3. Запустите обучение:
# curl http://api.example.com:8080/nw-api/v2/set_training_uri --header "Content-type: application/json" --data '{ "key": "%Лицензионный ключ%", "vhost": "example.com", "duration": 4, "complete": false }'
4. Запустите сервис Nemesida AI MLC:
# service mlc_main start
# curl http://api.example.com:8080/nw-api/v2/rep_models_uri --header "Content-type: application/json" --data '{ "key": "%Лицензионный ключ%", "src_model": "example.com", "dst_model": "example.org" }'
src_model
— виртуальный хост, поведенческая модель которого копируется;
dst_model
— виртуальный хост, для которого необходимо скопировать модель.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/v2/get_training_uri --data 'key=%Лицензионный ключ%'
Формат ответа:
{ "status": "success", "training": [ { "vhost": string, "duration": integer, "complete": boolean, "progress": integer }, ... ] }
Пример ответа:
{ "status": "success", "training": [ { "vhost": "example.com", "duration": 4, "complete": false, "progress": 95 }, ... ] }
# curl http://api.example.com:8080/nw-api/v2/set_training_uri --header "Content-type: application/json" --data '{ "key": "%Лицензионный ключ%", "vhost": "example.com", "duration": 4, "complete": false }'
duration
— период обучения в днях.
complete
— статус обучения модели.
или
# curl http://api.example.com:8080/nw-api/v2/set_training_uri --header "Content-type: application/json" --data '{ "key": "%Лицензионный ключ%", "vhost": "example.com", "duration": 4 }'
или
# curl http://api.example.com:8080/nw-api/v2/set_training_uri --header "Content-type: application/json" --data '{ "key": "%Лицензионный ключ%", "vhost": "example.com", "complete": false }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/v2/set_training_uri --header "Content-type: application/json" --data '{ "key": "%Лицензионный ключ%", "vhost": "*.example.com", "duration": 4, "complete": false }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/v2/set_training_uri --header "Content-type: application/json" --data '{ "key": "%Лицензионный ключ%", "vhost": ".example.com", "duration": 2, "complete": false }'
Выполнение команды со значением параметра complete: false
позволяет запустить процесс переобучения модели, если оно было завершено, а complete: true
— прерывает процесс обучения.
Перед запуском процесса обучения модели виртуальный хост должен быть добавлен в список виртуальных хостов.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/get_mt_attack --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "startTime": 1730986421, "endTime": 1730987421, "limit": 100, "bt": [12, ...], "ip": ["127.0.0.1", ...], "cc": ["RU", ...], "vhost": ["example.com", ...], "method": ["GET", ...], "agent": ["MLA", ...], "mz": ["args", ...], "request_id": ["e19699c37b4c26f53a9fab3a24f573c8", ...], "bodyLimit": 1024, "url": ["example.com/index.php", ...], "args": ["abc", ...], "body": ["some_text", ...], "cookie": ["id=123jmci5", ...], "other_headers": ["user_ID=admin", ...], "referer": ["http://example.com", ...], "ua": ["Mozilla/5.0", ...], "search": ["abc", ...] }'
Опциональные параметры:
startTime
иendTime
— начальная и конечная дата в форматеUnix Timestamp
, за который будет запрошена информация;limit
— максимальное количество выводимых записей;bt
— идентификатор блокировки. Поиск проводится по строгому соответствию каждого элемента списка;ip
— IP-адрес. Поиск проводится по строгому соответствию каждого элемента списка;cc
— код страны. Поиск проводится по строгому соответствию каждого элемента списка;vhost
— виртуальный хост, доменное имя. Поиск проводится по строгому соответствию каждого элемента списка;method
— метод отправки HTTP-запроса. Поиск проводится по строгому соответствию каждого элемента списка;agent
— название компонента, обработавшего запрос. Поиск проводится по строгому соответствию каждого элемента списка;mz
— зона выявления аномалии. Поиск проводится по строгому соответствию каждого элемента списка;request_id
— уникальный идентификатор запроса. Поиск проводится по строгому соответствию каждого элемента списка;bodyLimit
— размер выводимого тела запроса;url
— поиск вхождения строки вURL
-адресе. Поиск проводится по вхождению каждого элемента списка;args
— поиск вхождения строки в аргументах запроса. Поиск проводится по вхождению каждого элемента списка;body
— поиск вхождения строки в теле запроса. Поиск проводится по вхождению каждого элемента списка;cookie
— поиск вхождения строки в заголовкеСookie
. Поиск проводится по вхождению каждого элемента списка;other_headers
— поиск вхождения строки в заголовках (кромеCookie
,User-Agent
иReferer
). Поиск проводится по вхождению каждого элемента списка;referer
— поиск вхождения строки в заголовкеReferer
. Поиск проводится по вхождению каждого элемента списка;ua
— поиск вхождения строки в заголовкеUser-Agent
. Поиск проводится по вхождению каждого элемента списка;search
— поиск вхождения строки для каждого элемента из списка среди зон запроса (url
,args
,body
,cookie
,other_headers
,referer
,ua
). Поиск проводится по вхождению каждого элемента списка.
Поиск значений, передаваемых в виде списка, производится по принципу логического
ИЛИ
.
Формат ответа:
{ "status": "success", "count": integer, "waf_id": string, "attacks": [ { "id": integer, "timestamp": integer, "request_id": string, "agent": string, "mz": array, "bt": integer, "ip": string, "cc": string, "vhost": string, "method": string, "url": string, "args": string, "body": string, "cookie": string, "other_headers": string, "ua": string, "referer": string, "mz_origin": string }, ... ] }
или
{"status": "fail", "description": "%описание ошибки%"}
Пример ответа:
{ "status": "success", "count": 104, "waf_id": 119835378, "attacks": [ { "id": 1, "timestamp": 1730986421, "request_id": "e19699c37b4c26f53a9fab3a24f573c8", "agent": "MLA", "mz": ["args", ...], "bt": 12, "ip": "127.0.0.1", "cc": "RU", "vhost": "example.com", "method": "POST", "url": "/index.php", "args": "abc", "body": "some_text", "cookie": "id=123jmci5", "other_headers": "user_ID=admin", "ua": "Mozilla/5.0", "referer": "http://example.com", "mz_origin": "{'body': 'dW5pb24vKmFhYWFhKi9zZWxlY3Q='}" }, ... ] }
id
— идентификатор записи в БД;mz_origin
— оригинальное содержимое зон, в которых была выявлена аномалия.
# curl http://api.example.com:8080/nw-api/set_mt_fp --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "vhost": "example.com", "mz": "args", "mz_data": "abc" }'
Обязательные параметры:
vhost
— виртуальный хост, доменное имя;mz
— зона, в которой была выявлена аномалия;mz_data
— содержимое зоны, в которой была выявлена аномалия. Не допускается экспорт с пустым значением поля.
Пример ответа:
{"status": "success", "id": %идентификатор созданной записи%}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/del_mt_attack --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "id": [1, ...] }'
Пример ответа:
{"status": "success", "deleted": integer}
или
{"status": "fail", "description": "%описание ошибки%"}
Обязательные параметры:
id
— идентификатор записи в БД.
Значения, передаваемые в виде списка, применяются по принципу логического
ИЛИ
.
# curl http://api.example.com:8080/nw-api/get_mt_fp --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "limit": 100, "id": [1, ...], "vhost": ["example.com", ...] }'
Опциональные параметры:
limit
— максимальное количество выводимых записей;id
— идентификатор запроса. Поиск проводится по строгому соответствию каждого элемента списка;vhost
— виртуальный хост, доменное имя. Поиск проводится по строгому соответствию каждого элемента списка.
Поиск значений, передаваемых в виде списка, производится по принципу логического
ИЛИ
.
Формат ответа:
{ "status": "success", "count": integer, "waf_id": string, "fp": [ { "id": integer, "timestamp": integer, "vhost": string, "mz": string, "mz_data": string }, ... ] }
или
{"status": "fail", "description": "%описание ошибки%"}
Пример ответа:
{ "status": "success", "count": 25, "waf_id": 119835378, "fp": [ { "id": 1, "timestamp": 173096451, "vhost": "example.com", "mz": "args", "mz_data": "abc" }, ... ] }
id
— идентификатор записи в БД;mz_data
— содержимое зоны экспортированного запроса.
# curl http://api.example.com:8080/nw-api/del_mt_fp --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "id": [1, ...] }'
Пример ответа:
{"status": "success", "deleted": 3}
или
{"status": "fail", "description": "%описание ошибки%"}
id
— идентификатор записи в БД.
Значения, передаваемые в виде списка, применяются по принципу логического
ИЛИ
.
# curl http://api.example.com:8080/nw-api/get_openapi_schemas --header 'Content-type: application/json' --data '{"key": "%Лицензионный ключ%"}'
Формат ответа:
{ "schemas": [ { "schema_name": string, "schema": string }, ... ] }
или
{"status": "fail", "description": "%описание ошибки%"}
Пример ответа:
{ "schemas": [ { "schema_name": "example.com", "schema": "b3BlbmFwaSBzY2hlbWEgaW4gYmFzZTY0" }, ... ] }
Пример запроса:
# curl http://api.example.com:8080/nw-api/get_openapi_schemas_hash --header 'Content-type: application/json' --data '{"key": "%Лицензионный ключ%"}'
Пример ответа:
{'status': 'success', 'hash': '8ddd2b342d3190a866ee35afb249919a'}
# curl http://api.example.com:8080/nw-api/set_openapi_schema --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "set": { "schema_name": "example.com", "schema": "b3BlbmFwaSBzY2hlbWEgaW4gYmFzZTY0" } }'
Для корректной работы в качестве имени спецификации необходимо использовать доменное имя, заданное в спецификации. Например, если в спецификации задан параметр servers
со значением:
"servers": [ { "url": "http://example.com" } ]
то имя спецификации должно быть example.com
.
Допускается использовать строгое соответствие и wildcard-значения: *
, example.com
, .example.com
, *.example.com
.
После создания или изменения спецификации необходимо задать список URL-адресов для фильтрующей ноды, при обращении на которые будет выполняться анализ на соответствие запроса его спецификации. Если список URL-адресов не задан или не соответствует спецификации, то анализ запроса проводиться не будет.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/set_openapi_url --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "url": [ "example.com/admin", "example.com/admin/info", "example.com/v1/client/info" ] }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
Пример запроса:
# curl http://api.example.com:8080/nw-api/get_openapi_url_hash --header 'Content-type: application/json' --data '{"key": "%Лицензионный ключ%"}'
Пример ответа:
{'status': 'success', 'hash': '8ddd2b342d3190a866ee35afb249919a'}
# curl http://api.example.com:8080/nw-api/set_openapi_schema --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "set": { "schema_name": "example.com", "old_name": "example.ru" } }'
Для корректной работы в качестве имени спецификации необходимо использовать доменное имя, заданное в спецификации. Например, если в спецификации задан параметр servers
со значением:
"servers": [ { "url": "http://example.com" } ]
то имя спецификации должно быть example.com
.
Допускается использовать строгое соответствие и wildcard-значения: *
, example.com
, .example.com
, *.example.com
.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/set_openapi_schema --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "del": { "schema_name": "example.com" } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/get_openapi_schema_paths --header 'Content-type: application/json' --data '{"key": "%Лицензионный ключ%"}'
Nemesida AI MLC анализирует запросы и на основе соответствующего списка виртуальных хостов автоматически генерирует спецификации для каждого пути запроса
.
Формат ответа:
{ "paths": [ { "schema_name": string, "url": string, "schema": string }, ... ] }
или
{"paths": []}
Пример ответа:
{ "paths": [ { "schema_name": "example.com", "url": "/index/", "schema": "b3BlbmFwaSBzY2hlbWEgaW4gYmFzZTY0" }, ... ] }
Пример ответа с декодированным содержимым спецификации:
{ "paths": [ { "schema_name": "example.com", "url": "/url_1/", "schema": { "example.com": { "/url_1/": { "post": { "requestBody": { "content": { "*/*": { "schema": { "type": "object", "properties": { "id": { "type": "integer" }, "order": { "type": "string" } }, "required": [ "id", "order" ] } } } } } } } } }, ... ] }
# 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": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/get_openapi_exclude_paths --header 'Content-type: application/json' --data '{"key": "%Лицензионный ключ%"}'
Формат ответа:
{ "exclude_paths": [string, ...] }
Пример ответа:
{ "exclude_paths": ["/url_1/", ...] }
Пример запроса:
# curl http://api.example.com:8080/nw-api/get_openapi_exclude_paths_hash --header 'Content-type: application/json' --data '{"key": "%Лицензионный ключ%"}'
Пример ответа:
{'status': 'success', 'hash': '8ddd2b342d3190a866ee35afb249919a'}
🔗 Глобальные настройки Nginx
Секция позволяет задать глобальные настройки Nginx, которые будут располагаться в /etc/nginx/nwaf/conf/nginx/nginx.conf
. Поддерживает следующие команды управления:
# curl http://api.example.com:8080/nw-api/nginx/get_nginx --data 'key=%Лицензионный ключ%'
Формат ответа:
{ "status": "success", "configuration": [ { "active": boolean, "resolver": string, "limit_req_zone": [string, ...], "real_ip_header": string, "resolver_timeout": string, "set_real_ip_from": [string, ...], "client_max_body_size": string } ] }
или
{"status": "fail", "description": "%описание ошибки%"}
Пример ответа:
{ "status": "success", "configuration": [ { "active": true, "resolver": "127.0.0.1 [::1]:5353 valid=30s", "limit_req_zone": ["$binary_remote_addr zone=mylimit_1:10m rate=10r/s", ...], "real_ip_header": "X-Forwarded-For", "resolver_timeout": "30s", "set_real_ip_from": ["192.168.1.0/24", ...], "client_max_body_size": "100m" } ] }
# curl http://api.example.com:8080/nw-api/nginx/set_nginx --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "set": { "active": true, "resolver": "127.0.0.1 [::1]:5353 valid=30s", "resolver_timeout": "30s", "set_real_ip_from": [ "192.168.1.0/24", "192.168.2.1" ], "real_ip_header": "X-Forwarded-For", "client_max_body_size": "100m", "limit_req_zone": [ "$binary_remote_addr zone=mylimit_1:10m rate=10r/s", "$binary_remote_addr zone=mylimit_2:10m rate=10r/s" ] } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
Для управления доступны следующие параметры:
Адрес DNS-сервера. Значение valid
(в секундах) означает как долго ответ DNS-сервера будет считаться действительным.
Параметр устанавливает значение (в секундах), в течение которого Nginx будет ожидать ответа от DNS-сервера.
Параметр задаёт доверенные адреса, которые передают верный адрес для замены. Доверенные адреса могут быть также заданы при помощи имени хоста.
Допускается использование IPv6 и IPv4-адресов.
Задаёт поле заголовка запроса, значение которого будет использоваться для замены адреса клиента.
Параметр задаёт максимально допустимый размер тела запроса клиента в мегабайтах. Если размер больше заданного, то клиенту возвращается ошибка 413 (Request Entity Too Large). Установка параметра со значением 0
отключает проверку размера тела запроса клиента.
Задаёт параметры зоны разделяемой памяти, которая хранит состояние для разных значений ключа. В качестве ключа можно использовать текст, переменные и их комбинации. Запросы с пустым значением ключа не учитываются.
Пример запроса:
# curl http://api.example.com:8080/nw-api/nginx/get_nginx_hash --data 'key=%Лицензионный ключ%'
Пример ответа:
{"status": "success", "hash": "8ddd2b342d3190a866ee35afb249919a"}
# curl http://api.example.com:8080/nw-api/nginx/set_nginx --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "set": { "resolver": null, "resolver_timeout": null, "set_real_ip_from": null, "real_ip_header": null, "client_max_body_size": null, "limit_req_zone": null } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
🔗 Настройка виртуального хоста
Параметр
name
— имя конфигурации, которое будет располагаться в/etc/nginx/nwaf/conf/nginx/%name%.conf
.
Секция предназначена для настройки файла виртуального хоста. Поддерживает следующие команды управления:
# curl http://api.example.com:8080/nw-api/nginx/get_vhost --data 'key=%Лицензионный ключ%'
Формат ответа:
{ "status": "success", "configuration": [ { "active": boolean, "name": string, "root": string, "index": string, "listen": [string, ...], "add_header": {string, ...}, "error_page": {string, ...}, "locations": [ { "location": string, "pass_type": string, "path": string, "index": string, "add_header": {string, ...}, "error_page": {string, ...}, "limit_req": string, "limit_req_status": integer }, ... ], "server_name": string, "ssl_ciphers": string, "dhparam_name": string, "ssl_protocols": string, "certificate_name": string, "ssl_session_timeout": string } ] }
или
{"status": "fail", "description": "%описание ошибки%"}
Пример ответа:
{ "status": "success", "configuration": [ { "active": true, "name": "example.com", "root": "/var/www/site", "index": "index index.html index.php", "listen": ["localhost:443 default_server ssl http2", ...], "add_header":{ "Content-type": "text/html; charset=utf-8", ... }, "error_page": { "404 502": "=200 /404.html", ... }, "locations": [ { "location": "/static_1", "pass_type": "root", "path": "/var/www/html", "index": "index index.html index.php", "add_header":{ "Content-type": "text/html; charset=utf-8", ... }, "error_page": { "404 502": "=200 /404.html", ... }, "limit_req": "zone=mylimit_1 burst=20 nodelay", "limit_req_status": 444 }, ... ], "server_name": "www.example.com example.com", "ssl_ciphers": "AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5", "dhparam_name": "dhparam", "ssl_protocols": "TLSv1 TLSv1.1 TLSv1.2", "certificate_name": "SSL", "ssl_session_timeout": "10m" } ] }
# curl http://api.example.com:8080/nw-api/nginx/set_vhost --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "set": { "active": true, "name": "%Имя конфигурации%", "listen": [ "localhost:80 default_server", "[::1]:443 default_server ssl http2" ], "server_name": "www.example.com example.com", "certificate_name": "%name%", "dhparam_name": "%name%", "ssl_session_timeout": "10m", "ssl_ciphers": "AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5", "ssl_protocols": "TLSv1 TLSv1.1 TLSv1.2", "root": "/var/www/site", "index": "index.php index.html", "add_header": { "Content-Encoding": "gzip", "Content-type": "text/html; charset=utf-8" }, "error_page": { "404 502": "=200 /404.html", "504": "=200 @bad_gateway" }, "locations": [ { "location": "/static_1", "pass_type": "root", "path": "/var/www/html", "index": "index.php", "add_header": { "Content-Encoding": "gzip", "Content-type": "text/html; charset=utf-8" }, "error_page": { "504": "=200 @bad_gateway", "404 502": "=200 /404.html" }, "limit_req": "zone=mylimit_1 burst=20 nodelay", "limit_req_status": 444 }, { "location": "/static_2", "pass_type": "alias", "path": "/var/www/static_2", "autoindex": "on", "limit_req": "zone=mylimit_1 burst=20 nodelay", "limit_req_status": 444 }, { "location": "/abc_1", "pass_type": "proxy_pass", "proxy_pass": "http://main_proxy", "proxy_http_version": 1.0, "proxy_set_header": { "X-Real_IP": "$remote_address", "Host": "$http_host" }, "proxy_connect_timeout": "60s", "proxy_send_timeout": "60s", "proxy_read_timeout": "60s", "proxy_intercept_errors": "on", "limit_req": "zone=mylimit_1 burst=20 nodelay", "limit_req_status": 444 }, { "location": "/abc_2", "pass_type": "memcached_pass", "memcached_pass": "memc_upstream", "limit_req": "zone=mylimit_1 burst=20 nodelay", "limit_req_status": 444 } ] } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
Для управления доступны следующие параметры:
Имя конфигурации.
Параметр задаёт адрес, на которых сервер будет принимать запросы.
Адрес может быть задан в виде доменного имени/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-значений для замены первой или последней части имени.
Каноническое имя SSL-сертификата и приватного ключа для сервера. Имя задается при создании, в разделе настройки SSL-сертификатов.
Каноническое имя pem
-файла, необходимого для работы Forward Secrecy
(если злоумышленник узнает какой-либо сеансовый ключ, то он сможет получить доступ лишь к данным, защищенным этим ключом). Имя задается при создании в разделе настройки DHParam.
Параметр задаёт время, в течение которого клиент может повторно использовать параметры сессии.
Параметр задает разрешённые шифры. Шифры задаются в формате, поддерживаемом библиотекой OpenSSL.
Параметр разрешает использование указанных протоколов.
Параметр задаёт корневой каталог для запросов.
Параметр определяет файлы, которые будут использоваться в качестве индекса. В имени файла можно использовать переменные. Наличие файлов проверяется в порядке их перечисления. В конце списка может стоять файл с абсолютным путём.
Параметр определяет список используемых location
для виртуального хоста и их параметры. Настройка параметра предполагает использование обязательных и вспомогательных параметров.
Обязательные:
location — префикс, на основе которого будет происходить сравнение с URI
запроса.
Пример:
"location": "/" "location": "/user/"
proxy_type — тип обработки запросов.
Поддерживается 4 типа обработки: root
, alias
, proxy_pass
, memcached_pass
.
-
root — обработка запросов на локальном веб-сервере. При использовании этого типа обработки запросов необходимо использовать опцию
path
для задания корневого каталога для запросов.Пример:
"path": "/var/www/site"
При значении path
/var/www/site
и location/user/
запрос ресурса/user/index.html
будет возвращать содержимое файла/var/www/site/user/index.html
.Опционально:
index — файлы, которые будут использоваться в качестве индекса. В имени файла можно использовать переменные. Наличие файлов проверяется в порядке их перечисления. В конце списка может стоять файл с абсолютным путём. Если параметр не задан, то по умолчанию будет использоваться значение параметра из секцииserver
.Пример:
"index": "index index.html index.php"
autoindex — разрешение на листинг каталога.
Пример:
"autoindex": "on"
add_header — задает поле заголовка для ответа, при условии кода ответа
200
,201
,204
,206
,301
,302
,303
,304
,307
или308
. Если задан параметрalways
, то поле заголовка будет добавлено независимо от кода ответа.Пример:
"Content-Encoding": "gzip", "Content-type": "text/html; charset=utf-8"
error_page — задаёт
URI
, который будет показываться для указанных ошибок. В значенииURI
можно использовать переменные.Пример:
"504": "=200 @bad_gateway", "404 502": "=200 /404.html"
-
alias — путь, которым будет заменен указанный
location
. При использовании этого типа обработки запросов необходимо использовать опциюpath
для задания каталога для запросов.Пример:
"path": "/var/www/site"
При значении alias
/var/www/site
и location/user/
запрос ресурса/user/index.html
будет возвращать содержимое файла/var/www/site/index.html
. -
proxy_pass — адрес проксируемого сервера, куда будут перенаправляться запросы при обращении к
location
.Адрес может быть задан в виде доменного имени/IP-адреса и порта (опционально), UNIX-сокета или названия апстрима. К адресу сервера допускается добавлять
URI
.Пример:
"proxy_pass": "http://127.0.0.1:8080/remote/" "proxy_pass": "http://unix:/tmp/backend.socket:/uri/" "proxy_pass": "http://upstream_name"
Опционально:
proxy_http_version — версия протокола HTTP для проксирования. По умолчанию используется версия1.0
.Пример:
"proxy_http_version": 1.0
proxy_connect_timeout — таймаут для установления соединения с проксируемым сервером.
Пример:
"proxy_connect_timeout": "60s"
proxy_intercept_errors — при активации параметра ответы от проксируемого сервера с кодом ответа 300 и выше будут перехватываться и перенаправляться на обработку с помощью директивы error_page.
Пример:
"proxy_intercept_errors": "on"
proxy_send_timeout — таймаут передачи запроса проксируемому серверу.
Пример:
"proxy_send_timeout": "60s"
proxy_read_timeout — таймаут при чтении ответа проксируемого сервера.
Пример:
"proxy_read_timeout": "60s"
-
memcached_pass — адрес сервера
memcached
, куда будут перенаправляться запросы при обращении кlocation
.Адрес может быть задан в виде доменного имени/IP-адреса и порта (обязательно), UNIX-сокета или названия апстрима.
Пример:
"memcached_pass": "localhost:11211" "memcached_pass": "unix:/tmp/memcached.socket" "memcached_pass": "http://upstream_name"
Необязательные:
limit_req — зона разделяемой памяти (zone
) и максимальный размер всплеска запросов (burst
). Если скорость поступления запросов превышает описанную в зоне, то их обработка cдерживается так, чтобы запросы обрабатывались с заданной скоростью.
Пример:
"limit_req": "zone=mylimit_1 burst=20 nodelay"
Параметр необходмо сначала задать в глобальных настройках Nginx.
limit_req_status — код ответа, используемый при отклонении запросов.
Пример:
"limit_req_status": 444
# curl http://api.example.com:8080/nw-api/nginx/set_vhost --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "set": { "name": "%Имя конфигурации%", "listen": null, "server_name": null, "certificate_name": null, "dhparam_name": null, "ssl_session_timeout": null, "ssl_ciphers": null, "ssl_protocols": null, "root": null, "index": null, "add_header": null, "error_page": null, "locations": null } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
Пример запроса:
# curl http://api.example.com:8080/nw-api/nginx/get_vhost_hash --data 'key=%Лицензионный ключ%'
Пример ответа:
{"status": "success", "hash": "8ddd2b342d3190a866ee35afb249919a"}
# curl http://api.example.com:8080/nw-api/nginx/set_vhost --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "del": { "name": "%Имя конфигурации%" } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
🔗 Настройка балансировки нагрузки
Параметр
name
— имя конфигурации с параметрами балансировки нагрузки, который будет располагаться в/etc/nginx/nwaf/conf/nginx/%name%.conf
.
Секция предназначена для настройки параметров балансировки нагрузки. Поддерживает следующие команды управления:
# curl http://api.example.com:8080/nw-api/nginx/get_upstream --data 'key=%Лицензионный ключ%'
Формат ответа:
{ "status": "success", "configuration": [ { "name": string, "balancing_method": string "servers": [ { "server": string, "weight": integer, "max_fails": integer, "fail_timeout": string, "backup": boolean, "down": boolean }, ... ] } ] }
или
{"status": "fail", "description": "%описание ошибки%"}
Пример ответа:
{ "status": "success", "configuration": [ { "name": "upstream_main", "balancing_method": "ip_hash" "servers": [ { "server": "backend1.example.com", "weight": 3, "max_fails": 5, "fail_timeout": "60s", "backup": false, "down": true }, ... ] } ] }
# curl http://api.example.com:8080/nw-api/nginx/set_upstream --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "set": { "name": "%Имя конфигурации%", "balancing_method": "ip_hash", "servers": [ { "server": "backend1.example.com", "weight": 3 }, { "server": "127.0.0.1:8080", "fail_timeout": "60s" }, { "server": "192.0.2.1", "max_fails": 5 }, { "server": "backend3.example.com", "weight": 3, "fail_timeout": "60s", "max_fails": 5 }, { "server": "backend4.example.com" }, { "server": "backend5.example.com", "backup": true }, { "server": "backend4.example.com", "down": true } ] } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
Для управления доступны следующие параметры:
Название группы серверов для балансировки нагрузки.
Метод распределения нагрузки между серверами. Допускается использовать одно из значений: ip_hash, least_conn или random.
Список серверов, которые используются для обработки запросов, а также их параметры:
server
— адрес сервера. Адрес может быть задан в виде доменного имени/IP-адреса и порта (опционально) или UNIX-сокета. Допускается использование IPv6 и IPv4-адресов;weight
— числовой показатель приоритета выбора сервера при обработке запроса;fail_timeout
— время (в секундах), в течение которого должно произойти заданное число неудачных попыток работы с сервером для того, чтобы сервер считался недоступным;max_fails
— максимальное число неудачных попыток связи с сервером за время, заданное параметромfail_timeout
;down
— помечает сервер как постоянно недоступный;backup
— помечает сервер как запасной. На него будут передаваться запросы в случае, если не работают основные серверы.
# curl http://api.example.com:8080/nw-api/nginx/set_upstream --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "set": { "name": "%Имя конфигурации%", "balancing_method": null, "servers": null } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
Пример запроса:
# curl http://api.example.com:8080/nw-api/nginx/get_upstream_hash --data 'key=%Лицензионный ключ%'
Пример ответа:
{"status": "success", "hash": "8ddd2b342d3190a866ee35afb249919a"}
# curl http://api.example.com:8080/nw-api/nginx/set_upstream --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "del": { "name": "%Имя конфигурации%" } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
🔗 Настройка SSL-сертификатов
Параметр
name
— имя конфигурации для SSL-сертификатов и их приватных ключей, которые будут располагаться в/etc/nginx/nwaf/conf/nginx/ssl/certs/%name%.crt
и/etc/nginx/nwaf/conf/nginx/ssl/private/%name%.key
.
В целях безопасности выполнение команды получения конфигурации не возвращает полное содержимое поля certificate_key
. Полная информация о приватном ключе certificate_key
запрашивается компонентом Nemesida AI MLA по URL-адресу http://api.example.com:8080/nw-api/nginx/secure/get_certificate
, доступ к которому рекомендуется разрешить только для сервера фильтрующей ноды.
Секция предназначена для настройки параметров SSL-сертификатов и их приватных ключей. Поддерживает следующие команды управления:
# curl http://api.example.com:8080/nw-api/nginx/get_certificate --data 'key=%Лицензионный ключ%'
Формат ответа:
{ "status": "success", "configuration": [ { "name": string, "certificate": string, "certificate_key": string } ] }
или
{"status": "fail", "description": "%описание ошибки%"}
Пример ответа:
{ "status": "success", "configuration": [ { "name": "SSL", "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS...", "certificate_key": "LS0tLS1CRUdJTiBQUklWQVRF..." } ] }
# curl http://api.example.com:8080/nw-api/nginx/set_certificate --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "set": { "name": "%Имя конфигурации%", "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURVekNDQWpzQ0ZGei9jNjhLYk9USnlYOWpibWZMbjdmK1YwdWtNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1IOHgKQ3pBSkJnTlZCQVlUQWtGVk1RNHdEQVlEVlFRSURBVkJVMEZGUmpFTk1Bc0dBMVVFQnd3RVQzSmxiREVSTUE4RwpBMVVFQ2d3SVUxTlNSMEZCUldZeERqQU1CZ05WQkFzTUJYTnlaWFJuTVE0d0RBWURWUVFEREFWM1pUUm1aekVlCk1Cd0dDU3FHU0liM0RRRUpBUllQWVdSdGFXNUFZV1J0YVc0dVkyOXRNQjRYRFRJek1EY3hOekV3TlRZME0xb1gKRFRJMk1EUXhNVEV3TlRZME0xb3dUVEVMTUFrR0ExVUVCaE1DUTBFeERUQUxCZ05WQkFnTUJFNXZibVV4Q3pBSgpCZ05WQkFjTUFrNUNNUTB3Q3dZRFZRUUtEQVJPYjI1bE1STXdFUVlEVlFRRERBcGxlR0Z0Y0d4bExuSjFNSUlCCklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFySitBMkZ3cHFjMDhNVnRhVzZKeUsvbDkKQy9NWXFJRXZtRjZvdUt5V01ZRWFGMmlPK0l2VG1pN2hETkxQakR2ekhKRHJMYTZycjhJMkdMN0Nxdi9tdkN5NQpKZVBaSVZxeU9PQ0NLUEJFVXFrUkl4NUwvQ0hLMnVieHlxL1ZIWUExRysxanVqNzNINXZqUHM4anRyeFFNVG5OCkNacVBycmdoOTRlU0ViRmpER2JyZGlGSFpURmwyT01QdTlBVEJoRjF3dStwYS8yN3BJVm91S21BTnVTa0pTaUoKM29wRTkzZFJDYkUvWVhoTjJKTlNjdmdzcjBVbXBRd2t5VDJ4bGVKbHV0Sm5PZkZiK1NsdWFHVlloOUtncEwrcQorN2x3MFk0OEtYNnJGeXUzNko1RjBxNUN6T1hoMS9BZWFneStJQTdGanVSOU9tTFEvQVlwSGE1QmZMK0Fid0lECkFRQUJNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUNnV1VGTVZrMkVSaHF3WGpBT0YxVCt1cWZJM3pKZkVrTHAKYlZieW90d2dRMnZPU2VZdlAyU1dqdjZCMDExZEFONWNYTUIvOFhOVEdhdUNSajN1cEtTTUtvd1JaY1hjdUlKMApocUNDc01JZGw1bDFBQVFJWCtPTTJTeEpKdHVRK0dkWlhkQ294RStzN20zSHNCQ3UwbWRzY3doU0hGSnRmbXRhCit6eFJ4VmY5QkU3NDJSUE5ydXNFZmxwdVQ2Rm14QkpMUy9WYzVLOWtQMngwdjZQTjZYMUF4M09vRGhrQ3Nma2cKeXpwSFhtK3J1ZWJmcnNvcFdwUzJBM083T09CRk1lTVhZeHl3WjJUR2hmanh3R3ZGZml0ZnhFNnpTUnZnQ1A5WQphaUM5RUlMSXpodUdDNDFXNFFZYTJBUzNoaVF4Qms0eDcyeGZ1cXpmc212OE5Zd0lzY3BxCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K", "certificate_key": "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2QUlCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktZd2dnU2lBZ0VBQW9JQkFRQ3NuNERZWENtcHpUd3gKVzFwYm9uSXIrWDBMOHhpb2dTK1lYcWk0ckpZeGdSb1hhSTc0aTlPYUx1RU0wcytNTy9NY2tPc3RycXV2d2pZWQp2c0txLythOExMa2w0OWtoV3JJNDRJSW84RVJTcVJFakhrdjhJY3JhNXZIS3I5VWRnRFViN1dPNlB2Y2ZtK00rCnp5TzJ2RkF4T2MwSm1vK3V1Q0gzaDVJUnNXTU1adXQySVVkbE1XWFk0dys3MEJNR0VYWEM3NmxyL2J1a2hXaTQKcVlBMjVLUWxLSW5laWtUM2QxRUpzVDloZUUzWWsxSnkrQ3l2UlNhbERDVEpQYkdWNG1XNjBtYzU4VnY1S1c1bwpaVmlIMHFDa3Y2cjd1WERSamp3cGZxc1hLN2ZvbmtYU3JrTE01ZUhYOEI1cURMNGdEc1dPNUgwNll0RDhCaWtkCnJrRjh2NEJ2QWdNQkFBRUNnZ0VBWENKSjM3RFpIK01GeElZd3BRWUFFQTU2T24yR1pMR0cyTGwxTGhRWG1kYUIKT1lzNSs5aU5tUlo2VWFEVzI4OUhnN0NwaFZsY0UxUUNFWlVIUzhPSHdGblNmREd2TzBrd0pJRlhsMGdkLzB4egpkQjRBaWxMeTlZRWIvb1Y0cHVVOTgyanh1SDlRNE5NUUovN2czZkNHa0s5OEN5c3VreDkrS2FKM1NQQTNvRzhSCnlLNDVKckRZK1l4WktLNS9EZmtrZlRGdXF6TDkxSzdIcFdBKzkxc3FnRUM5c0hqTzJyME9KUmlEK1lFekFLZisKb0hsSHZmTjhrblBSTDZRMWFJaUgvL1o3S053YTlmOHFvK0prZmR3bExaS21KS21ScEtqQUppMWd1ckZSaklzUgpQeU5sTm43VHljQmZUKzIvS3hoNm1pR2F1UWg1ZC9saXg2QVJLMjhTdVFLQmdRRFNSQkxmQ3RiYWR2OThtWWJsCnREUS95OUZoSWo0WHJML2xPZVhJaEZEbFpKc3U4R3dpSzZZczNqWFQvOEhwUlZUbll6TkdtdUhUNk5Pb1lkakoKWk5IWDFINHlCT2xMV3oyQ3RvNk1aMWJSWkVlcHplV29GM2txMWc2TmNabmJYdk4xNmNhSXJzTG9LY0NYQ2h6UwpFQ245TytrS1FBYk1PL3d2WXVMUWJpRlU4d0tCZ1FEU0syc09WWGIrbm83MVZmR1BUSDJpQUV2bWxFRlZwVkNhClNxMmtWZE9hQkVOR3BnWnRwNmZ4Lzh5bUlPbGczWnZpQ2JQZnVhK2FGOENqVUYzaGRkcDFRdTI3RjdCaGswbGUKUXNrRGVBaEU4KzVxWWZtWEUwZUo1dE11bmtYUHM2b2o3eHRTTlR2c01CZEwwK3AwVUtia0EzaDVvLzlqdytkLwp2OHRpYytKMWxRS0JnQ1RNd1RqRUh1SlJYVm1qVFJhNnVVSkpHN1lTVmlleWxrczZITnRCUFI5SXdsZ3V2OTRqCklZeE12OE1BeWlGWGZ3cVlOQXN4WkVEQVNQcjVWUVc2WFhlV3V4ZHFBS0t0cjFCSFB4K1hubnc3UHNlYlA0eHgKdjBVZC9hSUh0ZFBOQkhNb25SU2k4WDNNZ09adVlLanJKMDRveEJxRkppdHNmRENXNy9kbXJ2SzlBb0dBZVR4OApsQmN1L25BZXpWMVhiQzlXcFpZQU1ySEJBcFBMYkVXNTV2dHZoZ0FCZ3dhUTNMNkMvZkZ1YjBLNi9acTRxbXFvCmJWMWk4OFBSNXlPY0ZFdjB5Z0hpdXpOT0Z1dHN2a2hPUm9iK1ZqQlVqdCtYcDlPQ1NBVjBPd2NvQkVtQzB4bkMKSytqemVTckF0WWc0VGdLY1V4bkJiSUh5OSt6eFpOc1JpdWlJY1FVQ2dZQUpQN3pBck5IQ0FVYWwwOUQvQVFjbAppMGVxQnkvZ2xJOXlIS1BVcDFlU1BnUnhSL3Y4ZVBPOGM2azA5YkM3bk1TeDQ5bEVWWnhvT1lkM3ZkSyszQXZCCnByZWZscnZXTk5hSWhBMHdsZTRjWXdObHlMZDVKRU5zeDZ1RTBwNUd4UVRLeEZNUE16L2JaSlU0YzZkUWsyUDIKNFdVME1SLzRLdU9KMjJOZWJObmlWUT09Ci0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K" } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
Для управления доступны следующие параметры:
Каноническое имя SSL-сертификата и его приватного ключа, которое будет использоваться в качестве имен соответствующих файлов.
SSL-cертификат и цепочку SSL-сертификатов (опционально) в формате Base64
. Параметр задается вместе с параметром certificate_key
.
Приватный ключ SSL-сертификата в формате Base64
. Параметр задается вместе с параметром certificate
.
Пример запроса:
# curl http://api.example.com:8080/nw-api/nginx/get_certificate_hash --data 'key=%Лицензионный ключ%'
Пример ответа:
{"status": "success", "hash": "8ddd2b342d3190a866ee35afb249919a"}
# curl http://api.example.com:8080/nw-api/nginx/set_certificate --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "del": { "name": "%Имя конфигурации%" } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
🔗 Настройка DHParam
Параметр
name
— имя конфигурации с параметрами DHParam, который будет располагаться в/etc/nginx/nwaf/conf/nginx/ssl/dhparam/%name%.pem
.
В целях безопасности выполнение команды получения конфигурации не возвращает полное содержимое поля dhparam
. Полная информация о dhparam
запрашивается компонентом Nemesida AI MLA по URL-адресу http://api.example.com:8080/nw-api/nginx/secure/get_dhparam
, доступ к которому рекомендуется разрешить только для сервера фильтрующей ноды.
Секция предназначена для настройки параметра DHParam. Поддерживает следующие команды управления:
# curl http://api.example.com:8080/nw-api/nginx/get_dhparam --data 'key=%Лицензионный ключ%'
Формат ответа:
{ "status": "success", "configuration": [ { "name": string, "dhparam": string } ] }
или
{"status": "fail", "description": "%описание ошибки%"}
Пример ответа:
{ "status": "success", "configuration": [ { "name": "dhparam", "dhparam": "LS0tLS1CRUdJTiBESCBQQVJBTUVURVJT..." } ] }
# curl http://api.example.com:8080/nw-api/nginx/set_dhparam --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "set": { "name": "%Имя конфигурации%", "dhparam": "LS0tLS1CRUdJTiBESCBQQVJBTUVURVJTLS0tLS0KTUlHSEFvR0JBT1lpNi9OQmljaHU5UDlPS3BpZ1RLQTB4WjNUWnZKQ3pWNzMvWkxCMkgvRFFzc2xUNWgyWEltcQpiazR0SHRGc2ViNDU0S29IR3JoM2FCbzFmcXB5REJQMDcxR0M3eE12c2xUQXVBanVIRmFVckd6NVNDTWRRN3A3CnJvaWNJdExNWE5razQ1WWpzazRPZjZHVXhDZXQ1MkdqSHo3a01yemdvbUtWTldjdU5BRGJBZ0VDCi0tLS0tRU5EIERIIFBBUkFNRVRFUlMtLS0tLQo=" } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
Для управления доступны следующие параметры:
Каноническое имя pem
-файла, необходимого для работы Forward Secrecy
. Forward Secrecy
означает, что если злоумышленник узнает какой-либо сеансовый ключ, то он сможет получить доступ лишь к данным, защищенным этим ключом.
Значение ключа в формате Base64
.
Пример запроса:
# curl http://api.example.com:8080/nw-api/nginx/get_dhparam_hash --data 'key=%Лицензионный ключ%'
Пример ответа:
{"status": "success", "hash": "8ddd2b342d3190a866ee35afb249919a"}
# curl http://api.example.com:8080/nw-api/nginx/set_dhparam --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "del": { "name": "%Имя конфигурации%" } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
Доступно только для тарифа Энтерпрайз.
Функционал предназначен для централизованного приема, хранения и обработки журналов всех компонентов Немезида ВАФ.
# curl http://api.example.com:8080/nw-api/get_event --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "startTime": 1234567891, "endTime": 1987654321, "limit": 100, "offset": 1, "level": ["info", ...], "ip": ["1.1.1.1", ...], "uuid": ["198be506d69ba8a9bdbcf87b22ef5bc", ...], "agent": ["dyn", ...], "category": ["settings", ...] }'
Опциональные параметры:
startTime
— начальная дата в форматеUnix Timestamp
, за который будет запрошена информация;endTime
— конечная дата в форматеUnix Timestamp
, за который будет запрошена информация;limit
— максимальное количество выводимых записей;offset
— смещение для вывода последующих записей;level
— уровень серьезности сообщения;ip
— IP-адрес сервера, где установлен компонент;uuid
— идентификатор сервера, где установлен компонент;agent
— название компонента;category
— категория события.
Добавленные параметры сочетаются по принципу логического «и» (
&
), а их значения — по принципу логического «или» (|
).
Формат ответа:
{ "status": "success", "count": integer, "waf_id": string, "events": [ { "id": integer, "ip": string, "uuid": string, "agent": string, "level": string, "category": string, "timestamp": integer, "description": string } ] }
Пример ответа:
{ "status": "success", "count": 28, "waf_id": "1674726761", "events": [ { "id": 2798306, "ip": "1.1.1.1", "uuid": "bd4f447720189ca3c5a42e1395fa6021", "agent": "dyn", "level": "debug", "category": "nginx", "timestamp": 1688404169, "description": "This is log 1" } ] }
startTime
— начальная дата в форматеUnix Timestamp
, за который будет запрошена информация;endTime
— конечная дата в форматеUnix Timestamp
, за который будет запрошена информация.
Количество записей:
limit
— максимальное количество выводимых записей;offset
— смещение для вывода последующих записей. При значении0
и значенииlimit 100
будут выводиться записи с порядковым номером1-100
, при значении1
— записи с порядковым номером101-200
и т.д. Использование параметра без указания максимального количества выводимых записей (limit
) невозможно.
Ранжирование событий:
level
— уровень серьезности события;debug
— события с отладочной информацией;info
— информационные сообщения о состоянии компонента;warn
— предупреждения о потенциальной проблеме в работе компонента;error
— сообщения об ошибках в работе компонента;fatal
— сообщения о критических ошибках в работе компонента, приводящие к сбою в работе.
category
— категория события:- Фильтрующая нода:
auth
— события, связанные с проверкой программного ключа, тарифного плана и т.д.;os
— события взаимодействия с операционной системой (память, диск);network
— события, связанные с сетью (невозможно установить соединение, отправки, таймауты, обрывы, запуск/остановка сокета/порта);api
— события, связанные со взаимодействием с Nemesida WAF API;settings
— события, связанные с настройками модуля;nginx
— события, связанные со взаимодействием с Nginx (несоответствие настроек, необходимых для работы фильтрующей ноды, нарушения RFC);signature
— события, связанные с сигнатурным анализом;clamav
— события, связанные со взаимодействием с ClamAV;mla
— события, связанные со взаимодействием с Nemesida AI MLA;mlc
— события, связанные со взаимодействием с Nemesida AI MLC;rabbitmq
— события, связанные со взаимодействием с RabbitMQ;autoban
— события, связанные механизмом автоматической блокировки;geo
— события, связанные с функционалом GeoIP;openapi
— события, связанные с работой OpenAPI;parsing
— события, связанные с декодом и нормализацией данных;analysis
— события, связанные с обработкой запроса, но не вошедшие ни в одну группу (signature, ml, openapi и т.д.);misc
— события, не вошедшие ни в одну категорию (например, вывод информаци об UUID, WAF ID, количестве сигнатур и т.д.).
- Nemesida AI MLA:
auth
— события, связанные с проверкой программного ключа, тарифного плана и т.д.;os
— события взаимодействия с операционной системой (память, диск);network
— события, связанные с сетью (невозможно установить соединение, отправки, таймауты, обрывы, запуск/остановка сокета/порта);api
— события, связанные со взаимодействием с Nemesida WAF API;settings
— события, связанные с настройками модуля;dyn
— события, связанные со взаимодействием с фильтрующей нодой;ml
— события, связанные с работой машинного обучения;geo
— события, связанные с функционалом GeoIP;mgmt
— события, связанные с функционалом сервисного интерфейса управления;openapi
— события, связанные с работой OpenAPI;parsing
— события, связанные с декодом и нормализацией данных;analysis
— события, связанные с обработкой запроса, но не вошедшие ни в одну группу (signature, ml, openapi и т.д.);misc
— события, не вошедшие ни в одну категорию (например, вывод информаци об UUID, WAF ID и т.д.).
- Nemesida AI MLC:
auth
— события, связанные с проверкой программного ключа, тарифного плана и т.д.;os
— события взаимодействия с операционной системой (память, диск);network
— события, связанные с сетью (невозможно установить соединение, отправки, таймауты, обрывы, запуск/остановка сокета/порта);api
— события, связанные со взаимодействием с Nemesida WAF API;settings
— события, связанные с настройками модуля;dyn
— события, связанные со взаимодействием с фильтрующей нодой;rabbitmq
— события, связанные со взаимодействием с RabbitMQ;ml
— события, связанные с работой машинного обучения;geo
— события, связанные с функционалом GeoIP;bf
— события, связанные с работой Brute-force/Flood анализа;ddos
— события, связанные с выявлением DDoS-атак;openapi
— события, связанные с работой OpenAPI;parsing
— события, связанные с декодом и нормализацией данных;analysis
— события, связанные с обработкой запроса, но не вошедшие ни в одну группу (signature, ml, openapi и т.д.);misc
— события, не вошедшие ни в одну категорию (например, вывод информаци об UUID, WAF ID и т.д.).
- Фильтрующая нода:
- Nemesida WAF Scanner:
auth
— события, связанные с проверкой программного ключа, тарифного плана и т.д.;os
— события взаимодействия с операционной системой (память, диск);network
— события, связанные с сетью (невозможно установить соединение, отправки, таймауты, обрывы, запуск/остановка сокета/порта);api
— события, связанные со взаимодействием с Nemesida WAF API;settings
— события, связанные с настройками модуля;scan
— события, связанные с работой компонента;%ModuleName%
— события, связанные с работой определенного модуля сканирования;parsing
— события, связанные с декодом и нормализацией данных;db
— события, связанные cо взаимодействием с базой данных;misc
— события, не вошедшие ни в одну категорию (например, вывод информаци об UUID, WAF ID и т.д.).
Идентификация компонентов:
ip
— IP-адрес сервера, где установлен компонент;uuid
— идентификатор сервера, где установлен компонент;agent
— название компонента:dyn
— Фильтрующая нода;mla
— Nemesida AI MLA;mlc
— Nemesida AI MLC;cabinet
— Личный кабинет;nws
— Nemesida WAF Scanner.
# curl http://api.example.com:8080/nw-api/del_event --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "timestamp": 1686655813, "id": [1, 2, 3], "ip": [ "1.1.1.1", "2.2.2.2" ], "uuid": [ "198be506d69ba8a9bdbcf87b22ef5bc", "198be506d69ba8a9bdbcf87b22ef5bb" ], "agent": [ "dyn", "mla" ], "level": [ "info", "error" ], "category": [ "os", "api" ] }'
Опциональные параметры:
timestamp
— дата в форматеUnix Timestamp
, до которой (включительно) все события будут удалены;id
— ID записей, которые будут удалены;ip
— IP-адрес сервера, где установлен компонент;uuid
— идентификатор сервера, где установлен компонент;agent
— название компонента;level
— уровень серьезности сообщения;category
— категория события.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
Добавленные параметры сочетаются по принципу логического «и» (
&
), а их значения — по принципу логического «или» (|
).Все события старше 90 дней удаляются автоматически.
Функционал позволяет получить информацию о заблокированных запросах, включая статистику за период.
# curl http://api.example.com:8080/nw-api/get_attack --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "startTime": 1677211703, "endTime": 1677211703, "limit": 100, "offset": 1, "bt": [1, ...], "ip": ["1.1.1.1", ...], "cc": ["RU", ...], "vhost": ["example.com", ...], "method": ["post", ...], "rule_id": [1, ...], "signatureType": ["sqli", ...], "mz": ["args", ...], "request_id": ["b2afdac78f17e017dd2b6dfafcb5a974", ...], "group_id": ["b2afdac78f17e017dd2b6dfafcb5a974", ...], "blocked": true, "possible": true, "bodyLimit": 1024, "url": ["/uploads.php", ...], "args": ["abc", ...], "body": ["abc", ...], "cookie": ["abc", ...], "other_headers": ["abc", ...], "referer": ["http://127.0.0.1", ...], "ua": ["Mozilla/5.0", ...], "search": ["abc", ...], }'
Опциональные параметры:
startTime
иendTime
— начальная и конечная дата в форматеUnix Timestamp
, за который будет запрошена информация;limit
— максимальное количество выводимых записей;offset
— смещение для вывода последующих записей. При значении0
и значенииlimit 100
будут выводиться записи с порядковым номером1-100
, при значении1
— записи с порядковым номером101-200
и т.д. Использование параметра без указания максимального количества выводимых записей (limit
) невозможно.bt
— идентификатор блокировки;ip
— IP-адрес;cc
— код страны;vhost
— виртуальный хост, доменное имя;method
— метод отправки HTTP-запроса;rule_id
— идентификатор выявленной сигнатуры;signatureType
— тип выявленной сигнатуры;mz
— зона выявления аномалии;request_id
— уникальный идентификатор запроса;group_id
— идентификатор группы запросов, определенных Nemesida AI MLC как brute-force или DDoS-атака;blocked
— идентификатор статуса фактической блокировки запроса;possible
— фильтр отображения потенциальных атак, которые не были достоверно определены как атаки;bodyLimit
— размер выводимого тела запроса;url
— поиск вхождения строки вURL
-адресе;args
— поиск вхождения строки в аргументах запроса;body
— поиск вхождения строки в теле запроса;cookie
— поиск вхождения строки в заголовкеСookie
;other_headers
— поиск вхождения строки в заголовках (кромеCookie
,User-Agent
иReferer
);referer
— поиск вхождения строки в заголовкеReferer
;ua
— поиск вхождения строки в заголовкеUser-Agent
;search
— поиск вхождения строки для каждого элемента из списка среди зон запроса (url
,args
,body
,cookie
,other_headers
,referer
,ua
).
Поиск значений, передаваемых в виде списка, производится по принципу логического
ИЛИ
.
Формат ответа:
{ "status": "success", "count": integer, "waf_id": string, "attacks": [ { "id": integer, "timestamp": integer, "request_id": string, "group_id": string, "rule_id": integer, "description": string, "long_description": string, "blocked": boolean, "possible": boolean, "lm": boolean, "mz": array, "bt": integer, "ip": string, "cc": string, "vhost": string, "method": string, "url": string, "args":string, "body": string, "cookie": string, "other_headers": string, "ua": string, "referer": string }, ... ] }
или
{"status": "fail", "description": "%описание ошибки%"}
Пример ответа:
{ "status": "success", "count": integer, "waf_id": string, "attacks": [ { "id": 1, "timestamp": 173098845, "request_id": "b2afdac78f17e017dd2b6dfafcb5a974", "group_id": "b2afdac78f17e017dd2b6dfafcb5a974", "rule_id": 1, "description": "SQLi", "long_description": "some_text", "blocked": true, "possible": false, "lm": false, "mz": ["args", ...], "bt": 2, "ip": "1.1.1.1", "cc": "RU", "vhost": "example.com", "method": "POST", "url": "/uploads.php", "args": "abc", "body": "abc", "cookie": "abc", "other_headers": "abc", "ua": "Mozilla/5.0", "referer": "http://127.0.0.1" }, ... ] }
id
— идентификатор записи в БД.
# curl http://api.example.com:8080/nw-api/get_attack_stats --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "startTime": 173098845, "endTime": 173096645 }'
Опциональные параметры:
startTime
и endTime
— начальная и конечная дата в формате Unix Timestamp
, за который будет запрошена информация.
Формат ответа:
{ "status": "success", "bt": [ { "bt": integer, "period": integer }, ... ], "ip": [ { "ip": string, "period": integer }, ... ], "cc": [ { "cc": string, "period": integer }, ... ], "vhost": [ { "vhost": string, "period": integer }, ... ] }
или
{"status": "fail", "description": "%описание ошибки%"}
Пример ответа:
{ "status": "success", "bt": [ { "bt": 1, "period": 30 }, ... ], "ip": [ { "ip": "1.1.1.1", "period": 45 }, ... ], "cc": [ { "cc": "RU", "period": 11 }, ... ], "vhost": [ { "vhost": "example.com", "period": 123 }, ... ] }
period
— количество событий по каждому bt
/сс
/vhost
/ip
за выбранный период;
bt
— идентификатор блокировки;
ip
— IP-адрес;
cc
— код страны;
vhost
— виртуальный хост, доменное имя.
Если период, за который необходимо получить данные, не задан параметрами startTime
и endTime
, то информация будет выводиться за последние 24 часа, 7 и 30 дней.
Формат ответа:
{ "status": "success", "bt": [ { "bt": integer, "lastDay": integer, "last7Days": integer, "last30Days": integer }, ... ], "ip": [ { "ip": string, "lastDay": integer, "last7Days": integer, "last30Days": integer }, ... ], "cc": [ { "cc": string, ... "lastDay": integer, "last7Days": integer, "last30Days": integer }, ... ], "vhost": [ { "vhost": string, "lastDay": integer, "last7Days": integer, "last30Days": integer }, ... ] }
или
{"status": "fail", "description": "%описание ошибки%"}
Пример ответа:
{ "status": "success", "bt": [ { "bt": 1, "lastDay": 12, "last7Days": 24, "last30Days": 145 }, ... ], "ip": [ { "ip": "1.1.1.1", "lastDay": 12, "last7Days": 24, "last30Days": 145 }, ... ], "cc": [ { "cc": "RU", ... "lastDay": 12, "last7Days": 24, "last30Days": 145 }, ... ], "vhost": [ { "vhost": "example.com", "lastDay": 12, "last7Days": 24, "last30Days": 145 }, ... ] }
lastDay/last7Days/last30Days
— количество событий по каждому bt
/сс
/vhost
/ip
за последние 24 часа, 7 и 30 дней;
bt
— идентификатор блокировки;
ip
— IP-адрес;
cc
— код страны;
vhost
— виртуальный хост, доменное имя.
# curl http://api.example.com:8080/nw-api/del_attack --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "id": [1, ...] }'
Пример ответа:
{"status": "success", "deleted": 15}
или
{"status": "fail", "description": "%описание ошибки%"}
Обязательные параметры:
id
— идентификатор записи в БД.
Поиск значений, передаваемых в виде списка, производится по принципу логического
ИЛИ
.
Доступно только для тарифа Энтерпрайз.
Функционал предназначен для управления настройками сканирования в компоненте Nemesida WAF Scanner.
# curl http://api.example.com:8080/nw-api/nws/get_target --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%" }'
Формат ответа:
{ "status": "success", "targets": [ { "active": boolean, "target": string, "scan_proxy": string, "auth_params": { "active": boolean, "url": string, "username_field": string, "username_value": string, "password_field": string, "password_value": string }, "exclude_modules": [string, ...] }, { "active": boolean, "target": string ... } ] }
или
{"status": "fail", "description": "%описание ошибки%"}
Пример ответа:
{ "status": "success", "targets": [ { "active": true, "target": example.com, "scan_proxy": "http://proxy.example.com:3128", "auth_params": { "active": true, "url": "http://example.com/login.php", "username_field": "username", "username_value": "admin", "password_field": "password", "password_value": "123456" }, "exclude_modules": ["sqli", ...] }, ... ] }
# curl http://api.example.com:8080/nw-api/nws/set_target --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "active": true, "target": "http://example.com", "scan_proxy": "http://example.com:3128", "auth_params": { "active": true, "url": "/login.php", "username_field": "username", "username_value": "admin", "password_field": "password", "password_value": "123456" }, "exclude_modules": [ "ba", "ca", "lfi", "rce", "rfi", "sde", "sqli", "ssti", "xss" ] }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
Для управления доступны следующие параметры:
Адрес веб-приложения в формате schema://domain[:port]
.
Пример:
{... "target": "http://example.com" ...}
или
{... "target": "https://example.com:443" ...}
Адрес прокси-сервера (опционально) для обращения к веб-приложению.
Пример:
{... "scan_proxy": "http://proxy.example.com:3128" ...}
Опции аутентификации:
active
— применить параметры аутентификации;url
— адрес страницы веб-приложения для выполнения процедуры аутентификации;username_field
— название поля для ввода имени пользователя;username_value
— имя пользователя;password_field
— название для поля ввода пароля пользователя;password_value
— пароль пользователя.
Если веб-приложение использует собственные названия полей для ввода имени и пароля пользователя, то их необходимо указать в параметрах username_field
и password_field
.
Параметр отключения модулей сканирования.
Пример:
{... "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": "%описание ошибки%"}