服务器安全:如何制定高效防火墙策略抵御网络威胁
引言
使用防火墙与学习语法一样,同样重要的是做出明智的策略决策。像iptables这样的防火墙通过解析管理员设置的规则来执行策略。然而,作为管理员,你需要知道哪些规则对你的基础设施是合理的。
在其他指南侧重于启动和运行所需的命令时,而在这个指南中,我们将讨论在实施防火墙时需要做出的一些决策。这些选择将影响你的防火墙行为、服务器的安全程度以及它对各种情况的响应方式。我们将以iptables作为一个具体示例,但大部分概念都是广泛适用的。
决定默认策略
在构建防火墙时,最重要的决策之一是默认策略。这决定了当流量没有与其他规则匹配时会发生什么。默认情况下,防火墙可以接受任何与先前规则不匹配的流量,或者丢弃该流量。
默认丢弃 vs 默认接受
默认的接受策略意味着任何未匹配的流量都可以进入服务器。一般来说,这是不推荐的,因为这意味着你需要从这里开始逆向工作,阻止所有不需要的流量。基于阻止列表的方法很难管理,因为你需要预先预测和阻止每一种不需要的流量。这可能导致维护方面的麻烦,并且往往容易出现错误配置和未预料的安全漏洞。
可选的策略是默认使用“拦截”(DROP)。这意味着任何未明确匹配规则的流量都不会被允许通过。每个服务都必须明确被允许通过,这可能需要一定数量的配置。然而,这意味着你的策略趋向于安全,并且你清楚地知道哪些流量可以在你的服务器上接收。此外,几乎所有预配置的策略都会遵循这种方法,这意味着你可以在现有默认设置上进行扩展。
默认丢弃策略 vs 最终丢弃规则
默认丢弃策略的选择会导致另一个微妙的决定。通过iptables和其他类似的防火墙,可以使用防火墙内置的策略功能来设置默认策略,或者通过在规则列表末尾添加一个捕获所有丢弃的规则来实现。
这两种方法的区别在于如果防火墙规则被清除后会发生什么。
如果你的防火墙的内置策略功能设置为DROP,并且防火墙规则被清除(重置),或者某些匹配规则被移除,你的服务将立即无法从远程访问。对于非关键服务设置策略时,这通常是一个好主意,以防止规则被移除后你的服务器暴露在恶意流量面前。
这种方法的缺点是,直到重新建立允许规则之前,您的服务将完全无法提供给客户。如果您没有本地或基于网络的远程访问作为替代方案,甚至可能会将自己锁在服务器之外。
使用内置策略功能来设置丢弃策略的替代方法是将防火墙的默认策略设为接受(ACCEPT),然后使用常规规则实施丢弃(DROP)策略。您可以在链的末尾添加一个普通防火墙规则,匹配并拒绝所有未匹配的流量。
在这种情况下,如果您的防火墙规则被清除,您的服务将可以访问但没有保护。根据您本地或备用访问的选项,这可能是一种必要的牺牲,以确保在规则被清除时您能重新进入服务器。如果您决定使用此选项,请确保全捕规则始终保持在规则集的最后一个规则位置上。
丢弃流量 vs 拒绝流量
有几种不同的方法可以阻止数据包到达其预期的目的地。在这些选择之间进行选择对客户端感知其连接尝试的影响很大,并且能够快速确定他们的请求将不会被处理的速度也很重要。
数据包可以被拒绝的第一种方式是使用DROP。DROP可以作为默认策略或匹配规则的目标。当数据包被丢弃时,iptables会直接将其丢弃,不向客户端发送任何响应,并且不给出任何关于接收到相关数据包的指示。这意味着客户端(无论是合法还是非法)将不会收到任何数据包已被接收的确认信息。
对于TCP连接尝试(例如由Web浏览器发起的连接),直到达到超时限制之前,连接将被阻塞。而对于UDP客户端而言,缺乏响应更加模糊不清。事实上,不收到UDP包的回复通常意味着该包被接受了。如果UDP客户端关心其数据包的接收情况,就需要重新发送它们以尝试确定它们是被接受、在传输过程中丢失还是被丢弃。这可能会增加恶意行为者获取有关服务器端口状态的信息所需的时间,但也可能导致合法流量出现问题。
一个不丢弃流量的替代方法是明确地拒绝那些你不允许的数据包。ICMP,即互联网控制消息协议,是互联网上使用的一种元协议,用于在主机之间发送状态、诊断和错误消息,作为一种不依赖于传统通信协议如TCP或UDP的带外通道。当你使用REJECT目标而不是DROP目标时,流量被拒绝,并且将一个ICMP数据包返回给发送者,告知其他们的流量已被接收但不会被接受。还可以包含一个状态消息以提供原因。
这会带来一系列的后果。假设ICMP流量被允许到达客户端,他们将立即收到通知,告知他们的流量被阻止了。对于合法的客户端来说,这意味着他们可以联系管理员或检查连接选项,确保他们正在连接到正确的端口。对于恶意用户来说,这意味着他们可以更短时间内完成扫描,并绘制出开放、关闭和过滤的端口。
在决定是否丢弃或拒绝流量时需要考虑许多因素。一个重要的考虑是,大多数恶意流量实际上是由自动化脚本所执行。由于这些脚本通常没有监督,丢弃非法流量不会有实质性的威慑作用,同时会给合法用户带来负面影响。关于这个主题可以在彼得·贝尼的网站上找到更多信息。
丢弃与拒绝回应表格
以下表格显示了一个由防火墙保护的服务器对不同请求的反应,这取决于应用于目标端口的策略。
客户端数据包类型 | NMap 命令 | 端口策略 | 响应 | 推断端口状态 |
---|---|---|---|---|
TCP | nmap [-sT | -sS] -Pn <服务器> | 接受 | TCP SYN/ACK | 开放 |
TCP | nmap [-sT | -sS] -Pn <服务器> | 丢弃 | (无) | 已过滤 |
TCP | nmap [-sT | -sS] -Pn <服务器> | 拒绝 | TCP RESET | 已关闭 |
UDP | nmap -sU -Pn <服务器> | 接受 | (无) | 开放或已过滤 |
UDP | nmap -sU -Pn <服务器> | 丢弃 | (无) | 开放或已过滤 |
UDP | nmap -sU -Pn <服务器> | 拒绝 | ICMP 端口不可达 | 已关闭 |
第一列表示客户端发送的数据包类型。第二列包含可用于测试每种情况的nmap命令。第三列表示应用于端口的端口策略。第四列是服务器将发送回的响应,第五列是客户端可以根据接收到的响应推断出的有关端口的信息。
ICMP 策略
与决定是否丢弃或拒绝被拒绝的流量一样,您可以选择接受或拒绝发送到您的服务器的ICMP数据包。
ICMP是一个用于许多事情的协议。正如前面提到的,它经常被发送回来提供有关使用其他协议的请求的状态信息。它最常用的功能之一是发送和响应网络ping以验证与远程主机的连接性。还有许多其他用途的ICMP并不被广泛知晓,但仍然很有用。
ICMP包通过“类型”和“代码”进行分类。类型指定消息的一般含义。例如,类型3表示目的地无法访问。代码通常用于提供有关类型的更多信息。例如,ICMP类型3代码3表示目的地端口不可用,而ICMP类型3代码0表示无法到达目的地网络。
注意
根据网络配置进行屏蔽的类型
某些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地址范围)来限制网络段的连接数量。您还可以为服务或整个计算机设置全局最大连接数。请记住,可以混合使用这些选项,创建更复杂的策略来控制连接数。
速率限制
速率限制允许您制定规则来控制服务器接受流量的速率或频率。可使用多种不同的防火墙扩展来进行速率限制,包括limit、hashlimit和recent。您选择使用的扩展主要取决于您希望限制流量的方式。
限制扩展将导致相关规则在达到限制值之前一直生效,之后将丢弃进一步的数据包。例如,每秒限制为5个数据包,之后将不再匹配该规则。这对于设置全局服务速率限制非常有用。您还可以部署类似Fail2ban的附加服务,以阻止重复的连接尝试。
hashlimit扩展更加灵活,它允许您指定iptables会进行哈希以评估匹配的一些值。例如,它可以查看源地址、源端口、目标地址、目标端口中的一个或这四个值的组合来评估每个条目。它可以按包或按接收的字节限制。这提供了灵活的按客户端或按服务进行速率限制的功能。
最近的扩展功能会动态地将客户端的IP地址添加到列表中,或在规则匹配时进行检查现有列表。这样你就可以将限制逻辑分布在许多不同的规则中,应对复杂的模式。它可以像其他限制器一样指定一个命中次数和时间范围,但如果有额外的流量出现,它还可以重置时间范围,强制客户端停止所有流量,以进行限制。
单体化管理 VS 基于链条的管理
所有iptables和nftables防火墙策略本质上都建立在扩展内置链的基础上。起初,这通常意味着更改现有链的默认策略并添加规则。对于更复杂的防火墙,扩展管理框架通过创建额外的链通常是一个好主意。
用户创建的链称为次链接,与它们起源链密切相关。用户创建的链没有默认策略,所以如果一个数据包穿过用户创建的链,它将返回到调用的链并继续评估。因此,用户创建的链主要用于组织目的,使规则匹配条件更易于维护,并通过分割匹配条件来提高可读性。
如果你发现自己需要为大量规则重复使用某些匹配条件,那么创建一个带有共享匹配条件的跳转规则到一个新的链可能是值得的。在新的链中,你可以添加那组省略了冗余匹配条件的规则。
将所有规则整合到内置链中,还是创建和利用额外的链,这个决定将取决于你的规则集有多复杂。
结论
当你设计服务器的防火墙策略时,你现在应该对你将要做出的决策有更好的理解。通常,投入到防火墙中的时间主要集中在初始设置上。尽管可能需要一些时间和实验来找出最适合你需求的策略,但这样做将使你对服务器的安全性拥有更多控制权。
如果你想了解关于防火墙和iptables的更多信息,请查看以下文章:
以下指南可以帮助您执行所需策略。选择与您的防火墙相匹配的指南开始操作: