当前所在位置:FreeBSD使用大全>>
FreeBSD连载(76):设置基本系统(1)
 
作者:王波
 
FreeBSD系统是一种安全性非常好的通用操作系统,在Internet上很少发生FreeBSD系统被攻击的报告,事实上最近一端时间内CERT的安全报告中几乎没有发生在FreeBSD系统上的安全报告。一方面是因为 FreeBSD安全性很好,另一方面也是由于FreeBSD用户对于系统安全比较了解的缘故。

  与其他Unix系统相比,FreeBSD系统的传统味道更足一些,设计者以追求完美的态度去完成每一种设计,稳定性和安全性就是其中的重要因素。因此,初始安装好的FreeBSD系统已经具备比较高的安全性,一般用户不需要特别设置,便具备了相当高的安全性。而且经过一些简单的设置之后,安全性可以更高。一些商业操作系统软件声称经过了某个安全认证,其实这些认证也只是保证最基本的安全性。当前的各种Unix版本(不包括较老的版本)经过一些设置工作,同样也能达到通过测试目的,只是包括FreeBSD在内的自由软件系统,没有资金、也没有必要去参加这类测试。

  对系统安全要求更高,而又不打算自己调整系统设置的使用者,可以选择另一种BSD Unix──OpenBSD ,它使用最大安全性的策略,其缺省设置中应用了大量的系统安全措施,也因为如此,它稍微难用一些。


设置基本系统

  增强FreeBSD的安全性可以从两个方面出发,一个为使用FreeBSD提供的安全措施,这些安全措施可能在缺省情况下可能并没有打开,但能够提供额外的安全性。另一种为安装其他辅助的安全软件,这些额外的软件可以在特定方面增加系统安全,或帮助检查系统安全的工具。


用户登录控制

  为了提高系统的安全性,一个重要的方面就是区分不同的用户,对于要使用不同服务的用户区别对待。有些用户只使用远程登录服务的就不必具备控制台访问的权限,有些用户只在某些子网上使用系统的就不必允许在任何位置进行登录,有些帐户只是用于系统维护目的,没有任何使用者需要使用相应帐户登录,就不必允许登录请求。

  当区分不同用户的情况,最大限度的提供了登录限制之后,就能对入侵者利用窃取的帐户从其他位置进行攻击设置了障碍,提供更大的安全性。


控制台安全控制

  系统的控制台是一个非常重要的安全弱点所在的位置,因为一个使用者能接触控制台,那么就表示他得到管理人员的特殊信任。系统缺省赋予了控制台终端以较大的安全信任。此外,接触控制台还能从物理上访问系统硬件,包括重新启动系统、将硬盘窃取分析其中的数据等等。然而,物理安全等措施不是在这里要讨论的内容。

  为了避免偶然的非法访问控制台造成的安全问题,所需要设置的第一件任务就是取消控制台的信任设置,这个设置位于/etc/ttys中。

console none     unknown off secure
 
 

  初始设置为secure表示root用户可以在控制台登录,另外,它还表示系统重新启动之后,如果管理员要求进入单用户状态,将不询问root的口令进行验证,这是一个重要的安全漏洞。将secure更改为insecure可以使得进入单用户状态时首先验证root口令,它带来的后果是,一旦系统损坏了passwd文件(主要是master.passwd 文件),root口令无法认证,就没有办法进入单用户状态进行修复工作,此时使用安装盘启动fixit 系统进行才能进行修正。

  使用另外一个运行在软盘上的小FreeBSD系统也能完成修复系统的任务,后面将介绍定制单软盘FreeBSD 系统的方法,这种小系统被称为PICOBSD,可以用于设置网关或防火墙,以及可以用作专有系统的嵌入式操作系统。

  此外,为了防止用户无意中重新启动系统,还需要取消Ctrl-Alt-Del热键的重新启动能力,这需要重新定制内核时使用以下选项。

options SC_DISABLE_REBOOT
 
 

  注意,这是针对使用标准控制台syscon的系统才有效果。

  当屏蔽了系统的热启动能力,那么重新启动或关闭系统便需要使用系统命令来完成,此时能启动系统的使用者便需要 root权限。而root口令知道的人越多,系统越不安全。此时可以使用软件包sudo来帮助解决这个问题,sudo 能限制某些特定用户使用root权限完成指定的操作,它使用用户本身的口令,而非root口令验证用户。

  即使屏蔽了热启动能力,并且重新启动进入单用户状态也需要询问口令,系统仍然存在安全性问题。非法使用者可以首先切断电源,然后使用安装盘或其他不使用现有文件系统的FreeBSD系统盘启动系统,获得相关数据,或更改pas swd文件,以便在重新启动之后获得root权限。保护这些攻击,需要其他手段,例如设置计算机的启动口令,拆除系统上的软盘驱动器、光盘驱动器等。然而,对于能进行物理攻击的入侵者,他的行为就如同一个正常系统管理员修复系统的行为一样,没有绝对的办法能杜绝这样大胆妄为的举动。

  如果管理员不能信任计算机系统的物理安全,为了防止信息外泻,唯一的方法是进行加密,可以通过Unix命令crypt 对具备敏感信息的文件加密。然而更简便的方法是使用一种加密文件系统,这类加密文件系统对于正常操作就如同标准文件系统一样,对任何应用程序的文件操作完全透明,然而数据是以加密方式保存到物理设备中。而且在网络中传送的也都是加密后的密钥,不必担心泄露密钥。FreeBSD下可以使用的加密文件系统为TCFS,但它这不是FreeBSD的标准配置,需要从http:// tcfs.dia.unisa.it/中单独获得。


登录控制

  为了加强控制台的安全,还应该阻止一般用户在控制台上登录入系统。为了达到这个目的,需要设置登录访问限制文件/etc/login.access。该文件由login程序读取,限制用户的登录位置,该文件中具备下面语句将屏蔽除了wheel组、admin之外的用户在console登录的权力。

-:ALL EXCEPT wheel admin:console
 
 

  第一个字符“-“号,用于指明该句是用于屏蔽,相反,“+“用于打开登录许可,由于这个文件主要用于控制登录位置的目的,所以打开登录许可的方式很少用得到。此后用冒号分隔的第二部分为帐号域,可以使用用户名和组名,以及使用 login.access的关键字All、ALL EXCEPT等定义用户。第三部分为登录位置,这里仅仅用于限制console。

  这个文件不但能用来限制在控制台登录,也能用来限制从其他位置登录入系统,还可以限制一些帐户在所有的位置都不能登录,这样就能更好的保证安全性。

-:wheel:ALL EXCEPT LOCAL .local.net
 
 

  这句设置了对管理员组wheel的登录位置限制,只能在本地或者本地的local.net域内计算机上建立登录连接。设置对能执行特定操作管理员的登录限制也能增强系统安全性。

-:daemon bin lpd nobody nogroup:ALL
 
 

  这个设置限制一些特殊的系统用户在所有节点上都不能登录,系统中的很多帐户事实上是用于系统维护的目的,并没有任何用户需要使用他们登录,显然这也能增加安全性。

  然而,使用login.access并不能表示该帐户就无法被非法使用了,很多网络服务不使用这个文件进行用户限制,而是使用自己的用户限制方式,因此入侵者可以通过这些网络服务攻击相关帐户。入侵者也可以通过先以其他用户身份登录,再使用su命令绕过这个限制。所以使用这个限制文件并不是一劳永逸的做法,事实上在保证网络安全方面,不存在百分之百的解决方案,只能通过各个方面配置,尽量提高安全性。

  即使提供了有效的登录控制,对于某些不必要的缺省帐户或长期不再使用的帐户,最好还是将其删除,以最大可能的避免安全问题。例如用于UUCP的帐户uucp,只有很少的系统需要这个帐户。可以放心的是,FreeBSD系统中不存在没有口令保护的缺省帐户,这将满足一般用户的安全需要。


安全认证方式

  由于FreeBSD是一个多用户系统,不但能由控制台用户使用,还可以通过网络,提供其他用户使用。而允许其他用户通过网络使用系统的时候,必须要对用户进行验证。此时的一个重要的安全问题就是口令以明文形式在网络中传输的问题。


S/key和Kerberos

  为了避免口令被窃听,有很多解决方法可以避免这个问题。一个很有意思的解决方法是使用一次性的口令系统,如 S/key,即使口令被窃听也不会对安全造成影响。FreeBSD缺省就支持S/key系统,每个用户都可以选择是否使用这个系统保证自己的口令安全性。为了使用S/key系统,首先需要使用keyinit初始化针对这个用户的口令串。

bash-2.02$ keyinit
Updating wb:
Old key: de415501
Reminder - Only use this method if you are directly connected.
If you are using telnet or rlogin exit with no password and use keyinit -s.
Enter secret password:
Again secret password:
ID wb s/key is 99 de415502
GAS SAM RUSK BASH NEWS WAIT
 
 

  由于这个命令是用于初始化S/key系统,要输入一个S/key口令短语(这个口令可以设置的非常长,通常建议使用一个句子以保证安全性),这个口令将影响以后产生的一次性口令,因此这个命令应该在一个安全连接的终端上(如控制台)执行,而不应该在通过普通telnet等网络连接的登录会话上执行。在两次输入S/key的口令之后,keyinit 将产生第一个一次性口令,keyinit输出的最后一行就是这个一次性口令,上面的ID行中的99指一次性口令的序列号,de415502是这个一次性口令对应的 “种子” 。口令的 “种子” ,和S/key口令短语相结合就用于产生不同的一次性口令序列。

  当使用了keyinit初始化S/key之后,就可以立即使用S/key一次性口令登录了。也可以使用key 命令产生其他一次性口令,这需要指定一次性口令的序列号和种子。

bash-2.02$ key 99 de415502
Reminder - Do not use this program while logged in via telnet or rlogin.
Enter secret password:
GAS SAM RUSK BASH NEWS WAIT
 
 

  key将提示用户输入口令短语,因此这个命令也不应该通过网络来使用,只能用于直接连接的时候。然而不必为此担心,因为无论在那台计算机上,使用同样的序列号、种子和口令短语产生的口令序列都是同样的,因此可以在本地计算机上,产生用于远程FreeBSD计算机登录的一次性口令。

  注意,S/key系统用于产生一次性口令使用的单向Hash函数可能不同,最常用的有MD4、MD5和DES 算法,使用不同算法产生的一次性口令序列不会相同。FreeBSD的S/key系统使用MD4算法,因此如果要在客户计算机为FreeBSD服务器产生S/key一次性口令,需要使用采用MD4算法的key程序。

  这样当系统进行认证时,将提示skey序列号和种子。这样用户就能使用正确的一次性口令登录了。一旦一个口令用过,这个口令就不再被使用,而使用下一个序列号的口令。

Login: wb
s/key 99 de415502
Password:
 
 

  由于每次使用过的口令将不再使用,而通过S/key认证的连接本身是不安全的连接,不应该用于再次产生新口令。那么如果仅通过本地计算机产生S/key口令,就限制了客户机上必须安装有S/key系统。事实上可以在建立安全连接的时候,一次可以产生多个S/key一次性口令,将这些口令记录或打印在密码本上,随用随查,只要密码本不丢失,就没有口令泄露的问题。产生多个S/key一次性口令需要使用-n参数执行key:

bash-2.02$ key -n 5 80 de415503
Reminder - Do not use this program while logged in via telnet or rlogin.
Enter secret password:
76: FIR SIGH BABE SUNG FUSS BAY
77: SOCK HOME WAGE CAN BALL WORE
78: DORA JUNO JAY YET HEAD SLUR
79: COWL TROY HURT SLAB SCAR GAGE
80: TOE BAKE FRAU PEG DOE I
 
 

  这将产生5个一次性口令的序列,80为口令序列的结束序号。此后需要经常更新所使用的口令序列,即更改 S/key的种子,以产生新的口令序列。

  更改S/key种子仍然还需要使用keyinit命令,然而此时有了一次性口令,就不需要在安全的终端上进行了,需要使用-s参数,使得keyinit使用一次性口令来获得S/key口令短语,而不必直接输入S/key口令短语。只要保证S/key口令短语的安全,就能保证整个S/key一次性口令序列不会被再现。

bash-2.02$ keyinit -s
Updating wb:
Old key: de415502
Reminder you need the 6 english words from the key command.
Enter sequence count from 1 to 9999: 100
Enter new key [default de415503]:
s/key 100 de415503
s/key access password: GAS SAM RUSK BASH NEWS WAIT

ID wb s/key is 100 de415503
GAS SAM RUSK BASH NEWS WAIT
 
 

  keyinit -s命令中,需要输入一次性口令序列中口令的数量,以及新种子的值。而用于认证的S/key 一次性口令为提示的一次性口令,这里为de415503,序列号为100。

  需要注意的是,缺省情况下即使使用S/key认证,原有的Unix口令认证方式仍然有效,如果S/key认证不成功,系统就接下来使用原有的老Unix口令认证方式。对于一些图形界面的应用程序,不能提示S/key口令的序列号,那么用户也无法输入正确的一次性口令,此时使用老口令就有必要了。

  然而,也能限制用户必须使用S/key口令,不能使用普通Unix明文口令,以更大程度上增强安全性。为了强制用户使用S/key口令,需要创建一个/etc/skey.access文件。

# touch /etc/skey.access
 
 

  当存在这个文件时,S/key认证系统就不再调用标准Unix认证系统。然而这个文件中可以设置一些例外的情况,允许使用Unix认证系统,例如在内部网络中允许使用Unix明文认证系统,等等。针对IP地址、用户和终端来设置可以使用Unix明文认证系统的权力。针对用户打开这个设置的情况一般是因为该用户不需要特别安全的情况,针对终端打开这个设置的情况通常发生在拨号访问FreeBSD系统的情况,由于认证口令不通过网络,因此也不需要 S/key加密。

permit internet 198.162.0.0 255.255.0.0
permit user aaa
permit port ttyd0
 
 

  对于一些需要自动进行认证的应用程序,需要将口令暂时保存起来,定时自动进行认证工作,但由于S/key的口令是一次性方式的,而客户软件不能根据S/key的提示,输入正确的口令,此时使用老口令也是必要的。如有些使用POP3 协议的客户端能定时从邮件服务器中下载邮件,这样就必须使用标准Unix口令。显然这明显是一个非常严重的安全漏洞,特别是明文口令不但是在网络上传输,而且是定时、多次传输的时候,问题更为明显。对于这样的情况,最好立即转换为支持加密口令的协议,对POP3来讲可以使用APOP协议。

  FreeBSD下使用的另一种安全认证方式为Kerberos方式,这是一种安全的认证模式,然而它需要客户和服务器都支持这个认证方式才行。当前流行的Kerberos为Kerberos V,而FreeBSD下使用的为Kerberos IV ,因此与其他Kerberos客户存在兼容的问题,使得这个认证系统大部分情况下用于多台FreeBSD 系统之间进行认证。这里就不再介绍其使用方法了,需要使用这个能力的用户可以查看FreeBSD Handbook ,以获得相关的内容。

  FreeBSD下也可以安装Kerberos V认证系统,它位于Posts Collecion中的sec urity部分中。


可加载认证模块PAM

  3.1-release之后的FreeBSD版本支持可加载的认证方式模块PAM,这种机制能使得系统能非常灵活的支持多种认证方式,具备非常大的可扩展性。PAM的设置文件为/etc/pam.conf,这里定义了各种条件下使用的认证方式。

# Configuration file for Pluggable Authentication Modules (PAM).
#
# This file controls the authentication methods that login and other
# utilities use.  See pam(8) for a description of its format.
#
# Note: the final entry must say "required" -- otherwise, things don't
# work quite right.  If you delete the final entry, be sure to change
# "sufficient" to "required" in the entry before it.
#
# $FreeBSD: src/etc/pam.conf,v 1.1 1998/11/20 23:20:01 jdp Exp $

# If the user can authenticate with S/Key, that's sufficient.
login auth sufficient pam_skey.so

# Check skey.access to make sure it is OK to let the user type in
# a cleartext password.  If not, then fail right here.
login auth requisite pam_cleartext_pass_ok.so

# If you want KerberosIV authentication, uncomment the next line:
#login auth sufficient pam_kerberosIV.so try_first_pass

# Traditional getpwnam() authentication.
login auth required pam_unix.so try_first_pass
 
 

  这是系统缺省的pam.conf文件,这里定义了三个认证过程,按照顺序系统将首先使用pam_skey.so ,然后pam_cleartext_pass_ok.so,最后是标准unix认证pam_unix.so。第一个是用于使用S/key系统认证,第二个不是一个认证,而是用于限制用户访问的,它检查/etc/skey.access ,以禁止非许可的节点、用户登录,因此其第三个参数为requisite,而非pam_skey.so对应的sufficient ,如果第二个设置许可,才能进入第三项定义的标准Unix认证方式。

  注意,如果存在/etc/pam.d目录,PAM将在这个目录中寻找设置信息,而忽略pam.conf。

  这些认证系统的动态连接库均位于系统中的/usr/lib/目录下,如果需要,可以增加其他认证方式。

# ls -l /usr/lib/*pam*
-r--r--r--  1 root  wheel  59938 Feb 15 18:41 /usr/lib/libpam.a
lrwxr
 
来源:http://freebsd.online.ha.cn/

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

Copyright 2000 www.newok.com