建站學(xué)院文檔 bsd一直是公認(rèn)的最安全的unix操作系統(tǒng),因?yàn)樗峁┝嘶趦?nèi)核的安全保護(hù)而不僅僅是老式unix的基于訪問控制的安全保護(hù)。bsd為內(nèi)核劃分了安全等級,這樣就可以限制很多不安全的操作,而且bsd在安全設(shè)置上是單點(diǎn)的,使得不可能輕易改變安全級別。linux提供的lsm“可加載安全模塊”可以從外部加載安全模塊,而bsd將此行為也作為可能的安全隱患,所以bsd中由內(nèi)核直接來負(fù)責(zé)安全,如果內(nèi)核認(rèn)為加載的安全模塊是不可信的,那么內(nèi)核將禁止加載模塊,這在bsd內(nèi)核中通過安全級別(securelevel)來實(shí)現(xiàn)。下面先引用一段介紹安全級別的文字然后我分析bsd的init程序中與安全級別相關(guān)的代碼:
FreeBSD內(nèi)核有一個安全級別(securelevel)的概念,這是指系統(tǒng)內(nèi)核運(yùn)行使用的安全等級,不同的等級具備不同的保護(hù)和檢查機(jī)制。因?yàn)檫@是內(nèi)核的檢查機(jī)制,因此相當(dāng)嚴(yán)格,沒有辦法能繞過這個機(jī)制提供的保護(hù),因此就對保護(hù)FreeBSD的安全性十分有用。內(nèi)核的安全級別按照提供安全保護(hù)的程度分為-1、0、1、2共分為四個級別,安全級別能提供的保護(hù)有:
系統(tǒng)文件:系統(tǒng)文件可以設(shè)置保護(hù)標(biāo)志"不可更改"和 "只能附加" ,具有這些保護(hù)標(biāo)志的文件在系統(tǒng)的文件屬性之外,還受這些保護(hù)標(biāo)志的保護(hù)。安全級別可以規(guī)定這些標(biāo)志能否取消。
磁盤設(shè)備文件:磁盤設(shè)備文件具備兩種訪問方式,隨機(jī)訪問的方式對應(yīng)的塊設(shè)備文件和順序訪問方式對應(yīng)的字符設(shè)備文件,其中字符設(shè)備文件可以直接讀取硬件設(shè)備,因此對于安全至關(guān)重要。內(nèi)核安全級別可以決定是否允許以直接讀取硬件的方式操作硬盤設(shè)備文件。
直接內(nèi)存訪問:/dev/mem和/dev/kmem是系統(tǒng)內(nèi)存的映射文件,訪問它們就能直接訪問系統(tǒng)內(nèi)存,一些需要獲取系統(tǒng)信息和需要進(jìn)程間共享內(nèi)存機(jī)制的程序需要訪問這兩個設(shè)備文件以直接訪問內(nèi)存,然而訪問內(nèi)存空間顯然也影響系統(tǒng)的安全運(yùn)行。內(nèi)核安全級別可以決定是否允許訪問系統(tǒng)內(nèi)存。
安全級別-1為一種永久性的不安全級別,系統(tǒng)內(nèi)核不提供任何額外的保護(hù)。系統(tǒng)缺省就處于這個級別,此時系統(tǒng)文件的保護(hù)標(biāo)志能被root用戶取消,所有的設(shè)備,包括磁盤設(shè)備和內(nèi)存映射設(shè)備,均能按照其屬性來訪問。
安全級別0為不安全的級別,它和等級-1一樣沒有對系統(tǒng)提供額外的安全保護(hù),但它影響到內(nèi)核進(jìn)程init的行為。當(dāng)內(nèi)核處于級別-1時,內(nèi)核init程序不會自動更改運(yùn)行級別,因此一直到進(jìn)入能夠登錄的狀態(tài),系統(tǒng)安全級別仍然為-1。這是系統(tǒng)的缺省行為,沒有打開安全級別保護(hù)機(jī)制。但如果安全級別不為-1,init在進(jìn)入單用戶狀態(tài)時將改變?yōu)?級別,在進(jìn)入多用戶模式時改變?yōu)榘踩墑e 1。因此安全級別0為設(shè)置了安全級別保護(hù)之后,單用戶狀態(tài)下的安全級別。
安全級別1為安全的級別,提供了對系統(tǒng)的保護(hù)能力。此時系統(tǒng)文件的那兩個保護(hù)標(biāo)志不能被取消,已安裝文件系統(tǒng)對應(yīng)的磁盤設(shè)備,以及/dev/mem,/dev/kmem不可以用寫入模式打開。
安全級別2與級別1類似,只是進(jìn)一步增加了對磁盤設(shè)備低級操作的限制,不管該磁盤設(shè)備是否安裝,都不允許直接以寫入方式訪問,這樣就無法進(jìn)行fdisk、disklabel以及newfs等操作。
可以使用sysctl來查看當(dāng)前系統(tǒng)的安全級別,但如果沒有經(jīng)過特別設(shè)置,F(xiàn)reeBSD的缺省安全級別應(yīng)該為-1:
bash-2.03# sysctl kern.securelevel
kern.securelevel: -1
安全級別中最重要的一點(diǎn)是,除了內(nèi)核的init進(jìn)程之外,即使是root用戶,也只能不斷提高安全級別,沒有辦法將安全級別降低。這樣就基本上保證遠(yuǎn)程入侵者在沒有重新啟動計算機(jī)的情況下,無法降低系統(tǒng)運(yùn)行級別。如果root 想提高系統(tǒng)運(yùn)行的安全級別,也需要使用sysctl命令。
bash-2.03# sysctl -w kern.securelevel=0
kern.securelevel: -1 -> 0
安全級別的意義就在于對文件和設(shè)備的保護(hù),如果要對文件提供保護(hù),就需要對文件設(shè)置保護(hù)標(biāo)志schg。設(shè)置這個標(biāo)志需要使用chflags命令,系統(tǒng)文件如/kernel,系統(tǒng)安全的時候就具備這個保護(hù)標(biāo)志。即使在非安全級別下要更改這些文件的時候,也要首先取消保護(hù)標(biāo)志才能進(jìn)行正常操作。
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文件的不可更改標(biāo)志schg,顯然這是在非安全級別下的操作。當(dāng)安全級別處于 1或2時,就不能使用chflags改變文件的保護(hù)標(biāo)志了。
bash-2.03# chflags noschg /kernel
chflags: /kernel: Operation not permitted
可以使用帶-o參數(shù)的ls來查看文件具備的標(biāo)志。
bash-2.03# ls -lo /kernel
-r-xr-xr-x 1 root wheel schg 1061679 Jun 30 01:27 /kernel