我应该如何自定义 fail2ban 过滤器以结合在容器中运行并使用 systemd 记录的 sshd 的使用?

How should I customize a fail2ban filter for a usage in conjunction of a sshd that runs in a container and logs with systemd?

我是 运行 容器中的 SSH 守护进程 Docker。由于后者由 systemd 管理并且 sshd 记录到 stdout,因此检测攻击者的相关数据出现在 systemd 的日志中,但其条目有一个额外的前缀,如下所示:

Feb 13 21:51:25 my.example.com dockerd[427]: Feb 13 18:51:25 sshd[555]: Invalid user ts3bot from 180.166.17.122 port 43474

监狱是用这个片段配置的:

[sshd]

enabled = true
mode    = aggressive
filter  = sshd[mode=%(mode)s]
port    = ssh

filters.d/sshd.conf 中的这一行似乎包含我要更改的内容:

journalmatch = _SYSTEMD_UNIT=sshd.service + _COMM=sshd

但是我找不到任何关于 journalmatch 配置的有用文档。我正在使用 fail2ban 0.10.

谁能解释一下等号右边的部分是怎么解释的?

当我希望弄清楚如何调整该值时,我应该直接编辑 filters.d/sshd.conf(它由 Arch 软件包提供)还是其他地方?

要保留为主机系统本身设置额外 sshd 监狱的选项,我会这样做:

  1. Version – 使用支持使用 systemd 作为后端的 fail2ban 版本 >= 0.9。 (顺便说一句:0.11 版很新,可能还不稳定,但我喜欢新功能自动增加来自同一 IP 的每场新比赛的禁令时间。)

  2. Jail – 创建一个单独的监狱 jail.d/sshd-docker。根据需要采用原始 sshd jail 中的设置。也许首先为了安全起见先降低禁令时间,然后再增加。将 backend = systemd 添加到那个新的 sshd-docker 监狱。可能看起来像这样:

    [sshd-docker]
    enabled  = true
    filter   = sshd-docker
    action   = iptables
    backend  = systemd
    maxretry = 5
    findtime = 1d
    bantime  = 2w
    
  3. Filter – 我更喜欢保留过滤器文件和原始 jail.conf 文件不变,这样我就可以轻松升级到更新的 fail2ban 版本。因此,我建议将过滤器文件 filter.d/sshd.conf 复制到 filter.d/sshd-docker.conf 并在 sshd-docker 监狱中引用该新过滤器(如上所示)。

  4. Filter/regex – 在 filter.d/sshd-docker.conf 中采用正则表达式来匹配您的日志条目。可以像改变这个一样简单

    _daemon = sshd
    

    _daemon = docker
    

    因为 _daemon 指令用于构造 __prefix_line 正则表达式,如您在 filter.d/common.conf.

  5. 中所见
  6. Filter/journalmatch – 据我从 fail2ban-regex 手册页中看到的,journalmatch 指令会覆盖其他过滤器。因此,您可能还需要在 filter.d/sshd-docker.conf

    中更改此行
    journalmatch = _SYSTEMD_UNIT=sshd.service + _COMM=sshd
    

    journalmatch = 
    

    (在 fail2ban 0.11 中,您也可以删除此行。不确定以前的版本何时停止要求过滤器文件中的 journalmatch = 条目。)

  7. 测试 – 重新加载 fail2ban 并检查它是如何工作的。