如何使用 Traefik 实现 fail2ban

Posted

技术标签:

【中文标题】如何使用 Traefik 实现 fail2ban【英文标题】:How to implement fail2ban with Traefik 【发布时间】:2019-02-06 22:51:58 【问题描述】:

我有兴趣在我的 Traefik 部署中设置 fail2ban。我找到了gist that has some snippets in it,但我不清楚如何使用它们。请问有人可以填空吗?或者,有没有更好的方法来使用 Traefik 实现 fail2ban 风格的安全性?

【问题讨论】:

您似乎在文件中第一个注释指定的位置创建文件。忽略botsearch,它只会使网络操作变得困难。 traefik_access_log 需要替换/设置为 Traefik 创建的日志文件。您问题上的 docker 标签暗示 Traefik 可能在 docker 中?如果有怎么办?是否还有另一个云解决方案在发挥作用? fail2ban 如何到达阻止所需的访问文件和网络接口。我会创建一个上游问题github.com/fail2ban/fail2ban/issues 并使用日志文件中的示例,以便它可以成为主流。 嗨,丹!感谢您阅读我的问题。我很抱歉,由于 Traefik 的一个非常常见的用例是用于 Docker 容器的自动代理,我将其作为一个假设,事实上正如你所说,它值得考虑,并且基本上是我的困惑之一——这些文件来自gist 在 Docker 主机上创建,还是在 Traefik 容器内创建?有没有更好的方法来做到这一点“Docker 方式”?也许还有一个容器化版本的 fail2ban? 同意。建议使用fail2ban developers 来提出一个如何使用 docker 容器的良好架构。对他们好一点,他们从正常运行时间安全方面得到了很多好处,足以赶走一些开发人员。 【参考方案1】:

从您发布的要点开始,我能够做到这一点。这是假设您已经使用 Traefik,想要阻止具有 HTTP 基本身份验证失败的 IP,并使用 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 部分,我使用的是fail2ban docker container,而不是安装在我的主机上,但从技术上讲,你也可以在那里进行。

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 禁止。如果要更改,可以更改traefik.conf中的默认banaction,例如:

[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目录并重启容器。

【讨论】:

感谢德文,这是一篇非常棒的文章。我在这里唯一的问题是基于基本身份验证失败的阻塞指标 - 我看到有很多关于为跟踪指标提供日志源的文献。 traefik 使用什么日志格式? json 还是 common 还是没关系? 我使用的是默认值,看起来很常见。 您能解释一下--web 标志的作用吗?它与日志和 fail2ban 或其他 Traefik 配置有关吗?非常感谢! 我修改了两件事以使其在 2020 年 11 月生效--- 1. 将 failregex 更改为 failregex = ^ \- \S+ [.*] \"(GET|POST| HEAD).+\" 401 .+$ ---- 2. 在traefik.conf中添加chain = DOCKER-USER

以上是关于如何使用 Traefik 实现 fail2ban的主要内容,如果未能解决你的问题,请参考以下文章

fail2ban安装配置

企业安全丨Ngx_Lua & Fail2ban实现主动诱捕

在k3s中启用其自带ingress——traefik的web-ui

使用 docker-compose 和 traefik 实现微服务之间的通信

traefik使用etcd存储配置--实例演示

如何使用 OAuth2 身份验证设置 traefik