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

本文详细介绍了如何配置分布式Fail2Ban系统,通过SSHFS共享日志文件实现多节点协同防御,包括服务器设置、节点配置、日志监控和实战测试,有效提升网络攻击防护能力。

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

作者:Kent Ickler
注意: 本文提及的技术和工具可能已过时,不适用于当前环境,但仍可作为学习参考,或用于更新和集成到现代工具与技术中。

Fail2Ban是一个监控日志并根据日志触发操作的系统。典型用例是监控认证日志(auth-log)中的认证错误,并配置系统阻止违规源IP。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文件中记录三次无效SSH尝试,但对于newbans.log文件中的条目,只需等待一次。这是因为newbans.log仅包含已被合作Fail2Ban节点禁止的日志条目,无需等待更多条目。增加newbans.log的“maxretry”可以设置规则,如“仅在30分钟内在两个不同服务器上有三次无效SSH尝试时才全局禁止”。

Fail2Ban包含自动解禁功能,每个节点独立管理自己的禁令和解禁过程。在此方法中,Fail2Ban“服务器”节点仅是全局newbans.log文件的存储位置。使用SSHFS通过SSH挂载日志文件,这是一种快速且安全的共享方式。但无法评论数百个节点时的可扩展性,可能存在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剧本模板。仓库文件列表如下。最后,需要注释掉/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剧本,用于远程部署配置了全局禁令的Fail2Ban节点。如果使用此剧本,请确保更新/etc/fstab配置中的[SERVER IP],并准备好私钥供Ansible传输。此剧本包含所有必要处理,将未安装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节点将为SSHFS远程日志文件保留一个SSH连接。如果文件显著增长,可能需要日志轮转以减少监控文件所涉及的流量。

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

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

相关链接:

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