Противодействие сканерам
Девять jail для HTTP-сканеров могут навсегда заблокировать адрес уже после одной подходящей строки журнала. В отличие от SSH с подсчётом ошибок, они ищут характерные шаблоны запросов.
Но те же пути, методы и User-Agent могут встречаться у обычных пользователей. Поэтому исключения здесь не менее важны, чем сами сигнатуры. Совпадение фильтра не доказывает, что атака удалась или что перед нами злоумышленник.
Все девять jail используют общие настройки. Ниже описано, что именно проверяется и какие запросы намеренно исключены.
Конфиденциальные файлы и VCS
nginx-scanner-secrets нацелен на попытки обращения к .env, .git/config, .svn/entries, файлам облачных учётных данных, закрытым ключам, файлам истории и резервным копиям конфигурации.
Этот фильтр исключает /.well-known/acme-challenge/. Так эти попытки отличаются от обычных проверок наличия публичного файла.
Методы HTTP
nginx-scanner-method нацелен на TRACE, CONNECT, заданные методы WebDAV и расширений, PRI, а также заданные некорректные методы и методы в нижнем регистре. Примеры: PROPFIND, MKCOL, LOCK, GETT и get.
Обычный OPTIONS используется для предварительных запросов CORS и не входит в эту проверку методов. Фильтр исключает пути в /dav, /webdav и /remote.php.
Обход путей (path traversal)
nginx-scanner-traversal нацелен на ../, заданные кодированные формы, системные файлы паролей, сведения об окружении процессов, файлы конфигурации Windows и сигнатуры попыток с нулевым байтом.
Даже если строка выглядит как обычный поисковый запрос, она может совпасть, если заданная сигнатура встречается в любом месте URI.
JNDI
nginx-scanner-jndi нацелен на ${jndi: в URI и заданные процентно-кодированные формы. Это не правило, охватывающее весь User-Agent или произвольные заголовки.
Сигнатуры SQL-инъекций
nginx-scanner-sqli нацелен на URI с query string. Он обнаруживает UNION SELECT, information_schema, sleep(...), benchmark(...), заданные выражения, пытающиеся читать или записывать файлы, и заданные тавтологии.
Учитываются заданные разделители и процентное кодирование. Это не обнаруживает SQL-инъекции в целом и не заменяет проверку входных данных в приложении.
Пути проверки для конкретных продуктов и устройств
nginx-scanner-cve нацелен на обращения к заданным путям для PHPUnit, Ignition, Actuator, Solr, VPN-устройств, почтовых продуктов, административных консолей, CGI, WordPress и диагностических страниц.
Примеры: eval-stdin.php из PHPUnit, /_ignition/execute-solution, /actuator/env, /manager/html, /server-status и /xmlrpc.php. Фильтр исключает /health и /info в Actuator.
Сервисы, которые правомерно предоставляют эти возможности, могут получать нормальные запросы, поэтому один путь не может служить общим основанием для вывода о вредоносности.
User-Agent
nginx-scanner-ua обнаруживает заданные имена сканеров в User-Agent, такие как nikto, sqlmap, Nmap Scripting Engine, masscan, zgrab, Nuclei, WPScan, gobuster, ffuf и Nessus. Сопоставление учитывает границы слов.
Распространённые HTTP-клиенты, такие как curl, wget и python-urllib, а также пустой User-Agent сами по себе не соответствуют этому условию. User-Agent сообщается самим клиентом, поэтому он не устанавливает, кто использовал инструмент, и не доказывает вредоносное намерение.
Название сканера в заголовке тоже нельзя считать надёжным способом установить личность отправителя.
Имена бэкдоров и коды ответов
nginx-scanner-backdoor нацелен на сочетания заданных имён файлов, таких как shell, cmd, upload и alfa, с заданными расширениями PHP, ASP, JSP и CGI и срабатывает, когда ответ — 200 или 403.
Он рассчитан на сайт, не основанный на PHP. Это не условие, которое блокирует каждый ответ 404 для произвольного пути .php.
Аномальные запросы к путям аутентификации
nginx-auth-garbage нацелен на ответы 400, 405, 411, 413, 414, 415, 422, 431 и 501 на заданных путях аутентификации, таких как /login, /signin и /api/auth. PUT, DELETE, PATCH и PROPFIND на заданных путях аутентификации также отслеживаются по отдельным условиям.
Ответ 401 на обычный POST к /login не входит в этот jail. Перечисленные ответы об ошибках могут возникать и у обычных клиентов, поэтому это также рабочий стандарт источников сбора.
Что само по себе не вызывает блокировку
- Обычные OPTIONS, HEAD и PATCH.
- Ответ 401 на обычный POST к
/login. - curl, wget,
python-urllib, User-Agent распространённых браузеров и пустой User-Agent. - Ответ 404 на обычный путь
.php. - Ответ 200 для
package.json.
Здесь описаны условия для одиночных запросов в противодействии сканерам. Если тот же запрос соответствует другой сигнатуре, его обнаруживает соответствующий jail. Обычные HTTP-запросы также могут соответствовать действующему правилу ограничения частоты HTTP-запросов.
Это описание правил на серверах сбора, а не универсальная рекомендуемая конфигурация. Перед использованием похожих фильтров стоит проверить допустимые пути и методы именно своего сервиса.