如何配置分布式Fail2Ban:可操作的威胁情报共享
作者:Kent Ickler
注意: 本文提及的技术和工具可能已过时,不适用于当前环境,但仍可作为学习参考,或用于更新和集成到现代工具与技术中。
Fail2Ban是一个监控日志并根据日志触发操作的系统。典型用例是监控认证日志(auth-log)中的认证错误,并配置系统阻止违规源IP。Fail2Ban在这种部署方式下效果很好,但本文将其进一步提升:通过以下方法,Fail2Ban不仅可以本地阻止违规源,还能通知其他Fail2Ban节点共同阻止该源。这是一套基础代码,可用于在多个Fail2Ban节点间分发禁令。
概念验证与方法
这是一个可横向或纵向扩展的概念验证。该方法使用SSHFS远程挂载文件共享,允许多个系统同时读取和追加内容。配置中添加了一个动作,用于写入“全局”禁令日志,其他Fail2Ban节点监控并处理这些禁令。全局日志文件newbans.log通过Fail2Ban动作调用系统组件“logger”追加内容,生成格式一致的条目到系统日志(此处为标准输出)。logger的标准输出被重定向以追加到全局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的日志轮转,可以减少延迟。
|
|
设置Fail2Ban节点
前提条件:
|
|
接下来,更新/etc/fstab以挂载新日志数据:
|
|
然后,让fstab挂载远程文件位置:
|
|
如果出现故障,需要先umount /opt/logdistro/logs再重试。
测试:
|
|
返回服务器,现在应该在/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文件协作的节点。
下载文件并移动到相应位置:
|
|
重启Fail2Ban并检查日志:
|
|
检查Fail2Ban日志以确保一切加载正常:
|
|
测试
测试并观察。当SSH上发生三次无效认证尝试时,Fail2Ban节点将在本地阻止源IP 30分钟,并在newbans.log文件中添加条目供其他Fail2Ban节点读取。当其他节点看到newbans.log中的新条目时,会立即阻止该源IP 30分钟。
可以实时查看/var/log/fail2ban.log中的Fail2Ban日志文件。存在延迟:在10台服务器的测试部署中,所有节点在初始节点第三次认证尝试后的3秒内都阻止了违规IP。
手动触发分布式禁令:
|
|
扩展建议
不确定主服务器的繁忙程度,但预计每个Fail2Ban节点将为SSHFS远程日志文件保留一个SSH连接。如果文件显著增长,可能需要日志轮转以减少监控文件所涉及的流量。
由于newbans.log格式简单,可以编程任何应用程序写入此日志,并由所有节点阻止IP。初始阻止不必来自Fail2Ban节点。使用以下logger语法,可以根据需要添加newbans.log条目:
|
|
相关链接:
- SSHFS: https://github.com/libfuse/sshfs
- Fail2Ban: https://www.fail2ban.org/