fail2ban обнаруживает IP-адрес атакующего, но не банит его и медленно читает логи

fail2ban обнаруживает IP-адрес атакующего, но не банит его и медленно читает логи

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

Мое тюремное досье:

[nginx-40x-req]
enabled  = true
bantime.rndtime = 2800
bantime.increment = true
port     = http,https
filter   = nginx-40x-req
logpath  = /var/log/nginx/access.log
maxretry = 5

и мой фильтр выглядит так:

[Definition]
failregex = ^{"status": (400|401|403), "request_time": [0-9\.]+,\s+"remote_addr": "<HOST>",

На моем nginx я добавил карту для обнаружения его запросов и при обнаружении возвращает 403. Логи выглядят так:

{"status": 403, "request_time": 0.000,  "remote_addr": "xx.xx.xx.xx", "@timestamp": "2021-09-03T18:32:34+02:00", "type": "nginx", "hostname": "vps-e642f340", "host": "d.itsyjd.com", "uri": "/v2/speed_test", "request": "GET https://d.itsyjd.com/v2/speed_test HTTP/1.1", "request_method": "GET", "request_proto": "http", "request_proto_proxy": "-", "request_uri": "/v2/speed_test", "request_args": "-", "server_proto": "HTTP/1.1", "body_bytes_sent": 552, "http_referer": "-", "http_user_agent": "Mozilla/5.0 (Linux; Android 8.0; MHA-AL00 Build/HUAWEIMHA-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/6.2 TBS/044304 Mobile Safari/537.36 (compatible; Baiduspider/2.0;+http://www.baidu.com/search/spider.html)", "msec": 1630686754.923, "upstream_connect_time": -, "upstream_header_time": -, "upstream_response": -, "pipe": "p", "gzip_ratio": "-", "brotli_ratio": "-", "remote_user": "-", "bad_request": "1"}

На моем fail2ban я вижу много сообщений о том, что IP-адрес был обнаружен:

2021-09-03 18:34:31,494 fail2ban.filter         [32586]: INFO    [nginx-40x-req] Found xx.xx.xx.xx - 2021-09-03 18:29:33

Но запретить эти IP-адреса по-прежнему не получится.

Я заметил, что скорость чтения fail2ban ниже скорости журнала, поэтому я начал думать, что, возможно, проблема в этом, потому что когда эти IP-адреса банятся, а fail2ban читает в реальном времени, то другие IP-адреса банятся без проблем. Max_retry равен 5, и все IP-адреса были обнаружены более 5 раз, поэтому их нужно забанить.

Кто-нибудь знает, что я делаю не так (потому что наверняка есть что-то, чего я не вижу).

С наилучшими пожеланиями.

EDIT: После написания этого сообщения я увидел, что банит, но работает очень медленно. Примерно за 15 минут забанил около 4 IP-адресов из примерно 11, когда каждую секунду их обнаруживают много раз.

EDIT2: Очистка журнала с помощью простого метода echo "" > <logfile>привела к банам.

Моя версия fail2ban — 0.10.2

Поскольку проблемный злоумышленник забанен и получает всего несколько запросов, fail2ban считывает данные в режиме реального времени и банит:

2021-09-03 18:46:13,759 fail2ban.filter         [32586]: INFO    [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:46:13
2021-09-03 18:46:13,909 fail2ban.actions        [32586]: NOTICE  [nginx-40x-req] Ban XX.XX.XX.XX
2021-09-03 18:46:18,855 fail2ban.filter         [32586]: INFO    [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:46:18
2021-09-03 18:47:07,004 fail2ban.filter         [32586]: INFO    [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:47:06
2021-09-03 18:48:34,390 fail2ban.filter         [32586]: INFO    [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:48:34
2021-09-03 18:48:54,230 fail2ban.filter         [32586]: INFO    [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:48:54
2021-09-03 18:48:54,231 fail2ban.filter         [32586]: INFO    [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:48:54
2021-09-03 18:48:54,231 fail2ban.filter         [32586]: INFO    [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:48:54
2021-09-03 18:48:54,335 fail2ban.actions        [32586]: NOTICE  [nginx-40x-req] Ban XX.XX.XX.XX
2021-09-03 18:50:08,488 fail2ban.filter         [32586]: INFO    [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:50:08

Поэтому я все еще думаю, что проблема, возможно, в скорости чтения.

РЕДАКТИРОВАНИЕ3:

Наконец я обновил версию fail2ban до 0.11.2, добавил datepattern и изменил детектор адресов. Теперь, кажется, читает файл nginx намного быстрее.

[Definition]
failregex = ^{"status": (400|401|403), "request_time": [0-9\.]+,\s+"remote_addr": "<ADDR>",
datepattern = "@timestamp": "%%Y-%%m-%%dT%%H:%%M:%%S%%z"

решение1

  1. Не рекомендуется отслеживать журнал доступа, см.fail2ban/wiki :: Лучшие практикиособенно часть «Уменьшение паразитного трафика логов».
  2. Неподходящие регулярные выражения также могут привести к тому, что fail2bans "скорость чтения может быть медленнее скорости журнала", просто я не вижу, что ваш RE нехорош. Но его можно сделать быстрее, просто для этого вам нужно будет изменить формат журнала. Также указание single и exact datepatternможет помочь ускорить обработку.
  3. Все вместе это может создать известное состояние гонки, fail2ban был затронут до версии 0.10.5, см.https://github.com/fail2ban/fail2ban/issues/2660для получения подробной информации (исправление было выпущено в версиях 0.10.6 / 0.11.2)

Также обратите внимание на ответы на похожие вопросы, напримерhttps://github.com/fail2ban/fail2ban/issues/3021#issuecomment-834287295.

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