BSD的核心安全級別

2021-05-21 19:30:39 字數 4518 閱讀 9260

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

因此可以將系統安全相關的很多程式都設定保護標誌,這樣入侵者就不能輕易更改這些檔案了。建議將/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 ,安全級別的保護就不再是完美無缺的了(dog250 :攻擊者可以利用x 的漏洞實施攻擊)。 如果不使用x server 之類的程式,那麼就可以將設定安全級別的命令直接放入系統的啟動rc 檔案中,以便自動提高安全級別。這需要在rc.conf 檔案中設定兩個變 量:kern_securelevel_enable 和kern_securelevel 。

kern_securelevel_enable=」yes」

kern_securelevel=0

上面將安全級別設定為0 ,那麼在啟動之後將自動更改為1 ,這是一種標準的做法。

以上就是關於bsd 安全級別的標準描述,那麼有句話說只有init 程序可以調整安全級別是什麼意思呢?還得通過bsd 的init 源**來理解,於是翻出bsd 的init.c 檔案(前面的文章分析過),裡面有乙個函式:setsecuritylevel

void setsecuritylevel(int newlevel)

#ifdef secure

warning("kernel security level changed from %d to %d", curlevel, newlevel);

#endif

#endif }

下面是getsecuritylevel :

int getsecuritylevel(void)

return (curlevel);

#else

return (-1);

#endif }

安 全性體現在**呢?前面的設定函式可是無條件設定的啊,如果我在我自己的程式裡面也來乙個sysctl 呼叫,豈不是也成功了,實際上,sysctl 是個系 統呼叫,bsd 的實現是在該系統呼叫的實現裡面如果是設定安全級別那麼就檢查程序的pid ,如果pid 不是1 還想降低安全級別,那麼很抱歉,出錯返回。見freebsd 的**:src/sys/kern/kern_mib.c

mtx_lock(&securelevel_mtx);

if (!regression_securelevel_nonmonotonic &&

(level < securelevel) &&          //

新安全級別小於原安全級別

(req->td->td_proc->p_pid != 1)) 

state_func_t multi_user(void)

state_func_t single_user(void)

由 上面的**可見,安全級別為0 就是乙個佔位符的作用,提示init 一會一旦進入多使用者就將安全級別公升為1 ,除此之外它和安全級別-1 沒有任何區別。深入到 了init 內部,是不是對安全級別的控制有了一些新的認識呢?init 程序並沒有什麼神力,只不過是核心將這個單點控制權給了1 號程序而已。

網路安全級別

網路安全級別按安全級別由高到低分為a b c d四個級別。這些安全級別不是線性的,而是成倍增加的。1 d1 級 這是計算機安全的最低級別。整個計算機系統不可信,硬體和作業系統容易受到攻擊。d1級計算機系統標準規定對使用者沒有認證,即任何人都可以無障礙地使用計算機系統。系統不需要使用者註冊 需要使用者...

RAID的儲存安全級別比較

問題 在資料儲存安全性方面,一般使用者的常見疑問 1.raid的資料儲存安全性一定比普通單盤資料儲存安全性高麼?2.不同的raid模式的安全級別和儲存空間利用率有何區別?問題分析 對於第乙個問題,首先要從raid的設計目的來談起,raid是 廉價磁碟冗餘陣列 的簡稱,設計的幾個目的中確有提高資料儲存...

談Notes和Domino提供的安全級別

談notes和domino提供的安全級別 在談及notes 和domino 的安全性之前,我們可以看圖 1所示從上到下的九個層,最上一層限制訪問 d o m i n o 伺服器所在的網路,最下一層涉及 domino 文件內的域級別的安全性。圖 1實際上描述了訪問許可權從上到下越來越嚴格的特性。圖 1...