建站學院文檔 bsd一直是公認的最安全的unix操作系統,因為它提供了基于內核的安全保護而不僅僅是老式unix的基于訪問控制的安全保護。bsd為內核劃分了安全等級,這樣就可以限制很多不安全的操作,而且bsd在安全設置上是單點的,使得不可能輕易改變安全級別。linux提供的lsm“可加載安全模塊”可以從外部加載安全模塊,而bsd將此行為也作為可能的安全隱患,所以bsd中由內核直接來負責安全,如果內核認為加載的安全模塊是不可信的,那么內核將禁止加載模塊,這在bsd內核中通過安全級別(securelevel)來實現。下面先引用一段介紹安全級別的文字然后我分析bsd的init程序中與安全級別相關的代碼:
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