一篇文章了解Linux操作系統(tǒng)的權(quán)限管理
我們在Linux系統(tǒng)下面部署一些軟件的時候,總是習(xí)慣性的將SELinux關(guān)閉。很多人用了幾年Linux操作系統(tǒng)了,知道SELinux是安全相關(guān)的,卻說不出更多細(xì)節(jié)來。您知道SELinux具體是做什么的嗎?
Linux操作系統(tǒng)是一個多用戶操作系統(tǒng),這樣就存在資源共享與隔離的問題。也就是說用戶A的資源不愿意讓用戶B訪問,用戶C的資源與用戶D的資源可以共享;同時,又存在超級用戶訪問所有用戶資源的可能性。因此在Linux操作系統(tǒng)下就需要一套權(quán)限管理的功能。
Linux原生的權(quán)限管理機(jī)制是基于用戶角色的管理機(jī)制,也就是UGO+RWX/ACL權(quán)限控制。其中UGO是User、Group和Other的簡稱;RWX則是Read、Write和eXecute的簡稱;ACL是Access Control List的簡稱。Linux原生的訪問控制稱為自主訪問控制。
自主訪問控制(Discretionary Access Control, DAC)是指對象(比如程序、文件、進(jìn)程)的擁有者可以任意修改或者授予此對象相應(yīng)的權(quán)限。這里的擁有者就是指具體的用戶,也就是角色(例如root)。這種控制方式的問題在于黑客入侵后可以以該用戶的角色執(zhí)行任何允許的操作。
另外一種訪問控制策略是基于標(biāo)簽的訪問控制。比如我們給程序和其訪問的資源打上標(biāo)簽,這樣程序就可以訪問有標(biāo)簽的資源,對于沒有標(biāo)簽的資源則不能訪問。這種模式并非基于用戶,而是基于許可。這種策略被稱作強(qiáng)制訪問控制(Mandatory Access Control ,簡稱MAC)。其中SELinux就是強(qiáng)制訪問控制。
一、RWX訪問控制概述
RWX訪問控制恐怕是我們見得最多的訪問控制了。當(dāng)我們通過ls命令獲取文件的詳細(xì)信息時,其前面的rwx字符串就是對文件權(quán)限的標(biāo)示,而后面跟的root root則是其所屬用戶和組的信息。如圖1就是RWX的一個實(shí)例。
RWX的組成及含義如圖2所示。整個權(quán)限描述分為4段,第一段用于描述該文件的類型,可以是常規(guī)文件(-)、目錄(d)、塊設(shè)備(b)、鏈接(l)和字符設(shè)備(c)等等。
后面三段是文件具體的權(quán)限描述信息了,分別是文件主權(quán)限、組用戶權(quán)限和其它用戶的權(quán)限。通過上述三段的組合就可以實(shí)現(xiàn)比較復(fù)雜的權(quán)限控制。比如允許某個用戶的文件可以被其它用戶讀,但是不可以改寫和執(zhí)行等等。
上述權(quán)限控制信息中包含rwx-四種字符,具體含義如下:
- r表示對于該用戶可讀,對于文件來說是允許讀取內(nèi)容,對于目錄來說是允許讀取其中的文件;
- w表示對于該用戶可寫,對于文件來說是允許修改其內(nèi)容,對于目錄來說可以寫信息到目錄中,即可以創(chuàng)建、刪除文件、移動文件等操作。
- x表示對于該用戶可執(zhí)行,對于文件來說就是可以執(zhí)行該文件,對于目錄來說則是可以進(jìn)入目錄;可以搜索(能用該目錄名稱作為路徑名去訪問它所包含的文件和子目錄)
從用戶角度來說文件的權(quán)限是通過rwx字符串表示的,其實(shí)在底層實(shí)現(xiàn)就是一些標(biāo)示位。如果該位置1則表示有該權(quán)限,否則沒有該權(quán)限。這些信息保持在文件的inode信息中。
上圖中的宏定義就是Linux內(nèi)核中對文件權(quán)限屬性的宏定義,例如S_IRUSR表示主權(quán)限可讀的標(biāo)示。這里需要理解的是每個標(biāo)示占用一個位,本文暫時不過多介紹,這里先有個概念就可以了。
我們經(jīng)常使用的chmod和chown等命令就是用來修改文件的訪問權(quán)限信息的。其中chmod用于修改文件權(quán)限熟悉,而chown則用于修改文件所屬的用戶和組。
例如我們想讓文件b具有執(zhí)行權(quán)限,那么可以執(zhí)行如下命令:
- sudo chmod +x b
執(zhí)行后結(jié)果如圖4所示,可以對比圖中上下兩部分,看到文件b的權(quán)限熟悉發(fā)生了變化。其中增加了可執(zhí)行屬性。
由于底層是二進(jìn)制的方式存儲的,chmod也是支持通過數(shù)字的方式修改其權(quán)限屬性的。比如執(zhí)行如下命令:
- sudo chmod 777 b
由于777其實(shí)就是使所有的RWX為1,也即可以被任何用戶和組訪問。執(zhí)行效果如下。
關(guān)于RWX的權(quán)限訪問控制就先介紹到這里,后續(xù)我們在詳細(xì)介紹,并且介紹在內(nèi)核中是如何實(shí)現(xiàn)的。
二、SELinux訪問控制概述
SELinux是另外一種訪問控制機(jī)制,它并非通過角色,而是通過標(biāo)簽的方式實(shí)現(xiàn)對主體與被訪問對象的控制。這句話可能不太容易理解,比如對于Apache進(jìn)程想訪問某個目錄下的文件,那么需要對Apache進(jìn)程和該目錄都打上標(biāo)簽,并且標(biāo)注其可訪問性。這樣Apache進(jìn)程才可以訪問該目錄。
文章《Linux下SELinux卡通圖解,豁然開悟》通過卡通的方式介紹了該機(jī)制的原理,非常形象生動。如果對上文的解釋還是稀里糊涂,那么推薦看看這篇文章。
SELinux通常并非默認(rèn)打開的,如果使用該特性需要我們手動打開。當(dāng)然,SELinux已經(jīng)為我們做了很多事情了,通常情況下打開后就可以使用,并不需要我們做更多的事情。如果想實(shí)時打開SELinux,直接執(zhí)行如下命令即可。
- setenforce 1
但如果想永久生效,則需要修改SELinux的配置文件。修改起來也非常簡單,只需要修改圖中紅色方框一行的內(nèi)容即可。
上圖中,將disabled修改為enforcing就可以使SELinux永久生效(需重啟系統(tǒng))。另外一個參數(shù)是permissive,該參數(shù)的含義是只記錄日志,不進(jìn)行實(shí)際的控制。
最下面一行參數(shù)表示該SELinux使用的規(guī)則庫。SELinux默認(rèn)定義了很多規(guī)則庫,所以通常情況下,我們只需要開啟就可以了。但是有時候也并非如此,此時就需要根據(jù)情況定義自己的規(guī)則(策略,policy)。
SELinux的原理也是比較簡單的,其核心是規(guī)則庫(Policy Database)。當(dāng)有進(jìn)程訪問資源(例如文件,或者套接字)時,內(nèi)核中的接口中會通過規(guī)則庫中的數(shù)據(jù)進(jìn)行匹配,如果滿足要求,則放行;否則阻止訪問,并記錄審計(jì)日志。