保护Linux服务器的安全:iptables vs fail2ban


10

我想引起社区对linux服务器安全性的关注,特别是关于蛮力攻击以及使用fail2ban与自定义iptables

那里也有一些类似的问题,但是没有一个问题令我满意。简而言之,我正在尝试确定最佳的解决方案,以保护免受互联网攻击的Linux服务器(运行常规服务,ssh,web,邮件)免受暴力攻击。

我对服务器安全性有很好的了解,即通过不允许root用户或密码登录,更改默认端口,确保软件为最新版本,检查日志文件,仅允许某些主机访问服务器并利用安全性来锁定ssh审核工具,例如Lynishttps://cisofy.com/lynis/),用于一般安全合规性,因此尽管总是欢迎您提供意见建议,但这个问题不一定要与之相关

我的问题是我应该使用哪种解决方案(fail2ban或iptables),应该如何配置它,还是应该结合使用两者来防止暴力攻击?

关于该主题有一个有趣的响应(Denyhosts vs fail2ban vs iptables-防止暴力登录的最佳方法?)。就我个人而言,最有趣的答案是(https://serverfault.com/a/128964),并且iptables路由发生在内核中,而不是使用用户模式工具来解析日志文件的fail2ban。Fail2ban当然使用iptables,但是它仍然必须解析日志文件并匹配模式,直到执行操作为止。

那么使用iptables和使用速率限制https://www.rackaid.com/blog/how-to-block-ssh-brute-force-attacks/)来丢弃来自IP的请求一段时间是否有意义在特定时间段内进行过多连接尝试的时间(无论它尝试连接到哪种协议)?如果是这样,那么对于此处的那些数据包使用丢弃与拒绝有一些有趣的想法(http://www.chiark.greenend.org.uk/~peterb/network/drop-vs-reject),对此有什么想法吗?

Fail2ban允许以能够为默认配置中可能未解决的服务编写自定义“ 规则 ” 的形式进行自定义配置。它易于安装和设置并且功能强大,但是如果我要实现的全部目的是“ 阻止 ”服务器的IP(如果他们对某项服务/协议进行了两次失败的访问尝试,且访问次数超过x的数量,那么这可能是一个过大的杀伤力)时间?

此处的目标是打开每日日志监视报告,而不必滚动浏览尝试与服务器建立连接失败的页面。

感谢您抽出宝贵的时间。


3
您可能会发现,如果服务器配置正确,为什么需要防火墙?可以阐明这个问题。
MadHatter

Answers:


21

我应该使用fail2ban还是iptables?

防火墙解决方案外,可以使用fail2ban 按需扩展现有的防火墙规则,并使用规则来阻止对其他公共服务执行不良操作的系统的特定ip地址。他们彼此合作。

简化:防火墙只能看到网络连接和数据包,并且可以对其中的模式有所了解,但是它不具备应用程序级别的洞察力来区分恶意恶意软件,恶意恶意软件和恶意恶意软件。例如,您的防火墙无法分辨出一堆HTTP API请求与Wordpress管理员页面上的蛮力密码猜测导致的多次错误登录尝试之间的区别,它们到防火墙都是通过TCP连接到端口80或443。

Fail2ban是一种通用且可扩展的方法,可以间接地向防火墙提供应用程序级别的见解。
应用程序经常会这样注册和记录恶意,格式错误和不良的请求,但是只有很少的应用程序具有阻止进一步滥用的本机能力。尽管Fail2ban稍微脱离了耦合,但是通常可以通过动态重新配置防火墙以拒绝进一步访问,Fail2ban可以对那些记录的恶意事件采取行动并限制破坏并防止进一步的滥用。换句话说,Fail2ban无需修改即可为您现有的应用程序提供抵御滥用的手段。

为防火墙提供应用程序级别见解的另一种方法是借助入侵检测/预防系统


例如,Web服务器是一种常见的公共服务,而在您的防火墙中,TCP端口80和443为整个Internet开放。
通常,您对HTTP / HTTPS端口没有任何速率限制,因为例如当多个有效用户位于NAT网关或Web代理之后时,它们可以具有单个来源。

当您检测到针对Web服务器的不良行为和/或恶意行为时,可以使用fail2ban自动阻止此类违法者(完全阻止他们或仅锁定他们对端口80和443的访问权限)。

另一方面,SSH访问不是一项公共服务,但是如果您无法将防火墙中的SSH访问限制为仅列入白名单的ip地址范围,则限制速率的传入连接是减慢暴力行为的一种方法力攻击。但是您的防火墙仍然无法区分bob用户成功登录5次,因为他正在运行ansible剧本和5次机器人以root用户身份登录失败的尝试。


这是我一直在寻找的见解,对我来说非常有意义,感谢您抽出宝贵的时间。
金米洛

2
尽管存在可以执行深度数据包检查的应用程序防火墙(也称为应用程序网关)。
Gardenhead '17

@gardenhead同意,并+1;由于iptablesOP提到的原因,我主要关注内核中内置的Linux packetfilter。在我的“观点”中,应用程序防火墙不完全检查数据包,它们是应用程序协议感知的,应该检查完整的请求。在网络中,您然后可以处理诸如Apache的mod_security,F5和Bluecoat设备之类的产品,甚至是“不起眼的”反向代理
-HBruijn

@HBruijn您说得对-我误用了“数据包”一词。我不知道如何构建应用程序网关的详细信息,但是我会想象它们在检查+转发之前会等待接收足够的数据包以将完整的应用程序层消息组合在一起。
Gardenhead '17

1
提示:即使对其他服务使用fail2ban,也应将iptables 最近模块用于ssh。可能会有一些有趣的失败模式,其中规则未正确清理,并且登录名受其影响确实很烦人(而且使问题难以调试)。使用最近的,实际的规则不必更改,因此您很有机会重新获得访问权限。
西蒙·里希特

8

我应该使用fail2ban还是iptables?

这有点类似于询问“我应该使用安全带还是汽车?”。

首先,请记住,fail2ban实际上仅是一种工具,它可以自动检测文本文件中的重复条目,并在满足指定阈值时执行一些命令。

我们经常使用它来阻止违反某些策略的主机,如通过重复日志条目表明策略违反所证明的那样,但这并不是您可以使用的唯一方法。

可以使用fail2ban根据需要添加(和删除)iptables规则。您也可以手动添加和删除iptables规则,也可以使用fail2ban做出完全不同的响应。这就是配置方式的全部内容。

无论是否运行fail2ban,都应设置常规防火墙。例如,这种防火墙将阻止您知道永远不会合法的流量(传入或传出)。例如,该数据库服务器是否真的需要处理来自整个Internet的端口25上的传入连接?

最重要的是,让fail2ban通过暂时切断有问题的IP来响应策略违规并不会对保护服务器本身起到很大的作用(一个好的漏洞利用只需要穿过您的防火墙一次),但是它将降低系统上的噪音水平,包括但不限于系统日志中。一种简单的方法是让fail2ban运行iptables来配置内核以暂时丢弃数据包。如果可以重新配置外围防火墙而不是仅重新配置主机防火墙,那就更好了。

换句话说,就它们一开始就可以轻易分离的程度而言,您想要两者兼而有之。

如果我要实现的全部目标是,如果他们在一定时间内对任何服务/协议进行了两次失败的访问尝试,那么我试图实现的就是从服务器“阻止” IP,那是否会显得过大?

正是 fail2ban旨在解决的用例。使用工具达到其预期目的几乎永远不过分。

此处的目标是打开每日日志监视报告,而不必滚动浏览尝试与服务器建立连接失败的页面。

顺便说一句,与您的问题没有直接关系:每当您过滤日志以供查看时,请考虑对某些特定条目的处理方式。如果您要做的只是说“ meh”然后继续,那么您可能希望将其过滤掉。确保保存完整的日志进行复审应该说是必要的,但只推到你的定期监测工作流程的东西,你实际上是打算什么用时,它显示了。如果您设置了fail2ban以在几次尝试失败的连接后阻止主机,则很有可能不需要手动检查它们,并且可以从监视通知中删除它们。如果合法用户抱怨失去访问权限,只需取出完整的日志并进行查看。


感谢广泛的反馈,我想我从未想过两者具有完全独立的功能。
金米洛

4

几年前,我解决了同样的问题。由于性能和易于设置,我决定将iptables与最近的模块一起使用。我必须保护主机上的许多虚拟容器。只记住不要用您的规则打开任何DOS向量。也可以使用ipset来匹配规则中的网络列表或ip列表。我将其用于白名单。一个国家/地区的所有网络都在一个列表中,非常适合进行微调。而且,仅通过添加一个匹配的端口来保护具有相同规则集的其他服务是非常容易的。因此,我不喜欢使用fail2ban进行更改,但也许有其他需求的人会对fail2ban感到满意。

这是一些示例:

  #
  # SSH tracking sample
  #
  #################################################################################
  iptables -X IN_SSH
  iptables -N IN_SSH
  iptables -A IN_SSH -m set --match-set net_blacklist src -p tcp -j REJECT
  iptables -A IN_SSH -m set --match-set net_whitelist src -p tcp --match limit --limit 5/second -j LOG --log-prefix whitelist_de_prefix
  iptables -A IN_SSH -m set --match-set net_whitelist src -p tcp -j ACCEPT
  # filter update
  iptables -A IN_SSH -m recent --name sshbf --set --rsource
  # connlimit
  iptables -A IN_SSH -m connlimit --connlimit-above 4 --match limit --limit 5/second -j LOG --log-prefix ssh_connlimit_per_ip_above_4
  iptables -A IN_SSH -m connlimit --connlimit-above 4 -j REJECT
  # filter
  iptables -A IN_SSH -m recent --name sshbf --rttl --rcheck --hitcount 13 --seconds 60 --match limit --limit 5/second -j LOG --log-prefix ssh_filtered_13in60sec
  iptables -A IN_SSH -m recent --name sshbf --rttl --rcheck --hitcount 13 --seconds 60 -j REJECT
  iptables -A IN_SSH -j ACCEPT

iptables -A FORWARD -p tcp --dport ssh --syn --jump IN_SSH
# iptables -A INPUT -p tcp --dport ssh --syn --jump IN_SSH

您的日志消息的输出可以与fail2ban结合使用。您也可以将其用于INPUT规则。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.