Как реализовать fail2ban с Traefik

Я заинтересован в настройке fail2ban с моим развертыванием Traefik. Я нашел суть, в которой есть некоторые фрагменты, но я не понимаю, как их использовать. Кто-нибудь может заполнить пробелы, пожалуйста? Или есть ли лучший способ реализовать безопасность в стиле fail2ban с помощью Traefik?

3 ответа

Я смог сделать это, начав с того, что ты написал. Это подразумевает, что у вас уже работает Traefik, вы хотите заблокировать IP-адреса с ошибками HTTP Basic Auth и запретить их с помощью iptables. Там есть пара частей, поэтому позвольте мне начать с конфигураций контейнера:

Traefik docker-compose.yaml

version: '2'
services:
  traefik:
    image: traefik:alpine
    volumes:
    - /apps/docker/traefik/traefik.toml:/traefik.toml:ro
    - /apps/docker/traefik/acme:/etc/traefik/acme
    - /var/log/traefik:/var/log
    ports:
    - 8080:8080/tcp
    - 80:80/tcp
    - 443:443/tcp
    command:
    - --web
    - --accessLog.filePath=/var/log/access.log
    - --accessLog.filters.statusCodes=400-499

Вы можете видеть здесь, я пишу файл журнала для /var/log/access.log и только получать коды доступа к 400-499, Затем я монтирую этот файл на свой хост /var/log/traefik:/var/log

Теперь для части fail2ban, я использую Docker-контейнер fail2ban, а не устанавливаю на свой хост, но технически вы можете сделать это и там.

Fail2ban docker-compose.yaml

version: '2'
services:
  fail2ban:
    image: crazymax/fail2ban:latest
    network_mode: "host"
    cap_add:
    - NET_ADMIN
    - NET_RAW
    volumes:
    - /var/log:/var/log:ro
    - /apps/docker/fail2ban/data:/data

Вы можете видеть, что я монтирую /var/log каталог в контейнер fail2ban только для чтения.

Конфигурация Fail2ban

/apps/docker/fail2ban/data/jail.d/traefik.conf файл содержит:

[traefik-auth]
enabled = true
logpath = /var/log/traefik/access.log
port = http,https

/apps/docker/fail2ban/data/filter.d/traefik-auth.conf файл содержит:

[Definition]
failregex = ^<HOST> \- \S+ \[\] \"(GET|POST|HEAD) .+\" 401 .+$
ignoreregex =

дополнительный

Действие по умолчанию - запретить через iptables. Если вы хотите изменить это, вы можете изменить по умолчанию banaction в traefik.conf, например:

[DEFAULT]
banaction = cloudflare

[traefik-auth]
enabled = true
logpath = /var/log/traefik/access.log
port = http,https

Действия здесь: https://github.com/fail2ban/fail2ban/tree/0.11/config/action.d

Если вам нужно изменить один, скопируйте файл в /apps/docker/fail2ban/data/action.d каталог и перезапустите контейнер.

В блоге есть хорошо написанное сообщение о том, как настроить Fail2ban для Traefik.

https://blog.lrvt.de/configuring-fail2ban-with-traefik/

Fail2ban будет отслеживать журналы доступа Traefik и блокировать злоумышленников, которые вызывают множественные ошибки HTTP, такие как 401, 403, 404 и так далее.

PS: Кажется, рекомендуется использовать формат журнала Traefik JSON, а не CLM, поскольку он содержит более подробную информацию и его легче анализировать. Также лучше, если вы хотите передать журналы в дополнительное программное обеспечение, такое как стек ELK, Grafana с Loki и т. д.

Вот дополнение к ответу @Devin B. С его информацией у меня все работает. Сfail2ban-client status traefik-authперечислены запрещенные IP-адреса, но доступ к услуге через этот IP-адрес все еще был возможен. Примечание: я не использую версию докера fail2ban, она устанавливается прямо на сервер.

Чтобы трафик на докер заблокировалDOCKER-USERнужна дополнительная запись в iptables. Вы можете увидеть iptable с помощью командыiptables -Lи запись сделана автоматически через fail2ban со следующей настройкой внутриtraefik.conf(илиjail.local):

      [traefik-auth]
enabled = true
chain = DOCKER-USER
logpath = /var/log/traefik/access.log
port = http,https
Другие вопросы по тегам