Как можно настроить fail2ban для обработки файла access.log, если он имеет формат JSON?

У меня есть access log от nginx, который выводится в формате JSON. Однако я сталкиваюсь с проблемами при обработке таких данных в fail2ban. Например, при использовании следующего правила:

<pre><code>[Definition]
failregex = ^{"status":(403|404),.*"remote_addr":"&lt;HOST&gt;".*</code></pre>

я получаю ошибку:

<pre><code>fail2ban.filter         [191145]: ERROR   Failed to process line: '{"status":403,"request":"GET /.env HTTP/1.1","remote_addr":"64.227.133.96","remote_user":"","body_bytes_sent":134,"http_referer":"","http_user_agent":"Mozilla/5.0 Keydrop","time_local":"07/Jan/2025:14:34:24 +0300","request_time":0.000}', caught exception: IndexError('string index out of range')</code></pre>

Как правильно обрабатывать JSON данные в access.log?
  • 7 января 2025 г. 12:53
Ответы на вопрос 1
Для того чтобы настроить `fail2ban` для обработки JSON-файлов, необходимо учитывать, что стандартные регулярные выражения, используемые в `fail2ban`, могут не всегда корректно работать с форматами, где данные находятся внутри JSON-строки. В вашем случае проблема возникает из-за того, что строка JSON не разбивается на отдельные элементы, как это происходит в стандартных log-файлах, поэтому `fail2ban` не может правильно обработать строку.

Вот пример, как можно настроить `fail2ban` для обработки JSON-логов от Nginx:

1. **Создайте новый фильтр для обработки JSON логов**. Создайте файл, например, `/etc/fail2ban/filter.d/nginx-json.conf` и добавьте в него следующее содержимое:

    ```ini
    [INCLUDES]
    before = common.conf

    [Definition]
    failregex = ^{"status":(403|404),.*"remote_addr":"<HOST>".*
    ```

2. **Проверьте корректность регулярного выражения**. Убедитесь, что ваше регулярное выражение правильно обрабатывает логи, которые вы имеете. Попробуйте протестировать регулярное выражение с помощью `regex101.com`, чтобы убедиться, что оно соответствует строкам логов.

3. **Создайте jail**. Далее создайте файл конфигурации `jail.local`, если он еще не создан, или добавьте в существующий, например, `/etc/fail2ban/jail.local`:

    ```ini
    [nginx-json]
    enabled = true
    filter = nginx-json
    logpath = /path/to/your/access.log
    maxretry = 3
    findtime = 600
    bantime = 3600
    ```

   Обязательно замените `/path/to/your/access.log` на актуальный путь к вашему access.log.

4. **Перезапустите fail2ban**. После того, как вы создали фильтр и jail, выполните команду, чтобы перезагрузить `fail2ban` и применить изменения:

    ```bash
    sudo systemctl restart fail2ban
    ```

5. **Проверка работы fail2ban**. Вы можете проверить логи `fail2ban`, чтобы убедиться, что он правильно обрабатывает ваши JSON логи:

    ```bash
    sudo fail2ban-client status nginx-json
    sudo tail -f /var/log/fail2ban.log
    ```

Программа должна теперь корректно обрабатывать логи JSON в `access.log` и блокировать IP-адреса в случае превышения количества неудачных попыток. Если возникнут другие ошибки, проверьте логи `fail2ban` для диагностики.
Похожие вопросы