fail2ban странное поведение запрета запрещает не IP правильно

Я пытаюсь запретить все подозрительные 403 ошибки через fail2ban.

Поэтому я создал этот джейл

# block 403 errors
[apache-403]
enabled = true
filter = apache-403
port = http,https
logpath = /var/log/apache2/other_vhosts_access.log
bantime = 3600
maxretry = 5
ignoreip = 127.0.0.1/8 37.4.226.100

с этими правилами фильтрации

failregex = <HOST> .* "(GET|POST|HEAD) .* HTTP/1\.[01]" 403 .*

Теперь я проверил fail2ban-client status apache-403 джейл и получил следующее

Status for the jail: apache-403
|- Filter
|  |- Currently failed: 0
|  |- Total failed: 51
|  `- File list:    /var/log/apache2/other_vhosts_access.log
`- Actions
   |- Currently banned: 1
   |- Total banned: 1
   `- Banned IP list:   de:443

Но de:443 не является IP... Так где же проблема?

Конкретная строка журнала выглядит так:

jotoma.de:443 45.133.192.140 - - [15/Apr/2021:01:42:42 +0200] "POST /wp-login.php HTTP/1.1" 403 10297 "-" "Mozilla/5.0 (Linux; Android 6.0.1; SM-G610M Build/MMB29K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/65.0.3325.109 Mobile Safari/537.36 Instagram 41.0.0.13.92 Android (23/6.0.1; 480dpi; 1080x1920; samsung; SM-G610M; on7xelte; samsungexynos7870; pt_BR; 103516666)"

Что я должен сделать сейчас, чтобы исправить это? Раньше у меня были большие проблемы с тем, чтобы заставить это правило фильтрации работать, но теперь оно работает, но, похоже, неправильно.

1
задан 15 April 2021 в 12:18
2 ответа

Проблема здесь в вашем "уязвимом" regex (не привязанном, со многими catch-all'ами и т.д.), а также в неверном предположении, что тег сопоставляет только IP-адреса (он также может сопоставлять имена хостов). Вы действительно можете заставить fail2ban сопоставлять только IP-адреса, либо отключив опцию usedns, либо используя другой тег вместо .

Но вместо этого лучше использовать привязанный и более точный regex:

failregex = ^(?:\S+:\d+ )?<ADDR> \S+ \S+ \[\] "[A-Z]+ /[^"]* \S+" 403\b

(замените тег на , если ваша версия fail2ban меньше v.0.10).

Также обратите внимание, что использование временной метки в середине сообщения вообще не рекомендуется, лучше, если вы перенастроите формат лога apache так, чтобы она располагалась в начале строки, так что получится что-то вроде этого:

[15/Apr/2021:01:42:42 +0200] srv:443 192.0.2.1 - - "POST /wp-login.php HTTP/1.1" 403 ...

в этом случае ваш джейл может выглядеть так:

[apache-403]
enabled = true
filter =
datepattern = ^\[%%d/%%b/%%Y:%%H:%%M:%%S(?:[.,]%%f)?(?: %%z)?\]
failregex = ^\s*(?:\S+:\d+ )?<ADDR> \S+ \S+ "[A-Z]+ /[^"]* \S+" 403\b
...

(используется одиночный datepattern, также закрепленный в начале строки).

Также, поскольку вы, похоже, отслеживаете access-log напрямую, пожалуйста, прочитайте Fail2ban :: wiki :: Best practice, потому что это вообще не рекомендуемая стратегия.

0
ответ дан 24 April 2021 в 01:02

Спасибо! Я изменил LogFormat на следующий:

#LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
#LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
#LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%t %v:%p %h %l %u \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%t %h %l %u \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%t %h %l %u \"%r\" %>s %O" common

Я сообщу, работает он или нет, потому что журнал должен быть записан заново и не может быть протестирован с помощью fail2ban_regex .

0
ответ дан 24 April 2021 в 01:02

Теги

Похожие вопросы