用戶在執行系統調用時,先經過原有的內核接口依次執行功能性的錯誤檢查,接着進行傳統的DAC檢查,並在即將訪問內核的內部對象以前,經過LSM鉤子函數調用LSM。LSM再調用具體的訪問控制策略來決定訪問的合法性。訪問控制總體構架:安全
LSM框架下訪問決策模塊包括selinux,smack,tomoyo,yama,apparmor.app
每一個決策模塊都是經過各自的XXX_init函數調用register_security()函數,註冊到LSM框架的模塊被加載成功後,就能夠進行訪問控制操做。若是此時還有一個安全模塊要使用register_security()函數進行加載,則會出現錯誤,直到使用框架註銷後,下一個模塊才能夠載入。框架
Linux安全模塊(LSM)提供了兩類對安全鉤子函數的調用:一類管理內核對象的安全域,另外一類仲裁對這些內核對象的訪問。對安全鉤子函數的調用經過鉤子來實現,鉤子是全局表security_ops中的函數指針,這個全局表的類型是security_operations結構,這個結構定義在include/linux/security.h這個頭文件中。函數
經過對security代碼進行一番簡單的分析,LSM啓動過程流圖:spa
security_initcall只能調用selinux_init,smack_init ,tomoyo_init , yama_init 和apparmor_init中的一個,由於內核不容許多種安全機制同時一塊兒工做。一旦一個安全模塊被加載,就成爲系統的安全策略決策中心,而不會被後面的register_security()函數覆蓋,直到這個安全模塊被使用unregister_security()函數向框架註銷。.net
所以LSM框架下只能開啓一種安全機制,smack編譯進Linux內核的配置和要求:
指針
(1)要求smack和selinux不可以同時運行,不能同時存在於同一個運行中的內核;orm
查看內核是否開啓如下的功能(若是沒有則須要開啓):對象
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打入標籤沒有生效)