当前所在位置:FreeBSD使用大全>>
FreeBSD连载(76):设置基本系统(2)
 
作者:王波
 
网络服务与应用程序安全

  由于提供服务与保障系统安全性是有冲突的,提供的服务越多,就会存在越多的潜在的危险性。因此为了增加系统安全,就要尽量减少系统提供的服务。

  提供网络服务的守护进程主要有两种启动方式,一种为从系统启动文件中启动,另一种为通过inetd超级守护进程启动应用程序。


系统rc文件

  通常的系统启动文件启动的守护进程有sendmail、syslogd、lpd等,要改变系统启动的服务进程,需要更改的文件包括/etc/rc.conf、/etc/rc.local,以及/usr/local/etc/rc.d 与/usr/X11R6/etc/rc.d目录下的以.sh结尾的启动文件(这两个启动脚本目录是由rc.conf 中的local_startup定义,因此也有可能被设置为了其他的值)。除非特殊情况,其他的rc文件不应该被改动,如果其他的rc文件被非法更改,很可能是入侵行为。

  特别需要注意/etc/default/rc.conf,/etc/rc.conf.local文件,因为这些文件也能用于设置启动服务,而不被管理员所注意,因此可能是入侵者用于放置后门程序的位置。

  为了减少守护进程,就需要将rc.conf中相关选项设置为NO,例如要屏蔽sendmail,就可以设置 sendmail_enable=”NO”。此外,缺省的rc.local文件中没有内容,因此在这里也不应该有降低系统安全的设置,/usr/local/etc/rc.d/和/usr/X11R6/etc/rc.d/目录下的执行脚本为安装其他软件包时所安装的,对于不希望提供的网络服务,应该将执行脚本更改为以其他后缀结尾的文件,只有以 .sh结尾的执行脚本才会在启动时自动执行。

  一个安全的FreeBSD系统,应该具有干净的rc.local文件,/usr/local/etc/rc.d 与/usr/X11R6/etc/rc.d目录,以及尽量减少基本启动进程的rc.conf文件。

  守护进程直接放在rc文件中启动,将具备root的权限,危险性较大。如果能使用用户的身份可以执行守护进程的相应操作,就应该使用用户的身份执行它。这可以通过使用su命令启动服务进程的方式,代替直接启动服务进程的命令。

su user services_process
 
 


inetd服务器

  然而,Unix系统中绝大多数服务进程还是通过超级服务器进程inetd来启动的。它的设置文件为/etc/inetd.conf ,以下为这个文件的一部分。

#
# $Id: inetd.conf,v 1.30 1998/09/30 16:12:40 wosch Exp $
#
# Internet server configuration database
#
# @(#)inetd.conf 5.4 (Berkeley) 6/30/90
#
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l
telnet stream tcp nowait root /usr/libexec/telnetd telnetd
shell stream tcp nowait root /usr/libexec/rshd rshd
login stream tcp nowait root /usr/libexec/rlogind rlogind
finger stream tcp nowait/3/10 nobody /usr/libexec/fingerd fingerd -s
#exec stream tcp nowait root /usr/libexec/rexecd rexecd
#uucpd stream tcp nowait root /usr/libexec/uucpd uucpd
#nntp stream tcp nowait usenet /usr/libexec/nntpd nntpd
comsat dgram udp wait root /usr/libexec/comsat comsat
ntalk dgram udp wait root /usr/libexec/ntalkd ntalkd
 
 

  这个文件中的每一行对应一个服务程序。为了增强系统安全,建议除了必要的服务,如telnetd、ftpd之外,其他比如rshd、rlogind等r命令服务程序,fingerd等守护进程都应该加以注释。telnet和ftp 也应该与S/key等认证方式相结合,来保证口令的安全性。除非需要,不要提供匿名ftp服务。

  当使用rlogin,rsh等r命令的时候,/etc/hosts.equiv文件和用户个人目录下的.rhosts 文件中的设置将对系统安全有严重的影响。

  如果要求更安全的系统,甚至可以屏蔽inetd,不使用inetd来提供任何服务,通过其他安全途径来完成远程访问FreeBSD。要屏蔽inetd,需要在rc.conf中改变inetd_enable变量的值为NO。即使使用inetd的时候,最好让inetd记录相关日志,这需要使用参数-l启动inetd,在rc.conf中可以设置inetd_flags为”-l”。

  当需要启动某个守护进程的时候,inetd.conf中的第五列参数对安全性有重要影响,这个参数设置启动这个进程的用户标识,应该尽量不要使用root用户,以减少具备root身份的进程。

  为了避免服务程序出现问题,还要经常更新软件的版本,或应用补丁程序,以堵上可能出现的漏洞,因此有些服务程序的老版本存在已经发现的安全问题,如果不及时弥补,入侵者就能利用这些漏洞达到入侵系统的目的。虽然每个FreeBSD 版本使用的都是最新版本的服务软件,但服务器软件是不断升级的,因此就需要及时升级服务器软件。

  在inetd启动的服务中,telnetd和ftpd是最重要的两个,它们提供最基本的网络服务。telnetd 本身的安全问题较少,与它相关的安全问题有访问认证问题,可以通过S/key,login.access等方式加以保护,而ftpd则的安全问题就更为敏感一些。

  如果需要启动ftp服务,虽然在inetd.conf中启动ftpd已经使用了-l参数,使ftpd将日志记录发送给syslogd,但是还需要配置syslogd才能接收ftpd发送的记录。如果/etc/syslog.conf 文件中没有下面的设置行用于记录ftp的日志,请修改syslog.conf加入。

ftp.*           /var/log/ftpd
 
 

  然后还需要执行下列命令,使得syslogd重新启动,使其能开始记录下ftpd发送的记录信息。

# touch /var/log/ftpd
# killall -HUP syslogd
 
 

  ftp对访问进行了种种限制,这些限制对于网络安全都是非常重要的,当用户的shell不在/etc/shells 中的时候,ftp拒绝提供服务,当用户的用户名位于/etc/ftpusers文件中时,或者是/etc/ftpusers 中记录的组的成员,ftp同样也拒绝提供服务,这样就对使用ftp的用户进行了限制,尤其对于安全敏感的用户。如果/var/run/nologin文件存在时,ftp将拒绝一切用户访问。

  ftp认证是通过标准认证过程进行的,因此也可以使用S/key等安全认证的方式。同样,/etc/ftphosts 可以设置对来自不同位置的主机访问ftp服务的限制。

  很多情况下需要FreeBSD服务器提供匿名ftp服务功能,如果此时普通用户能通过更安全的方法访问系统,就应该屏蔽普通用户使用ftp服务的权力,而只允许匿名ftp,可以使用-A选项启动ftp服务器,此时ftp将拒绝正常用户登录,避免ftp服务器出现安全问题的可能性及减少安全问题的影响。当使用-S选项时,ftp将所有匿名访问的传输日志也记录在/var/log/ftpd文件中。这两个选项对于提供匿名ftp服务非常有用。对于提供匿名ftp 的服务器,还可以不再使用FreeBSD提供的ftpd服务器,而使用wuftpd或ncftpd等其他种类的ftp 服务器,同样也需要针对这些服务器设置其安全性。


改变程序的根文件系统

  当不得不提供一些服务的时候,为了增加安全性,可以考虑提供chroot的服务。chroot意味着改变运行程序的根文件系统,当一个程序运行在chroot的环境下时,它所了解的文件系统只是chroot设置给它的某级目录开始,它就不能访问这个目录之外文件系统中的内容,使得即使这个程序出现安全问题,也不会影响文件系统中的其他重要数据的安全性。显然不是每种服务都适合这种形式,有的服务提供访问的文件资源不固定在某个目录下,就不能使用这个形式。 

  由于设置一个服务程序使用chroot的时候,它就以为给它指定的目录就是它的根目录,因此它无论访问哪个文件,都将在相对的目录中查找,包括它要访问的重要系统文件。这样就必须为这个chroot程序建立一个小的,但完全满足其要求的系统目录结构,这个目录将和系统目录结构类似,也具有/etc/、/usr/、/var/、/dev/、/tmp/、/usr/lib/ 等等,并具备应用程序要访问的相应文件。

  如果程序是动态连接的,就需要/usr/lib目录中存在动态连接库,应用程序还可能会访问/etc目录下的配置文件,/dev目录下的设备文件,以及其他可能的文件。必须在应用程序的新的根目录下设置所有必须的目录结构和复制需要访问的文件。当然文件内容可以是系统原来文件的一个子集,而非原有的整个文件,以尽可能的保障安全。例如服务程序要访问的passwd文件只是系统passwd文件的一部分,等等。

  当chroot的程序需要访问某个用户的口令数据时,就需要将/etc/passwd文件中有关这个用户的内容复制到用户chroot目录下etc子目录下,然而口令文件并不止passwd一个文件,将包括master.passwd,pwd.db 及spwd.db。由于pwd.db和spwd.db使用了数据库形式,就使得复制部分用户数据变得比较困难。

  改变根文件系统的服务程序有两种类型,一种为本身不具备改变根文件系统的能力,但由于不访问过多的文件,能使用系统的chroot命令来启动程序,使其运行在某个目录下。另一种类型为程序本身就支持这个能力,这样就不需要使用手工使用chroot命令,系统在特定条件下或使用一定参数启动时就自动进行chroot操作。然而这些类型进行目录设置时需要进行的操作是相同的。而要设置网络服务所使用的文件环境,就要对该服务程序有详细的了解,这才是最为困难的问题。

  这里以配置改变根文件系统的namd为例,简介设置改变根文件系统的网络服务的步骤,这个设置步骤的原始文档为http://www.psionic.com/papers/dns.html(这个适用于OpenBSD和Fr eeBSD,没有使用Ports Collection,但给了较详细的解释),和http://www.antisocial.net/~modred/papers/named.html (使用了FreeBSD的Ports Collection,给出了详细的步骤)。以下只着重介绍操作过程,并没有详细给出操作步骤,需要设置chroot named的使用者可以参阅这些相关网页的内容。

  

编译静态连接的named和namd-xfer,这需要增加编译连接标志-static,重新编译bind8 软件。这个过程也可以使用Ports Collecion来完成,然而要注意的是使用Ports Collection 编译的named和直接编译的named对目录结构的处理有所不同,这将影响后面建立目录结构的处理过程。使用静态连接的执行程序的好处是不必考虑为chroot环境复制对应的动态连接库,简化了chroot文件系统设置。

  

建立chroot目录结构,首先在根目录下建立/chroot/named目录,作为这个服务的根目录,然后在这个目录中建立dev,etc,etc/namedb,usr,usr/libexec, var, var/run等目录,注意这些目录结构是与应用软件中的设置相关的,如果使用Ports Collection 定制的named和named-xfer,它使用目录结构是与Bind8的缺省设置不同的,需要建立/usr/local/libexec 而非/usr/libexec目录。

  

然后向新的文件系统中复制相应的文件、建立相关的设备。如果是动态连接的程序,还需要考虑复制/usr/lib下的动态连接库和相关的ld程序。可以通过ldd命令查询程序需要的动态连接库。然而增加文件就降低了系统安全性,因此一般应该使用静态连接的程序,新的环境中应具备尽可能少的文件。

  

设置环境,包括增加程序执行的用户和组,目录结构的属主和权限设置等等。可以为named 添加用户named和组named。

  

手工执行chroot的named,执行命令为”/chroot/named -unamed -g named -t /chroot/named” ,-t参数指出named应该使用/chroot/named作根目录执行chroot操作,一切正确之后,再更改启动脚本。

  

更改启动脚本,屏蔽原有的named的执行权限,使得新named成为系统的网络服务程序,并设置正确的启动参数。


用户相关的安全问题

  系统管理员有时也不希望用户占用太多的系统资源,在有些Unix系统中入侵者能通过普通帐户,启动大量的进程或产生大量的文件,从而使系统死掉或不能提供正常操作,而FreeBSD下则不必有此担忧,因为可以通过login.conf 和用户的口令数据来设置用户类别,限制用户对系统资源的占用,同样占用的硬盘资源可以通过quota来限制。

  at和cron机制能帮助用户自动启动应用程序和服务进程,如果必要,可以屏蔽用户使用at和cron的权限。也要注意检查root用户的at和cron设置,这里也是入侵者可能用于设置后门程序的一个位置。

  系统中,除了服务进程可能具备root身份之外,再就是具备SetUID身份的程序能进入root身份。由于 SetUID和SetGID与系统安全息息相关,因此系统中也应该具备尽量少的SetUID和SetGID程序。要不定期使用find命令查找,或者检查/var/log下的日志文件,了解系统中这些程序文件的更改情况。

  实际上很多SetUID程序不会被使用的,例如很少有人使用uucp,如果使用的是局域网也很少使用ppp和 pppd,因此对于这些不常用到的SetUID程序,应该取消其SetUID位,甚至取消执行属性,以避免用户来执行它。

  为了避免不必要的SetUID程序,一个办法是可以在安装一个文件系统时就设定不承认这个文件系统中的SetUID 程序。安装文件系统时可以使用nosuid选项,就能让文件属性中的SetUID和SetGID位失效。因此为了利用这个优点,可以创建使用使用nosuid位的/home文件系统,让所有的用户使用,而其他可以存在SetUID 程序的文件系统,如/usr,则不允许用户写入。同样也要创建一个/var/tmp文件系统,将系统的/tmp目录指向这个目录,/var/tmp也应该是nosuid的,以避免用户在/tmp目录中保存SetUID程序。其他的文件系统,如使用NFS装载的文件系统,也要使用nosuid安装选项。

  划分多个磁盘分区、安装到不同目录上也能防止入侵者企图填满磁盘空间的阻塞攻击。同样,对于用户使用的磁盘文件系统,应该使用qutoa来限制用户个人占用的磁盘空间。

  这个nosuid安全选项应该加入到/etc/fstab文件中,一使得每次都能生效。需要注意的是nosuid 安装选项不能影响一些解释性语言程序的这个属性,如perl程序,当解释性语言程序具备SetUID属性,语言解释器为其设置身份,由于真正的setuid()调用是由语言解释器执行的,因此如果语言解释器具备root权限(具备 SetUID属性),那么就能使解释器将具备SetUID位的程序设置入root权限。这不是系统的问题,而是语言解释器的问题,屏蔽语言解释器本身的SetUID属性可以避免这个问题。

  当系统作为NFS服务器,设置共享出去的NFS文件系统时,应该使用maproot或mapall参数,以便隔离危险,使得即使在远程系统被侵入的情况下,防止从这个允许安装文件系统的客户上对本机的入侵。还可以考虑使用安全的NFS协议,使用DES算法进行服务器和客户机的认证。如果系统不使用NFS及其他RPC服务时,最好屏蔽相关的选项,如portmap_enable选项。


安全日志记录

  Unix系统使用Syslog记录应用软件发送的日志记录,日志记录对于安全管理非常重要,因为管理员可以从这些日志中发现系统遭受攻击的痕迹及证据。然而syslogd本身也是一个服务程序,能接收网络上的消息,因此其本身也存在安全问题。

  这样,syslog就存在两个矛盾的问题,为了安全起见syslogd不应该接收网络上的其他计算机发送的日志记录。由于接收消息是通过UDP传送并且没有加密保护,因此syslog消息可能是伪造的,即便攻击者不使用伪造信息进行欺骗,仅仅使用服务阻塞的方法,就能导致正常的日志记录系统不能正常使用,此后攻击者就能放心进行入侵操作而无需担心留下踪迹。那么即使syslogd没有因为这种阻塞攻击而崩溃,大量无意义的syslog记录,也使得其他有用的日志记录被迅速淹没或清除(为了防止日志文件占用过多的磁盘空间,系统中缺省情况下会自动进行日志的清理工作)。

  为了使得syslogd不理会其他计算机的记录,可以使用-s参数重新启动syslogd。在rc.conf 中更改syslogd_flags的值为"-s"。

  FreeBSD系统中用于管理syslog日志文件的程序为newsyslog,它由crontab来启动,它检查由newsyslog.conf中指定的日志文件,当这些文件达到一定大小时,就截断原文件,重新启动syslogd ,并压缩保存原有记录。为了避免占用太多的磁盘空间,newsyslog保存的日志备份文件有数量的限制,因此就使得阻塞攻击清除日志的攻击方式成为了可能。可以增加newsyslog保存的日志备份文件的数量,和进行备份时文件的大小,增大系统日志文件的容量。

  然而,当一台计算机仅仅使用自己硬盘来记录日志的话,那么一旦入侵者成功入侵这台计算机,他就能按照syslogd 的配置文件syslog.conf的设置,清除相关的日志记录,以便为以后继续潜伏在系统中做打算。甚至可以直接删除/var/log目录下文件以及其他syslog.conf中指明的文件,消灭入侵踪迹及证据。这样,将syslog 日志记录保留在其他计算机系统中也是一个有效增强安全审计的重要因素。

  因此,可以设定一台用于记录日志的计算机,其syslogd屏蔽外部计算机的日志请求,只记录本地可信任的计算机系统的日志。这样,就需要在使用"-s"参数屏蔽任意计算机请求的同时,使用"-a"加上信任的计算机主机名,或者子网号,域名等,这样就只会记录这些计算机的日志记录。为了安全起见,这台计算机最好是专用于这一项服务,不执行任何服务程序,以避免遭受入侵。然而由于syslogd对系统要求不高,因此这台计算机可以不必使用很高的硬件配置,除了需要足够的硬盘空间以容纳大量日志记录。

  此外,还可以通过将特别重要的syslog的记录直接发送到行式打印机的方式,避免入侵者清除日志记录。

  由于日志记录会迅速增加,特别是在遭受攻击的时候更为显著,因此需要使用一些日志分析工具来帮助分析这些日志文件,以快速定位发生的安全问题,否则面临庞大的日志文件,很难找到有用的日志记录。logcheck或其他具备相似功能的程序就用来完成这个任务。http://www.psionic.com/abacus/abacus_logcheck.html为logcheck的主页。


其他服务程序问题

  有些软件本身很可能存在安全问题,应该尽量使用该软件的最新稳定版本并及时进行打补丁,或者使用具备同样功能,但更安全的软件来代替这种软件,例如使用qmail或postfix来代替sendmail。

  有时候软件的新版本由于增加了新功能,会变得更不稳定或具备其他的安全漏洞,对于这种情况就不能盲目升级软件。

  X Window也对网络安全有一定影响,特别是X服务器的认证问题,不要为了方便起见而直接使用xhost+ 命令,这样就会其他使用者能窥视用户正在进行的操作。除了上面提到的措施之外,还可以将FreeBSD系统放置到防火墙之内,或者直接利用FreeBSD系统的包过滤能力,屏蔽一些不友好节点的访问,或者屏蔽所有的外部连接请求,而不影响本机对外部的访问。将FreeBSD设置为防火墙是一个重要的安全措施,因为这不但能对本机提供保护,也能对网络内其他客户计算机提供保护。毫无疑问,FreeBSD系统的包过滤能力非常优秀,结合FreeBSD具备的网络地址翻译的能力,就使得它能构建仅次于硬件防火墙的防火墙系统。本章的后续部分中将详细讨论将FreeBSD设置为防火墙系统的各种方法。


内核安全级别

  FreeBSD内核有一个安全级别(securelevel)的概念,这是指系统内核运行使用的安全等级,不同的等级具备不同的保护和检查机制。因为这是内核的检查机制,因此相当严格,没有办法能绕过这个机制提供的保护,因此就对保护FreeBSD的安全性十分有用。

  内核的安全级别按照提供安全保护的程度分为-1、0、1、2共分为四个级别,安全级别能提供的保护有:

  系统文件:系统文件可以设置保护标志 “ 不可更改 “ 和 “&
 
来源:http://freebsd.online.ha.cn/

声明:本站的文章和软件是本人从网上收集整理的(除本人的作品之外),所有版权属于作者,
如有侵犯您的权益,请指出,本站将立即改正,谢谢.

Copyright 2000 www.newok.com