LSM的全稱是Linux Security Modules,它是linux核心中用來支援更靈活的安全性原則的一個底層架構,雖然聽起來比較複雜,但是可以就把它理解成一組安插在linux核心的鉤子函數和一些預留的被稱為安全域的資料結構,下面先說說這個架構的由來吧。
linux本身的機制就保證了linux擁有更好的安全機制,但是在這個機制下面,還是隱藏了許多的問題:
1、許可權粒度太大。用過linux的人應該對0644這樣的存取權限設定不陌生,它對能夠操作這個檔案的使用者做了限制,但是這個只是限制到了組,而沒有更進一步的細分,當然,如果LSM只是用來限制這個的話,那麼也就太沒意思了,因為實現檔案更細的控制粒度,ACL就能夠很出色的完成,順便提一下,ACL有一個分配的限制,如果哪位朋友需要用ACL進行粒度更細的存取權限控制的話,可能需要注意一下這方面的東西。
2、root使用者的許可權太大。在linux中,root使用者就是至高無上的,他擁有對機器的完全控制許可權,可以做他想做的一切事情。但是很多時候,我們可能並不希望有root有這麼大的許可權,比如在現在比較流行的雲端儲存中,使用者肯定不希望服務提供者能夠隨意訪問我們的檔案,那麼這個時候,就需要對root使用者進行一定的設定了。
由於這些問題的存在,所以出現了像SE Linux(Securiy Enhanced Linux )這樣的增強補丁。但是每個系統對於具體安全細節的控制不盡相同, 所以Linus Tovalds 提出應該要有一個 Linux 核心所能接受的安全架構來支援這些安全性原則,這個安全架構應該提供包含核心資料結構中的透明安全域以及用來控制、維護安全網域作業的安全鉤子,於是就有了LSM。
LSM在核心中的位置,可以用來表示(註:這張圖是我從網上找的,因為它確實很清晰地體現了LSM的位置,所以直接拿來使用了,因為現在不知道這張圖的原出處,如果冒犯了您的權益,請告訴我,我馬上刪除,謝謝啦,呵呵):
當使用者態程式調用某些作業系統提供的函數的時候,比如read()函數,其會對應於核心中的一個系統調用,然後該首先會進行一些常規的錯誤偵測,接著進行DAC(Discretionary Access Control)檢測,再接著它會進行LSM檢測。從中能夠看出來,LSM其實是一個非常底層的安全性原則架構,利用LSM,可以接管所有的系統調用,這樣,我們就能對包括root在內的所有使用者的許可權進行控制,並且實現粒度更細的存取權限控制。
當系統初始化的時候,LSM就是一個空的架構,它不提供任何的檢測,其所做的全部工作幾乎就是返回0,當然,有些不帶傳回值的函數除外。而我們則可以針對自己特定的需求來編寫LSM,然後將我們編寫的LSM鉤子函數,通過其資料結構struct security_operations註冊到系統中去,這樣,我們的LSM檢測就開始起作用了。
在接下來的文章中,會通過項目中的一個部分——限制root使用者對某些檔案的存取權限來更具體的說明LSM這個架構,當然,略陳固陋,還請各位大牛多多指教,謝謝啦。呵呵