想實現一個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鉤子模塊的實現例子,高票答案已經說的很詳細了推薦閱讀: