“TARPIT” 是否存在任何已知的漏洞或缺点?

“TARPIT” 是否存在任何已知的漏洞或缺点?

焦油坑可用于浪费攻击者的资源,从而减缓他们的攻击并降低他们攻击其他主机的能力......看起来是个好主意。

它作为网络过滤器 添加在并且可以像任何其他 IPTables 目标一样使用。

这种处理 (D)DoS 的方法是否存在已知的缺点或漏洞?

答案1

我以前认为这是个好主意。但现在不幸的是,我知道这是个非常糟糕的想法。

您是否曾经运行过 ApacheBench 之类的 HTTP 基准测试应用程序?在一台机器上,您可以将其设置为每秒创建数百个到目标服务器的连接。让其中一些客户端运行并连接到启用缓送功能的服务器,我认为您会看到问题。

考虑一下,如果每个连接都被困在 tarpit 中,每秒创建数千个到服务器的连接将对服务器产生怎样的影响。

您的服务器将很快耗尽其所有可用资源(或文件句柄),从而不再允许任何连接。这比直接关闭连接更糟糕。最好暂时放弃违规者,而不是试图占用他们的资源,而这正是 fail2ban 等脚本所实现的。

此外,您绝不希望普通用户被困在 tarpit 中,尤其是在交互式会话中。您如何预先决定谁被允许,谁不被允许?对于某些协议(如 HTTP),您无法做到这一点。您必须假设客户端没有问题,直到您从客户端收到活动,告诉您情况并非如此。然后,您可以决定将其视为坏的,下次它将被困在 tarpit 中。这似乎没问题,但许多此类攻击可能来自动态 ADSL 用户等,他们恰好感染了最新的蠕虫病毒。

由于许多来自动态 IP 的 PC 的攻击都感染了蠕虫病毒,而所有者却毫不知情,因此您可以快速建立过时的 tarpit 黑名单。您是否开始发现一些问题了?

答案2

概括

在通用服务器上运行 tarpit 确实存在风险。如果您知道有哪些风险,您可以根据自己的承受程度来减轻这些风险。

  • 你必须确保你不会意外地使用 tarpit 流量对你的服务器进行 DOS 攻击
  • 你必须确保你的状态表里没有填充延迟连接信息
  • 你必须确保你的日志中不会充斥着 tarpit 连接信息
  • 你需要确保较长的黑名单不会影响性能
  • 你需要确保你的黑名单自动过期主机
  • 您需要能够将主机列入白名单(永久或有时间限制)

值得庆幸的是,这一切都是可能的,而且使用常规 iptables 和 ipset 相当容易。

限制 TARPIT 资源使用

您可以使用 iptables 来限制 TARPIT 的主机数量,而不会使用太多的系统资源。 参见下面的示例。 这包括网络带宽、系统内存、状态稳定条目和其他系统资源。如果出现过多的缓送连接,请开始忽略它们。如果您以正确的顺序组织规则集,则所有缓送连接都不会出现在您的状态表中。另外,请确保不要记录日志,除非您使用自定义 ulog 之类的东西进行实时统计——直接 iptables 缓送日志会很快填满磁盘。

根据我的经验,我当前的主机可以轻松地将 200 多台主机放在一个 tarpit 中,而对内存使用率、流量使用率或 CPU 使用率几乎没有明显影响。我可能可以进一步推动这一点,但到目前为止,平均而言,我在任何给定时刻只能捕获大约 130 台主机。

我实施限制的原因如另一条建议所述,是因为我的第一个 tarpit 主机被淹没了。这是一个简单的解决方法。从那以后我就没遇到过任何问题。

使用 ipset 实现高效黑名单

ipset是一款很棒的小工具,它允许您创建对象组以用于 iptables 规则。不仅如此,由于它可以将对象保存在哈希表中,因此与等效的线性 iptables 规则集相比,ipset 越大,速度越快。

除此之外,列表还可以包括每个对象的计数器(数据包/字节)、超时和排除。

您可以使用大多数自动阻止的程序(例如 fail2ban、ossec 等)从 ipset 添加/删除。因为您可以设置默认超时,所以无论哪个程序设置了条目,您都可以确保条目已过期。

例子

以下是根据我在所管理的服务器上使用的方法示例,可以减轻上述风险:

警告

### Note:  This does not account for all possible traffic you might need or want
###        This is only an example of mitigating common risks of using a tarpit
###        Use at your own risk

配置 ipset

# Create the ipset blacklist
# options:
# - create         : create a new ipset
# - blacklist      : Name of the ipset we'll reference in the iptables rule
# - hash:net       : Make blacklist type hash to hold network (ip/mask) data
# - family inet    : This is for IPv4 data (inet6 for IPv6)
# - counters       : We want packet/byte stats counted for each entry
# - comment        : So we can add a comment with each entry (handy)
# - timeout 604800 : Set a default timeout of 604800 seconds (1 week) for each new entry
# - nomatch        : Allow us to enter exclusion entries (never match an entry)
ipset create blacklist hash:net family inet counters comment timeout 604800 nomatch

# Create an entry to never blacklist a trusted network
# options:
# - timeout 0      : entry never expires
# - nomatch        : Tells IPset to never match this entry (whitelist, in our usage)
ipset add blacklist 123.45.67.0/24 comment "Trusted subnet, causes breakage if blocked" timeout 0 nomatch

# Example to blacklist hosts
# no netmask implies /32 (or /128 for ipv6)
ipset add blacklist 34.56.78.90 comment "SSH Bruteforce"
ipset add blacklist 23.45.67.89 comment "SQL Injection" timeout 12345
# etc...

配置 iptables

# Flush the input table
iptables -F INPUT

# Drop the custom flow TAR
iptables -X TAR

# Set default INPUT policy to DROP
iptables -P INPUT DROP

# Create the chain TAR
iptables -N TAR

# Send all blacklisted hosts to the tarpit
iptables -A INPUT -m set --match-set blacklist src -j TAR

# Allow established connections
# Note: after the blacklist so newly blacklisted threats are immediately ignored
#       Yes, that will cause the server to hold the state open until it times out.
#       Would you rather have a malicious host continuing its attack?
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# Allow the services we want
# Note:  These create new state table entries/use up memory
# Note:  We do not account for synflood prevention in this example
iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -m tcp --syn -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT

# Send everything else to tarpit chain
iptables -A INPUT -j TAR

# This is the tarpit chain

# Tarpit up to 10 unique connections a second, any more, and pass to next rule
# Note: 10/s limit is arbitrary, adjust to your preference (experiment)
iptables -A TAR -p tcp -m limit --limit 10/sec -j TARPIT --tarpit 

# Drop everything else that makes it this far
# You can also set to REJECT which will immediately tell all connections to buzz off
iptables -A TAR -j DROP

实时查看被困主机

$ sudo tcpdump -npi eth0 'src YOUR.HOST.IP and (tcp[14] = 0 && tcp[15] = 0)'

答案3

缺点

我一直在我的服务器中使用 TARPIT。保证使用超过 20 年。我发现的唯一缺点是:

  • 安装需要编译— TARPIT 目标不是 Linux 内核的一部分,而是由XTables 插件包。据我所知,没有主流 Linux 发行版提供可立即安装的二进制包作为插件。因此,要获得 TARPIT 目标,您必须获取源代码并自行构建模块。如今,大多数 Linux 发行版都使这项任务变得简单,但仍然不像那么容易apt install PACKAGE

  • 增加 iptables 规则的复杂性— 尽管 TARPIT 机制旨在限制仅有的攻击者的资源,配置不当的系统可以打开你的服务器 DOS 攻击。不幸的是,实现 TARPIT 的最直观方法(“哦,让我们用 替换-j DROP-j TARPIT)是错误的,并且会使服务器易受攻击。原因是内核不知道您的 tarpitting 业务,并将尝试进行连接跟踪,尽管如此,这将使用您服务器上的资源。知道您的服务器配置错误的攻击者可以很容易地对其进行 DOS 攻击,并且为了防止这种情况,您需要对 iptables 规则进行一些技巧,这会增加复杂性。以下是我使用的避免此问题的技术要点:https://gist.github.com/flaviovs/103a0dbf62c67ff371ff75fc62fdded3

漏洞

从实施角度来看,据我所知,唯一的潜在问题是上面解释的连接跟踪 DOS 攻击,如果你没有正确配置 iptables,就可以利用该攻击

如果你谈论的是软件漏洞,那么很难证明任何软件没有问题。考虑到项目的成熟度,我认为它相当安全。据我所知,也没有报告过针对它的漏洞。当然,这只是我个人的看法——在使用它之前,你应该做好充分的调查。

相关内容