如何配置分布式Fail2Ban:可操作的威胁情报
Fail2Ban是一个监控日志并根据日志触发操作的系统。虽然操作可以高度定制,但典型用例是监控认证日志中的认证错误,并配置系统阻止违规源IP。
Fail2Ban在这种部署方式下效果很好。但我想更进一步。通过以下方法,您可以使用Fail2Ban像往常一样阻止违规源,然后通知其他Fail2Ban节点也应阻止该违规源的未来连接。这是一组基础代码,您可以在此基础上构建,将Fail2Ban禁令分发到多个Fail2Ban节点。
概念验证与方法
这是一个可以横向或纵向扩展的概念验证。该方法使用SSHFS远程挂载一个可以被多个系统同时读取和追加的文件共享。配置添加了一个操作,用于写入“全局”禁止日志,其他Fail2Ban节点监控并处理这些禁令。
全局日志文件newbans.log由Fail2Ban操作追加,该操作调用名为“logger”的系统组件,用于在系统日志中生成格式一致的条目;在我们的例子中是标准输出。logger的标准输出被重定向以追加到全局newbans.log(在文件服务器上):
|
|
在我们的配置中,我们使用Fail2Ban监控SSH作为其主要触发源。虽然Fail2Ban会等待/var/log/auth.log文件中记录的三次无效SSHd尝试,但它只会等待newbans.log文件中的单个条目。这是因为newbans.log日志文件只包含已被协作Fail2Ban节点禁止的日志条目,因此不需要等待更多条目。增加newbans.log的“maxretry”可能允许诸如“仅在30分钟内在两个不同服务器上出现三次无效SSH尝试时才全局禁止”的规则。
Fail2Ban包含在给定时间后自动解禁源的选项。每个Fail2Ban节点独立管理自己的禁止和解禁过程。在这种情况下,Fail2Ban“服务器”节点只是全局newbans.log文件的存储位置。通过这种方法,我们使用SSHFS通过SSH在网络挂载日志文件。存在其他方法,但这是一种快速且安全的“共享”日志文件的方法。我无法评论这种做法在数百个节点上的可扩展性。 presumably,在变得低效之前,该系统可以支持的协作Fail2Ban节点数量与SSHFS挂载文件存在限制。
问题与调整
可能需要一些调整。某些发行版处理日志轮询的方式不同,您可能需要相应调整“backend”变量。“Polling”方法对我们的大多数节点有效。然而,在其他一些Linux发行版上,对全局newbans.log日志的更改未被注意到。这是由于“backend”方法未确认SSHFS挂载的文件已更改。有关“backend”方法的更多信息可以在Fail2Ban网站上找到。
当禁止在newbans.log中找到的源时,我们调用相同的iptables-multiport操作,因此协作Fail2Ban节点也会在newbans.log中输入自己的条目。如果一个节点响应另一个节点的newbans.log条目创建禁令,该禁令将使用multiport禁止所有端口,而不仅仅是初始连接端口。这会使日志有点嘈杂,但允许每个节点报告它传播了禁令。这可以通过多种方式配置。此外,在newbans.log中添加条目的操作可以应用于其他Fail2Ban操作。
开始配置!
这里的配置相对简单。我们首先设置一个SSH服务器,用于托管“全局”newbans日志文件。我们将创建一个用户和一个私钥/公钥对,允许其他Fail2Ban节点安全访问和追加新日志文件。然后,转到Fail2Ban节点,我们将获取私钥并使用SSHFS和fstab设置远程文件共享挂载。最后,我们需要设置Fail2Ban配置文件以查看新文件并相应触发操作——为此,我提供了一个GitHub克隆以帮助您快速开始。
设置新服务器:
在这种情况下,我选择了一个DigitalOcean droplet作为全局日志文件的存储位置。但它不必在云中。如果您不为newbans.log文件配置日志轮换,在本地网络上托管文件可以减少延迟。
|
|
设置Fail2Ban节点:
先决条件
|
|
接下来,更新/etc/fstab以挂载新日志数据:
|
|
接下来,让fstab挂载远程文件位置:
|
|
如果此处出现任何故障,您需要在重试之前umount /opt/logdistro/logs。
测试!
|
|
回到服务器,您现在应该在/opt/logsdistro/中看到一个文件!
Fail2Ban配置
节点配置的其余部分将涉及构建和/或重建一些配置文件。我在GitHub仓库中添加了这些文件和一个Ansible playbook模板。GitHub仓库中的文件列表如下。最后,我们需要注释掉/etc/fail2ban/jail.d中defaults-debian.conf文件的行,或将文件移出Fail2Ban文件夹。下面我们将文件移动到GitHub克隆中的“old”文件夹。
-
iptables-multiport.conf
Fail2Ban操作文件,包含写入新“全局”日志文件的信息。
替换 /etc/fail2ban/actions.d/iptables-multiport.conf -
newbans.conf
Fail2Ban新“全局”日志文件的过滤器。
移动到 /etc/fail2ban/filter.d/newbans.conf -
Sshd.conf(可选)
Fail2Ban更新后的SSHD过滤器,包括一些基于密钥认证的额外SSH失败。
替换 /etc/fail2ban/filter.d/sshd.conf -
Jail.local
Fail2Ban监狱配置,用于创建新的全局日志监视实例。
移动到 /etc/fail2ban/jail.local -
Fail2ban-with-distro.yml(可选)
Ansible Playbook,用于远程部署配置了全局禁止的Fail2Ban节点。如果使用此playbook,请确保更新/etc/fstab配置中的[服务器IP],并准备好私钥以供Ansible传输。此playbook包含所有必要的处理,将未安装Fail2Ban的节点转换为受Fail2Ban保护并与newbans.log日志文件协作的节点。
下载文件并将其移动到各自的位置:
|
|
重启Fail2Ban并检查日志:
|
|
检查Fail2Ban日志以确保一切加载正常:
|
|
测试
测试并观察。当现在在SSH上进行三次无效认证尝试时,Fail2Ban节点将在本地阻止源IP 30分钟。它还会在newbans.log文件中添加一个条目,供其他Fail2Ban节点读取。当它们在newbans.log中看到新条目时,它们将立即阻止源IP 30分钟。
您可以在/var/log/fail2ban.log尾部查看Fail2Ban日志文件,并实时观察此过程。存在延迟。在我部署的10台服务器测试中,所有节点在初始节点上第三次认证尝试后的3秒内都阻止了违规IP。
要手动触发分布式禁止,您可以使用以下行:
|
|
横向扩展
我不确定您的主服务器会有多忙,但您可以预期它将为每个Fail2Ban节点保留一个SSH连接以用于SSHFS远程日志文件。如果文件开始显著增长,可能需要日志轮换以减少监视文件所涉及的流量。
纵向扩展
由于newbans.log日志格式非常简单,您可以编程任何应用程序写入此日志,并让所有节点阻止IP。初始阻止不必来自Fail2Ban节点。利用下面的logger语法,您可以根据需要添加newbans.log条目。
|
|
相关链接:
SSHFS: https://github.com/libfuse/sshfs
Fail2Ban: https://www.fail2ban.org/