分布式Fail2Ban配置指南:实现可操作威胁情报共享

本文详细介绍了如何配置分布式Fail2Ban系统,通过SSHFS共享日志文件实现多节点协同防御,包含具体配置步骤、代码示例和实际部署注意事项。

如何配置分布式Fail2Ban:可操作的威胁情报

Fail2Ban是一个监控日志并根据日志触发操作的系统。虽然操作可以高度定制,但典型用例是监控认证日志中的认证错误,并配置系统阻止违规源IP。

Fail2Ban在这种部署方式下效果很好。但我想更进一步。通过以下方法,您可以使用Fail2Ban像往常一样阻止违规源,然后通知其他Fail2Ban节点也应阻止该违规源的未来连接。这是一组基础代码,您可以在此基础上构建,将Fail2Ban禁令分发到多个Fail2Ban节点。

概念验证与方法

这是一个可以横向或纵向扩展的概念验证。该方法使用SSHFS远程挂载一个可以被多个系统同时读取和追加的文件共享。配置添加了一个操作,用于写入“全局”禁止日志,其他Fail2Ban节点监控并处理这些禁令。

全局日志文件newbans.log由Fail2Ban操作追加,该操作调用名为“logger”的系统组件,用于在系统日志中生成格式一致的条目;在我们的例子中是标准输出。logger的标准输出被重定向以追加到全局newbans.log(在文件服务器上):

1
logger -s -i "HOST <ip> PORT <port>" 2>> /opt/logdistro/logs/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文件配置日志轮换,在本地网络上托管文件可以减少延迟。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
sudo -s
mkdir /opt/logdistro
touch /opt/logdistro/newbans.log
useradd f2bcourrier
chown -R /opt/logdistro
su f2bcourrier ##(以新f2bcourrier用户身份操作)
cd ~/
ssh-keygen -t rsa -b 4096 ###(您也可以使用RSA!)
cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys
cat ~/.ssh/id_rsa
#复制此输出(私钥),我们很快需要它
exit

设置Fail2Ban节点:

先决条件

1
2
3
4
5
6
7
8
sudo -s
apt-get install sshfs
apt-get install fail2ban
mkdir /opt/logdistro
mkdir /opt/logdistro/logs
mkdir /opt/logdistro/keys
nano /opt/logdistro/keys/f2bcourier.key 
#粘贴服务器上的“id_rsa”内容。

接下来,更新/etc/fstab以挂载新日志数据:

1
2
3
nano /etc/fstab
 ##--- 添加以下行;确保更改服务器IP等:
f2bcourrier@[SERVER IP]:/opt/logdistro /opt/logdistro/logs fuse.sshfs auto,reconnect,allow_other,StrictHostKeyChecking=no,cache=no,IdentityFile=/opt/logdistro/keys/f2bcourier.rsa,defaults,_netdev 0 0'

接下来,让fstab挂载远程文件位置:

1
mount -a

如果此处出现任何故障,您需要在重试之前umount /opt/logdistro/logs。

测试!

1
touch /opt/logdistro/logs/test

回到服务器,您现在应该在/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日志文件协作的节点。

下载文件并将其移动到各自的位置:

1
2
3
4
5
6
7
8
cd /opt
git clone https://github.com/Relkci/F2BDistro.git
cp /opt/F2BDistro/f2bfiles/iptables-multiport.conf /etc/fail2ban/action.d/
cp /opt/F2BDistro/f2bfiles/newbans.conf /etc/fail2ban/filter.d/newbans.conf
cp /opt/F2BDistro/f2bfiles/sshd.conf /etc/fail2ban/filter.d/sshd.conf
cp /opt/F2BDistro/f2bfiles/jail.local /etc/fail2ban/jail.local
mkdir /opt/F2BDistro/old
mv /etc/fail2ban/jail.d/defaults-debian.conf /opt/F2BDistro/old

重启Fail2Ban并检查日志:

1
service Fail2Ban restart

检查Fail2Ban日志以确保一切加载正常:

1
tail /var/log/fail2ban.log

测试

测试并观察。当现在在SSH上进行三次无效认证尝试时,Fail2Ban节点将在本地阻止源IP 30分钟。它还会在newbans.log文件中添加一个条目,供其他Fail2Ban节点读取。当它们在newbans.log中看到新条目时,它们将立即阻止源IP 30分钟。

您可以在/var/log/fail2ban.log尾部查看Fail2Ban日志文件,并实时观察此过程。存在延迟。在我部署的10台服务器测试中,所有节点在初始节点上第三次认证尝试后的3秒内都阻止了违规IP。

要手动触发分布式禁止,您可以使用以下行:

1
logger -s -i "HOST <ip> PORT <port>" 2>> /opt/logdistro/logs/newbans.log

横向扩展

我不确定您的主服务器会有多忙,但您可以预期它将为每个Fail2Ban节点保留一个SSH连接以用于SSHFS远程日志文件。如果文件开始显著增长,可能需要日志轮换以减少监视文件所涉及的流量。

纵向扩展

由于newbans.log日志格式非常简单,您可以编程任何应用程序写入此日志,并让所有节点阻止IP。初始阻止不必来自Fail2Ban节点。利用下面的logger语法,您可以根据需要添加newbans.log条目。

1
logger -s -i "HOST <ip> PORT <port>" 2>> /opt/logdistro/logs/newbans.log

相关链接:
SSHFS: https://github.com/libfuse/sshfs
Fail2Ban: https://www.fail2ban.org/

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计