FreeBSD连载77:安全工具

来源:岁月联盟 编辑:zhu 时间:2008-01-17
FreeBSD连载77:安全工具内容简介:【FreeBSD教程】安全工具 虽然只使用FreeBSD基本系统提供的功能,就能将计算机系统设置为具有非常高的安全性的系统。然而网络上也存在各种用于增强或检查系统安全性的软件工具,有些工具是标准程序的更安全替代品,增

  【FreeBSD教程】安全工具

  虽然只使用FreeBSD基本系统提供的功能,就能将计算机系统设置为具有非常高的安全性的系统。然而网络上也存在各种用于增强或检查系统安全性的软件工具,有些工具是标准程序的更安全替代品,增强了系统安全性,有些是对系统或网络进行监视和检查的工具。使用这些工具,毫无疑问会进一步增强系统的安全性。FreeBSD的Packages Collection或Ports Collection通常将这些工具放在security子类中。

  系统工具软件

  虽然FreeBSD系统本身提供了对访问的认证、控制和记录,然而由于在Unix系统中,服务程序基本上是独立的,使用标准的安全控制方式的服务程序能从FreeBSD的认证控制机制中获益,但是有些服务程序并没有使用这些安全认证方式。对于独立进行认证控制的软件,除了使用其本身的控制能力之外,还有一些独立的软件具备为其他程序服务的控制访问功能。

  还有一些系统工具,能用于自动检查系统,帮助治理员发现系统中存在的问题,这些软件也是非常有用的工具。此外,还有一些工具软件属于系统工具,但对于增进系统安全也有很大意义,例如sudo,能在一定程度上增加root口令的安全性。

  TcpWrapper

  tcp_wrapper对于多种服务器软件是非常有用的访问控制工具,它能以统一的方式保护各种不同服务器。对于没有受防火墙保护的独立主机系统,tcpwrapper的保护更为重要。因为配置了tcp_wrapper之后,任何向inetd发起的连接首先是连接到tcp_wrapper提供的tcpd上之后,再连接到具体的服务进程上,这样tcpd就有机会查看远程系统是否被答应访问,并能将连接的情况通过syslog记录下来,包括请求的种类,时间和连接的来源地址。

  这个程序事实上代替了系统提供的守护进程,来轻松和高效的监控外部网络与服务器的连接。由于它提供了具体的日志记录,也是用于抓住入侵者,并提供可靠的证据的一种方法。tcpwrapper的思想与代理型防火墙的思路是相同的,都是通过替换正常服务器的做法来完成控制任务。

  当使用Packages Collection安装了tcpwrapper之后,它的守护进程tcpd就被安装到了/usr/local/libexec目录下,然后就能使用tcpd来代替原有的守护进程提供网络服务了。

  FreeeBSD 3.2-RELEASE之后,tcp_wrapper进入了FreeBSD的基本系统中,而不再需要额外安装。

  有几种不同的使用tcpd的办法,最基本的办法是通过更改inetd.conf来启动tcpd。例如要想让tcpd来保护 fingerd,那么就需要将inetd.conf中对应fingerd的设置更改为tcpd:

  finger stream tcp nowait/3/10 nobody /usr/local/libexec/tcpd fingerd -s

  tcpd能在标准的系统文件目录中查找正确的守护进程以提供服务,假如进程不在标准的目录路径下,就需要在最后一列中指定所要执行文件的全路径,如/usr/libexec/fingerd。此后,对finger端口的访问,将被记录进系统的日志文件,具体为syslog.conf中对auth指定的记录文件,例如下面的syslog设置将tcpd的信息发送到/var/log/auth.log 文件中(需要保证auth.log文件已存在)。

  auth.* /var/log/auth.log

  tcpd使用/usr/local/etc/目录下的hosts.allow和hosts.deny文件来控制对服务器的访问,访问控制是基于IP 地址和域名的。以下为一个hosts.allow控制文件的例子。可以看出设置文件比较简单易懂,tcpwrapper也提供了一个程序tcpdchk,来检查用户更改过的设置文件是否正确。

  ALL: domain.com

  telnet: 192.168.3.0/255.255.255.0 EXCEPT 192.168.3.10

  此外有着相似功能,但用于替换inetd的软件为xinetd,它能用于代替原有的inetd来启动各种服务程序,但提供了更具体的日志记录。

  系统安全检查工具

  Internet上针对每个系统均报告了大量的安全相关的问题,假如将这些已知的安全问题有效的组织起来,使用程序对系统自动进行检查,就能极大的帮助网络治理员查找现有的问题,使得系统更为安全。网络上存在多种这类的工具,如Satan、cops,就用于这个目的。然而由于它们的强大功能,这些工具也能被企图入侵他人系统的使用者利用,因此为了避免入侵者,系统治理员应该尽早使用这些软件,以起到预防作用。

  cops是一个由系统治理员运行,检查系统内部设置的程序。它针对已知的Unix存在问题进行检查,如检查系统中是否存在没有口令的帐户,是否有非法SetUID程序,以及是否存在Internet上已经报告过的系统漏洞,是否存在有问题的软件等等。系统治理员能使用cops来检查系统的配置有无问题。

  Satan则与cops不同,Satan是从系统外部进行检查系统是否存在安全问题的程序,它能对网络存在的脆弱性自动进行搜索、分析并提供安全报告。这种从外部分析系统的软件一般称为扫描器,由于Satan功能强大并提供了可扩展的框架,因此在Internet上十分流行。它的另一个特点就是它通过Web浏览器工作,使用者只需指明要搜索的主机以及搜索深度和相近规则的级别,Satan就能自动收集尽可能多的目标信息。

  由于Santa是一个安全工具,因此它对扫描目标计算机并没有刻意隐藏,这样就在目标计算机的系统日志中留下了大量的扫描连接记录,尤其是当目标计算机使用了tcpwrapper的时候。这些日志能用于标识是否遭到扫描攻击。一些更隐蔽的软件工具能通过不进行完全连接等方式隐藏扫描记录,要发现它们就更为困难,因而对系统安全更为危险。

  加密数据传输

  一般情况下,用户需要从客户机上访问服务器,数据是以透明的方式通过网络传输的,这样数据包经过的网络中的计算机都有可能截取传送的信息。由于这个问题来源于低层网络的结构,只能通过协议的加密来防止信息泄露。然而当前大部分网络协议并不支持加密传送,因此使用窥探的方式获取网络上的信息,虽然是一种被动的方式,却是对网络安全的重要威胁。

  Tcpdump

  任何事情都具有两面性,事实上能够获得网络上传输的数据的工具对于维护网络运行也非常重要,网络需要这些工具软件来帮助分析网络状态、解决各种网络故障,它们是网络工程师的好帮手。在市场上销售的有好几种专用的网络分析设备,来实现截获数据并进行分析的目的。虽然这些硬件实现的设备虽然功能强大,但价格昂贵,而使用软件通过标准计算机的网络接口来实现这种功能,相对来讲对于一般使用者还是可以承受的。

  tcpdump就是一种免费的网络分析工具,尤其其提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。tcpdump存在于基本的FreeBSD系统中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。

  普通情况下,直接启动tcpdump将监视第一个网络界面上所有流过的数据包。

bash-2.02# tcpdump
tcpdump: listening on fxp0
11:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns: udp 50
11:58:47.974331 0:10:7b:8:3a:56 > 1:80:c2:0:0:0 802.1d ui/C len=43
0000 0000 0080 0000 1007 cf08 0900 0000
0e80 0000 902b 4695 0980 8701 0014 0002
000f 0000 902b 4695 0008 00
11:58:48.373134 0:0:e8:5b:6d:85 > Broadcast sap e0 ui/C len=97
ffff 0060 0004 ffff ffff ffff ffff ffff
0452 ffff ffff 0000 e85b 6d85 4008 0002
0640 4d41 5354 4552 5f57 4542 0000 0000
0000 00
^C

  tcpdump支持相当多的不同参数,如使用-i参数指定tcpdump监听的网络界面,这在计算机具有多个网络界面时非常有用,使用-c参数指定要监听的数据包数量,使用-w参数指定将监听到的数据包写入文件中保存,等等。

  然而更复杂的tcpdump参数是用于过滤目的,这是因为网络中流量很大,假如不加分辨将所有的数据包都截留下来,数据量太大,反而不轻易发现需要的数据包。使用这些参数定义的过滤规则可以截留特定的数据包,以缩小目标,才能更好的分析网络中存在的问题。tcpdump使用参数指定要监视数据包的类型、地址、端口等,根据具体的网络问题,充分利用这些过滤规则就能达到迅速定位故障的目的。请使用man tcpdump查看这些过滤规则的具体用法。

  显然为了安全起见,不用作网络治理用途的计算机上不应该运行这一类的网络分析软件,为了屏蔽它们,可以屏蔽内核中的bpfilter伪设备。一般情况下网络硬件和TCP/IP堆栈不支持接收或发送与本计算机无关的数据包,为了接收这些数据包,就必须使用网卡的混杂模式,并绕过标准的TCP/IP堆栈才行。在FreeBSD下,这就需要内核支持伪设备bpfilter。因此,在内核中取消bpfilter支持,就能屏蔽tcpdump之类的网络分析工具。

  并且当网卡被设置为混杂模式时,系统会在控制台和日志文件中留下记录,提醒治理员留意这台系统是否被用作攻击同网络的其他计算机的跳板。

  May 15 16:27:20 host1 /kernel: fxp0: promiscuous mode enabled

  虽然网络分析工具能将网络中传送的数据记录下来,但是网络中的数据流量相当大,如何对这些数据进行分析、分类统计、发现并报告错误却是更要害的问题。网络中的数据包属于不同的协议,而不同协议数据包的格式也不同。因此对捕捉的数据进行解码,将包中的信息尽可能的展示出来,对于协议分析工具来讲更为重要。昂贵的商业分析工具的优势就在于它们能支持很多种类的应用层协议,而不仅仅只支持tcp、udp等低层协议。

  从上面tcpdump的输出可以看出,tcpdump对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障,通常的解决办法是先使用带-w参数的tcpdump 截获数据并保存到文件中,然后再使用其他程序进行解码分析。当然也应该定义过滤规则,以避免捕捉的数据包填满整个硬盘。FreeBSD提供的一个有效的解码程序为tcpshow,它可以通过Packages Collection来安装。

# pkg_add /cdrom/packages/security/tcpshow*
# tcpdump -c 3 -w tcpdump.out
tcpdump: listening on fxp0
# tcpshow < tcpdump.out
---------------------------------------------------------------------------
Packet 1
TIME: 12:00:59.984829
LINK: 00:10:7B:08:3A:56 -> 01:80:C2:00:00:00 type=0026
<*** No decode support for encapsulated protocol ***>
---------------------------------------------------------------------------
Packet 2
TIME: 12:01:01.074513 (1.089684)
LINK: 00:A0:C9:AB:3C:DF -> FF:FF:FF:FF:FF:FF type=ARP
ARP: htype=Ethernet ptype=IP hlen=6 plen=4 op=request
sender-MAC-addr=00:A0:C9:AB:3C:DF sender-IP-address=202.102.245.3
target-MAC-addr=00:00:00:00:00:00 target-IP-address=202.102.245.3
---------------------------------------------------------------------------
Packet 3
TIME: 12:01:01.985023 (0.910510)
LINK: 00:10:7B:08:3A:56 -> 01:80:C2:00:00:00 type=0026
<*** No decode support for encapsulated protocol ***>

  tcpshow能以不同方式对数据包进行解码,并以不同的方式显示解码数据,使用者可以根据其手册来选择最合适的参数对截获的数据包进行分析。从上面的例子中可以看出,tcpshow支持的协议也并不丰富,对于它不支持的协议就无法进行解码。

  除了tcpdump之外,FreeBSD的Packages Collecion中还提供了Ethereal 和Sniffit两个网络分析工具,以及其他一些基于网络分析方式的安全工具。其中Ethereal运行在X Window 下,具有不错的图形界面,Sniffit使用字符窗口形式,同样也易于操作。然而由于tcpdump对过滤规则的支持能力更强大,因此系统治理员仍然更喜欢使用它。

  对于有经验的网络治理员,使用这些网络分析工具不但能用来了解网络到底是如何运行的,故障出现在何处,还能进行有效的统计工作,如那种协议产生的通信量占主要地位,那个主机最繁忙,网络瓶颈位于何处等等问题。因此网络分析工具是用于网络治理的宝贵系统工具。

  为了防止数据被滥用的网络分析工具截获,要害还是要在网络的物理结构上解决。常用的方法是使用交换机或网桥将信任网络和不信任网络分隔开,可以防止外部网段窃听内部数据传输,但仍然不能解决内部网络与外部网络相互通信时的数据安全问题。

  假如没有足够的经费将网络上的共享集线器升级为以太网交换机,可以使用FreeBSD系统执行网桥任务。这需要使用option BRIDGE编译选项重新定制内核,此后使用bridge命令启动网桥功能。

  ssh

  由于网络上的数据传输是不安全,因此出现了S/key等方式来保护口令的安全。然而这些认证系统只是保证了口令等非凡敏感信息的安全,而不能保证连接之后的传输数据安全性。为了保证数据传输的安全性,就必须先将数据加密之后再进行传输。

  对传输加密可以从两个方面入手,一个是在网络低层进行加密,应用程序不需了解加密的细节,因此可以兼容现有的应用程序,这种考虑方式包括建立虚拟专用网(VPN)的各种协议,如PPTP、L2TP,以及以后将采用的IPSec 协议。另一种考虑方式是从网络应用程序入手,应用程序首先加密信息然后在进行传输,通过特定的服务程序和客户程序来建立安全连接,这种方式的代表就是ssh,此外还包括支持SSL(加密Socket层)的各个应用程序,如Telnet SSL,ApachSSL等。

  SSL在FreeBSD下的实现为openssl,它是在FreeBSD之类的免费操作系统下安装其他基于SSL应用程序的基础。

  PGP也是一个具备重要影响的加密程序,其本身虽然是为网络环境而设计的,但其程序本身不涉及网络。通常它和电子邮件的客户程序合作,构成安全的电子邮件系统。

  这些加密程序一般要使用Ports Collection下载安装,而没有现成的二进制软件包,主要原因是这些软件使用的公开密钥算法在美国有专利限制,其专利属于RSA研究所,因此FreeBSD就不将它们作成二进制软件包,以避免法律纠纷。即使使用Ports Collection下载这些软件的时候,也需要设定一个环境变量USA_RESIDENT ,以区分是不是美国居民,make程序好决定从何处下载这些程序,当然,手工下载就不必顾及这些。RSA 算法在其他国家没有专利限制,因此可以随意使用。

  假如需要反复安装这些加密工具,可以更改/etc/make.conf中的设置,使其自动设置这个变量,以方便安装过程。

  在这些工具中,最重要的还是ssh,因为它提供了Unix系统最基本访问功能的安全实现,如终端访问、文件传输功能。当使用ssh访问服务器时,服务器首先发送自己的公用密钥,客户可以使用这个密钥加密自己产生的随机密码,此后客户和服务器使用这个密码,用传统的算法,如IDEA、DES等方法来加密通信数据。对于任何希望增强安全性的系统来讲,使用ssh来代替telnet,ftp以及rlogin,rsh,rcp等命令,都是最优先要考虑的措施。网络安全敏感的系统一般都要屏蔽telnet,rlogin等方式,而使用ssh提供远程访问。

  ssh有两个不同的版本,ssh1和ssh2,这两个版本互不兼容。由于ssh1更为流行,在非Unix系统之外也拥有不同的客户程序,一般需要使用ssh1,否则就会碰到与其他ssh的服务器系统和客户软件不兼容的问题。ssh2 功能更为强大,然而其提供的额外功能一般不需要,ssh1提供的能力已经是绰绰有余的了。Ports Collection中这两个版本使用同样的安装位置,不能同时安装。

  安装了ssh之后,ssh将自动产生它所使用的公用密钥,这个密钥和ssh的设置文件保存在/usr/local/etc/ 目录中,不需要改动这些设置,直接启动ssh守护进程sshd就可以正常提供ssh登录服务了。通过Ports Collection安装的ssh的sshd位置为/usr/local/sbin/sshd。启动sshd之后,ssh客户程序就能登录和使用这台系统,可以 立即使用命令ssh来连接本地系统。

bash-2.02$ ssh localhost
wb@localhost's password:
Last login: Wed May 19 08:14:13 1999 from 202.102.245.72
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
The Regents of the University of California. All rights reserved.

FreeBSD 3.1-RELEASE (wb) #6: Thu Apr 22 18:29:12 CST 1999
Welcome to FreeBSD!

  Ports Collection会在/usr/local/etc/rc.d目录下放置ssh的启动文件sshd.sh ,用以在系统启动时自动启动sshd。

  sshd使用端口22来监听用户的连接请求,需要调整网络中防火墙系统的设置,打开对ssh服务器端口22的连接请求,以便让网络之外的客户能够发送请求并建立连接。由于ssh系统相当安全,不必担心这样作会带来安全问题。

  当在低速网络上使用ssh的时候,就会希望网络连接的效率更高,可以在客户端启动ssh时使用压缩选项-C,这将使用与gzip相同的压缩算法对数据先进行压缩再传输,能用来提高传输非压缩数据的效率。

  同样文件传输也能通过加密的方式进行,ssh提供了scp用于复制远程文件,它的参数与rcp使用的参数相同,用与email地址相似的方式标识远程主机及确定的用户,然后再是文件位置。

bash-2.02$ scp vpn.txt wb@remotehost:vpn.txt
wb@mx's password:
vpn.txt | 1 KB | 1.5 kB/s | ETA: 00:00:00 | 100%

  对于使用Windows系统的客户,可以从Internet中下载运行在Windows下的ssh客户程序。支持ssh的仿真终端软件有:
TTSSH http://www.zip.com.au/~roca/ttssh.html
SecureCRT http://www.vandyke.com/
F-Secure http://www.DataFellows.com)

  ssh的另一项强大能力是可以在客户机和服务器之间建立加密传输通道,从而能将本地的数据转发到远端的服务器上。这种功能最常用于将X Window的数据包进行转发,以便能在本地X服务器上通过ssh连接到远程,然后在ssh的连接终端上启动远程计算机上的X应用程序,但显示到本地X服务器上。此时X系统的通信数据是通过ssh建立的加密通道进行传输的,而不是普通情况下直接通过网络进行的传输,因此就保证了安全性。这种X11转发功能不需要任何设置,包括设置DISPLAY 环境变量或-dislay参数,因此同时兼具安全性和方便性。

bash-2.02$ ssh remotehost /usr/X11R6/bin/xterm
wb@remotehost's password:
Waiting for forwarded connections to terminate...
The following connections are open:
X11 connection from remotehost port 3979

  此外,还可以使用ssh转发其他不同的TCP连接,这样就不必担心数据在通过不安全的网络部分时的安全问题了。这首先需要使用ssh的-L参数定义本地端口和要转发的远程服务器端口的对应关系。

bash-2.02$ ssh remotehost -L 1234:192.168.3.1:23
wb@remote's password:

  假如使用上例建立ssh连接之后,任何对本地端口1234的连接请求,将首先转发给ssh,然后再由ssh服务器连接远端计算机的相应端口上。

  使用ssh和ppp建立安全连接

  由于ssh能在客户和服务器之间建立加密连接,因此它能和其他程序合作,如ppp,建立安全的网络通道。这种建立VPN的方式虽然不符合任何标准,然而却十分有效。对于FreeBSD系统之间,以及FreeBSD与其他Unix 系统之间,都可以使用这种方式建立虚拟专有网络连接。

  无论使用ppp或者是pppd,都能用于和ssh协作建立VPN。然而ppp更易于使用和设置,FreeBSD 下,通常使用ppp程序建立ppp连接,因此这里就介绍使用ppp程序建立虚拟安全连接的方法。

  在/etc/ppp/目录下的ppp缺省配置文件ppp.conf中,已经提供了一个和外部程序协作,建立安全ppp连接的基本例子。就是由ppp启动外部程序建立连接,通过认证之后自动在远端执行ppp服务器,从而建立ppp 连接。这种方法中ppp通过set device命令设置使用管道启动外部命令,但是这种管道方法不能和ssh很好的合作。因为进行认证的口令是ssh直接从终端设备上读取的,而在通道方式中ppp供给口令是通过标准输入/输出进行的,因此这些认证信息到达不了ssh中,就造成不能通过ssh认证建立连接。

  为了修正这个问题,让ppp程序能够建立ssh加密连接,一个解决办法是使用外部拨号程序,首先使用外部程序首先进行ssh认证,认证之后再将标准输入输出交回ppp,而外部程序可以生成伪设备文件直接控制ssh进行验证,然而需要使用者进行一些编程工作,并使用这个伪设备文件作为通信设备。另一种方式是通过设置ssh系统信任,使其不需要进行标准方式的口令认证(可以使用事先分发的公开密钥进行认证),显然这不是一个简单且安全的解决办法。更好、更简单的办法是使用ssh的TCP/IP转发能力,结合ppp建立IP通道的能力,从而建立安全的专有连接。

  为了建立ssh转发条件下的安全专有连接,首先回顾使用ppp建立IP通道的方法,这个方法在前面设置ppp 时介绍过。可以根据这些设置来设置客户端ppp配置文件ppp.conf,建立与本机的IP通道。

vpnclient:
set timeout 0
set log phase chat connect lcp ipcp
set dial
set ifaddr 192.168.4.10 192.168.4.1 255.255.255.0
set device localhost:3333

  上面vnpclient的拨号设备设置为本地端口3333,与建立标准IP通道时的设置是不同,这里设置的是本地计算机的端口。而服务器端的设置为:

vpnserver:
set timeout 0
set log phase lcp ipcp command
set ifaddr 192.168.4.1 192.168.4.10 255.255.255.0
allow mode direct
enable proxy

  为了建立安全连接,与设置IP通道类似,服务器端也需要设置使用inetd之类的超级服务器程序来启动ppp 服务器,回应客户端的请求以在IP通道上建立PPP连接。需要修改/etc/services,增加启动ppp服务器的端口号。

  ppploop 6671/tcp # loopback ppp daemon

  然后修改/etc/inetd.conf文件,增加对ppp服务器启动的支持,并重新启动inetd。

  ppploop stream tcp nowait root /usr/sbin/ppp ppp -direct vpnserver

  但是,由于ppp客户是向本地计算机发送连接请求,而非直接将请求发送给PPP服务器,因此就需要启动ssh,并建立相应的数据包转发功能,将转发的目标端口设置为服务器上ppp监听的端口。

bash-2.02$ ssh remotehost -L 3333:remotehost:6671
wb@remotehost's password:

  此后,可以在本地使用ppp连接本地的转发端口,直接建立安全连接。

bash-2.02# ppp -b vpnclient
Working in background mode
Using interface: tun0
PPP enabled.
bash-2.02# ifconfig tun0
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
inet 192.168.4.10 --> 192.168.4.1 netmask 0xffffff00

图片内容