Как реализовать 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