2008年2月22日星期五

有效配置与管理iptable来提高网络安全

有效配置与管理iptable来提高网络安全
开发者在线 Builder.com.cn 更新时间:2006-02-27作者:Chad Perrin 来源:

重定向

在测试该配置一段时间后,我将使用iptables-save命令将配置内容输出到一个文件中,我使用重定向将输出内容保存到名为saved.std或iptables.std的文件中,此处的std是standard(标准)的缩写,这样,我就清楚地标记出了基准的通用的工作站iptable配置模板。

一旦我保存了这个文件,我就能针对单独的工作站的需要编辑iptable规则了,并可以使用iptables-restore命令来加载它们,在默认情况下,iptables-restore命令将在重建iptable 之前刷新原有设置,所以您不需要担心在使用该命令前刷新iptable来保证所有的事情按照您的需求运作。

现在,如果我需要那个save.std文件在很多其他的计算机上重复使用,我应该将其保存在方便的位置,然后,将它应用到新的计算机上,我所需要做的就是将它拷贝到新的系统上,并在新的系统上运行iptables-restore < saved.std就像我要在第一个系统上恢复备份的默认设置一样,这样做就使新的配置完全取代了原有的iptable设置,即使重新启动计算机也不会取消这些改变,它将保持不便知道您再次改变它。

这是一个模板文件saved.std的例子(列表A)和一些解释。

列表A

*mangle

:PREROUTING ACCEPT [48436:11233990]

:INPUT ACCEPT [48436:11233990]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [29730:6162034]

:POSTROUTING ACCEPT [29730:6162034]

COMMIT

*nat

:PREROUTING ACCEPT [391:49336]

:POSTROUTING ACCEPT [1793:110951]

:OUTPUT ACCEPT [1793:110951]

COMMIT

*filter

:INPUT DROP [0:0]

:FORWARD DROP [0:0]

:OUTPUT ACCEPT [1418:147349]

-A INPUT -i lo -j ACCEPT

-A INPUT -m state --state ESTABLISHED -j ACCEPT

-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 631 -j ACCEPT

-A INPUT -p all -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

-A INPUT -j DROP

-A OUTPUT -o lo -j ACCEPT

-A OUTPUT -p tcp -m tcp --sport 22 -j ACCEPT

-A OUTPUT -p tcp -m tcp --sport 631 -j ACCEPT

COMMIT

这个iptable配置可以从根本上使您的计算机立刻对任何没有通过您请求的输入连接伪装成不存在,对于转发的包也同样适用,这通常是一个好的策略,使用默认的:INPUT DROP和:FORWARD DROP,用于特定端口、地址等等的例外情况可以在稍后创建。

与此同时,为了保证您不会忘记允许您的用户可以做的事情,您或许可以使用:OUTPUT ACCEPT的默认值,这样的操作是在假设由此用户发起的来自系统外部的连接不太可能是安全威胁。一种更安全的配置方式是使用:OUTPUT DROP并设定您希望允许的例外情况,但当最终用户系统必需执行多种网络功能时,这可能会造成一些困难。

同样的,尽管创建一个更安全并可有效管理的配置是可能的,但是这一任务在不同的案例和需求情况下是截然不同的,这超出了本文的讨论范围。请将我提供的配置当作是“足够好”的解决方案,直到您学到了足够的关于iptable的知识来改变其配置以符合您专门的单独的需要。这一模板配置彻底提高了默认配置的安全性,而不会干扰您完成工作的能力。

-A INPUT -i lo -j允许您的系统接收所有源自您自己网络适配器的输入请求,这对于诸如测试您的系统配置是非常有帮助的,比如ping自己,让本地系统传送邮件(当您的计算机想要告诉您什么东西坏掉时)等等。

-A INPUT -m state --state ESTABLISHED -j ACCEPT利用了iptable过滤有状态的数据包的能力,这将允许您对输入数据保的DROP策略采取更灵活的手段。这行命令基本上规定了任何由您发起的连接都可以继续,对于任何已经建立的连接中的输入信息包可以绕过DROP策略。另外,您也可以将数据发送到其它的服务器,但是永远都不会知道数据是否送达了,因为服务器试图向您的防火墙进行回复,但只能丢弃那些数据包而没有任何注释。

-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT允许输入的SSH连接,您可能要将命令中的22改为任何其它的端口,以保证任何远程客户可以建立SSH连接,因为这些用户可能使用的是其它的端口用于建立SSH连接。

对于永远不要远程访问的系统,您在应用此配置前应当删除这一行命令,但是据我的经验,远程SSH访问是一种对分布式网络进行安全管理的一种工具,所以大部分非单机系统用户,比如家庭桌面计算机,都是网络中的计算机,而这些用户大都需要某种程度上的远程SSH连接。今后当您非常精通iptable配置的时候,您可以将这行命令替换为多行以详细定义与远程计算机连接的有效来源,这样即使使用的是非标准的系统端口,也能够从错误的来源建立SSH连接(比如不正确的IP地址等等),但这些内容已经超过了本文的范围。

-A INPUT -p tcp -m tcp --dport 631 -j ACCEPT允许使用通用UNIX打印系统(CUPS)与网络中的打印机连接,如果这不是您需要考虑的内容,请将这行删除。对于更复杂的情况,需要更安全的iptable规则来实现这些功能,但这行命令只是一个简洁的起点。

-A INPUT -p all -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT是另一“允许我和我自己通话”的命令。

基于我所给出的INPUT部分的说明,OUTPUT部分的命令也就不言自明了,它们主要定义了与外界连接的网络活动的规则。用于保证系统安全的iptable的工作还可以有很多,但是我的目的在于提供一个管理iptable配置的起始点。在我所见到过的系统默认配置中,这个简短的配置是优秀的、具有安全智慧的,而默认配置往往会长达上百行。

执行总结

为了简单起见,这是您所要执行的工作信息。

1. 输入iptables-save > /var/lib/iptables/saved.bak命令(或某些相似的文件名或路径)来保存现有的iptable配置,这样您以后就可以撤销所做的改变。
2. 将以上的iptable配置保存到/var/lib/iptables/saved.std(或相似的文件)。
3. 输入iptables-restore < /var/lib/iptables/saved.std命令来使用saved.std对现有的iptable进行设置。

如果您决定将改变的配置只用于一个系统,而不是其它的,您可以将saved.std复制为saved.loc,这样您可以在新的文件中编辑iptable的配置参数以反映新的配置需求,然后使用iptables-restore命令在本地系统上执行这些改变。

在大型网络中,推动脚本或网络节点的克隆脚本可以用于替代在这些机器上的任何新版本的saved.std文件,它们可以自动执行,尽管我建议不要允许工作站的本地脚本来改变iptable配置,这可能会引入安全漏洞,而且,一个在网络中从中央位置运行的推动脚本来部署新的配置文件以及运行iptables-restore可能是一个更好的选择,这将有助于减少管理费用。

以上这些只是一个与本地系统防火墙相关的严肃的企业范围的安全策略的开始,还有很多工作要做,尤其在大型网络中需要进一步减少工作量,然而,从此开始您一定可以施展这些技能在今后的工作中造就难以渗透的网络。

努力工作,并祝好运。

没有评论: