如何选择有效的防火墙策略来保护您的服务器

介绍

使用防火墙不仅涉及制定智能策略决策,还需要了解语法规则。 防火墙iptables 的设计目的是通过解释管理员设置的规则来执行策略。然而,作为管理员,您需要了解对您的基础架构有意义的规则类型。

虽然 其他指南 侧重于启动和运行所需的命令,但在本指南中,我们将讨论在实施防火墙时需要做出的一些决策。这些选择将影响您的防火墙行为、服务器的安全性以及对发生的各种情况的响应方式。我们将以 iptables 为具体示例,但大多数概念都是广泛适用的。

确定默认策略

在构建防火墙时,其中一个最重要的决定是默认策略。这决定了当流量不符合任何其他规则时会发生什么。默认情况下,防火墙可以选择 接受(ACCEPT) 任何未匹配先前规则的流量,或者 丢弃(DROP) 该流量。

默认丢弃与默认接受

A default policy of ACCEPT means that any unmatched traffic is allowed to enter the server. This is generally not recommended, because it means that you would need to work backwards from there, blocking all unwanted traffic. Blocklist-type approaches are difficult to manage, because you’d need to anticipate and block every type of unwanted traffic. This can lead to maintenance headaches and is generally prone to mistakes, misconfigurations, and unanticipated holes in the established policy.

另一种选择是使用 丢弃(DROP) 的默认策略。这意味着任何未匹配显式规则的流量将不被允许。每项服务必须显式允许,这可能需要相当多的初始配置。然而,这意味着您的策略倾向于安全,并且您确切知道什么被允许在服务器上接收流量。而且,几乎所有预配置的策略都将遵循这种方法,这意味着您可以在现有默认设置的基础上构建。

默认丢弃策略与最终丢弃规则

选择默认丢弃策略会导致另一个微妙的决定。使用 iptables 和其他类似的防火墙时,默认策略可以通过防火墙的内置策略功能设置,或者通过在规则列表末尾添加一个全捕获的丢弃规则来实现。

这两种方法的区别在于防火墙规则被清除后会发生什么。

如果你的防火墙内置策略函数设置为DROP,并且防火墙规则被清除(重置),或者某些匹配规则被移除,你的服务将立即在远程不可访问。这通常是为非关键服务设置策略的一个好主意,这样如果规则被移除,你的服务器就不会暴露在恶意流量中。

这种方法的缺点是,在重新建立允许规则之前,你的服务将完全不可用于你的客户。如果你没有本地或基于 Web 的远程访问作为替代方案,甚至可能会将自己锁在服务器外。

使用内置策略功能设置拒绝策略的替代方法是将防火墙的默认策略设置为ACCEPT,然后使用常规规则实施DROP策略。你可以在链的末尾添加一个正常的防火墙规则,匹配并拒绝所有未匹配的流量。

在这种情况下,如果你的防火墙规则被清除,你的服务将是可访问但没有保护的。根据你的本地或备用访问选项,这可能是一个必要的权衡,以确保在规则被清除时你能重新进入服务器。如果你决定使用这个选项,请确保这个全捕获规则始终保持在你的规则集中的最后一个规则。

丢弃 vs 拒绝流量

有几种不同的方式可以阻止数据包到达其目标位置。在这些选择之间进行选择会影响客户端对其连接尝试的感知以及他们能够确定他们的请求不会被服务的速度。

数据包被拒绝的第一种方式是使用 DROP。丢弃可以作为默认策略或作为匹配规则的目标。当数据包被丢弃时,iptables 只是将其丢弃。它不会向试图连接的客户端发送任何响应,也不会提供任何表明它甚至收到了相关数据包的指示。这意味着客户端(无论是否合法)将不会收到任何确认其数据包已被接收的信息。

对于 TCP 连接尝试(例如由 Web 浏览器进行的连接),连接将会停滞,直到达到超时限制。对于 UDP 客户端来说,缺乏响应甚至更加模糊。事实上,不收到 UDP 数据包返回往往意味着数据包已被接受。如果 UDP 客户端关心其数据包的接收情况,它将不得不重新发送它们以确定它们是否被接受、在传输过程中丢失或被丢弃。这可能会增加恶意行为者花费的时间来获取有关服务器端口状态的信息,但也可能会导致合法流量出现问题。

另一种避免丢弃流量的方法是明确拒绝不允许的数据包。 ICMP,即互联网控制消息协议,是互联网中用于在主机之间发送状态、诊断和错误消息的元协议,作为一种不依赖于传统通信协议(如TCP或UDP)的带外通道。当您使用REJECT目标而不是DROP目标时,流量将被拒绝,并且将返回一个ICMP数据包给发送者,告知他们其流量已被接收但不会被接受。还可以包含状态消息以提供原因。

这会产生一系列后果。假设允许ICMP流量到达客户端,则它们会立即收到有关其流量被阻止的通知。对于合法客户端,这意味着他们可以联系管理员或检查其连接选项,以确保他们正在连接到正确的端口。对于恶意用户,这意味着他们可以在较短的时间内完成其扫描并绘制出开放、关闭和被过滤端口。

在决定是丢弃还是拒绝流量时需要考虑很多因素。一个重要的考虑因素是,大多数恶意流量实际上都是由自动化脚本执行的。由于这些脚本通常没有监督,丢弃非法流量将不会有实质性的威慑作用,并且会对合法用户产生负面影响。有关此主题的更多信息可以在Peter Benie的网站上找到。

拒绝 vs 丢弃响应表

下表显示了由防火墙保护的服务器根据应用于目标端口的策略对不同请求的反应。

Client Packet Type NMap Command Port Policy Response Inferred Port State
TCP nmap [-sT | -sS] -Pn <server> Accept TCP SYN/ACK Open
TCP nmap [-sT | -sS] -Pn <server> Drop (none) Filtered
TCP nmap [-sT | -sS] -Pn <server> Reject TCP RESET Closed
UDP nmap -sU -Pn <server> Accept (none) Open or Filtered
UDP nmap -sU -Pn <server> Drop (none) Open or Filtered
UDP nmap -sU -Pn <server> Reject ICMP Port Unreachable Closed

第一列指示客户端发送的数据包类型。第二列包含可用于测试每种情景的nmap命令。第三列指示应用于端口的端口策略。第四列是服务器将发送的响应,第五列是客户端可以根据收到的响应推断出的端口信息。

ICMP策略

与决定拒绝还是丢弃被拒绝的流量一样,您可以选择接受或拒绝发送到服务器的 ICMP 数据包。

ICMP是一种用于许多目的的协议。正如前面提到的,它经常被发送回来以提供有关使用其他协议的请求的状态信息。它最常见的功能之一是发送和响应网络ping以验证与远程主机的连接性。有许多其他用途的 ICMP 并不被广泛知晓,但仍然很有用。

ICMP数据包按“类型”组织,然后进一步按“代码”组织。类型指定消息的一般含义。例如,类型3表示目标不可达。代码通常用于提供有关类型的进一步信息。例如,ICMP类型3代码3表示目标端口不可用,而ICMP类型3代码0表示无法到达目标网络。

一些ICMP类型已被弃用,因此它们可以被无条件地阻止。其中包括ICMP源阻塞(类型4代码0)和备用主机(类型6)。类型1、2、7以及15及以上的类型均已弃用,保留供将来使用或实验性质。许多上游防火墙模板将默认处理此问题。

根据网络配置阻止的类型

某些ICMP类型在某些网络配置中很有用,但在其他情况下应该被阻止。

例如,ICMP重定向消息(类型5)可用于说明不良的网络设计。当客户端有更好的路由直接可用时,会发送ICMP重定向。因此,如果路由器接收到一个将被路由到同一网络上的另一台主机的数据包,它会发送ICMP重定向消息,告诉客户端未来通过其他主机发送数据包。

这在您信任本地网络并希望在初始配置期间发现路由表中的效率低下时非常有用。在一个不受信任的网络上,恶意用户有可能发送 ICMP 重定向以操纵主机上的路由表。

在一些网络中有用但在其他网络中可能有潜在危害的其他 ICMP 类型包括 ICMP 路由器通告(类型 9)和路由器请求(类型 10)包。路由器通告和请求包是 IRDP(ICMP 互联网路由器发现协议)的一部分,该协议允许主机在启动或加入网络时动态发现可用的路由器。

在大多数情况下,最好为主机配置静态路由,以便使用网关。这些包应在与 ICMP 重定向包相同的情况下被接受。事实上,由于主机不会知道任何已发现路由的流量的首选路由,因此通常在发现后直接需要重定向消息。如果您没有运行发送路由器请求包或根据广告包修改路由的服务(如rdisc),则可以安全地阻止这些包。

通常可以允许的类型

通常可以允许的 ICMP 类型如下,但如果您想要更加小心,可能希望禁用它们。

  • 类型 8 — 回显请求:这些是针对您服务器的ping请求。通常可以允许这些请求(拒绝这些数据包并不会隐藏您的服务器,因为用户有很多其他方法来确定您的主机是否在线),但如果您愿意,可以阻止它们或限制您响应的源地址。
  • 类型 13 — 时间戳请求:这些数据包可被客户端用于收集延迟信息。它们可用于一些操作系统指纹识别技术,因此您可以阻止它们或限制您响应的地址范围。

通常情况下,可以通过配置防火墙允许响应其已发出的请求(通过使用conntrack模块来允许已建立相关流量)而无需明确规则来允许下面的类型。

  • 类型 0 — 回显回复:这些是对回显请求(ping)的响应。
  • 类型 3 — 目标不可达:合法的目标不可达数据包是对由您的服务器创建的请求的响应,指示无法传送该数据包。
  • 类型 11 — 超时:如果由您的服务器生成的数据包在到达目的地之前因超出其TTL值而死亡,则会返回此诊断错误。
  • 类型 12 — 参数问题:这意味着您服务器发出的出站数据包格式不正确。
  • 类型 14 — 时间戳回复:这些是由您的服务器生成的时间戳查询的响应。

封锁所有传入的 ICMP 流量仍然是一些安全专家推荐的做法,然而现在许多人鼓励采用智能 ICMP 接受策略。两个 Stackexchange 主题提供了更多信息。

连接限制和速率限制

对于一些服务和流量模式,您可能希望仅在客户端没有滥用访问权限时才允许访问。限制资源使用的两种方法是连接限制和速率限制。

连接限制

连接限制可以通过使用像 connlimit 这样的扩展来实现,以检查客户端打开了多少活动连接。这可用于限制一次允许的连接数。如果决定实施连接限制,您需要做一些决定:

  • 您是在每个地址、每个网络还是全局范围内进行限制?
  • 您是否匹配和限制特定服务的流量,还是对整个服务器进行限制?

连接可以根据主机进行限制,也可以通过提供网络前缀(例如整个组织的IP地址范围)来限制网络段的数量。您还可以为服务或整台机器设置全局最大连接数。请注意,可以混合使用这些方法以创建更复杂的策略来控制连接数。

速率限制

速率限制允许您制定规则,管理服务器接受流量的速率或频率。有许多不同的防火墙扩展可用于速率限制,包括limithashlimitrecent

limit扩展将导致匹配的规则一直生效,直到达到限制为止,之后将丢弃进一步的数据包。像5/sec这样的限制将允许每秒匹配5个数据包,之后规则将不再生效。这对于设置服务的全局速率限制很有用。您还可以部署其他服务,如Fail2ban,以阻止重复的连接尝试。

hashlimit扩展更加灵活,允许您指定一些值,iptables会对其进行哈希以评估匹配。例如,它可以查看源地址、源端口、目标地址、目标端口或这四个值的组合来评估每个条目。它可以按数据包或按接收的字节限制。这提供了灵活的按客户端或按服务的速率限制。

recent扩展会动态地将客户端IP地址添加到列表中,或在规则匹配时检查现有列表。这使您可以在多个不同的规则中分散您的限制逻辑,以处理复杂的模式。它具有指定命中计数和时间范围的能力,就像其他限制器一样,但如果检测到额外的流量,它还可以重置时间范围,迫使客户端停止所有流量以进行限制。

单体与基于链的管理

所有iptablesnftables防火墙策略基本上都是根据扩展内置链。首先,这通常意味着更改现有链的默认策略并添加规则。对于更复杂的防火墙,通常最好通过创建额外的链来扩展管理框架。

用户创建的链被称为次级链,与其“调用链”密切相关,即其源自的链。用户创建的链没有默认策略,因此,如果数据包通过了用户创建的链,它将返回到调用链并继续评估。考虑到这一点,用户创建的链主要用于组织目的,以使规则匹配条件更易维护,并通过拆分匹配条件来提高可读性。

如果您发现自己针对大量规则重复某些匹配条件,创建一个具有共享匹配条件的跳转规则到新链可能是值得的。在新链内,您可以添加省略了冗余匹配条件的规则集。

将所有规则捆绑到内置链中还是创建和利用额外链将取决于您的规则集有多复杂。

结论

当为您的服务器设计防火墙策略时,您现在应该对您将要做出的决定有了更好的理解。通常,防火墙涉及的时间投入在很大程度上偏向于初始设置。尽管可能需要一些时间和实验才能得出最适合您需求的策略,但这样做将让您对服务器的安全性拥有更多控制。

如果您想了解更多关于防火墙和 iptables 的信息,请查阅以下文章:

以下指南可帮助您实施您的策略。选择与您的防火墙匹配的指南以开始:

Source:
https://www.digitalocean.com/community/tutorials/how-to-choose-an-effective-firewall-policy-to-secure-your-servers