保护 Linux 服务器:iptables 与 fail2ban

保护 Linux 服务器:iptables 与 fail2ban

我想就 Linux 服务器安全问题征求社区的意见,特别是关于暴力攻击并使用失败2ban与自定义iptables

还有一些类似的问题,但没有一个能让我满意地解决这个问题。简而言之,我正在尝试确定最佳解决方案,以保护暴露在互联网上的 Linux 服务器(运行常用服务、ssh、web、邮件)免受暴力攻击。

我对服务器安全有很好的把握,例如通过不允许 root 或密码登录来锁定 ssh、更改默认端口、确保软件是最新的、检查日志文件、只允许某些主机访问服务器以及使用安全审计工具,例如莱尼斯https://cisofy.com/lynis/),对于一般的安全合规性,因此这个问题不一定与输入和欢迎提出建议

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

关于这个话题有一个有趣的回应(Denyhosts 与 fail2ban 与 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 允许以能够编写自定义“规则' 针对默认配置中可能未解决的服务。它易于安装和设置,功能强大,但如果我只想实现以下目的,那么它是否有点过头了 '堵塞' 如果它们通过任何服务/协议尝试两次访问失败,则从服务器获取 IPX多少时间?

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

感谢您抽出宝贵的时间。

答案1

我应该使用 fail2ban 还是 iptables?

您使用 fail2ban此外防火墙解决方案延长一经请求这些现有的防火墙规则与阻止对公共服务执行不良操作的系统的特定 IP 地址的规则相结合。它们相互配合。

简单来说:防火墙只能看到网络连接和数据包,并且可以理解其中的模式,但它没有应用程序级别的洞察力来区分所需和有效的请求与恶意、格式错误和不受欢迎的请求。例如,您的防火墙无法区分一堆 HTTP API 请求和由 Wordpress 管理页面上的暴力密码猜测导致的多次错误登录尝试,对于防火墙来说,它们都只是到端口 80 或 443 的 TCP 连接。

Fail2ban 是一种通用且可扩展的方法,可为您的防火墙提供应用程序级洞察,尽管有些间接。
应用程序经常会注册和记录恶意、格式错误和不受欢迎的请求,但它们很少具有防止进一步滥用的原生能力。尽管 Fail2ban 略微解耦,但它可以对这些记录的恶意事件采取行动,限制损害并防止进一步滥用,通常是通过动态重新配置防火墙以拒绝进一步访问。换句话说,Fail2ban 无需修改现有应用程序,即可为其提供抵御滥用的方法。

为防火墙提供应用程序级别洞察的另一种方法是通过入侵检测/预防系统


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

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

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

答案2

我应该使用 fail2ban 还是 iptables?

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

首先,请记住fail2ban 实际上只是一个自动检测文本文件中重复条目并在达到指定阈值时执行某些命令的工具。

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

使用 fail2ban 按需添加(和删除)iptables 规则。您还可以手动添加和删除 iptables 规则,或者可以使用 fail2ban 执行完全不同的响应操作。这就是您如何配置它的全部内容。

无论您是否运行 fail2ban,您都应该安装常规防火墙。例如,这种防火墙可以阻止(传入或传出的)流量,你知道这些流量是绝不是否合法。例如,该数据库服务器真的需要处理来自整个互联网的端口 25 上的传入连接吗?

最重要的是,让 fail2ban 通过暂时切断违规 IP 来应对政策违规行为,这对保护你的服务器没有多大帮助本身(一个好的漏洞只需要通过你的防火墙一次)但它会减少你系统的噪音水平,包括但不限于系统日志中的噪音。简单的方法是让 fail2ban 运行 iptables 来配置内核以暂时丢弃数据包。如果你可以重新配置你的外围防火墙而不仅仅是主机防火墙,那就更好了。

换句话说,如果一开始就可以轻松将它们分开,那么您就会想要两者。

如果我所要做的就是在某个 IP 在某段时间内对任何服务/协议进行两次失败的访问尝试时“阻止”该服务器,这会不会有点小题大做?

那是确切地fail2ban 旨在解决用例。使用工具实现其预期目的几乎永远不会过度。

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

题外话,与你的问题没有直接关系:每当你过滤日志以供审查时,请考虑你将如何处理某些特定条目。如果你对某个条目所做的只是说“嗯”然后继续,那么你可能想过滤掉它。确保保存完整的日志以供审查(如果需要),但只将你实际要处理的内容推送到你的常规监控工作流程中出现时会出现一些问题。如果您设置 fail2ban 在几次连接尝试失败后阻止主机,则很有可能您不需要手动检查这些尝试,并且可以将它们从监控通知中删除。如果合法用户抱怨无法访问,只需拉出完整的日志并查看即可。

答案3

几年前我解决了同样的问题。我决定使用具有最新模块的 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 规则。

相关内容