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

来自菜鸟教程
跳转至:导航、​搜索

介绍

使用防火墙与学习语法一样重要的是做出明智的策略决策。 Firewallsiptables 能够通过解释管理员设置的规则来执行策略。 但是,作为管理员,您需要知道哪些类型的规则对您的基础架构有意义。

虽然 其他指南 侧重于启动和运行所需的命令,但在本指南中,我们将讨论您在实施防火墙时必须做出的一些决定。 这些选择将影响您的防火墙的行为方式、服务器的锁定程度以及它将如何响应可能不时发生的各种情况。 我们将使用 iptables 作为示例来讨论细节,但无论使用何种工具,大多数实际决策都是相关的。

决定默认策略

构建防火墙时,您必须做出的基本决策之一是默认策略。 这决定了当流量与任何其他规则不匹配时会发生什么。 默认情况下,防火墙可以 接受 任何与先前规则不匹配的流量,或 拒绝 该流量。

默认丢弃与默认接受

“接受”的默认策略意味着允许任何不匹配的流量进入服务器。 通常不建议这样做,因为这意味着您将有效地维护黑名单。 黑名单很难管理,因为您必须明确预测并阻止 每种 类型的不需要的流量。 这可能会导致维护问题,并且通常容易出现错误、错误配置和已建立策略中的意外漏洞。

另一种选择是“丢弃”的默认策略。 这意味着将不允许任何与显式规则不匹配的流量。 这类似于白名单 ACL。 每一项服务都必须被明确允许,起初这似乎是大量的研究和工作。 但是,这意味着您的策略倾向于安全,并且您确切地知道允许在您的服务器上接收流量的内容。

基本上,选择归结为默认安全性或开箱即用的可访问服务的趋势。 虽然实施倾向于服务可用性的防火墙可能很诱人,但除非明确允许,否则阻止流量几乎总是一个更好的主意。

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

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

这两种方法的区别在于如果刷新防火墙规则会发生什么。

如果您的防火墙的内置策略功能设置为“丢弃”并且您的防火墙规则被刷新(重置),或者如果某些匹配规则被删除,您的服务将立即变得无法远程访问。 在为非关键服务设置策略时,这通常是一个好主意,以便在删除规则时您的服务器不会暴露于恶意流量。

这种方法的缺点是,在您重新建立许可规则之前,您的客户将完全无法使用您的服务。 如果您没有本地或带外访问权限来绕过问题,您甚至可能会将自己锁定在服务器之外(无论网络设置如何,都可以使用“访问”中的“控制台访问”按钮访问 DigitalOcean 服务器控制面板中 Droplet 页面的一部分)。 如果您的防火墙刷新是故意的,只需在重置规则之前将默认策略切换为“接受”即可避免这种情况。

使用内置策略功能设置丢弃策略的替代方法是将防火墙的默认策略设置为“接受”,然后使用常规规则实施“丢弃”策略。 您可以在链的末尾添加一个正常的防火墙规则,该规则匹配并拒绝所有剩余的不匹配流量。

在这种情况下,如果您的防火墙规则被刷新,您的服务将可以访问但不受保护。 根据您对本地或替代访问的选择,这可能是必要的,以确保您可以在规则被刷新时重新进入您的服务器。 如果您决定使用此选项,则必须确保包罗万象的规则始终在您的规则集中保留为 last 规则。

丢弃与拒绝流量

有几种不同的方法可以拒绝数据包到达其预期目的地。 这些之间的选择会影响客户端如何感知其连接尝试以及他们能够多快确定他们的请求将不会被服务。

可以拒绝数据包的第一种方法是使用“丢弃”。 Drop 可用作默认策略或匹配规则的目标。 当一个数据包被丢弃时,iptables 基本上只是把它扔掉。 它不会向尝试连接的客户端发送回响应,也不会给出任何迹象表明它甚至曾经收到过有问题的数据包。 这意味着客户端(合法与否)将不会收到任何收到其数据包的确认。

对于 TCP 连接尝试,连接将停止,直到达到超时限制。 由于 UDP 是一种无连接协议,因此缺乏对客户端的响应就更加模棱两可了。 事实上,在这种情况下没有收到返回的数据包通常表明数据包已被接受。 如果 UDP 客户端关心其数据包的接收,它将不得不重新发送它们以尝试确定它们是否被接受、在传输中丢失或丢弃。 这可能会增加恶意行为者获取有关服务器端口状态的正确信息所必须花费的时间,但也可能导致合法流量出现问题。

丢弃流量的另一种方法是明确拒绝不允许的数据包。 ICMP 或 Internet 控制消息协议是一种元协议,用于在整个 Internet 中作为不依赖于 TCP 或 UDP 等传统通信协议的带外通道在主机之间发送状态、诊断和错误消息。 当您使用“reject”目标时,流量会被拒绝,并且 ICMP 数据包会返回给发送方,通知他们他们的流量已收到但不会被接受。 状态消息可以提示原因。

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

在决定是丢弃还是拒绝流量时,需要考虑很多因素。 一个重要的考虑因素是大多数恶意流量实际上是由自动脚本实施的。 由于脚本通常对时间不敏感,因此丢弃非法流量不会起到抑制作用,但会对合法用户产生负面影响。 有关此主题的更多信息,请参见 此处

丢弃与拒绝响应表

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

客户端数据包类型 NMap 命令 港口政策 回复 推断的港口国
TCP -sS] -Pn 接受 TCP 同步/确认 打开
TCP -sS] -Pn 降低 (没有任何) 过滤
TCP -sS] -Pn 拒绝 TCP 复位 关闭
UDP nmap -sU -Pn 接受 (没有任何) 打开或过滤
UDP nmap -sU -Pn 降低 (没有任何) 打开或过滤
UDP nmap -sU -Pn 拒绝 ICMP 端口不可达 关闭

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

ICMP 政策

与是否丢弃或拒绝被拒绝的流量的问题类似,对于是否接受发往您的服务器的 ICMP 数据包有不同的意见。

ICMP 是一种用于许多事情的协议。 正如我们在上面看到的,它经常被发回,以提供有关使用其他协议的请求的状态信息。 也许它最受认可的功能是发送和响应网络 ping,以验证与远程主机的连接性。 ICMP 还有许多其他用途,但它们并不为人所知,但仍然有用。

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

总是可以被阻止的类型

某些 ICMP 类型已弃用,因此可能应该无条件阻止它们。 其中包括 ICMP 源淬火(类型 4 代码 0)和备用主机(类型 6)。 类型 1、2、7 和 15 及以上类型均已弃用、保留以供将来使用或实验性使用。

根据网络配置阻止的类型

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

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

如果您信任本地网络并希望在初始配置期间发现路由表中的低效率(修复路由是更好的长期解决方案),这将非常有用。 然而,在不受信任的网络上,恶意用户可能会发送 ICMP 重定向来操纵主机上的路由表。

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

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

通常可以安全允许的类型

通常可以安全允许的 ICMP 类型如下所示,但如果您要格外小心,可能需要禁用它们。

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

通过将防火墙配置为允许响应其发出的请求,通常可以在没有明确规则的情况下允许以下类型(通过使用 conntrack 模块来允许 ESTABLISHEDRELATED 流量) .

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

一些安全专家仍然建议阻止所有传入的 ICMP 流量,但是现在许多人鼓励智能 ICMP 接受策略。 链接 herehere 有更多信息。

连接限制和速率限制

对于某些服务和流量模式,您可能希望允许访问,前提是客户端没有滥用该访问。 限制资源使用的两种方式是连接限制和速率限制。

连接限制

可以使用 connlimit 之类的扩展来实现连接限制,以检查客户端打开了多少活动连接。 这可用于限制一次允许的连接数。 如果您决定实施连接限制,您将需要就如何应用它做出一些决定。 决策的一般分类是:

  • 限制每个地址、每个网络或全球范围?
  • 匹配和限制特定服务或整个服务器的流量?

可以在逐个主机的基础上限制连接,或者可以通过提供网络前缀来为网段设置限制。 您还可以为服务或整台机器设置全局最大连接数。 请记住,可以混合和匹配这些以创建更复杂的策略来控制您的连接数。

速率限制

速率限制允许您构建规则来管理服务器接受流量的速率或频率。 有许多不同的扩展可用于速率限制,包括 limithashlimitrecent。 您使用的扩展程序的选择很大程度上取决于您想要限制流量的 方式

limit 扩展将导致有问题的规则被匹配,直到达到限制,之后进一步的数据包被丢弃。 如果您设置了“5/sec”之类的限制,则该规则将允许每秒匹配 5 个数据包,之后该规则将不再匹配。 这有利于为服务设置全局速率限制。

hashlimit 扩展更加灵活,允许您指定一些值 iptables 将散列以评估匹配。 例如,它可以查看源地址、源端口、目标地址、目标端口或这四个值的任意组合来散列每个条目。 它可以通过接收的数据包或字节来限制。 基本上,这提供了灵活的每个客户端或每个服务的速率限制。

recent 扩展动态地将客户端 IP 地址添加到列表中,或者在规则匹配时检查现有列表。 这允许您在复杂模式的许多不同规则之间传播您的限制逻辑。 它能够像其他限制器一样指定命中计数和时间范围,但也可以在看到额外流量时重置时间范围,有效地强制客户端在所有流量受到限制时停止所有流量。

选择使用哪个速率限制扩展取决于您希望执行的确切策略。

单体管理与基于链的管理

所有 iptables 防火墙策略都植根于扩展内置链。 对于简单的防火墙,这通常采用更改链的默认策略和添加规则的形式。 对于更复杂的防火墙,通过创建额外的链来扩展管理框架通常是一个好主意。

用户创建的链本质上与它们的调用链相关联。 用户创建的链没有默认策略,因此如果数据包通过用户创建的链,它将返回调用链并继续评估。 考虑到这一点,用户创建的链主要用于组织目的,使规则匹配条件更加 DRY,并通过拆分匹配条件来提高可读性。

如果您发现自己对大量规则重复某些匹配标准,则可能值得创建一个具有共享匹配标准的跳转规则到新链。 在新链中,您可以添加该组规则并删除共享匹配条件。

除了简单的组织之外,这可能会产生一些有益的副作用。 例如,对非常相似的规则集智能使用链意味着在正确的位置添加规则可以更容易且不易出错。 通过链式限制,还可以更轻松地显示和理解您关心的策略部分。

是否将所有规则集中到一个内置链中或是否创建和使用附加链的决定将在很大程度上取决于管理规则集的复杂程度和容易程度。

结论

到目前为止,您应该对在为您的服务器设计防火墙策略时必须做出的一些决定有一个相当好的想法。 通常,与防火墙有关的时间投资在很大程度上倾向于初始设置,从而使管理相当简单。 虽然可能需要一些时间、思考和试验才能提出最能满足您需求的策略,但这样做可以让您更好地控制服务器的安全性。

如果您想详细了解防火墙和 iptables,请查看以下文章:

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