想實現一個linux內核安全功能模塊的技術思路是怎樣的?

想在kernel中實現一個安全模塊,對程序進行啟動控制,做個demo就行。查了下資料,個人覺得在Linux Security Module(LSM)框架下面註冊個自己的模塊,利用其提供的hook實現,不知道還有別的思路沒?

另上面思路中碰到問題:2.6.36下面register_security等符號都沒導出,用不成,但看到內核自帶的smack等都還在用,不知道怎麼用起來的,是不是只有靜態編譯進內核才能用,動態載入模塊就不行?

同時還有個疑問,LSM下是不是只能註冊一個安全模塊,比如我的模塊註冊了,smack就不能註冊了?感覺是這樣不確定。


用戶在執行系統調用時,先通過原有的內核介面依次執行功能性的錯誤檢查,接著進行傳統的DAC檢查,並在即將訪問內核的內部對象之前,通過LSM鉤子函數調用LSM。LSM再調用具體的訪問控制策略來決定訪問的合法性。訪問控制整體構架:

LSM框架下訪問決策模塊包括selinux,smack,tomoyo,yama,apparmor.

每個決策模塊都是通過各自的XXX_init函數調用register_security()函數,註冊到LSM框架的模塊被載入成功後,就可以進行訪問控制操作。如果此時還有一個安全模塊要使用register_security()函數進行載入,則會出現錯誤,直到使用框架註銷後,下一個模塊才可以載入。

Linux安全模塊(LSM)提供了兩類對安全鉤子函數的調用:一類管理內核對象的安全域,另一類仲裁對這些內核對象的訪問。對安全鉤子函數的調用通過鉤子來實現,鉤子是全局表security_ops中的函數指針,這個全局表的類型是security_operations結構,這個結構定義在include/linux/security.h這個頭文件中。

通過對security代碼進行一番簡單的分析,LSM啟動過程流圖:

security_initcall只能調用selinux_init,smack_init ,tomoyo_init , yama_init 和apparmor_init中的一個,因為內核不允許多種安全機制同時一起工作。一旦一個安全模塊被載入,就成為系統的安全策略決策中心,而不會被後面的register_security()函數覆蓋,直到這個安全模塊被使用unregister_security()函數向框架註銷。

因此LSM框架下只能開啟一種安全機制,smack編譯進Linux內核的配置和要求:

(1)要求smack和selinux不能夠同時運行,不能同時存在於同一個運行中的內核;

查看內核是否開啟以下的功能(如果沒有則需要開啟):

CONFIG_NETLABEL=y

CONFIG_SECURITY=y

CONFIG_SECURITY_NETWORK=y

CONFIG_SECURITY_SMACK=y

CONFIG_SECURITY_SELINUX should not be

set

步驟:

make menuconfig

make modules_install

make install

查看/proc/filesystems

可以看到smackfs,說明smack已經編進內核

執行如下的命令:

mkdir -p /smack

在文件/etc/fstab添加下面的一行

smackfs /smack smackfs defaults 0 0

然後執行下面的命令:

mount –a

然後就體驗一下它的功能了:

1. 比如在用戶test的home目錄下(/home/test),新建文件夾 mkdir testdir

cd testdir/

touch testfile

2. 給新建的testfile 打上TheOther標籤

setfattr

--name=security.SMACK64 --value=TheOther testfile

查看其標籤

getfattr

--only-values -n security.SMACK64 -e text testfile

可以看到標籤TheOther

3. echo TheOne

2&>/dev/null &> /proc/self/attr/current,當前執行的進程默認都會被打為/proc/self/attr/current下的標籤

4.配置策略echo -n "TheOne TheOther r---"> /sma ck/load

因為當前進程只要是沒有特殊配置過的都被打為TheOne,所以當轉換到普通用戶test下,cat testfile是可讀的

5.現在我將當前進程打為NotTheOne ,echo NotTheOne 2&>/dev/null &>

/proc/self/attr/current

當轉換到普通用戶test下,cat testfile則變成不可讀的了

6.如果你想單獨對某個進程打標籤,而不是對當前進程打,就

attr -s security.SMACK64 -V TheOne /bin/cat

此時cat被標為TheOne,根據策略可以看出,當轉換到普通用戶test下,cat testfile是可讀的

若attr -s

security.SMACK64 –V Not TheOne /bin/cat

根據策略可以看出,當轉換到普通用戶test下,cat testfile是不可讀的

(需要說明的一點是,當cat本身被標上標籤和/proc/self/attr/current打入標籤共存時,cat本身的標籤生效,而/proc/self/attr/current打入標籤沒有生效)

希望對你有用~


忍不住來吐槽一下 lsm 這個sb貨!

1 register_security 不導出,那麼請問怎麼做成一個module? 搞不成module, 你還叫個毛線的lsm ?

2 register_security 只允許一個人註冊,你以為誰都要實現一套完整的安全機制,做個簡單的hook行不行? 要是不行, 你丫就放內核里自己玩兒就好了, 開個毛線的介面?

3 ungister 函數讓你們給吃了?

另外,最新的內核,又放開了多次註冊的機制, 是不是有病啊 ? 有本事別改啊? 改的話, 能不能全放開? 你馬丹的!


補充兩點。LSM(Linux Security Module,Linux安全模塊)雖然名稱叫模塊,但是很早就不再以內核模塊的形式存在了,它被強制要求編入內核。到底有多早呢?Linux自從2005年開始用git管理代碼,那時的版本是2.6.11,自那時起LSM就是編譯在內核中了。

LSM包含SELinux、SMACK、Tomoyo、AppArmor、loadpin和Yama。它們可以同時起作用了,不像以前,在運行中只能有一個起作用(Yama特殊,它可以和別的安全模塊共存)。這個變化是在Linux 4.3版上出現的。


1.kallsyms_lookup_name

2.關閉保護強行替換掉security_ops的指針

3.你要自行保證各安全模塊間的兼容性

至於lsm鉤子模塊的實現例子,高票答案已經說的很詳細了


推薦閱讀:

linux掛載機制,訪問父目錄的細節是怎樣的?
在Linux內核模塊中對空指針解引用,為什麼內核不掛?

TAG:Linux | 信息安全 | Linux內核 | 操作系統內核 |