使用防火墙既可以用于制定智能策略决策,也可以用于学习语法。 像iptables
这样的防火墙能够通过解释管理员设置的规则来实施策略。但是,作为管理员,您需要知道哪些类型的规则对您的基础架构有意义。
虽然其他指南侧重于启动和运行所需的命令,但在本指南中,我们将讨论在实施防火墙时您必须做出的一些决策。这些选择将影响防火墙的行为方式,服务器的锁定方式以及它将如何响应可能不时发生的各种情况。我们将以iptables
作为一个例子来讨论具体细节,但无论使用何种工具,大多数实际决策都是相关的。
要完成本教程,你需要具备以下内容:
sudo
命令的非root账号的服务器,没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。构建防火墙时,必须做出的一个基本决策是默认策略。这决定了当流量与任何其他规则不匹配时会发生什么。默认情况下,防火墙可以接受先前规则不匹配的任何流量,也可以拒绝该流量。
默认策略“接受”表示允许任何不匹配的流量进入服务器。通常不建议这样做,因为这意味着,实际上,您将维护一个黑名单。黑名单很难管理,因为您必须明确预测并阻止所有类型的不需要的流量。这可能导致维护问题,并且通常容易出现错误,错误配置以及既定策略中的意外漏洞。
替代方案是“drop”的默认策略。这意味着将不允许任何未与显式规则匹配的流量。这类似于白名单ACL。必须明确允许每项服务,这可能看起来像是一项重要的研究和工作。但是,这意味着您的策略倾向于安全性,并且您确切知道允许在服务器上接收流量的内容。
基本上,选择归结为默认情况下的安全性或开箱即用的可达服务。虽然实施可倾向于服务可用性的防火墙可能很诱人,但除非明确允许,否则阻止流量几乎总是更好的主意。
上面选择的默认丢弃策略会导致另一个微妙的决定。使用iptables
防火墙和其他类似防火墙,可以使用防火墙的内置策略功能设置默认策略,也可以通过在规则列表末尾添加catch-all丢弃规则来实现。
这两种方法的区别在于如果刷新防火墙规则会发生什么。
如果防火墙的内置策略功能设置为“丢弃”并且您的防火墙规则被刷新(重置),或者如果删除了某些匹配规则,您的服务将立即远程无法访问。在为非关键服务设置策略时,这通常是一个好主意,这样,如果删除规则,您的服务器就不会暴露于恶意流量。
这种方法的缺点是,在重新建立许可规则之前,您的服务将完全不可用。如果您没有本地或带外访问权限,您甚至可能将自己锁定在服务器之外(使用“访问”中的“控制台访问”按钮,无论网络设置如何都可以访问DigitalOcean服务器控制面板中Droplet页面的一部分)。如果您的防火墙刷新是故意的,只需在重置规则之前将默认策略切换为“接受”即可避免这种情况。
使用内置策略功能设置丢弃策略的替代方法是将防火墙的默认策略设置为“接受”,然后使用常规规则实施“丢弃”策略。您可以在链的末尾添加常规防火墙规则,以匹配并拒绝所有剩余的不匹配流量。
在这种情况下,如果刷新防火墙规则,您的服务将可访问但不受保护。根据您对本地访问或备用访问的选项,这可能是必要的恶意,以确保在刷新规则时可以重新进入服务器。如果您决定使用此选项,则必须确保catch-all规则始终是规则集中的最后一条规则。
有一些不同的方法可以阻止数据包通过其预定目的地。这些选择之间的选择会影响客户端如何看待其连接尝试以及他们能够多快地确定他们的请求将不会被提供。
可以拒绝数据包的第一种方法是“丢弃”。Drop可用作默认策略或匹配规则的目标。丢弃数据包时,iptables
基本上只是丢弃它。它不会向尝试连接的客户端发送任何响应,也不会发出任何已经收到相关数据包的指示。这意味着客户端(合法与否)将不会收到任何收到其数据包的确认。
对于TCP连接尝试,连接将停止,直到达到超时限制。由于UDP是一种无连接协议,因此客户端缺乏响应更加模糊。实际上,在这种情况下不接收数据包通常表明数据包已被接受。如果UDP客户端关心其数据包的接收,则必须重新发送它们以尝试确定它们是否被接受,在传输中丢失或丢弃。这可能会增加恶意行为者为获取有关服务器端口状态的正确信息而花费的时间,但也可能导致合法流量出现问题。
丢弃流量的替代方法是明确拒绝您不允许的数据包。ICMP或Internet控制消息协议是整个互联网中使用的元协议,用于在主机之间发送状态,诊断和错误消息,作为不依赖于传统通信协议(如TCP或UDP)的带外信道。当您使用“拒绝”目标时,流量将被拒绝,并且ICMP数据包将返回给发件人,以通知他们已收到其流量但不会被接受。状态消息可以提示原因。
这有很多后果。假设允许ICMP流量流出到客户端,他们将立即被告知他们的流量被阻止。对于合法客户端,这意味着他们可以联系管理员或检查其连接选项,以确保他们可以联系到正确的端口。对于恶意用户,这意味着他们可以在更短的时间内完成扫描并映射打开,关闭和过滤的端口。
在决定是放弃还是拒绝流量时,需要考虑很多事情。一个重要的考虑因素是大多数恶意流量实际上都是由自动脚本实现的。由于脚本通常不是时间敏感的,因此丢弃非法流量不会产生预期的抑制因素,但会对合法用户产生负面影响。
下表显示受防火墙保护的服务器将如何响应不同的请求,具体取决于应用于目标端口的策略。
客户端包类型 | NMap命令 | 港口政策 | 响应 | 推断港口国 |
---|---|---|---|---|
TCP | nmap [-sT | -sS] -Pn <server> | 接受 | TCP SYN / ACK | 打开 |
TCP | nmap [-sT | -sS] -Pn <server> | 下降 | (没有) | 过滤 |
TCP | nmap [-sT | -sS] -Pn <server> | 拒绝 | TCP重置 | 关闭 |
UDP | nmap -sU -Pn <server> | 接受 | (没有) | 打开或过滤 |
UDP | nmap -sU -Pn <server> | 下降 | (没有) | 打开或过滤 |
UDP | nmap -sU -Pn <server> | 拒绝 | ICMP端口无法访问 | 关闭 |
第一列表示客户端发送的数据包类型。在第二列中,我们已经包含了可用于测试每个场景的命令nmap
。第三列表示应用于端口的端口策略。第四列是服务器将发回的响应,第五列是客户端可以根据收到的响应推断出端口的内容。
与是否丢弃或拒绝拒绝流量的问题类似,对是否接受发往服务器的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 Internet路由器发现协议)的一部分,该系统允许主机在启动或加入网络时动态发现可用的路由器。
在大多数情况下,主机最好为其将使用的网关配置静态路由。应在与ICMP重定向数据包相同的情况下接受这些数据包。实际上,由于主机不知道任何发现路由的流量的首选路由,因此通常在发现之后直接需要重定向消息。如果您没有运行发送路由器请求数据包的服务或根据广告数据包(如rdisc
)修改您的路由,您可以安全地阻止这些数据包。
通常可以安全使用的ICMP类型如下,但如果您需要格外小心,可能需要禁用它们。
通过配置防火墙以允许响应它所做的请求(通过使用conntrack
模块允许ESTABLISHED
和RELATED
流量),通常可以在没有明确规则的情况下允许以下类型。
一些安全专家仍然建议阻止所有传入的ICMP流量,但是现在很多人都鼓励采用智能ICMP接受策略。
对于某些服务和流量模式,您可能希望允许访问,前提是客户端没有滥用该访问权限。限制资源使用的两种方式是连接限制和速率限制。
可以使用扩展来实现连接限制,例如connlimit
用于检查客户端打开的活动连接数。这可用于限制一次允许的连接数。如果您决定实施连接限制,则需要做出一些关于如何应用连接的决定。决定的一般细分是:
可以在逐个主机的基础上限制连接,或者可以通过提供网络前缀为网段设置限制。您还可以为服务或整个计算机设置全局最大连接数。请记住,可以混合和匹配这些以创建更复杂的策略来控制您的连接数。
速率限制允许您构建规则,以控制服务器接受流量的速率或频率。有许多不同的扩展的,可用于为速率限制包括limit
,hashlimit
,和recent
。您使用将在很大程度上依赖于扩展的选择方式要限制流量。
limit
扩展将导致有问题的规则进行匹配,直至达到限制,则之后进一步的数据包将被丢弃。如果设置限制为“5 / sec”,则规则将允许每秒匹配5个数据包,之后规则不再匹配。这适用于设置服务的全局速率限制。
hashlimit
扩展更加灵活,允许你指定某些值iptables
会出现乱码,以评估匹配。例如,它可以查看源地址,源端口,目标地址,目标端口或这四个值的任意组合来散列每个条目。它可以通过接收的数据包或字节来限制。基本上,这提供了灵活的每客户端或每服务速率限制。
recent
扩展动态地将客户端IP地址对当规则匹配现有列表列表或检查。这允许您在复杂模式的许多不同规则之间传播限制逻辑。它能够像其他限制器一样指定命中计数和时间范围,但如果看到额外的流量,还可以重置时间范围,有效地迫使客户端在限制时停止所有流量。
选择使用哪种速率限制扩展取决于您希望执行的确切策略。
所有iptables
防火墙策略都植根于扩展内置链。对于简单的防火墙,这通常采用更改链的默认策略和添加规则的形式。对于更复杂的防火墙,通过创建其他链来扩展管理框架通常是个好主意。
用户创建的链本质上与其调用链相关联。用户创建的链没有默认策略,因此如果数据包通过用户创建的链,它将返回到调用链并继续评估。考虑到这一点,用户创建的链主要用于组织目的,使规则匹配条件更干燥,并通过拆分匹配条件提高可读性。
如果您发现在自己为大量规则重复某些匹配条件,则可能创建一个具有共享匹配条件的跳转规则到新链是值得的。在新链中,您可以添加该组规则并删除共享匹配条件。
除了简单的组织,这可能会产生一些有益的副作用。例如,对非常相似的规则集合智能地使用链意味着在正确的位置添加规则可以更容易并且更不容易出错。通过链限制,可以更容易地显示和理解您关注的策略部分。
是否将所有规则归入其中一个内置链或是否创建和利用其他链的决定在很大程度上取决于规则集的复杂性和易管理性。
到目前为止,您应该对在为服务器设计防火墙策略时必须做出的一些决策有一个相当好的想法。通常,防火墙所涉及的时间投入很大程度上倾向于初始设置,使管理变得相当简单。虽然可能需要一些时间,思考和实验来制定最符合您需求的策略,但这样做可以让您更好地控制服务器的安全性。
想要了解更多关于防火墙策略的相关教程,请前往腾讯云+社区学习更多知识。
参考文献:《How To Choose an Effective Firewall Policy to Secure your Servers》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。