實現系統安全的策略
在Linux中,一切且為文件,實現系統安全的策略主要可分為兩種:基于inode
的安全、基于文件路徑的安全。
基于inode的安全
為文件引入安全屬性,安全屬性不屬于文件內容,它是文件的元數據,應該與inode
關聯,一些內核安全模塊將安全屬性存儲在文件的擴展屬性中,這種方式就是基于inode
的安全。基于inode
的安全的優點主要有兩個:
- 文件的安全屬性與文件路徑無關。文件可以在不同目錄間移動,不管它怎么移動,其安全屬性都沒有變化。
- 同一個文件可以有多個鏈接,從不同鏈接訪問文件,其安全屬性總是一樣的。
基于inode
的安全的缺點是:
- 文件系統必須支持擴展屬性,并且掛載文件系統時必須使用擴展屬性。
- 刪除文件時,文件的安全屬性會隨之消失。再在原來的路徑處創建同名文件,并不能保證新文件和老文件的安全屬性相同。
- 安裝軟件和升級軟件需要保證系統中新的文件具有正確的安全屬性。新文件來自軟件包,新的安全屬性自然也應該來自軟件包。于是就有了下一個要求:眾多軟件包格式也需要支持文件的擴展屬性,比如tar、cpio等。
基于inode
的安全實現策略有SELinux、SMACK等。
基于路徑的安全
從用戶角度看,用戶通過路徑訪問文件,用戶態進程無法用inode
號來訪問文件。即使是基于inode
的安全,用戶讀寫安全屬性也需先通過路徑找到文件,然后才能訪問文件的安全屬性。那么能否將文件的安全屬性簡單地與文件路徑對應起來呢?比如/bin/bash
的安全屬性是“system-shell
”,/usr/local/bin/bash
的安全屬性是“local-shell
”。不把這些安全屬性存儲在文件的擴展屬性中,而是存儲在系統內部的一張表里,這就是基于路徑的安全的實現原理。這樣做的優點是:
- 不需要文件系統有額外支持。
- 不怕文件更新,對打包格式也沒有額外要求。用戶甚至可以為還不存在的文件定義安全屬性。
基于路徑的安全的缺點是:同一個文件可能有多個安全屬性,簡單地創建鏈接就可能讓文件擁有另一個安全屬性。
基于路徑的安全實現策略實現有Tomoyo、AppArmor等。
對文件讀取的安全策略
實現對文件讀取的安全策略也有兩種,一種是使用file_permission
鉤子函數,另一種是使用inode_permission
鉤子函數。它們的區別如下:
inode_permission
和 file_permission
都與文件系統中的權限有關,但是它們的作用和范圍不同。
inode_permission
是指針對文件 inode
的權限控制,而 file_permission
則是針對打開的文件描述符的權限控制。
當一個文件被創建時,系統為其分配一個 inode
(inode
存儲了文件的元數據,如訪問時間、修改時間、權限等信息),在對該文件進行權限控制時,操作系統會檢查進程是否有訪問該文件 inode
的權限,如果權限不足則拒絕訪問。這部分的權限控制由inode_permission
完成。
而開發者在使用系統調用(如 open
、read
、write
等)打開文件時可以得到一個文件描述符,通過該描述符可以對打開的文件進行操作。在這里,系統會檢查該進程是否有訪問該文件描述符所代表的文件的權限,并在權限不足的情況下拒絕訪問。這部分的權限控制就是由 file_permission
完成的。
因此,inode_permission
和 file_permission
雖然都是與權限有關,但是控制的范圍不一樣。inode_permission
主要關注于文件所在的 inode
層面,而 file_permission
則關注于打開的文件描述符層面,它們協同工作來保證文件的安全性。