Руководство по установке, настройке и эксплуатации модуля Nemesida WAF API, предназначенного для:
- приема информации об атаках и выявленных уязвимостях;
- получения статистики об атаках и централизованного сбора и обработки журналов всех компонентов Немезида ВАФ;
- управления настройками Немезида ВАФ и веб-сервера Nginx;
- управления настройками сканера уязвимостей Nemesida WAF Scanner.
Доменное имя
api.example.com
используется в качестве примера обозначения сервера с установленным модулем Nemesida WAF API.
Для установки Nemesida WAF API необходимо выполнить следующие действия:
1. Установите и настройте СУБД PostgreSQL:
# 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;\""
# 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
# 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
# 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;\""
Если БД используется на отдельном сервере, то необходимо предоставить к ней доступ. Для этого внесите изменения в файл конфигурации PostgreSQL pg_hba.conf
.
Пример:
# IPv4 local connections: host all all 0.0.0.0/0 md5
2. Установите модуль:
Перед установкой модуля обязательно проверьте доступ к созданной БД, произведя подключение к ней командой:
psql -h <server_ip> -U nw_api waf
. При подключении введите пароль пользователяnw_api
.
# 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 && apt upgrade # apt install nginx python3-pip python3-dev postgresql-server-dev-all python3-venv memcached
# echo "deb https://nemesida-security.com/repo/nw/debian bookworm nwaf" > /etc/apt/sources.list.d/NemesidaWAF.list # curl -s https://nemesida-security.com/repo/nw/gpg.key | gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/trusted.gpg --import # chmod 644 /etc/apt/trusted.gpg.d/trusted.gpg # apt update && apt upgrade # apt update && apt upgrade # apt install nginx python3-pip python3-dev postgresql-server-dev-all python3-venv memcached
# apt install nwaf-api
Во время установки модуля дополнительно устанавливаются следующие PIP-пакеты:
flask func-timeout netaddr psycopg2-binary pymemcache pyopenssl cryptography python-decouple requests validators pandas
# 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 # wget -O- https://nemesida-security.com/repo/nw/gpg.key | apt-key add - # apt update && apt upgrade # apt install nginx python3.8 python3-pip python3.8-dev postgresql-server-dev-all python3.8-venv build-essential memcached
# echo "deb [arch=amd64] https://nemesida-security.com/repo/nw/ubuntu jammy non-free" > /etc/apt/sources.list.d/NemesidaWAF.list # curl -s https://nemesida-security.com/repo/nw/gpg.key | gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/trusted.gpg --import # chmod 644 /etc/apt/trusted.gpg.d/trusted.gpg # apt update && apt upgrade # apt install nginx python3.10 python3-pip python3.10-dev postgresql-server-dev-all python3.10-venv build-essential memcached
# apt install nwaf-api
Во время установки модуля дополнительно устанавливаются следующие PIP-пакеты:
flask func-timeout netaddr psycopg2-binary pymemcache pyopenssl cryptography python-decouple requests validators pandas
# 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
# rpm -Uvh https://nemesida-security.com/repo/nw/centos/nwaf-release-centos-8-1-6.noarch.rpm # dnf update # dnf install nginx python39 python39-pip python39-devel postgresql-devel gcc memcached
# rpm -Uvh https://nemesida-security.com/repo/nw/centos/nwaf-release-centos-9-1-6.noarch.rpm # dnf update # dnf install nginx python3 python3-pip python3-devel postgresql-devel gcc memcached
# dnf install nwaf-api
Во время установки модуля дополнительно устанавливаются следующие PIP-пакеты:
flask func-timeout netaddr psycopg2-binary pymemcache pyopenssl cryptography python-decouple requests validators pandas
3. Разрешите обращения:
При локальном развертывании БД:
— к внешним ресурсам;
— к серверу Memcached 127.0.0.1:11211
;
— к серверу с СУБД PostgreSQL 127.0.0.1:5432
.
При развертывании БД на отдельном сервере:
— к внешним ресурсам;
— к серверу Memcached 127.0.0.1:11211
;
— к серверу с СУБД PostgreSQL <server_ip>:5432
.
4. Создайте структуру базы данных:
# cat /var/www/nw-api/api.sql | su postgres -c "psql waf"
5. Внесите необходимые изменения в файл /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
6. Активируйте виртуальный хост:
# mv /etc/nginx/conf.d/nwaf-api.conf.disabled /etc/nginx/conf.d/nwaf-api.conf # nginx -t && service nginx reload
7. Перезапустите сервис и проверьте работу модуля:
# 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-адресов.
1. На сервере с установленным динамическим модулем внесите изменения в конфигурационный файл /etc/nginx/nwaf/conf/global/nwaf.conf
, приведя параметры к виду:
nwaf_api_proxy http://proxy.example.com:3128; nwaf_sys_proxy http://proxy.example.com:3128; nwaf_api_conf host=http://api.example.com:8080/nw-api/;
где api.example.com:8080/nw-api/
— адрес и порт сервера, на котором установлен модуль Nemesida WAF API, а http://proxy.example.com:3128
— адрес прокси-сервера для обращения к Nemesida WAF API.
2. На сервере с установленным модулем Nemesida AI MLC внесите изменения в конфигурационный файл /opt/mlc/mlc.conf
, приведя параметры к виду:
api_uri = http://api.example.com:8080/nw-api/ api_proxy = http://proxy.example.com:3128
3. На сервере с установленным модулем Nemesida WAF Scanner внесите изменения в конфигурационный файл /opt/nws/main.conf
, приведя параметры к виду:
api_host = http://api.example.com:8080/nw-api/ api_proxy = http://proxy.example.com:3128
4. После внесения изменений необходимо перезапустить сервисы или перезагрузить сервер.
🔗 Общие сведения
Используя вызовы API, можно управлять настройками Немезида ВАФ:
- настройками динамического модуля;
- настройками Nemesida AI MLC;
- настройками API Firewall;
- поведенческими моделями;
- синхронизацией между серверами настроек динамического модуля и Nemesida AI MLC;
- правилами исключения сигнатур и расширенными правилами блокировки.
Управление настройками осуществляется с помощью специально составленных запросов. Каждый запрос должен содержать лицензионный ключ установленной копии Немезида ВАФ.
🔗 Настройка динамического модуля
Позволяет управлять настройками динамического модуля. Поддерживает следующие команды управления:
# curl http://api.example.com:8080/nw-api/get_dyn_settings?format=json --data 'key=%Лицензионный ключ%'
Пример ответа:
{"nwaf_ip_wl": "127.0.0.1", "nwaf_limit": "nwaf_limit domain=example.com rate=3r/s block_time=300, nwaf_limit rate=5r/s block_time=300", "nwaf_body_exclude": "a.example.com/upload/1/", "nwaf_rfc_violation_lm": "*, .example.com/uploads/uploads.php", "nwaf_rfc_violation_wl": "example.com, *.example.com/uploads/", "nwaf_b64_decode_disable": "example.com z:BODY|URL|ARGS|HEADERS", "status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/set_dyn_settings --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "set": { "nwaf_ip_wl": "127.0.0.1, 127.0.0.2", "nwaf_ai_extra_host_lm": "example.com", "active": true } }'
set
— параметры настроек в формате JSON.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
Для управления доступны следующие параметры:
Устанавливает лимит заблокированных запросов. При превышении допустимого количества запросов, определенного опцией rate
, IP-адрес будет заблокирован на время (в секундах), указанное в block_time
.
Пример:
{... "nwaf_limit": "rate=5r/m block_time=600" ...}
Параметр domain
является опциональным и требуется только для установки лимита заблокированных запросов для конкретного домена. Для этого необходимо привести параметр к виду: nwaf_limit rate=... block_time=... domain=...
. Допускается использовать строгое соответствие и wildcard-значения: *
, example.com
, .example.com
, *.example.com
.
Пример:
{... "nwaf_limit": "domain=example.com rate=5r/m block_time=600" ...}
Для установки разных лимитов для разных доменов необходимо указать параметры для каждого из них.
Пример:
{... "nwaf_limit": "domain=a.example.com rate=5r/m block_time=300, domain=example.com rate=5r/m block_time=300" ...}
или
{... "nwaf_limit": "rate=10r/m block_time=600, domain=example.com rate=5r/m block_time=300" ...}
В последнем примере будут установлены лимиты на 5
блокировок в минуту для домена example.com
(с последующей блокировкой IP-адреса атакующего на 300 секунд), а также лимиты на 10
блокировок в минуту для всех остальным доменов (с последующей блокировкой IP-адреса атакующего на 600 секунд).
При выявлении атак методом перебора (BT 7), флуда (BT 9) и DDoS (BT 10) параметр rate
не учитывается, блокировка будет производиться при первом срабатывании.
Деактивация механизма анализа запроса средствами Немезида ВАФ для конкретного IP-адреса или подсети.
Пример:
{... "nwaf_ip_wl": "127.0.0.1, 192.168.0.1" ...}
При использовании "nwaf_ip_wl": "domain=example.com 127.0.0.1"
механизм анализа будет деактивирован только при обращении с конкретного IP-адреса на конкретный домен. Значение domain
является опциональным. Допускается использовать строгое соответствие и wildcard-значения: *
, example.com
, .example.com
, *.example.com
. Допускается использование IPv4/IPv6 адресов, в том числе использование CIDR (например, x.x.x.x/24) и диапазона IP-адресов.
Пример:
{... "nwaf_ip_wl": "127.0.0.1, 192.168.61.0/24, 192.168.61.1-192.168.61.255" ...}
Для снижения количества ложных срабатываний рекомендуется указывать статический IP-адрес пользователей (администраторов, контент-менеджеров, редакторов) в параметре nwaf_ip_wl
. Запросы, попадающие под действие параметра не будут блокироваться, передаваться в RabbitMQ, и, как результат, анализироваться модулем Nemesida AI. При использовании параметра будьте предельно осторожны.
Настройка обработки запросов для конкретного IP-адреса или подсети с фиксацией в СУБД, но без фактической блокировки (режим мониторинга).
Пример:
{... "nwaf_ip_lm": "127.0.0.1, 192.168.0.1" ...}
При использовании "nwaf_ip_lm": "domain=example.com 127.0.0.1"
пропуск будет производиться только при обращении с конкретного IP-адреса на конкретный домен. Значение domain
является опциональным. Допускается использовать строгое соответствие и wildcard-значения: *
, example.com
, .example.com
, *.example.com
. Допускается использование IPv4/IPv6 адресов, в том числе использование CIDR (например, x.x.x.x/24) и диапазона IP-адресов.
Пример:
{... "nwaf_ip_lm": "127.0.0.1, 192.168.61.0/24, 192.168.61.1-192.168.61.255" ...}
Допускается использование IPv6 и IPv4-адресов.
Определение географического местоположения на основе IP-адреса производится за счет обращения к онлайн GeoIP
-базе, если информация об IP-адресе не была получена из файла /etc/nginx/nwaf/conf/global/cc.json
. В случае ошибки или невозможности ее использования запрос на определение передается в модуль Nemesida AI MLA. Для запросов, попадающих под действие параметра, определение географического местоположения с использованием Nemesida AI MLA будет деактивировано.
Пример:
{... "nwaf_geoip_mla_disable": "example.com" ...}
Допускается использовать строгое соответствие и wildcard-значения: *
, example.com
, .example.com
, *.example.com
.
Деактивация механизма анализа запроса средствами Немезида ВАФ для виртуального хоста. При параметре nwaf_host_wl *
пропуск будет производиться для всех виртуальных хостов.
Пример использования одного значения:
{... "nwaf_host_wl": "*" ...}
или
{... "nwaf_host_wl": "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
.
Если при записи 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
.
При параметре *
деактивация будет производиться для всех виртуальных хостов.
Если при записи 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
.
При значении *
обработка запросов в режиме мониторинга будет производиться для всех виртуальных хостов.
Если при записи 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
.
Для зоны 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
.
Если при записи 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
.
Если при записи 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, 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
.
Нелегитимные запросы, поступающие с определенного 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
.
Нелегитимные запросы, поступающие на определенный URL-адрес и попадающие под действие параметра, не фиксируются в журналах и не блокируются при анализе запроса на соответствие его спецификации в формате OpenAPI.
Пример:
{... "nwaf_openapi_url_wl": "*" ...}
или
{... "nwaf_openapi_url_wl": "example.com/admin/*" ...}
или
{... "nwaf_openapi_url_wl": "example.com/admin/admin.php" ...}
Для записи домена допускается использовать строгое соответствие и wildcard-значения: *
, example.com
, .example.com
, *.example.com
.
При значении example.com/admin/*
будет учитываться вхождение URL-адреса, например, example.com/admin/ааааа
или example.com/admin/bbbbb
.
Если при записи URL-адреса необходимо использовать знак *
в качестве обычного символа, то необходимо выполнить его экранирование символами \\
, например, запись example.com/admin/uploads/aa\\*a
будет соответствовать example.com/admin/uploads/aa*a
.
При значении *
параметр будет применяться для любого URL-адреса.
Нелегитимные запросы, поступающие на определенный URL-адрес и попадающие под действие параметра, фиксируются в журналах, но не блокируются при анализе запроса на соответствие его спецификации в формате OpenAPI.
Пример:
{... "nwaf_openapi_url_lm": "*" ...}
или
{... "nwaf_openapi_url_lm": "example.com/admin/*" ...}
или
{... "nwaf_openapi_url_lm": "example.com/admin/admin.php" ...}
Для записи домена допускается использовать строгое соответствие и wildcard-значения: *
, example.com
, .example.com
, *.example.com
.
При значении example.com/admin/*
будет учитываться вхождение URL-адреса, например, example.com/admin/ааааа
или example.com/admin/bbbbb
.
Если при записи URL-адреса необходимо использовать знак *
в качестве обычного символа, то необходимо выполнить его экранирование символами \\
, например, запись example.com/admin/uploads/aa\\*a
будет соответствовать example.com/admin/uploads/aa*a
.
При значении *
параметр будет применяться для любого URL-адреса.
# curl http://api.example.com:8080/nw-api/set_dyn_settings --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "del": "nwaf_ip_wl" }'
del
— параметр настроек в формате JSON.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
🔗 Управление списком заблокированных IP-адресов
Функционал позволяет создавать списки для блокировки запросов на основе IP-адреса источника запроса.
# curl http://api.example.com:8080/nw-api/get_dyn_bl?format=json --data 'key=%Лицензионный ключ%'
Пример ответа:
{"status": "success", "active": true, "bl": ["10.0.0.1-10.0.0.25", "2.2.2.2", "10.0.0.15 domain=example.com", "domain=example.com 1.1.1.1", "4.4.4.4-5.5.5.5 api=yes", "10.0.0.15", "3.3.3.0/24", "domain=example.com 3.3.3.3-4.4.4.4", "domain=example.com 10.0.0.15", "domain=example.com 3.4.5.6"]}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/set_dyn_bl --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "set": { "active": true, "bl": [ "domain=example.com 1.1.1.1", "2.2.2.2", "3.3.3.0/24", "4.4.4.4-5.5.5.5 api=yes" ] } }'
set
— параметры настроек в формате JSON.
api=yes
— параметр отправки событий о блокировках при обращении с указанного IP-адреса(ов) в Nemesida WAF API.
Запросы с IP-адреса 1.1.1.1
будут заблокированы только для домена example.com
. Обращения с IP-адресов 2.2.2.2
, 3.3.3.0/24
и 4.4.4.4-5.5.5.5
будут блокироваться для всех доменов, включая example.com
.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/set_dyn_bl --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "del": "" }'
del
— параметр настроек в формате JSON.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
🔗 Управление списком автоматически заблокированных IP-адресов
Функционал позволяет управлять списком автоматически заблокированных IP-адресов для всех фильтрующих нод.
# curl http://api.example.com:8080/nw-api/get_dyn_sync_ban --data 'key=%Лицензионный ключ%'
Пример ответа:
{ "status": "success", "ban_data": [ { "ip-address": "127.0.0.1", "ttl": 30, "is_banned": true, "domain": "1.example.com", "timestamp": 1234567890 }, { "ip-address": "127.0.0.2", "ttl": 30, "is_banned": true, "domain": "2.example.com", "timestamp": 1234567891 }, { "ip-address": "127.0.0.3", "ttl": 30, "is_banned": true, "domain": "DEFAULT", "timestamp": 1234567892 } ] }
или
{"status": "fail", "description": "%описание ошибки%"}
ip-address
— IP-адрес;
ttl
— оставшееся время блокировки в секундах;
is_banned
— параметр указывает, заблокирован ли IP-адрес;
domain
— виртуальный хост (доменное имя), обращения к которому блокируются для IP-адреса. DEFAULT
означает, что для IP-адреса блокируются обращения на любой виртуальный хост;
timestamp
— дата добавления IP-адреса в список в формате Unix Timestamp
.
# curl http://api.example.com:8080/nw-api/del_dyn_sync_ban --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "ip-address": "127.0.0.1" }'
ip-address
— IP-адрес для удаления в формате IPv4/IPv6. Допускается использование *
для удаления всех IP-адресов.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
🔗 Правила исключения сигнатур
Позволяет настроить правила исключения сигнатур. С помощью созданного правила исключения нельзя исключить срабатывание расширенного правила блокирования запросов. Поддерживает следующие команды управления:
# curl http://api.example.com:8080/nw-api/get_dyn_wl?format=json --data 'key=%Лицензионный ключ%'
Пример ответа:
{"status": "success", "wl": [{"mz": "ARGS", "rl_id": "515", "active": true, "domain": "example.com.com", "modify": "2023-06-22T18:55:13.800437", "extension": null, "rid": 20}]}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/set_dyn_wl --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "add": { "rl_id": "1", "domain": "example.com", "mz": "url", "extension": "$URL_X:/test" } }'
add
— параметры настроек в формате JSON.
Пример ответа:
{"status": "success", "rid": 20}
или
{"status": "fail", "description": "%описание ошибки%"}
Для управления доступны следующие параметры:
Параметр активирует/деактивирует правило исключения.
Пример:
{... "active": 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/set_dyn_wl --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "upd": { "rid": "20", "mz": "URL" } }'
upd
— параметры настроек в формате JSON;
rid
— ID правила, который генерируется при создании правила исключения.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/set_dyn_wl --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "del": { "rid": "8" } }'
del
— параметры настроек в формате JSON.
rid
— ID правила, который генерируется при создании правила исключения.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
🔗 Расширенные правила блокировки запросов
Механизм расширенных правил блокирования запросов позволяет при составлении персональных правил использовать дополнительные условия для более точного результата. Например, можно составить правило, по которому запрос будет заблокирован если:
- соответствует географическому местоположению на основе IP-адреса (определение страны по IP-адресу атакующего);
- происходит обращение на определенный домен или URL;
- содержит определенный заголовок (например,
User-Agent
,Cookie
,Referer
и т.д.) и/или содержимое этих заголовков.
Для более точного результата параметры можно комбинировать между собой. В таком случае правило сработает только в случае соответствия всех условий.
ip
— IP-адрес атакующего;api
— отправлять результат срабатывания правила в модуль Nemesida WAF API;lm
— обработка правила в режимеLM
(фиксируется срабатывание правила, но запрос не блокируется);noban
— со значениемfalse
при срабатывании правила запрос будет заблокирован, но счетчикrate
параметраnwaf_limit
, необходимый для блокировки IP-адреса источника запросов, не будет увеличиваться;no_cookie
— со значениемtrue
правило применяется только к запросу с пустой зонойCookie
;country
— страна;domain
— домен;url
— вхождение строки в содержимое зоныURL
;args
— вхождение строки в содержимое зоныARGS
;body
— вхождение строки в содержимое зоныBODY
;cookies
— вхождение строки в содержимое зоныCookie
;ua
— вхождение строки в содержимое зоныUser-Agent
;referer
— вхождение строки в содержимое зоныReferer
;other_headers
— вхождение строки в содержимое зоныHEADERS
, за исключением зонCookie
,User-Agent
иReferer
.
Для поля domain
допускается использовать строгое соответствие и wildcard-значения: *
, example.com
, .example.com
, *.example.com
.
Пример:
{... "domain": "base64(*.example.com)" ...}
При таком значении правило будет применяться ко всем поддоменам (a.example.com
, b.example.com
и т.д.), исключая основной домен example.com
. Если значение поля domain
пустое, то правило будет применяться ко всем запросам.
Префикс
base64
перед параметром означает, что значение параметра при составлении правила необходимо передавать в форматеbase64
. Например:"domain": "base64(*.example.com)"
будет выглядеть как"domain": "Ki5leGFtcGxlLmNvbQ=="
Для всех параметров (кроме api
,lm
, noban
и no_cookie
) допускается использовать несколько значений в одном параметре, используя логические операторы условий «не» (!
), «и» (&
), «или» (|
). Операторы не имеют приоритета и выполняются по очереди, слева направо.
Пример:
{... "ip": "192.168.61.0/24|192.168.62.0/24" ...}
При таком значении правило будет применяться ко всем IP-адресам из диапазонов 192.168.61.1-192.168.61.255
или 192.168.62.1-192.168.62.255
.
Пример:
{... "country": "!base64(RU)&!base64(US)" ...}
При таком значении правило будет применяться ко всем запросам, в которых IP-адрес источника запроса не из России и не из США.
Пример:
{... "cookie": "!base64(abc)&!base64(def)" ...}
При таком значении правило будет применяться ко всем запросам, которые не содержат abc
и def
в Cookie
.
При проверке срабатывания расширенного правила блокирования запроса все поля, кроме ip
, country
, api
, lm
и noban
, проверяются на вхождение содержимого поля из правила блокирования в проверяемое поле запроса. Например, при "url": "base64(/abc)"
будет заблокирован запрос с вхождением /abcd
в URL.
other_headers
Формат поля:
{... "other_headers": ["base64(header_name):base64(header_value)", "base64(header_name):base64(header_value)" ...] ...}
base64(header_name)
— название заголовка в base64
;
base64(header_value)
— значение заголовка в base64
.
Для поля other_headers
содержимое секций base64(header_name)
и base64(header_value)
являются опциональными, но необходимо указать хотя бы одну из секций . Например, при наличии заголовка header_name
будет проверяться содержимое header_value
только этого заголовка, а при отсутствии — содержимое всех заголовков.
Пример:
{... "other_headers": ["base64(example_header):base64(abcd)"] ...}
При таком значении запрос будет заблокирован при наличии abcd
в заголовке example_header
.
Пример:
{... "other_headers": [":base64(abcd)"] ...}
При таком значении запрос будет заблокирован при наличии abcd
в любом заголовке.
Если base64(header_name)
указан без последующего значения, то блокирование запроса произойдет при любом значении заголовка header_name
(блокировка по наличию заголовка).
Пример:
{... "other_headers": ["base64(example_header):"] ...}
Пример:
{... "other_headers": ["base64(example1_header):base64(abc)","base64(example2_header):base64(def)"] ...}
При таком значении запрос будет заблокирован при наличии заголовков example1_header
, который содержит abc
и example2_header
, который содержит def
.
Пример:
{... "other_headers": ["base64(example1_header):","base64(example2_header):"] ...}
При таком значении запрос будет заблокирован при наличии заголовков example1_header
и example1_header
с любыми значениями.
Для имени заголовка допустимо применение логического оператора !!
, означающего отсутствие заголовка с таким именем в запросе. Блокирование запроса сработает в том случае, если среди всех заголовков запроса отсутствует заголовок с указанным именем. При этом, значение заголовка игнорируется, даже если присутствует в правиле.
Пример:
{... "other_headers": ["!!base64(example_header):"] ...}
Пример:
{... "other_headers": ["base64(example_header):base64(abc)&base64(def)"] ...}
При таком значении запрос будет заблокирован при наличии заголовка example_header
, который содержит abc
и def
.
Пример:
{... "other_headers": ["base64(example_header):!base64(abc)"] ...}
При таком значении запрос будет заблокирован при наличии заголовка example_header
, который не содержит abc
.
Пример:
{... "other_headers": ["base64(example_header):!base64(a)&!base64(b)&!base64(c)"] ...}
При таком значении запрос будет заблокирован при наличии заголовка example_header
, который не содержит a
, b
и c
.
Пример:
{... "other_headers": ["base64(example_header):!base64(a)|base64(b)"] ...}
При таком значении запрос будет заблокирован при наличии заголовка example_header
, который не содержит a
или содержит b
.
Если в запросе недоступно получение какого-либо поля, указанного в расширенном правиле блокирования, то запрос будет пропущен.
Поддерживает следующие команды управления:
# curl http://api.example.com:8080/nw-api/get_dyn_erl?format=json --data 'key=%Лицензионный ключ%'
Пример ответа:
{"status": "success", "erl": [{"id": 100052, "ip": "1.1.1.1|3.3.3.3", "lm": false, "ua": null, "api": true, "url": null, "args": null, "body": null, "noban": false, "active": true, "cookie": null, "domain": null, "modify": "2023-06-28T15:07:46.002211", "country": null, "referer": null, "no_cookie": false, "other_headers": null, "rid": 100052}]}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/set_dyn_erl --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "add": { "ip": "1.1.1.1|2.2.2.2", "active": true } }'
add
— параметры настроек в формате JSON.
# curl http://api.example.com:8080/nw-api/set_dyn_erl --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "add": { "ip": "!1.1.1.0/24", "domain": "ZXhhbXBsZS5jb20=", "active": true } }'
Запрос будет заблокирован, если на example.com
поступит запрос c любого IP-адреса, кроме 1.1.1.1-1.1.1.255
.
Из-за особенностей обработки запросов функционал не предназначен для работы с большим количеством IP-адресов. Если необходимо блокировать обращения для списка IP-адресов — воспользуйтесь функционалом добавления IP-адреса в список «Заблокированные IP».
# curl http://api.example.com:8080/nw-api/set_dyn_erl --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "add": { "ip": "1.1.1.1", "domain": "ZXhhbXBsZS5jb20=", "other_headers": [ "dGVzdC1oZWFkZXI=:YWJj" ], "active": true } }'
Запрос будет заблокирован правилом в случае, если на example.com
поступит запрос с IP-адреса 1.1.1.1
и заголовок test-header
содержит строку abc
.
# curl http://api.example.com:8080/nw-api/set_dyn_erl --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "add": { "сountry": "Q0g=|UlU=", "domain": "ZXhhbXBsZS5jb20=", "other_headers": [ "dGVzdC1oZWFkZXI=:YWJj" ], "cookie": "!dGVzdF9jb29raWU=", "referer": "!aHR0cDovL2V4YW1wbGUuY29t", "active": true } }'
Запрос будет заблокирован правилом в случае, если на example.com
поступит запрос с IP-адреса из региона RU
или CH
, заголовок test-header
содержит строку abc
, заголовок Cookie
не содержит строку test_cookie
и заголовок Referer
не содержит http://example.com
.
# curl http://api.example.com:8080/nw-api/set_dyn_erl --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "add": { "ip": "1.1.1.1", "other_headers": [ "VGVzdC1GaWVsZA==:" ], "referer": "aHR0cDovL2V4YW1wbGUuY29tLw==", "ua": "TW96aWxsYS81LjA=", "cookie": "dGVzdF9jb29raWU=", "body": "YmM9MyZjYz0x", "args": "P3BhZ2U9Mw==", "url": "aW50ZXJuYWx0ZXN0", "domain": "ZXhhbXBsZS5jb20=", "api": false, "country": "Q0g=|VFc=", "active": true } }'
Запрос будет заблокирован правилом в случае, если на example.com
поступит запрос c IP-адреса 1.1.1.1
из региона RU
или CH
, который будет содержать:
- заголовок
Referer
с содержимымhttp://example.com/
; - заголовок
Test-Field
с любым содержимым; - заголовок
User-Agent
с содержимымMozilla/5.0
; - заголовок
Cookie
с содержимымtest_cookie
; - содержимое тела запроса
bc=3&cc=1
; - аргумент запроса
?page=3
.
Пример ответа:
{"status": "success", "rid": 100053}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/set_dyn_erl --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "upd": { "rid": "1", "ip": "1.1.1.1", "active": true } }'
upd
— параметры настроек в формате JSON.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/set_dyn_erl --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "del": { "rid": "1" } }'
del
— параметры настроек в формате JSON.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
🔗 Настройка Nemesida AI MLC
Позволяет управлять настройками модуля Nemesida AI MLC. Поддерживает следующие команды управления:
# curl http://api.example.com:8080/nw-api/get_mlc_settings?format=json --data 'key=%Лицензионный ключ%'
Пример ответа:
{"ddos__wl_ip": "10.0.0.2", "ddos__enable": true, "ddos__wl_url": "[\"example.com\"]", "brute__enable": true, "brute__max_val": 10, "ddos__interval": 120, "main__ai_extra": false, "brute__interval": 30, "ddos__latest_only": false, "brute__latest_only": false, "brute__brute_detect": "[\"example.com/index.php\", \"example.by\"]", "brute__flood_detect": "[\"example.com/index.php\", \"example.by\", \"example.com/wp-login.php\"]", "ddos__send_possible": false, "brute__send_possible": false, "openapi__vhosts_list": "[\"example.com\", \"example.ru\"]", "status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/get_vhosts_list --data 'key=%Лицензионный ключ%'
Пример ответа:
{"status": "success", "vhosts_list": "["example.com", "example.ru"]"}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/set_vhosts_list --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "vhosts_list": ["example.com, example.org"] }'
vhosts_list
— список виртуальных хостов, для которых будут созданы и применены модели.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/set_mlc_settings --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "set": { "main__ai_extra": "false", "brute__interval": "11", "brute__brute_detect": [ "example.com/a1", "example.com/b1" ], "active": true } }'
set
— параметры настроек в формате JSON.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
Для управления доступны следующие параметры:
Активация/деактивация функционала дополнительного анализа запросов, позволяющего выявлять пропущенные атаки и производить временное блокирование их источника по IP-адресу. При неактивном функционале дополнительного анализа все незаблокированные запросы будут включены в обучающую выборку (за исключением запросов, попадающих под действие режима WL
, или нелегитимных запросов, попавших под действия режима LM
).
Пример:
{... "main__ai_extra": true ...}
Параметр задает список виртуальных хостов, для которых будут созданы спецификации в формате OpenAPI
.
Пример:
{... "openapi__vhosts_list": ["example.com", "example.ru"] ...}
Пример:
{... "ddos__enable": true ...}
x.x.x.x/24
). Каждое последующее значение указывается через пробел.
Пример:
{... "ddos__wl_ip": "127.0.0.1 192.168.1.0/24" ...}
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"] ...}
Пример:
{... "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
.
brute_detect
функционал, но предназначен для выявления попыток флуда или аналогичных атак с повторением запроса. Единственное различие заключается в том, что в процессе анализа запросов, попадающих под действие параметра flood_detect
, не происходит удаление дублей.
Таким образом, в случае повторной отправки идентичных запросов (например, множественные попытки восстановления пароля по СМС), запросы, имеющие схожее содержание и попадающие под действие параметра flood_detect
, не будут удалены, в отличие от запросов, имеющие схожее содержание, но попадающих под действие параметра brute_detect
.
Пример:
{... "brute__flood_detect": ["example.com/auth", ".example.com/auth"] ...}
или
{... "brute__flood_detect": ["*.example.com/auth"] ...}
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/set_mlc_settings --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "del": "brute_detect" }'
del
— параметры настроек в формате JSON.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
🔗 Управление поведенческими моделями
Некорректное обучение поведенческих моделей или значительные изменения в веб-приложении могут привести ко множеству ложных срабатываний. Для повышения точности определения атак рекомендуется выполнять переобучение моделей раз в неделю. Команды ниже позволяют производить действия над моделями.
# curl http://api.example.com:8080/nw-api/get_models_list_uri --data 'key=%Лицензионный ключ%'
Пример ответа:
["example.ru"]
или
[]
# curl http://api.example.com:8080/nw-api/del_models_uri --data 'key=%Лицензионный ключ%&vhost=example.com'
vhost
— имя виртуального хоста, для которого необходимо удалить поведенческую модель.
Пример ответа:
{"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/set_training_uri --data 'key=%Лицензионный ключ%&vhost=*.example.com&complete=no'
4. Запустите сервис Nemesida AI MLC:
# service mlc_main start
# curl http://api.example.com:8080/nw-api/rep_models_uri --data 'key=%Лицензионный ключ%&src=example.com&dst=example.ru'
src
— виртуальный хост, поведенческая модель которого копируется;
dst
— виртуальный хост, для которого необходимо скопировать модель.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/get_training_uri --data 'key=%Лицензионный ключ%&vhost=example.com'
Пример ответа:
{'status': 'success', 'duration': 4, 'complete': True, 'progress': 11}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/set_training_uri --data 'key=%Лицензионный ключ%&vhost=example.com&duration=4'
duration
— период обучения в днях.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/set_training_uri --data 'key=%Лицензионный ключ%&vhost=*.example.com&complete=no'
complete
— статус обучения модели.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/set_training_uri --data 'key=%Лицензионный ключ%&vhost=.example.com&duration=4&complete=no'
Выполнение команды со значением параметра complete=no
позволяет запустить процесс переобучения модели, а complete=yes
— прерывает процесс обучения.
Перед запуском процесса обучения модели виртуальный хост должен быть добавлен в список виртуальных хостов.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/get_openapi_schemas --header 'Content-type: application/json' --data '{"key": "%Лицензионный ключ%"}'
Пример ответа:
{"schemas": [{"schema_name": "example.ru", "schema": null}, {"schema_name": "example.com", "schema": "eyJvcGVuYXBpIjogIjMuMC4xIiwgImluZm8iOilY2lwaGVyT25seSJdfSwgIlg1MDlLZXlVc2FnZUZsYWdzQ3NyRGlmZmVyZW5jZSI6IHsidHlwZSI6ICJvYmplY3QiLCAicHJvcGVydGllcyI6IHsiRXhwZWN0ZWRWYWx1ZSI6IHsiJHJlZiI6ICIjL2NvbXBvbmVudHMvc2NoZW1hcy9YNTA5S2V5VXNhZ2VGbGFncyJ9LCAiQ3NyVmFsdWUiOiB7IiRyZWYiOiAiIy9jb21wb25lbnRzL3NjaGVtYXMvWDUwOUtleVVzYWdlRmxhZ3MifX0sICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlLCAiZGVzY3JpcHRpb24iOiAiXHUwNDFlXHUwNDQyXHUwNDNiXHUwNDM4XHUwNDQ3XHUwNDM4XHUwNDRmIFx1MDQzZlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQzY1x1MDQzNVx1MDQ0Mlx1MDQ0MFx1MDQzMCBcdTA0MzdcdTA0MzBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0NDFcdTA0MzAgXHUwNDNkXHUwNDMwIFx1MDQzMlx1MDQ0Ylx1MDQzZlx1MDQ0M1x1MDQ0MVx1MDQzYSBcdTA0NDFcdTA0MzVcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDRcdTA0MzhcdTA0M2FcdTA0MzBcdTA0NDJcdTA0MzAifX0sICJzZWN1cml0eVNjaGVtZXMiOiB7ImJhc2ljQXV0aCI6IHsidHlwZSI6ICJodHRwIiwgImRlc2NyaXB0aW9uIjogIklucHV0IHlvdXIgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHRvIGFjY2VzcyB0aGlzIEFQSSIsICJzY2hlbWUiOiAiYmFzaWMifX19LCAic2VjdXJpdHkiOiBbeyJiYXNpY0F1dGgiOiBbXX1dLCAic2VydmVycyI6IFt7InVybCI6ICIvIn1dfQ=="}]}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/set_openapi_schema --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "set": { "schema_name": "%Имя спецификации%", "schema": "%base64(Спецификация)%" } }'
Для корректной работы в качестве имени спецификации необходимо использовать доменное имя, заданное в спецификации. Например, если в спецификации задан параметр servers
со значением:
"servers": [ { "url": "http://example.com" } ]
то имя спецификации должно быть example.com
.
Допускается использовать строгое соответствие и wildcard-значения: *
, example.com
, .example.com
, *.example.com
.
После создания или изменения спецификации необходимо задать список URL-адресов для фильтрующей ноды, при обращении на которые будет выполняться анализ на соответствие запроса его спецификации. Если список URL-адресов не задан или не соответствует спецификации, то анализ запроса проводиться не будет.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/set_openapi_url --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "url": [ "example.com/admin", "example.com/admin/info", "example.com/v1/client/info", ] }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/set_openapi_schema --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "set": { "schema_name": "%Имя спецификации%", "old_name": "%Имя спецификации%" } }'
Для корректной работы в качестве имени спецификации необходимо использовать доменное имя, заданное в спецификации. Например, если в спецификации задан параметр servers
со значением:
"servers": [ { "url": "http://example.com" } ]
то имя спецификации должно быть example.com
.
Допускается использовать строгое соответствие и wildcard-значения: *
, example.com
, .example.com
, *.example.com
.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/set_openapi_schema --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "del": { "schema_name": "%Имя спецификации%" } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/get_openapi_schema_paths --header 'Content-type: application/json' --data '{"key": "%Лицензионный ключ%"}'
Nemesida AI MLC генерирует paths
со спецификациями, представленные в виде конечного URL-адреса ресурса (исключая базовый путь) и метода получения доступа к ресурсу (например: GET
, POST
, PUT
, DELETE
).
Пример ответа:
{"paths": ["example.com/url_1/", "example.com/url_2"]}
или
{"paths": []}
# 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": ["/test_84/", "/test_85/"]}
или
{"exclude_paths": []}
🔗 Глобальные настройки Nginx
Секция позволяет задать глобальные настройки Nginx, которые будут располагаться в /etc/nginx/nwaf/conf/nginx/nginx.conf
. Поддерживает следующие команды управления:
# curl http://api.example.com:8080/nw-api/nginx/get_nginx --data 'key=%Лицензионный ключ%'
Пример ответа:
{ "status": "success", "configuration": [ { "active": true, "resolver": "127.0.0.1 [::1]:5353 valid=30s", "limit_req_zone": [ "$binary_remote_addr zone=mylimit_1:10m rate=10r/s", "$binary_remote_addr zone=mylimit_2:10m rate=10r/s" ], "real_ip_header": "X-Forwarded-For", "resolver_timeout": "30s", "set_real_ip_from": [ "192.168.1.0/24", "192.168.2.1" ], "client_max_body_size": "100m" } ] }
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/nginx/set_nginx --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "set": { "active": true, "resolver": "127.0.0.1 [::1]:5353 valid=30s", "resolver_timeout": "30s", "set_real_ip_from": [ "192.168.1.0/24", "192.168.2.1" ], "real_ip_header": "X-Forwarded-For", "client_max_body_size": "100m", "limit_req_zone": [ "$binary_remote_addr zone=mylimit_1:10m rate=10r/s", "$binary_remote_addr zone=mylimit_2:10m rate=10r/s" ] } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
Для управления доступны следующие параметры:
Адрес DNS-сервера. Значение valid
(в секундах) означает как долго ответ DNS-сервера будет считаться действительным.
Параметр устанавливает значение (в секундах), в течение которого Nginx будет ожидать ответа от DNS-сервера.
Параметр задаёт доверенные адреса, которые передают верный адрес для замены. Доверенные адреса могут быть также заданы при помощи имени хоста.
Допускается использование IPv6 и IPv4-адресов.
Задаёт поле заголовка запроса, значение которого будет использоваться для замены адреса клиента.
Параметр задаёт максимально допустимый размер тела запроса клиента в мегабайтах. Если размер больше заданного, то клиенту возвращается ошибка 413 (Request Entity Too Large). Установка параметра со значением 0
отключает проверку размера тела запроса клиента.
Задаёт параметры зоны разделяемой памяти, которая хранит состояние для разных значений ключа. В качестве ключа можно использовать текст, переменные и их комбинации. Запросы с пустым значением ключа не учитываются.
# curl http://api.example.com:8080/nw-api/nginx/set_nginx --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "set": { "resolver": null, "resolver_timeout": null, "set_real_ip_from": null, "real_ip_header": null, "client_max_body_size": null, "limit_req_zone": null } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
🔗 Настройка виртуального хоста
Параметр
name
— имя конфигурации, которое будет располагаться в/etc/nginx/nwaf/conf/nginx/%name%.conf
.
Секция предназначена для настройки файла виртуального хоста. Поддерживает следующие команды управления:
# curl http://api.example.com:8080/nw-api/nginx/get_vhost --data 'key=%Лицензионный ключ%'
Пример ответа:
{ "status": "success", "configuration": [ { "name": "example.com", "root": "/var/www/site", "index": "index index.html index.php", "active": true, "listen": [ "localhost:80 default_server", "[::1]:443 default_server ssl http2" ], "add_header": { "Content-Encoding": "gzip", "Content-Type": "text/html; charset=utf-8" }, "error_page": { "504": "=200 @bad_gateway", "404 502": "=200 /404.html" }, "locations": [ { "location": "/static_1", "pass_type": "root", "path": "/var/www/html", "index": "index.php", "add_header": { "Content-Encoding": "gzip", "Content-Type": "text/html; charset=utf-8" }, "error_page": { "504": "=200 @bad_gateway", "404 502": "=200 /404.html" }, "limit_req": "zone=mylimit_1 burst=20 nodelay", "limit_req_status": 444 }, { "location": "/static_2", "pass_type": "alias", "path": "/var/www/static_2", "autoindex": "on", "limit_req": "zone=mylimit_1 burst=20 nodelay", "limit_req_status": 444 }, { "location": "/abc_1", "pass_type": "proxy_pass", "proxy_pass": "http://main_proxy", "proxy_http_version": 1.0, "proxy_set_header": { "X-Real_IP": "$remote_address", "Host": "$http_host" }, "proxy_connect_timeout": "60s", "proxy_send_timeout": "60s", "proxy_read_timeout": "60s", "proxy_intercept_errors": "on", "limit_req": "zone=mylimit_1 burst=20 nodelay", "limit_req_status": 444 }, { "location": "/abc_2", "pass_type": "memcached_pass", "memcached_pass": "memc_upstream", "limit_req": "zone=mylimit_1 burst=20 nodelay", "limit_req_status": 444 } ], "server_name": "www.example.com example.com", "ssl_ciphers": "AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5", "dhparam_name": "dhparam", "ssl_protocols": "TLSv1 TLSv1.1 TLSv1.2", "certificate_name": "SSL", "ssl_session_timeout": "10m" } ] }
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/nginx/set_vhost --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "set": { "name": "%Имя конфигурации%", "active": true, "listen": [ "localhost:80 default_server", "[::1]:443 default_server ssl http2" ], "server_name": "www.example.com example.com", "certificate_name": "%name%", "dhparam_name": "%name%", "ssl_session_timeout": "10m", "ssl_ciphers": "AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5", "ssl_protocols": "TLSv1 TLSv1.1 TLSv1.2", "root": "/var/www/site", "index": "index.php index.html", "add_header": { "Content-Encoding": "gzip", "Content-Type": "text/html; charset=utf-8" }, "error_page": { "404 502": "=200 /404.html", "504": "=200 @bad_gateway" }, "locations": [ { "location": "/static_1", "pass_type": "root", "path": "/var/www/html", "index": "index.php", "add_header": { "Content-Encoding": "gzip", "Content-Type": "text/html; charset=utf-8" }, "error_page": { "504": "=200 @bad_gateway", "404 502": "=200 /404.html" }, "limit_req": "zone=mylimit_1 burst=20 nodelay", "limit_req_status": 444 }, { "location": "/static_2", "pass_type": "alias", "path": "/var/www/static_2", "autoindex": "on", "limit_req": "zone=mylimit_1 burst=20 nodelay", "limit_req_status": 444 }, { "location": "/abc_1", "pass_type": "proxy_pass", "proxy_pass": "http://main_proxy", "proxy_http_version": 1.0, "proxy_set_header": { "X-Real_IP": "$remote_address", "Host": "$http_host" }, "proxy_connect_timeout": "60s", "proxy_send_timeout": "60s", "proxy_read_timeout": "60s", "proxy_intercept_errors": "on", "limit_req": "zone=mylimit_1 burst=20 nodelay", "limit_req_status": 444 }, { "location": "/abc_2", "pass_type": "memcached_pass", "memcached_pass": "memc_upstream", "limit_req": "zone=mylimit_1 burst=20 nodelay", "limit_req_status": 444 } ] } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
Для управления доступны следующие параметры:
Имя конфигурации.
Параметр задаёт адрес, на которых сервер будет принимать запросы.
Адрес может быть задан в виде доменного имени/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/set_vhost --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "del": { "name": "%Имя конфигурации%" } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
🔗 Настройка балансировки нагрузки
Параметр
name
— имя конфигурации с параметрами балансировки нагрузки, который будет располагаться в/etc/nginx/nwaf/conf/nginx/%name%.conf
.
Секция предназначена для настройки параметров балансировки нагрузки. Поддерживает следующие команды управления:
# curl http://api.example.com:8080/nw-api/nginx/get_upstream --data 'key=%Лицензионный ключ%'
Пример ответа:
{ "status": "success", "configuration": [ { "name": "upstream_main", "servers": [ { "server": "backend1.example.com", "weight": 3 }, { "server": "127.0.0.1:8080", "fail_timeout": "60s" }, { "server": "192.0.2.1", "max_fails": 5 }, { "server": "backend3.example.com", "weight": 3, "fail_timeout": "60s", "max_fails": 5 }, { "server": "backend4.example.com" }, { "server": "backend5.example.com", "backup": true }, { "server": "backend4.example.com", "down": true } ], "balancing_method": "ip_hash" } ] }
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/nginx/set_upstream --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "set": { "name": "%Имя конфигурации%", "balancing_method": "ip_hash", "servers": [ { "server": "backend1.example.com", "weight": 3 }, { "server": "127.0.0.1:8080", "fail_timeout": "60s" }, { "server": "192.0.2.1", "max_fails": 5 }, { "server": "backend3.example.com", "weight": 3, "fail_timeout": "60s", "max_fails": 5 }, { "server": "backend4.example.com" }, { "server": "backend5.example.com", "backup": true }, { "server": "backend4.example.com", "down": true } ] } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
Для управления доступны следующие параметры:
Название группы серверов для балансировки нагрузки.
Метод распределения нагрузки между серверами. Допускается использовать одно из значений: ip_hash, least_conn или random.
Список серверов, которые используются для обработки запросов, а также их параметры:
server
— адрес сервера. Адрес может быть задан в виде доменного имени/IP-адреса и порта (опционально) или UNIX-сокета. Допускается использование IPv6 и IPv4-адресов;weight
— числовой показатель приоритета выбора сервера при обработке запроса;fail_timeout
— время (в секундах), в течение которого должно произойти заданное число неудачных попыток работы с сервером для того, чтобы сервер считался недоступным;max_fails
— максимальное число неудачных попыток связи с сервером за время, заданное параметромfail_timeout
;down
— помечает сервер как постоянно недоступный;backup
— помечает сервер как запасной. На него будут передаваться запросы в случае, если не работают основные серверы.
# curl http://api.example.com:8080/nw-api/nginx/set_upstream --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "set": { "name": "%Имя конфигурации%", "balancing_method": null, "servers": null } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/nginx/set_upstream --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "del": { "name": "%Имя конфигурации%" } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
🔗 Настройка SSL-сертификатов
Параметр
name
— имя конфигурации для SSL-сертификатов и их приватных ключей, которые будут располагаться в/etc/nginx/nwaf/conf/nginx/ssl/certs/%name%.crt
и/etc/nginx/nwaf/conf/nginx/ssl/private/%name%.key
.
В целях безопасности выполнение команды получения конфигурации не возвращает полное содержимое поля certificate_key
. Полная информация о приватном ключе certificate_key
запрашивается компонентом Nemesida AI MLA по URL-адресу http://api.example.com:8080/nw-api/nginx/secure/get_certificate
, доступ к которому рекомендуется разрешить только для сервера фильтрующей ноды.
Секция предназначена для настройки параметров SSL-сертификатов и их приватных ключей. Поддерживает следующие команды управления:
# curl http://api.example.com:8080/nw-api/nginx/get_certificate --data 'key=%Лицензионный ключ%'
Пример ответа:
{ "status": "success", "configuration": [ { "name": "SSL", "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURVekNDQWpzQ0ZGei9jNjhLYk9USnlYOWpibWZMbjdmK1YwdWtNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1IOHgKQ3pBSkJnTlZCQVlUQWtGVk1RNHdEQVlEVlFRSURBVkJVMEZGUmpFTk1Bc0dBMVVFQnd3RVQzSmxiREVSTUE4RwpBMVVFQ2d3SVUxTlNSMEZCUldZeERqQU1CZ05WQkFzTUJYTnlaWFJuTVE0d0RBWURWUVFEREFWM1pUUm1aekVlCk1Cd0dDU3FHU0liM0RRRUpBUllQWVdSdGFXNUFZV1J0YVc0dVkyOXRNQjRYRFRJek1EY3hOekV3TlRZME0xb1gKRFRJMk1EUXhNVEV3TlRZME0xb3dUVEVMTUFrR0ExVUVCaE1DUTBFeERUQUxCZ05WQkFnTUJFNXZibVV4Q3pBSgpCZ05WQkFjTUFrNUNNUTB3Q3dZRFZRUUtEQVJPYjI1bE1STXdFUVlEVlFRRERBcGxlR0Z0Y0d4bExuSjFNSUlCCklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFySitBMkZ3cHFjMDhNVnRhVzZKeUsvbDkKQy9NWXFJRXZtRjZvdUt5V01ZRWFGMmlPK0l2VG1pN2hETkxQakR2ekhKRHJMYTZycjhJMkdMN0Nxdi9tdkN5NQpKZVBaSVZxeU9PQ0NLUEJFVXFrUkl4NUwvQ0hLMnVieHlxL1ZIWUExRysxanVqNzNINXZqUHM4anRyeFFNVG5OCkNacVBycmdoOTRlU0ViRmpER2JyZGlGSFpURmwyT01QdTlBVEJoRjF3dStwYS8yN3BJVm91S21BTnVTa0pTaUoKM29wRTkzZFJDYkUvWVhoTjJKTlNjdmdzcjBVbXBRd2t5VDJ4bGVKbHV0Sm5PZkZiK1NsdWFHVlloOUtncEwrcQorN2x3MFk0OEtYNnJGeXUzNko1RjBxNUN6T1hoMS9BZWFneStJQTdGanVSOU9tTFEvQVlwSGE1QmZMK0Fid0lECkFRQUJNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUNnV1VGTVZrMkVSaHF3WGpBT0YxVCt1cWZJM3pKZkVrTHAKYlZieW90d2dRMnZPU2VZdlAyU1dqdjZCMDExZEFONWNYTUIvOFhOVEdhdUNSajN1cEtTTUtvd1JaY1hjdUlKMApocUNDc01JZGw1bDFBQVFJWCtPTTJTeEpKdHVRK0dkWlhkQ294RStzN20zSHNCQ3UwbWRzY3doU0hGSnRmbXRhCit6eFJ4VmY5QkU3NDJSUE5ydXNFZmxwdVQ2Rm14QkpMUy9WYzVLOWtQMngwdjZQTjZYMUF4M09vRGhrQ3Nma2cKeXpwSFhtK3J1ZWJmcnNvcFdwUzJBM083T09CRk1lTVhZeHl3WjJUR2hmanh3R3ZGZml0ZnhFNnpTUnZnQ1A5WQphaUM5RUlMSXpodUdDNDFXNFFZYTJBUzNoaVF4Qms0eDcyeGZ1cXpmc212OE5Zd0lzY3BxCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K", "certificate_key": "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2QUlCQURBTioqKioqSjIyTmViTm5pVlE9PQotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tCg==" } ] }
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/nginx/set_certificate --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "set": { "name": "%Имя конфигурации%", "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURVekNDQWpzQ0ZGei9jNjhLYk9USnlYOWpibWZMbjdmK1YwdWtNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1IOHgKQ3pBSkJnTlZCQVlUQWtGVk1RNHdEQVlEVlFRSURBVkJVMEZGUmpFTk1Bc0dBMVVFQnd3RVQzSmxiREVSTUE4RwpBMVVFQ2d3SVUxTlNSMEZCUldZeERqQU1CZ05WQkFzTUJYTnlaWFJuTVE0d0RBWURWUVFEREFWM1pUUm1aekVlCk1Cd0dDU3FHU0liM0RRRUpBUllQWVdSdGFXNUFZV1J0YVc0dVkyOXRNQjRYRFRJek1EY3hOekV3TlRZME0xb1gKRFRJMk1EUXhNVEV3TlRZME0xb3dUVEVMTUFrR0ExVUVCaE1DUTBFeERUQUxCZ05WQkFnTUJFNXZibVV4Q3pBSgpCZ05WQkFjTUFrNUNNUTB3Q3dZRFZRUUtEQVJPYjI1bE1STXdFUVlEVlFRRERBcGxlR0Z0Y0d4bExuSjFNSUlCCklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFySitBMkZ3cHFjMDhNVnRhVzZKeUsvbDkKQy9NWXFJRXZtRjZvdUt5V01ZRWFGMmlPK0l2VG1pN2hETkxQakR2ekhKRHJMYTZycjhJMkdMN0Nxdi9tdkN5NQpKZVBaSVZxeU9PQ0NLUEJFVXFrUkl4NUwvQ0hLMnVieHlxL1ZIWUExRysxanVqNzNINXZqUHM4anRyeFFNVG5OCkNacVBycmdoOTRlU0ViRmpER2JyZGlGSFpURmwyT01QdTlBVEJoRjF3dStwYS8yN3BJVm91S21BTnVTa0pTaUoKM29wRTkzZFJDYkUvWVhoTjJKTlNjdmdzcjBVbXBRd2t5VDJ4bGVKbHV0Sm5PZkZiK1NsdWFHVlloOUtncEwrcQorN2x3MFk0OEtYNnJGeXUzNko1RjBxNUN6T1hoMS9BZWFneStJQTdGanVSOU9tTFEvQVlwSGE1QmZMK0Fid0lECkFRQUJNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUNnV1VGTVZrMkVSaHF3WGpBT0YxVCt1cWZJM3pKZkVrTHAKYlZieW90d2dRMnZPU2VZdlAyU1dqdjZCMDExZEFONWNYTUIvOFhOVEdhdUNSajN1cEtTTUtvd1JaY1hjdUlKMApocUNDc01JZGw1bDFBQVFJWCtPTTJTeEpKdHVRK0dkWlhkQ294RStzN20zSHNCQ3UwbWRzY3doU0hGSnRmbXRhCit6eFJ4VmY5QkU3NDJSUE5ydXNFZmxwdVQ2Rm14QkpMUy9WYzVLOWtQMngwdjZQTjZYMUF4M09vRGhrQ3Nma2cKeXpwSFhtK3J1ZWJmcnNvcFdwUzJBM083T09CRk1lTVhZeHl3WjJUR2hmanh3R3ZGZml0ZnhFNnpTUnZnQ1A5WQphaUM5RUlMSXpodUdDNDFXNFFZYTJBUzNoaVF4Qms0eDcyeGZ1cXpmc212OE5Zd0lzY3BxCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K", "certificate_key": "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2QUlCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktZd2dnU2lBZ0VBQW9JQkFRQ3NuNERZWENtcHpUd3gKVzFwYm9uSXIrWDBMOHhpb2dTK1lYcWk0ckpZeGdSb1hhSTc0aTlPYUx1RU0wcytNTy9NY2tPc3RycXV2d2pZWQp2c0txLythOExMa2w0OWtoV3JJNDRJSW84RVJTcVJFakhrdjhJY3JhNXZIS3I5VWRnRFViN1dPNlB2Y2ZtK00rCnp5TzJ2RkF4T2MwSm1vK3V1Q0gzaDVJUnNXTU1adXQySVVkbE1XWFk0dys3MEJNR0VYWEM3NmxyL2J1a2hXaTQKcVlBMjVLUWxLSW5laWtUM2QxRUpzVDloZUUzWWsxSnkrQ3l2UlNhbERDVEpQYkdWNG1XNjBtYzU4VnY1S1c1bwpaVmlIMHFDa3Y2cjd1WERSamp3cGZxc1hLN2ZvbmtYU3JrTE01ZUhYOEI1cURMNGdEc1dPNUgwNll0RDhCaWtkCnJrRjh2NEJ2QWdNQkFBRUNnZ0VBWENKSjM3RFpIK01GeElZd3BRWUFFQTU2T24yR1pMR0cyTGwxTGhRWG1kYUIKT1lzNSs5aU5tUlo2VWFEVzI4OUhnN0NwaFZsY0UxUUNFWlVIUzhPSHdGblNmREd2TzBrd0pJRlhsMGdkLzB4egpkQjRBaWxMeTlZRWIvb1Y0cHVVOTgyanh1SDlRNE5NUUovN2czZkNHa0s5OEN5c3VreDkrS2FKM1NQQTNvRzhSCnlLNDVKckRZK1l4WktLNS9EZmtrZlRGdXF6TDkxSzdIcFdBKzkxc3FnRUM5c0hqTzJyME9KUmlEK1lFekFLZisKb0hsSHZmTjhrblBSTDZRMWFJaUgvL1o3S053YTlmOHFvK0prZmR3bExaS21KS21ScEtqQUppMWd1ckZSaklzUgpQeU5sTm43VHljQmZUKzIvS3hoNm1pR2F1UWg1ZC9saXg2QVJLMjhTdVFLQmdRRFNSQkxmQ3RiYWR2OThtWWJsCnREUS95OUZoSWo0WHJML2xPZVhJaEZEbFpKc3U4R3dpSzZZczNqWFQvOEhwUlZUbll6TkdtdUhUNk5Pb1lkakoKWk5IWDFINHlCT2xMV3oyQ3RvNk1aMWJSWkVlcHplV29GM2txMWc2TmNabmJYdk4xNmNhSXJzTG9LY0NYQ2h6UwpFQ245TytrS1FBYk1PL3d2WXVMUWJpRlU4d0tCZ1FEU0syc09WWGIrbm83MVZmR1BUSDJpQUV2bWxFRlZwVkNhClNxMmtWZE9hQkVOR3BnWnRwNmZ4Lzh5bUlPbGczWnZpQ2JQZnVhK2FGOENqVUYzaGRkcDFRdTI3RjdCaGswbGUKUXNrRGVBaEU4KzVxWWZtWEUwZUo1dE11bmtYUHM2b2o3eHRTTlR2c01CZEwwK3AwVUtia0EzaDVvLzlqdytkLwp2OHRpYytKMWxRS0JnQ1RNd1RqRUh1SlJYVm1qVFJhNnVVSkpHN1lTVmlleWxrczZITnRCUFI5SXdsZ3V2OTRqCklZeE12OE1BeWlGWGZ3cVlOQXN4WkVEQVNQcjVWUVc2WFhlV3V4ZHFBS0t0cjFCSFB4K1hubnc3UHNlYlA0eHgKdjBVZC9hSUh0ZFBOQkhNb25SU2k4WDNNZ09adVlLanJKMDRveEJxRkppdHNmRENXNy9kbXJ2SzlBb0dBZVR4OApsQmN1L25BZXpWMVhiQzlXcFpZQU1ySEJBcFBMYkVXNTV2dHZoZ0FCZ3dhUTNMNkMvZkZ1YjBLNi9acTRxbXFvCmJWMWk4OFBSNXlPY0ZFdjB5Z0hpdXpOT0Z1dHN2a2hPUm9iK1ZqQlVqdCtYcDlPQ1NBVjBPd2NvQkVtQzB4bkMKSytqemVTckF0WWc0VGdLY1V4bkJiSUh5OSt6eFpOc1JpdWlJY1FVQ2dZQUpQN3pBck5IQ0FVYWwwOUQvQVFjbAppMGVxQnkvZ2xJOXlIS1BVcDFlU1BnUnhSL3Y4ZVBPOGM2azA5YkM3bk1TeDQ5bEVWWnhvT1lkM3ZkSyszQXZCCnByZWZscnZXTk5hSWhBMHdsZTRjWXdObHlMZDVKRU5zeDZ1RTBwNUd4UVRLeEZNUE16L2JaSlU0YzZkUWsyUDIKNFdVME1SLzRLdU9KMjJOZWJObmlWUT09Ci0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K" } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
Для управления доступны следующие параметры:
Каноническое имя SSL-сертификата и его приватного ключа, которое будет использоваться в качестве имен соответствующих файлов.
SSL-cертификат и цепочку SSL-сертификатов (опционально) в формате Base64
. Параметр задается вместе с параметром certificate_key
.
Приватный ключ SSL-сертификата в формате Base64
. Параметр задается вместе с параметром certificate
.
# curl http://api.example.com:8080/nw-api/nginx/set_certificate --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "del": { "name": "%Имя конфигурации%" } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
🔗 Настройка DHParam
Параметр
name
— имя конфигурации с параметрами DHParam, который будет располагаться в/etc/nginx/nwaf/conf/nginx/ssl/dhparam/%name%.pem
.
В целях безопасности выполнение команды получения конфигурации не возвращает полное содержимое поля dhparam
. Полная информация о dhparam
запрашивается компонентом Nemesida AI MLA по URL-адресу http://api.example.com:8080/nw-api/nginx/secure/get_dhparam
, доступ к которому рекомендуется разрешить только для сервера фильтрующей ноды.
Секция предназначена для настройки параметра DHParam. Поддерживает следующие команды управления:
# curl http://api.example.com:8080/nw-api/nginx/get_dhparam --data 'key=%Лицензионный ключ%'
Пример ответа:
{ "status": "success", "configuration": [ { "name": "dhparam", "dhparam": "LS0tLS1CRUdJTiBESCBQQVJBTUVURVJTLS0tLS0KTUlHSEFvR0JBTyoqKioqV2N1TkFEYkFnRUMKLS0tLS1FTkQgREggUEFSQU1FVEVSUy0tLS0tCg==" } ] }
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/nginx/set_dhparam --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "set": { "name": "%Имя конфигурации%", "dhparam": "LS0tLS1CRUdJTiBESCBQQVJBTUVURVJTLS0tLS0KTUlHSEFvR0JBT1lpNi9OQmljaHU5UDlPS3BpZ1RLQTB4WjNUWnZKQ3pWNzMvWkxCMkgvRFFzc2xUNWgyWEltcQpiazR0SHRGc2ViNDU0S29IR3JoM2FCbzFmcXB5REJQMDcxR0M3eE12c2xUQXVBanVIRmFVckd6NVNDTWRRN3A3CnJvaWNJdExNWE5razQ1WWpzazRPZjZHVXhDZXQ1MkdqSHo3a01yemdvbUtWTldjdU5BRGJBZ0VDCi0tLS0tRU5EIERIIFBBUkFNRVRFUlMtLS0tLQo=" } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
Для управления доступны следующие параметры:
Каноническое имя pem
-файла, необходимого для работы Forward Secrecy
. Forward Secrecy
означает, что если злоумышленник узнает какой-либо сеансовый ключ, то он сможет получить доступ лишь к данным, защищенным этим ключом.
Значение ключа в формате Base64
.
# curl http://api.example.com:8080/nw-api/nginx/set_dhparam --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "del": { "name": "%Имя конфигурации%" } }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
Доступно только для тарифа Enterprise.
Функционал предназначен для централизованного приема, хранения и обработки журналов всех компонентов Немезида ВАФ.
# curl http://api.example.com:8080/nw-api/get_event --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "startTime": 1234567891, "endTime": 1987654321, "limit": 100, "offset": 1, "level": [ "info", "error" ], "ip": [ "1.1.1.1", "2.2.2.2" ], "uuid": [ "198be506d69ba8a9bdbcf87b22ef5bc", "198be506d69ba8a9bdbcf87b22ef5bb" ], "agent": [ "dyn", "mlc" ], "category": [ "auth", "settings" ] }'
Опциональные параметры:
startTime
— начальная дата в форматеUnix Timestamp
, за который будет запрошена информация;endTime
— конечная дата в форматеUnix Timestamp
, за который будет запрошена информация;limit
— максимальное количество выводимых записей;offset
— смещение для вывода последующих записей;level
— уровень серьезности сообщения;ip
— IP-адрес сервера, где установлен компонент;uuid
— идентификатор сервера, где установлен компонент;agent
— название компонента;category
— категория события.
Пример ответа:
{ "status": "success", "count": 28, "waf_id": "1674726761", "events": [ { "id": 2798306, "ip": "1.1.1.1", "uuid": "bd4f447720189ca3c5a42e1395fa6021", "agent": "dyn", "level": "debug", "category": "nginx", "timestamp": 1688404169, "description": "This is log 1" } ] }
Добавленные параметры сочетаются по принципу логического «И», а их значения — по принципу логического «ИЛИ».
startTime
— начальная дата в форматеUnix Timestamp
, за который будет запрошена информация;endTime
— конечная дата в форматеUnix Timestamp
, за который будет запрошена информация.
Количество записей:
limit
— максимальное количество выводимых записей;offset
— смещение для вывода последующих записей. При значении0
и значенииlimit 100
будут выводиться записи с порядковым номером1-100
, при значении1
— записи с порядковым номером101-200
и т.д. Использование параметра без указания максимального количества выводимых записей (limit
) невозможно.
Ранжирование событий:
level
— уровень серьезности события;debug
— события с отладочной информацией;info
— информационные сообщения о состоянии компонента;warn
— предупреждения о потенциальной проблеме в работе компонента;error
— сообщения об ошибках в работе компонента;fatal
— сообщения о критических ошибках в работе компонента, приводящие к сбою в работе.
category
— категория события:- Динамический модуль:
auth
— события, связанные с проверкой программного ключа, тарифного плана и т.д.;os
— события взаимодействия с операционной системой (память, диск);network
— события, связанные с сетью (невозможно установить соединение, отправки, таймауты, обрывы, запуск/остановка сокета/порта);api
— события, связанные со взаимодействием с Nemesida WAF API;settings
— события, связанные с настройками модуля;nginx
— события, связанные со взаимодействием с Nginx (несоответствие настроек, необходимых для работы динамического модуля, нарушения RFC);signature
— события, связанные с сигнатурным анализом;clamav
— события, связанные со взаимодействием с ClamAV;mla
— события, связанные со взаимодействием с Nemesida AI MLA;mlc
— события, связанные со взаимодействием с Nemesida AI MLC;rabbitmq
— события, связанные со взаимодействием с RabbitMQ;autoban
— события, связанные механизмом автоматической блокировки;geo
— события, связанные с функционалом GeoIP;openapi
— события, связанные с работой OpenAPI;parsing
— события, связанные с декодом и нормализацией данных;analysis
— события, связанные с обработкой запроса, но не вошедшие ни в одну группу (signature, ml, openapi и т.д.);misc
— события, не вошедшие ни в одну категорию (например, вывод информаци об UUID, WAF ID, количестве сигнатур и т.д.).
- Nemesida AI MLA:
auth
— события, связанные с проверкой программного ключа, тарифного плана и т.д.;os
— события взаимодействия с операционной системой (память, диск);network
— события, связанные с сетью (невозможно установить соединение, отправки, таймауты, обрывы, запуск/остановка сокета/порта);api
— события, связанные со взаимодействием с Nemesida WAF API;settings
— события, связанные с настройками модуля;dyn
— события, связанные со взаимодействием с динамическим модулем;ml
— события, связанные с работой машинного обучения;geo
— события, связанные с функционалом GeoIP;mgmt
— события, связанные с функционалом сервисного интерфейса управления;openapi
— события, связанные с работой OpenAPI;parsing
— события, связанные с декодом и нормализацией данных;analysis
— события, связанные с обработкой запроса, но не вошедшие ни в одну группу (signature, ml, openapi и т.д.);misc
— события, не вошедшие ни в одну категорию (например, вывод информаци об UUID, WAF ID и т.д.).
- Nemesida AI MLC:
auth
— события, связанные с проверкой программного ключа, тарифного плана и т.д.;os
— события взаимодействия с операционной системой (память, диск);network
— события, связанные с сетью (невозможно установить соединение, отправки, таймауты, обрывы, запуск/остановка сокета/порта);api
— события, связанные со взаимодействием с Nemesida WAF API;settings
— события, связанные с настройками модуля;dyn
— события, связанные со взаимодействием с динамическим модулем;rabbitmq
— события, связанные со взаимодействием с RabbitMQ;ml
— события, связанные с работой машинного обучения;geo
— события, связанные с функционалом GeoIP;bf
— события, связанные с работой Brute-force/Flood анализа;ddos
— события, связанные с работой DDoS анализа;openapi
— события, связанные с работой OpenAPI;parsing
— события, связанные с декодом и нормализацией данных;analysis
— события, связанные с обработкой запроса, но не вошедшие ни в одну группу (signature, ml, openapi и т.д.);misc
— события, не вошедшие ни в одну категорию (например, вывод информаци об UUID, WAF ID и т.д.).
- Динамический модуль:
- Nemesida WAF Scanner:
auth
— события, связанные с проверкой программного ключа, тарифного плана и т.д.;os
— события взаимодействия с операционной системой (память, диск);network
— события, связанные с сетью (невозможно установить соединение, отправки, таймауты, обрывы, запуск/остановка сокета/порта);api
— события, связанные со взаимодействием с Nemesida WAF API;settings
— события, связанные с настройками модуля;scan
— события, связанные с работой компонента;%ModuleName%
— события, связанные с работой определенного модуля сканирования;parsing
— события, связанные с декодом и нормализацией данных;db
— события, связанные cо взаимодействием с базой данных;misc
— события, не вошедшие ни в одну категорию (например, вывод информаци об UUID, WAF ID и т.д.).
Идентификация компонентов:
ip
— IP-адрес сервера, где установлен компонент;uuid
— идентификатор сервера, где установлен компонент;agent
— название компонента:dyn
— динамический модуль;mla
— Nemesida AI MLA;mlc
— Nemesida AI MLC;cabinet
— Личный кабинет;nws
— Nemesida WAF Scanner.
# curl http://api.example.com:8080/nw-api/del_event --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "timestamp": "1686655813", "id": [ 1, 2, 3 ], "ip": [ "1.1.1.1", "2.2.2.2" ], "uuid": [ "198be506d69ba8a9bdbcf87b22ef5bc", "198be506d69ba8a9bdbcf87b22ef5bb" ], "agent": [ "dyn", "mla" ], "level": [ "info", "error" ], "category": [ "os", "api" ] }'
Опциональные параметры:
timestamp
— дата в форматеUnix Timestamp
, до которой (включительно) все события будут удалены;id
— ID записей, которые будут удалены;ip
— IP-адрес сервера, где установлен компонент;uuid
— идентификатор сервера, где установлен компонент;agent
— название компонента;level
— уровень серьезности сообщения;category
— категория события.
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
Добавленные параметры сочетаются по принципу логического «И», а их значения — по принципу логического «ИЛИ».
Все события старше 90 дней удаляются автоматически.
Функционал позволяет получить информацию о заблокированных запросах, включая статистику за период.
# curl http://api.example.com:8080/nw-api/get_attack --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "startTime": 1677211703, "endTime": 1677211703, "limit": 100, "offset": 1, "bt": [ 1, 2, 3, 7, 9 ], "ip": [ "1.1.1.1", "2.2.2.2", "3.3.3.3" ], "cc": [ "RU", "US", "UK" ], "vhost": [ "example.com", "api.example.com", "shop.example.com" ] }'
Опциональные параметры:
startTime
иendTime
— начальная и конечная дата в форматеUnix Timestamp
, за который будет запрошена информация;limit
— максимальное количество выводимых записей;offset
— смещение для вывода последующих записей. При значении0
и значенииlimit 100
будут выводиться записи с порядковым номером1-100
, при значении1
— записи с порядковым номером101-200
и т.д. Использование параметра без указания максимального количества выводимых записей (limit
) невозможно.bt
— идентификатор блокировки;ip
— IP-адрес;cc
— код страны;vhost
— виртуальный хост, доменное имя.
Пример ответа:
{ "status": "success", "count": "1234", "waf_id": "1234567890", "attacks": [ { "id": 1, "timestamp": 1677211703, ... "description": "%data in plain-text%" }, { "id": 2, "timestamp": 1234567891, ... "description": "%data in plain-text%" }, ... ] }
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/get_attack_stats --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "startTime": 1677211703, "endTime": 1677211753 }'
Опциональные параметры:
startTime
и endTime
— начальная и конечная дата в формате Unix Timestamp
, за который будет запрошена информация.
Пример ответа:
{ "status": "success", "bt": [ { "bt": 1, ... "period": 14 }, { "bt": 2, ... "period": 14 } ], "ip": [ { "ip": "1.1.1.1", ... "period": 14 }, { "ip": "2.2.2.2", ... "period": 14 } ], "cc": [ { "cc": "RU", ... "period": 14 }, { "cc": "US", ... "period": 14 } ], "vhost": [ { "vhost": "example.com", ... "period": 14 } ] }
или
{"status": "fail", "description": "%описание ошибки%"}
period
— количество событий по каждому bt
/сс
/vhost
/ip
за выбранный период;
bt
— идентификатор блокировки;
ip
— IP-адрес;
cc
— код страны;
vhost
— виртуальный хост, доменное имя.
Если период, за который необходимо получить данные, не задан параметрами startTime
и endTime
, то информация будет выводиться за последние 24 часа, 7 и 30 дней.
Пример ответа:
{ "status": "success", "bt": [ { "bt": 1, ... "lastDay": 1, "last7Days": 13, "last30Days": 84 }, { "bt": 2, ... "lastDay": 1, "last7Days": 13, "last30Days": 84 } ], "ip": [ { "ip": "1.1.1.1", ... "lastDay": 1, "last7Days": 13, "last30Days": 84 }, { "ip": "2.2.2.2", ... "lastDay": 1, "last7Days": 13, "last30Days": 84 } ], "cc": [ { "cc": "RU", ... "lastDay": 1, "last7Days": 13, "last30Days": 84 }, { "cc": "US", ... "lastDay": 1, "last7Days": 13, "last30Days": 84 } ], "vhost": [ { "vhost": "example.com", ... "lastDay": 1, "last7Days": 13, "last30Days": 84 } ] }
или
{"status": "fail", "description": "%описание ошибки%"}
bt
— идентификатор блокировки;
ip
— IP-адрес;
cc
— код страны;
vhost
— виртуальный хост, доменное имя.
Доступно только для тарифа Enterprise.
Функционал предназначен для управления настройками сканирования в компоненте Nemesida WAF Scanner.
# curl http://api.example.com:8080/nw-api/nws/get_target --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%" }'
Пример ответа:
{ "status": "success", "targets": [ { "active": true, "target": "http://example.com", "scan_proxy": "http://example.com:3128", "auth_params": { "active": true, "url": "/login.php", "username_field": "username", "username_value": "admin", "password_field": "password", "password_value": "123456" }, "exclude_modules": [ "ba", "ca", "lfi", "rce", "rfi", "sde", "sqli", "ssrf", "ssti", "xss" ] }, { "active": true, "target": "https://1.example.com" ... } ] }
или
{"status": "fail", "description": "%описание ошибки%"}
# curl http://api.example.com:8080/nw-api/nws/set_target --header 'Content-type: application/json' --data '{ "key": "%Лицензионный ключ%", "active": true, "target": "http://example.com", "scan_proxy": "http://example.com:3128", "auth_params": { "active": true, "url": "/login.php", "username_field": "username", "username_value": "admin", "password_field": "password", "password_value": "123456" }, "exclude_modules": [ "ba", "ca", "lfi", "rce", "rfi", "sde", "sqli", "ssti", "xss" ] }'
Пример ответа:
{"status": "success"}
или
{"status": "fail", "description": "%описание ошибки%"}
Для управления доступны следующие параметры:
Адрес веб-приложения в формате 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": "%описание ошибки%"}