Журнал доступа Apache

Журнал доступа Apache

Я использую fail2ban для обнаружения вредоносных запросов ко всем моим размещенным доменам, и этот сервис работает очень хорошо, за одним исключением.

Если запрос отправляется на IP-адрес вместо полного доменного имени или поддомена, он перехватывается и записывается в other_vhosts_access.log, поскольку сам IP-адрес не является виртуальным хостом.

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

somedomain.de:80 20.37.96.167 - - [24/янв./2020:15:47:04 +0100] "POST //4walls/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php HTTP/1.1" 301 587 "https://www.google.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, как Gecko) Chrome/79.0.3945.88 Safari/537.36"

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

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

Как я могу предотвратить запись somedomain.de:80?

решение1

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

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

Я предполагаю, что в вашем примере записи журнала, somedomain.deэто ваш адрес и 20.37.96.167это адрес "intruder". Тогда правильное failregex будет выглядеть так:

# ban everything (with code 300-599):
failregex = ^\S+\s+<ADDR>\s+\S+\s+\S+\s+\[\]\s+"[^\"]+" [345]\d+

Прикрепленная часть ^\S+\s+<ADDR>совпадает somedomain.de:80 20.37.96.167и будет искать в строке от начала только из-за привязки ^.
Этого также будет достаточно в качестве регулярного выражения, если вам нужно запретить все other_vhosts_access.log(независимо от результирующего http-статуса).

Если у вас fail2ban версии <= 0.9, используйте <HOST>вместо <ADDR>.

Вы также можете проверить, fail2ban-regexфиксирует ли он некоторые ложные срабатывания, например:

fail2ban-regex --raw -vv /path/to/log '^\S+\s+<ADDR>\s+\S+\s+\S+\s+\[\]\s+"[^\"]+" [345]\d+' \
  | grep <your-IP-or-hostname>

Связанный контент