76 FreeBSD连载:设置基本系统( 十 )


内核安全级别
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:
# sysctl kern.securelevelkern.securelevel: -1安全级别中最重要的一点是,除了内核的init进程之外,即使是root用户,也只能不断提高安全级别,没有办法将安全级别降低 。这样就基本上保证远程入侵者在没有重新启动计算机的情况下,无法降低系统运行级别 。如果root想提高系统运行的安全级别,也需要使用sysctl命令 。
# sysctl -w kern.securelevel=0kern.securelevel: -1 -> 0安全级别的意义就在于对文件和设备的保护,如果要对文件提供保护,就需要对文件设置保护标志schg 。设置这个标志需要使用chflags命令,系统文件如/kernel,系统安全的时候就具备这个保护标志 。即使在非安全级别下要更改这些文件的时候,也要首先取消保护标志才能进行正常操作 。
# mv /kernel /kernel.bakmv: rename /kernel to /kernel.bak: Operation not permitted # chflags noschg /kernel# mv /kernel /kernel.bak# mv /kernel.bak /kernel# chflags schg /kernel上面操作先取消了kernel文件的不可更改标志schg,显然这是在非安全级别下的操作 。当安全级别处于1或2时,就不能使用chflags改变文件的保护标志了 。

推荐阅读