2006年9月24日星期日

第八章 Linux 系统安全及其它

  世界上没有绝对安全的计算机系统,如果想获得绝对的安全性,估计唯一能够采取的措施就是不联网,不让管理员之外的任何人使用。那样计算机也就无异于一堆废铁了!作为系统管理员首先应该明白,我们只能尽量让系统在能承担最低风险的情况下正常工作,而不是追求绝对安全这一看起来很美好的海市蜃楼。
 
  任何操作系统都不可能毫无漏洞,无论是 Windows、Linux 甚至 Unix,这些漏洞可能是先天系统设计上的缺陷,也可能是人为管理不当所造成的。要做好同这些漏洞进行持久战的心理准备。
 
第一节 扫描和嗅探
 
  网络从诞生的那天起就存在一小撮破坏分子,他们或许是出于某种特定的目的,或许仅仅是为了寻找刺激和乐趣,总是喜欢乐此不疲地去探索和发现系统中的弱点,然后伺机进行破坏。正所谓未雨绸缪,管理员可以采用同样的方法来寻找系统已经存在或可能将要存在的弱点,然后采用相应的措施进行防范。
 
1、认识扫描和嗅探
 
  说起来有点滑稽,现在被系统管理员奉为法宝的系统扫描器(scanner)和网络嗅探器(sniffer),最早均出于黑客之手,是用来对系统实施攻击的。只不过后来被网络管理员“招安”之后用于正当途径,摇身一变成了捍卫系统安全的卫士。
 
  对系统进行安全性检查的工作,以前通常是由管理员定期手工完成的,显然这要花费相当多的精力和时间。为了将管理员从这一繁重的体力劳动中解脱出来,有人专门开发了能够用来自动检查系统安全设置的小工具,帮助管理员发现系统中存在的问题。这类安全工具常被称为“系统扫描器”,它们通过对系统设置进行扫描,能够对已知的系统安全问题进行检查。如检查系统中是否存在没有口令的帐户,是否有非法运行着的程序,以及是否存在已经报告过的系统漏洞等等。
 
  网络嗅探器是另外一类常用的安全工具,是用来截获网络通信数据的软件或硬件。与常用的电话网络不同,计算机网络是共享通信通道的,这就意味每台计算机在理论上都可以接收到发给其它计算机的信息。嗅探器常常被作为一种收集网络中特定数据(比如信用卡密码)的有效方法,由于它工作在整个网络环境中的最底层,几乎能够对所有正在网络上传送的数据进行拦截,因而是网络安全的一个巨大威胁。通过对网络进行嗅探,一些恶意用户能够很容易地窃取到绝密文档和敏感数据,因此网络嗅探器以前被黑客们作为网络攻击的基本手段。
 
  任何工具有弊就有利,网络嗅探器既可以作为黑客们获得非法数据的手段,但同时对网络管理员来讲又是很重要的,因为它可以帮忙诊断出网络中大量不可见的模糊性问题,还可以用来判断是否有黑客正在攻击系统。如果网络管理员怀疑网络正在遭受攻击,通过嗅探器截获数据包可以确定正在攻击系统的是什么类型的数据包,以及它们的源头。这样就可以及时做出响应或对网络进行相应的调整,从而可以尽早避免一场灾难的发生。
 
2、安装安全工具
 
  Red Hat Linux AS 4 自带了优秀的系统扫描工具 Nmap 和网络嗅探器工具Ethereal,只需在安装 Linux 系统时选择『系统工具』套件就可以安装它们了。如果不清楚当前的 Linux 系统是否安装了这两个工具,可以在命令行方式下用 rpm命令查询一下:
 
  [root@kevin ~]#rpm -qalgrep nmap
  nmap-3.00-4 (# 命令行模式下的系统扫描工具)
  nmap-frontend-3.00-4 (# 图形模式下的系统扫描工具)
  [root@kevin ~]#rpm -qalgrep ethereal
  ethereal-gnome-0.9.8-6
  ethereal-0.9.8.6 (# 网络嗅探器)
 
  如果还没有安装两个系统安全工具,那就应该以 root 用户的身份登录 KDE,然后单击 KDE 主菜单,从『系统设置』菜单下选择『添加/删除应用程序』命令,当软件包管理窗口打开之后,在『系统』区域中将『系统工具』套件选中,如图8-1-1 所示。
 
图 8-1-1 安装系统工具
 
  由于 Nmap 和 Ethereal 都是可选的软件包,因此需要单击右侧的『细节』按钮,打开『System Tools 软件包细节』窗口,在『额外软件包』区域中将『ethereal』、『ethereal-gnome』、『nmap』和『nmap-frontend』四项选中,如图 8-1-2 所示。
 
图 8-1-2 选择安全工具软件包
 
  选择好要安装的软件包后,单击『软件包管理』窗口中的『更新』按钮,然后按照提示插入 Red Hat Linux AS 4 的安装光盘,就可以完成 Nmap 和 Ethereal软件包的安装了。
 
  Red Hat Linux AS 4 的系统扫描工具 Nmap 由 nmap-3.0-4.i386.rpm 和nmap-frontend-3.00-4.i386.rpm 两个 RPM 包组成,而网络嗅探工具 Ethereal 则由 ethereal-0.9.8-4.i386.rpm 和 ethereal-gnome-0.98-6.i386.rpm 两个 RPM包组成。
 
3、端口扫描
 
  Nmap 是一个优秀的系统端口扫描工具,它可以帮助发现网络在安全性方面所存在的问题。Nmap 起初是一个黑客工具,但很快就受到系统管理员的青睐,用于以下几个方面:
 
  监视网络:使用 Nmap 可以很快地检查出网络中具有安全漏洞的计算机;
  检查防火墙:Nmap 可以帮助防火墙在不牺牲与外界通信的同时,确保已经阻断了那些应该阻断的数据包;
  测试路由器:借助 Nmap 的测试功能,管理员可以对网络中的路由器和交换机的配置进行检测。
 
  早先的 Nmap 是一个命令行工具,要完成如此丰富的功能,其命令格式当然不会很简单,初学者掌握起来自然也不那么轻松了。现在的管理员相比之下就幸运多了,因为 Red Hat Linux AS 4 为 Nmap 提供了一个图形化的用户界面 NmapFE,可以执行 nmapfe 命令来启动它,如图 8-1-3 所示。
 
图 8-1-3 Nmap 系统端口扫描工具
 
  要使用 Nmap 来对网络中的某台主机进行端口扫描,只需在『Host(S)』文本框中输入该主机的域名或 IP 地址,然后单击『Scan』按钮就可以了,端口扫描结果将在下面的文本框中显示出来,如图 8-1-4 所示。
 
图8-1-4扫描固定主机
 
  Nmap 会将所有它认为可能存在问题的端口都列出来,请仔细检查一下这些端口看它们是否真的需要向外界开放。Nmap 有一项很实用的功能就是能够判断某台计算机所使用的操作系统的类型,你只需在进行端口扫描前选中『General Options』区域中的『OS Detection』复选框就可以了。
 
  你可能已经觉察到了扫描结果中只有 TCP 端口的信息,难道 Nmap 不能扫描UDP 端口吗?当然不是了,在『Scan Options』区域中可以看到 Nmap 提供的五种不同的扫描方式,其中『connect』、『SYN Stealth』、『Ping Sweep』和『FIN Stealth』都是针对 TCP 端口的,只有『UDP Port Scan』是针对 UDP 商品。要使用 Nmap 来对网络中某台主机的 UDP 端口进行扫描,首先在『Host(s)』文本框中输入该主机的域名可 IP 地址,然后在『Scan Options』区域中选择『UDP Port Scan』单选框,再单击『Scan』按钮就可以了,如图 8-1-5 所示。
 
图 8-1-5 扫描 UDP 端口
 
  如果同时管理着网络中的多台主机,可能希望对网络中的所有主机做一次全面的端口扫描,以便发现可能存在的安全隐患。没有问题,Nmap 允许使用通配符“*”来指定要扫描的主机。假设需要对子网 218.168.100 内的所有主机进行 UDP 端口的扫描,只需在『Host (s)』文本框中输入“218.168.100.*”,然后在『Scan Options』区域中选择『UDP Port Scan』单选框,再单击『Scan』按钮就可以了,如图 8-1-6 所示。
 
图 8-1-6 扫描子网
 
  除了可以使用通配符外,Nmap 还允许用 CIDR 表示法,对需要进行扫描的主机进行更精确的控制。CIDR 是表示子网掩码的一种新形式,它用子网掩码中“1”的个数来表示子网,比如要扫描子网 218.168.100 中的所有主机,则应在『Host(s)』文本框中输入“218.168.100.0/24”如图 8-1-7 所示。为了加快端口扫描速度,还可以在『General Options』区域中将『Fast Scan』复选框选中。
 
图 8-1-7 CIDR 表示子网
 
  对主机中的所有端口进行一次完整的扫描,可能需要持续一段较长的时间。其实多数情况只需扫描某些特定的端口就可以了,因为黑客也只对那些特定服务(如WWW和DNS)的端口感兴趣。如果只想扫描端口号为 1 到 100 的 TCP 端口,可以在『Host(s)』文本框中输入要扫描的主机地址,然后在『Scan Options』区域中选择『SYN Stealth』单选框,最重要的当然是要在『General Options』区域中将『Range of Ports』复选框中,并在紧接着的文本框中输入端口的范围,如图 8-1-8所示。所有参数都填好后,单击『Scan』按钮,接着就可以在下面的文本框中看到端口扫描结果。
 
4、网络嗅探
 
  对 Linux 网络管理员来讲,使用嗅探器可以随时掌握网络的实际情况。当网络性能急剧下降时,可以通过嗅探器来分析原因,找出造成网络阻塞或者安全隐患的根源。正是因为嗅探器可以帮助网络管事员分析整个网络的状态、性能或故障,因而它已不再是帮助黑客们为非作歹的帮凶,而是变成了管理员手中一种不可或缺的强大工具。
 
  Linux 平台上的网络嗅探器非常多,简直可以说到了泛滥的地步,但口碑比较好的恐怕还是得数 Tcpdump。它是一个在命令行方式下运行的网络监视工具,能够截获在网卡上收到的所有数据包,并能够协助网络管理员对其中的内容进行分析。由于 Tcpdump 提供了一整套完善的规则来对截获的数据包进行过滤,因此对Linux 网络管理员来说,了解如何使用 Tcpdump 来捕获感兴趣的数据包就成了一门必修课。
 
  如果一定要从鸡蛋里挑骨头,那么 Tcpdump 对某些人来说的确也存在一个很大的毛病,那就是没有提供图形化的用户界面。Ethereal 的出现正好解决了这一问题,它是一个基于图形用户界面的网络嗅探器,能够完成与 Tcpdump 相同的功能,但操作界面友好很多。
 
  Ethereal 和 Tcpdump 都依赖于一个名叫 pcap 的函数库所提供的功能,因此两者在很多方面非常类似,比如都使用相同的过滤规则和关键字。
 
  Ethereal 和其它图形化的网络嗅探器都使用相同的界面模式,如果能熟练地使用 Ethereal,那么其它图形用户界面的嗅探器也就不在话下了。由于需要对网卡这一硬件设备进行操作,所以必须以 root 身份执行 ethereal 命令来起动它,如图8-1-9 所示。
 
图 8-1-9 Ethereal 主界面
 
  在用 Ethereal 从网络上截获数据包之前,应该为其设置恰当的过滤器。默认情况下 Ethereal 会捕获网络中所有的数据包,过滤规则的作用就是帮助管理员从数量众多的数据包内挑选出真正感兴趣的数据,使你不至于迷失方向。
 
  Ethereal 将过滤器分为两类:捕获过滤器(Capture Filter)和显示过滤器(Disply Filter)。当 Ethereal 在从网卡上截取数据包时,捕获过滤器将被应用,这样 Ethereal 就只会截取部分数据包。经过第一次筛选后,这些被截取的数据包要真正显示在 Ethereal 主窗口的数据包列表中,还必须满足显示过滤器的要求。捕获过滤器分别适用于不同的阶段,其语法格式也稍有不同。
 
  Ethereal 能够对过滤器进行管理,可以将它们保存到磁盘中,这样在需要时就可以随时使用。要为 Ethereal 设置捕获过滤器,单击『Edit』菜单,选择『Capture Filters』命令,打开『Edit Capture Filter List』对话框,如图8-1-10 所示。
 
图 8-1-10 管理捕获过滤器
 
  此时还没有添加任何捕获过滤器,因此对话框右侧的列表框内是空的。
 
  Ethereal 捕获过滤器使用和 Tcpdump 相同的语法规则,Tcpdump 的过滤表达式是一个正则表达式,Tcpdump 利用它作为过滤数据包的条件。如果一个数据包满足表达式的条件,则这个数据包将会被捕获,如果不指定表达式,则在网络上任何两台主机间的所有数据包都将被截获。Tcpdump 的过滤表达式中一般有如下几种类型的关键字:
 
(1)类型关键字
 
  这类关键字用于指定主机、网络或端口,包括 host、net 和 port 三个关键字。例如,可以用“host 218.168.100.1”来标明监听的主机,用“net 218.168.100.0”来标明监听的网络,用“port 23”来标明监听的端口。如果没有在表达式中指明类型,则缺省的类型为 host。
 
(2)方向关键字
 
  这类关键字用于指定截获的方向,包括 dst、src、dst or src、dst and src四个关键字。例如,可以用“src 218.168.100.1”来指明截获的数据包中的源主机地址,用“dst net 218.168.100.0”来指明截获的数据包中的目标网络地址。如果没有在表达式中指明方向,则缺省的方向为 dst or src,即两个方向的数据包都将被捕获。对于数据链路层协议(如SLIP和PPP),使用 inbound 和 outbound 来定义方向。
 
(3)协议关键字
 
  这类关键字用于指定要截获的数据包所属的协议,包括 ether、fddi、tr、ip、ip6、arp、rarp、decnet、tcp、和 udp 等关键字 fddi 指明 FDDI(分布式光纤数据接口网络)上的特定网络协议,实际上它是 ether 的别名,fddi 和 ether 具有类似的源地址和目标地址,所以可以将 fddi 协议包当作 ether 的包进行分析和处理。其它几个关键字只是指定了所要截获的协议数据包。如果没有在表达式中指明协议,则所有协议的数据包都将被截获。
 
  除了上述三种类型的关键字外,在 Tcpdump 的过滤表达式中还可以指定的一些重要关键字包括:gateway、broadcast、multicast、less、greater,这些关键安对于监听网络中的广播和多播很有帮助,详细的用法可以参考 Tcpdump 的联机手册。
 
  [root@kevin ~]#man tcpdump
 
  在捕获过滤器的表达式中,各类关键字之间还可以通过布尔运算符来构成组合表达式,以满足实际需要。布尔运算符包括取非运算符(not或!)、与运算符(and或&&)、或运算符(or或),使用布尔运算符可以将表达式组合起来构成强大的组合条件,从而能够更好地截取真正需要的数据包。
 
  一下子学了这么多过滤规则的基础知识,下面就来现学现卖一下吧!如果想要截取主机 218.168.100.1 所收到和发出的数据包,可以在『Edit Capture FilterList』窗口中的『Filter name』文本框中输入过滤规则“host 218.168.100.1”,然后在『Filter string』文本框中为该过滤规则起一个容易识别的名字,再单击『New』按钮就可以创建过滤规则了,如图 8-1-11 所示。
 
图 8-1-11 设置过滤规则
 
  如果想要截获主机 218.168.100.1 和主机 218.168.100.2 外所有其它主机间的 IP 数据包,可以先在『Edit Capture Filter List』窗口中的『Filter name』文本框中指定过滤规则的名字,然后在『Filter string』文本框中输入“ip host218.168.100.1 and ! 218.168.100.2”,再单击『New』按钮创建该过滤规则,如图 8-1-12 所示。
 
图 8-1-12 过滤 IP 数据包
 
  如果想要截获网络中所有 FTP(TCP端口号21)数据包,同样应该先在『Edit Capture Filter List』窗口中的『Filter name』文本框中指定过滤规则的名称,然后在『Filter string』文本框中输入“tcp port 21”,再单击『New』按钮开关创建该过滤规则,如图 8-1-13 所示。
 
图 8-1-13 过滤 FTP 数据包
 
  设置好所有的捕获过滤后,单击『Edit Capture Filter List』窗口中的『Save』按钮保存这些过滤器,再单击『Close』按钮关闭该对话框。除了可以设置捕获数据包时的过滤规则外,Ethereal 还允许设置显示数据包时使用的过滤规则。一个数据包只有同时满足两者才会最终显示在 Ethereal 主窗口中的数据包列表中,正是有了这样的双重过滤机制,Ethereal 能够使管理员将精力真正集中在那些关键数据包上。要为 Ethereal 设置显示过滤器,单击『Edit』菜单,选择『DisplayFilters』命令,打开『Ethereal Edit Display Filter List』对话框,如图8-1-14 所示。
 
图 8-1-14 管理显示过滤器
 
  最简单的显示过滤器是对属于某一特定协议的数据包进行过滤。假设只希望Ethereal 显示截获到的 IP 数据包,则可以在『Edit Display Filter List』窗口中的『Filter name』文本框中指定过滤规则的名称,然后在『Filter string』文本框中输入“ip”,再单击『New』按钮就可以创建该显示过滤规则,如图 8-1-15 所示。
 
图 8-1-15 显示 IP 数据包
 
  显示过滤器同样允许根据数据包中的特定信息设置过滤规则。假设只希望Ethereal 显示来自地址 218.168.100.1 的 IP 数据包,则可以单击『Add Expression』按钮,打开『Filter Express』窗口。在设置好所需要的过滤表达式后,单击『Accept』按钮确定,如图 8-1-16 所示。
 
图 8-1-16 过滤表达式
 
  返回到『Ethereal Edit Displya Filter List』窗口后,在『Filter name』文本框中指定过滤规则的名称,然后单击『New』按钮创建该过滤规则,如图 8-1-17 所示。
 
图 8-1-17 显示来自特定地址的 IP 数据包
 
  所有的显示过滤器都设置好后,单击『Save』按钮保存这些过滤器,再单击『Close』按钮关闭该对话框。Ethereal 能够同时维护很多个过滤器,这样网络管理员就可以很方便地根据实际需要选用不同的过滤器。例如,一个过滤器可能用于截获两个主机间的数据包,而另一个则可能用于截获 ICMP 包来诊断网络故障。
 
  现在可以动手截取网络中的数据包了,单击 Ethereal 的『Capture』菜单,选择『Start』命令,打开『Capture Options』对话框。首先从『Interface』下拉框中选择要进行侦听的网络接口,然后选中『Capture packets in promiscuous mode』复选框,将网卡置于“混杂”模式,如图 8-1-18 所示。
 
图 8-1-18 设置网卡
 
  网卡被设置成混杂模式后,对接收到的每一个数据包都将产生硬件中断,以提醒操作系统处理经过该网卡的每一个数据包,这就是网络嗅探器的全部秘密。
 
  如果不希望 Ethereal 转眼间就截获了成千上万个数据包,从而使自己陷入数据包的汪洋大海而无法自拔的话,那就充分利用一下刚刚设置好的捕获过滤器吧!单击『Ethereal Capture Options』窗口中的『Filter』按钮,打开『Ethereal Capture Filter』窗口,在过滤器列表中选中希望应用的过滤规则后,单击『OK』按钮确定,如图 8-1-19 所示。
 
图 8-1-19 应用捕获过滤器
 
  在『Ethereal Capture Options』窗口中,『Display options』区域内的两个选项是很重要的。如果希望每个数据包在被截获时就能够实时地显示出来,而不是在整个嗅探过程结束之后再显示所有截获的数据包,那就需要将『Update list ofpackets in real time』复选框选中。此外,如果选中『Automatic scrolling inlive capturt』复选框的话,则可以在截获数据包时自动滚屏,这样就能保证在Ethereal 主窗口的数据包列表中始终都可以看到最新截获的数据包,如图8-1-20 所示。
 
图 8-1-20 实时更新数据包列表
 
  单击『Ethereal Capture Options』窗口中的『OK』按钮,整个网络嗅探过程就开始了。在『Ethereal Capture』窗口中可以实时看到 Ethereal 到目前为止已经截获到的所有数据包的统计信息,如图 8-1-21 所示。单击『Stop』按钮可以终止对网络中数据包的截获。
 
图 8-1-21 网络嗅探
 
  嗅探过程开始之后,所有符合捕获规则的数据包都将在 Ethereal 主窗口中的数据包列表中看到。不过可能并不是所有的数据包你都感兴趣,不有关系,此时还可以应用显示过滤器,让 Ethereal 只显示符合过滤规则的数据包。看到Ethereal 主窗口底部的『Filter』按钮了吧,单击它将打开『Displya Filter』窗口,从中可以选择将要被应用的显示过滤规则,最后单击『OK』按钮确定,如图 8-1-22 所示。
 
图 8-1-22 应用显示过滤器
 
  返回到 Ethereal 主窗口后,可以在窗口底部的组合框中看到选中的显示过滤器所对应的规则表达式。此时单击『Apply』按钮,Ethereal 就会再次对所有截获的数据包进行过滤,只有符合显示过滤器的数据包,才会最终在数据包列表中显示出来,如图 8-1-23 所示。
 
图 8-1-23 过滤数据包
 
  同许多 Windows 下流行的网络嗅探器类似,Ethereal 的整个窗口也被分成三个部分:最上面为数据包列表,用来显示每个数据包的总结性信息;中间为协议树,用来对选定的数据进行协议分析;最下边是以十六进制形式表示的数据包内容,用来显示数据包在物理层上传输时的最终形式。
 
  有了功能如此强大的 Ethereal,网络对你来讲就没有任何秘密可言了。不管是数据的源地址、目的地址,或是其所属的协议,在 Ethereal 中都一览无余。图8-1-24 是在 Ethereal 中对一个 HTTP 包进行分析时的情景。
 
图 8-1-24 分析 HTTP 协议包
 
  Ethereal 提供的图形用户界面非常友好,使用它监视网络中的每个数据包不再是一件什么难事了。正所谓知己知彼方能百战不殆,要保护好 Linux 系统,使用嗅探器掌握黑客们的行踪是你应该迈好的第一步。

没有评论: