分类: BSD
2010-08-21 00:50:13
5、设置安全级别
FreeBSD内核有一个安全级别(securelevel)的概念,这是指系统内核运行使用的安全等级,不同的等级具备不同的保护和检查机制。因为这是内核的检查机制,因此相当严格,没有办法能绕过这个机制提供的保护,因此就对保护FreeBSD的安全性十分有用。
内核的安全级别按照提供安全保护的程度分为-1、0、1、2共分为四个级别,安全级别能提供的保护有:
系统文件:系统文件可以设置保护标志"不可更改"和 "只能附加" ,具有这些保护标志的文件在系统的文件属性之外,还受这些保护标志的保护。安全级别可以规定这些标志能否取消。
磁盘设备文件:磁盘设备文件具备两种访问方式,随机访问的方式对应的块设备文件和顺序访问方式对应的字符设备文件,其中字符设备文件可以直接读取硬件设备,因此对于安全至关重要。内核安全级别可以决定是否允许以直接读取硬件的方式操作硬盘设备文件。
直接内存访问:/dev/mem和/dev/kmem是系统内存的映射文件,访问它 们就能直接访问系统内存,一些需要获取系统信息和需要进程间共享内存机制的程序需要访问这两个设备文件以直接访问内存,然而访问内存空间显然也影响系统的 安全运行。内核安全级别可以决定是否允许访问系统内存。
安全级别-1为一种永久性的不安全级别,系统内核不提供任何额外的保护。系统缺省就处于这个级别,此时系统文件的保护标志能被root用户取消,所有的设备,包括磁盘设备和内存映射设备,均能按照其属性来访问。
安全级别0为不安全的级别,它和等级-1一样没有对系统提供额外的安全保护,但它影 响到内核进程init的行为。当内核处于级别-1时,内核init程序不会自动更改运行级别,因此一直到进入能够登录的状态,系统安全级别仍然为-1。这 是系统的缺省行为,没有打开安全级别保护机制。但如果安全级别不为-1,init在进入单用户状态时将改变为0级别,在进入多用户模式时改变为安全级别 1。因此安全级别0为设置了安全级别保护之后,单用户状态下的安全级别。
安全级别1为安全的级别,提供了对系统的保护能力。此时系统文件的那两个保护标志不能被取消,已安装文件系统对应的磁盘设备,以及/dev/mem,/dev/kmem不可以用写入模式打开。
安全级别2与级别1类似,只是进一步增加了对磁盘设备低级操作的限制,不管该磁盘设备是否安装,都不允许直接以写入方式访问,这样就无法进行fdisk、disklabel以及newfs等操作。
可以使用sysctl来查看当前系统的安全级别,但如果没有经过特别设置,FreeBSD的缺省安全级别应该为-1:
bash-2.03# sysctl kern.securelevel
kern.securelevel: -1
安全级别中最重要的一点是,除了内核的init进程之外,即使是root用户,也只 能不断提高安全级别,没有办法将安全级别降低。这样就基本上保证远程入侵者在没有重新启动计算机的情况下,无法降低系统运行级别。如果root 想提高系统运行的安全级别,也需要使用sysctl命令。
bash-2.03# sysctl -w kern.securelevel=0
kern.securelevel: -1 -> 0
安全级别的意义就在于对文件和设备的保护,如果要对文件提供保护,就需要对文件设置 保护标志schg。设置这个标志需要使用chflags命令,系统文件如/kernel,系统安全的时候就具备这个保护标志。即使在非安全级别下要更改这 些文件的时候,也要首先取消保护标志才能进行正常操作。
bash-2.03# mv /kernel /kernel.bak
mv: rename /kernel to /kernel.bak: Operation not permitted
bash-2.03# chflags noschg /kernel
bash-2.03# mv /kernel /kernel.bak
bash-2.03# mv /kernel.bak /kernel
bash-2.03# chflags schg /kernel
上面操作先取消了kernel文件的不可更改标志schg,显然这是在非安全级别下的操作。当安全级别处于 1或2时,就不能使用chflags改变文件的保护标志了。
bash-2.03# chflags noschg /kernel
chflags: /kernel: Operation not permitted
可以使用带-o参数的ls来查看文件具备的标志。
bash-2.03# ls -lo /kernel
-r-xr-xr-x 1 root wheel schg 1061679 Jun 30 01:27 /kernel
因此可以将系统安全相关的很多程序都设置保护标志,这样入侵者就不能轻易更改这些文件了。建议将/bin,/sbin下的文件都设置这个标志。
bash-2.03# chflags schg /bin
bash-2.03# chflags schg /bin/*
bash-2.03# chflags schg /sbin
bash-2.03# chflags schg /sbin/*
这里首先将相关目录本身设置保护标志,这样入侵者就不能通过将目录更改名字的方法创造一个新的/sbin或 /bin目录。
当文件具备了保护标志,并且安全级别高于1时,保护标志就无法取消,这些文件就不能更改,因此就带来一些必要的操作无法进行,例如重新生成内核的操作等。此时就必须再重新启动系统进入单用户状态执行这些操作。
通常情况下,如果FreeBSD系统只提供网络服务,那么使用安全级别1或2毫无问 题。然而如果要运行X Server ,由于X Server使用了共享内存机制,需要访问/dev/mem和/dev/kmem,这样就会带来问题。这时的一种解决办法是在启动X Server之后(例如使用Xdm),再升高安全级别,以避开这个问题,但此时 X Server已经打开了/dev/mem和/dev/kmem,安全级别的保护就不再是完美无缺的了。
如果不使用X Server之类的程序,那么就可以将设置安全级别的命令直接放入系统的启动rc文件中,以便自动提高安全级别。这需要在rc.conf文件中设置两个变量:kern_securelevel_enable和kern_securelevel。
kern_securelevel_enable=”YES”
kern_securelevel=0
上面将安全级别设置为0,那么在启动之后将自动更改为1,这是一种标准的做法。
如果系统提供shell服务,系统管理员有时也不希望用户占用太多的系统资源,在有 些Unix系统中入侵者能通过普通帐户,启动大量的进程或产生大量的文件,从而使系统死掉或不能提供正常操作,而FreeBSD下则不必有此担忧,因为可 以通过login.conf 和用户的口令数据来设置用户类别,限制用户对系统资源的占用。
6、限制用户所能使用的资源
从 4.3 BSD Net/2开始,BSD Unix引入了登录类别这种分类机制来管理用户使用的资源、记账和环境设置。FreeBSD系统使用/etc/login.conf中描述的数据来将用户 按照登录环境、强制性的资源限制以及记账管理等分为不同的登录类别,每个用户的登录类别记录在/etc/master.passwd中的该用户的设置中。 以下是一个缺省安装的/etc/login.conf的部份内容。
bash-2.03# cat login.conf
---------------------snip----------------------
default:\
:copyright=/etc/COPYRIGHT:\
:welcome=/etc/motd:\
:setenv=MAIL=/var/mail/$,BLOCKSIZE=K,FTP_PASSIVE_MODE=YES:\
:path=~/bin /bin /usr/bin /usr/local/bin /usr/X11R6/bin:\
:nologin=/var/run/nologin:\
:cputime=unlimited:\
:datasize=unlimited:\
:stacksize=unlimited:\
:memorylocked=unlimited:\
:memoryuse=unlimited:\
:filesize=unlimited:\
:coredumpsize=unlimited:\
:openfiles=unlimited:\
:maxproc=unlimited:\
:priority=0:\
:ignoretime@:\
:umask=022:
#
# A collection of common class names - forward them all to 'default'
# (login would normally do this anyway, but having a class name
# here suppresses the diagnostic)
#
standard:\
:tc=default:
xuser:\
:tc=default:
staff:\
:tc=default:
daemon:\
:tc=default:
news:\
:tc=default:
dialer:\
:tc=default:
#
# Root can always login
#
# N.B. login_getpwclass(3) will use this entry for the root account,
# in preference to 'default'.
root:\
:ignorenologin:\
:tc=default:
---------------------snip----------------------
利用login.conf可以方便地对用户的登录环境和资源许可进行设置,缺省的设置对用户所能使用的资源几乎没有限制,可以把login.conf改为如下内容:
---------------------snip----------------------
default:\
:cputime=infinity:\
:datasize-cur=64M:\
:stacksize-cur=64M:\
:memorylocked-cur=10M:\
:memoryuse-cur=100M:\
:filesize=infinity:\
:coredumpsize=infinity:\
:maxproc-cur=64:\
:openfiles-cur=64:\
:priority=0:\
:requirehome@:\
:umask=022:\
:tc=auth-defaults:
---------------------snip----------------------
上面设置了default登录类别中的几个参数,如果没有在master.passwd文件中明确指定用户的登录类别,就使用这个缺省类别来作为用户的登录类别。
cputime设置了用户的每个进程可以使用的CPU时间,缺省是无限制(infinity)。如果加以限制,有些需要大量CPU时间进行运算的进程就不能正常执行到结束。
datasize-cur设置了用户使用的数据段最大为64M,但-cur设置不是 强制的,用户实际使用的数据有可能超过这个值,但最大不能超过datasize-max设置的值(缺省没有设置)。如果没有-cur和-max 后缀,仅仅定义datasize,则表示datasize-cur和datasize-max同样都为datasize 设置的值。同样stacksize定义了对栈的限制。
memorylocked-cur设置了用户每进程可以锁定的最大内存。
memoryuse-cur设置了每进程使用的最大内存。
filesize-cur设置了用户产生的文件大小。
coredumpsize设置了在应用程序发生问题时产生的core dump文件的大小。
maxproc-cur设置了用户可以同时执行的最大进程数。
openfiles-cur设置了每进程最多打开的文件数。
priority设置用户进程的优先级。
requirehome设置用户登录时是否需要主目录,@符号表示不需要主目录。
umask项设置缺省的umask,用于用户创建文件的属性。
tc设置系统认证策略为使用缺省的认证策略。
如果要创建新类别,并不需要对每个值都重新设置,系统缺省先应用default类别的设置,然后再应用具体类别的设置,因此只需要设置与default类别不同的项就可以了。
---------------------snip----------------------
users:\
:manpath=/usr/share/man /usr/X11R6/man /usr/local/man:\
:cputime=4h:\
:openfiles=32:\
:maxproc=48:\
:tc=default:
---------------------snip----------------------
上面是设置了一个新类users,可以看出它为用户设置了环境变量MANPATH,并重置了cputtime 、openfile、maxproc和tc的值。每次更改login.conf之后,都要进行更新登录类别数据库的操作。
bash-2.03# cap_mkdb /etc/login.conf
由于登录类别保存在master.passwd文件中,通常在使用adduser添 加用户的时候设置用户的登录类别。如果要进行更改,必须使用vipw来修改/etc/master.passwd文件的第5个域。下面为 master.passwd 中的一行,该行指定这个用户的登录类别为user:
缺省为:
bash-2.03# cat master.passwd
# $FreeBSD: src/etc/master.passwd,v 1.25 1999/09/13 17:09:07 peter Exp $
inburst:TioxhDpCtDaRE:1004:0::0:0:stardust:/home/stardust:/usr/local/bin/bash
改为:
inburst:TioxhDpCtDaRE:1004:0:users:0:0:stardust:/home/stardust:/usr/local/bin/bash
设定系统中用户的可用空间也是系统免受本地拒绝服务攻击重要的一方面,在未设定 quota 的系统上的用户可以随意的灌爆硬盘。要把 quota这项功能打开,可以修改 /etc/rc.conf 中的这项设定:
check_quotas="NO" # Check quotas (or NO).
改成
check_quotas="YES" # Check quotas (or NO).
请先看看以下的 man page,这些文件说明如何使用 quota 的各项设定,并且有一些设定的范例: quotaon, edquota, repquota, quota,要确定在 /etc/fstab 中有加入 "userquota" , 详见 man 5 fstab。
7、保证suid,sgid可执行程序的安全
在UNIX类操作系统中,当黑客取得了本地shell权限,绝大多数情况下,他们通 过攻击有缺陷的suid,sgid程序来获得root或高一级的访问权限。因此有缺陷的suid,sgid程序构成了对本地安全的极大威胁。管理员有必要 订阅相关的安全邮件列表,了解最新被发现的漏洞,在被攻击者利用之前及时修补,这样才有可能保证本地安全,如何订阅邮件列表将在以后的讨论中提到。作为预 防,建议找出系统中所有的suid,sgid程序,了解它们的功能,对那些不常使用的程序一律去其suid,sgid位,只保留那些对系统正常运行所必须 的程序的特权位。用如下命令找出那些特权程序:
bash-2.03# find / -type f \(-perm -4000 -o -2000 \) -exec ls -l {} \;
---------------------snip----------------------
-r-sr-sr-x 1 uucp dialer 121640 Mar 20 2000 /usr/bin/cu
-r-sr-xr-x 1 uucp wheel 86552 Mar 20 2000 /usr/bin/uucp
-r-sr-xr-x 1 uucp wheel 36348 Mar 20 2000 /usr/bin/uuname
-r-sr-sr-x 1 uucp dialer 95100 Mar 20 2000 /usr/bin/uustat
-r-sr-xr-x 1 uucp wheel 87184 Mar 20 2000 /usr/bin/uux
-r-sr-xr-x 1 man wheel 28088 Mar 20 2000 /usr/bin/man
-r-s--x--x 2 root wheel 50356 Mar 20 2000 /usr/bin/suidperl
-r-s--x--x 2 root wheel 50356 Mar 20 2000 /usr/bin/sperl5.00503
-r-sr-xr-x 4 root wheel 19116 Mar 20 2000 /usr/bin/at
-r-sr-xr-x 4 root wheel 19116 Mar 20 2000 /usr/bin/atq
-r-sr-xr-x 4 root wheel 19116 Mar 20 2000 /usr/bin/atrm
-r-sr-xr-x 4 root wheel 19116 Mar 20 2000 /usr/bin/batch
-r-sr-xr-x 6 root wheel 31492 Dec 23 01:06 /usr/bin/chpass
-r-sr-xr-x 6 root wheel 31492 Dec 23 01:06 /usr/bin/chfn
-r-sr-xr-x 6 root wheel 31492 Dec 23 01:06 /usr/bin/chsh
-r-sr-xr-x 6 root wheel 31492 Dec 23 01:06 /usr/bin/ypchpass
-r-sr-xr-x 6 root wheel 31492 Dec 23 01:06 /usr/bin/ypchfn
-r-sr-xr-x 6 root wheel 31492 Dec 23 01:06 /usr/bin/ypchsh
-r-xr-sr-x 1 root kmem 11024 Mar 20 2000 /usr/bin/fstat
-r-xr-sr-x 1 root kmem 9680 Mar 20 2000 /usr/bin/ipcs
-r-sr-xr-x 1 root wheel 510 Mar 20 2000 /usr/bin/keyinfo
-r-sr-xr-x 1 root wheel 7056 Mar 20 2000 /usr/bin/keyinit
---------------------snip----------------------
上面的列表只是一部份,FreeBSD的缺省安装中有相当多的suid,sgid程 序,其中的很多只是管理员应该使用的程序,比如一些系统管理工具,管理员完全可以su到root后使用。有些程序基本不会被用到,比如uucp类的程序。 有些是针对特定服务的,而这些服务并不是系统所提供的,如果系统不运行SUN的NIS服务的话,yp系统命令就是无用的。因此可以也应该去掉所有这些程序 的特权位,甚至取消它们的执行权限,这样既使在那些程序中有被发现安全漏洞,也不至于对系统安全构成威胁。
另外,在安装系统的时候,可以通过合理分区,把一般用户可写的分区分割开来,而这些 分区就可以用 "nosuid" 的方式来 mount。 一般会有个分区给一般使用者使用:/home 或 /usr/home。可以另外开个分区给 /var/tmp 然后再把/tmp 指到这里:
bash-2.03# rm -rf /tmp
bash-2.03# ln -s /var/tmp /tmp
可以参考下面这个例子:
bash-2.03# cat /etc/fstab
---------------------snip----------------------
# Device Mountpoint FStype Options Dump Pass#
/dev/sd0s1b none swap sw 0 0
/dev/sd0s1a / ufs rw 1 1
/dev/sd0s1g /usr ufs rw 2 2
/dev/sd0s1h /usr/home ufs rw,nosuid 2 2
/dev/sd0s1f /var ufs rw 2 2
/dev/sd0s1e /var/tmp ufs rw,nosuid 2 2
proc /proc procfs rw 0 0
---------------------snip----------------------
现在一般用户可以写入的目录/usr/home和/var/tmp是以 "-nosuid" 的方式被 mount的,如此可以减少一些可能的安全风险。
当系统作为NFS服务器,设置共享出去的NFS文件系统时,应该使用maproot 或mapall参数,以便隔离危险,使得即使在远程系统被侵入的情况下,防止从这个允许安装文件系统的客户上对本机的入侵。还可以考虑使用安全的NFS协 议,使用DES算法进行服务器和客户机的认证。如果系统不使用NFS及其他RPC服务时,最好屏蔽相关的选项,如portmap_enable选项。
三、参考配置选项
1、控制能su成root的用户
在FreeBSD系统中,只有wheel组的成员,也就是说用户的组ID为0,才能 su成为root。因为缺省加入用户时,用户被赋于组ID为0,所以几乎所有加入用户都能su成root,这在一般情况下是不需要的。应该严格控制可以 su成root的用户,对于那些没有必要成为root的用户,用vipw把/etc/passwd和/etc/master,passwd,把他们的组 ID,改到其他组对应的ID,组名和它的ID可以在/etc/group里找到:
bash-2.03# cat /etc/group
---------------------snip----------------------
wheel:*:0:root
daemon:*:1:daemon
kmem:*:2:root
sys:*:3:root
tty:*:4:root
operator:*:5:root
mail:*:6:
bin:*:7:
news:*:8:
man:*:9:
games:*:13:
staff:*:20:root
guest:*:31:root
bind:*:53:
uucp:*:66:
xten:*:67:xten
dialer:*:68:
network:*:69:
qnofiles:*:81:
qmail:*:82:
mysql:*:88:
casper:*:1001:
admin:*:1009:
nogroup:*:65533:
nobody:*:65534:
---------------------snip----------------------
chinaunix网友2010-08-24 07:21:05
Download More than 1000 free IT eBooks: http://free-ebooks.appspot.com