應(yīng)用強(qiáng)制訪問控制管理網(wǎng)絡(luò)服務(wù)
與傳統(tǒng)的自主訪問控制不同,強(qiáng)制訪問控制具有更高的安全性。SELinux是強(qiáng)制訪問控制機(jī)制的一個代表,本文將介紹如何應(yīng)用該機(jī)制來管理網(wǎng)絡(luò)服務(wù)的文件系統(tǒng)訪問權(quán)限,并以Fedora 16下的SELinux為例進(jìn)行實例介紹。
一、強(qiáng)制訪問控制機(jī)制簡介
在傳統(tǒng)的訪問控制機(jī)制中,自主訪問控制模型占主導(dǎo)地位。使用自主訪問控制(discretionary access control,DAC)的系統(tǒng)可以讓資源的擁有者指定哪些主體可以訪問該資源。這種模型稱為“自主型”是因為對訪問的控制是由資源擁有者自主決定的。在DAC模型中,訪問根據(jù)授予用戶的權(quán)限來進(jìn)行限制,這意味著客體的擁有者有權(quán)指定對這些客體的訪問類型。如果一個組織采用了DAC模型,那么網(wǎng)絡(luò)管理員可以讓資源的擁有者控制哪些人可以訪問他們的文件。DAC模型中最常見的實現(xiàn)方式是訪問控制列表(access control list,ACL),這個列表由用戶指定,由操作系統(tǒng)實施。我們使用的大多數(shù)操作系統(tǒng)都是基于自主型訪問控制模型的,比如Windows、Macintosh和主流的Unix系統(tǒng)。
而在強(qiáng)制型訪問(mandatory access control,MAC)模型中,數(shù)據(jù)的擁有者沒有決定誰能訪問這些文件的權(quán)力,是由操作系統(tǒng)最后做出決定,并且可能會覆蓋數(shù)據(jù)擁有者的設(shè)置。這種模型更為結(jié)構(gòu)化并更加嚴(yán)格,一般基于安全標(biāo)簽系統(tǒng)來實現(xiàn)。用戶被賦予一個安全級別(秘密、機(jī)密、絕密等),且數(shù)據(jù)也被分成了多個類別。這種分類存儲在資源的安全標(biāo)簽里面。分類標(biāo)簽指明了用戶訪問一個文件時必備的可信級別。
當(dāng)系統(tǒng)接到一個客體訪問請求時,它根據(jù)主體的安全級別和客體的安全類別作出決策。主體如何訪問數(shù)據(jù)的規(guī)則由管理層制定,由管理員配置和管理,由操作系統(tǒng)來進(jìn)行實施,由安全技術(shù)支持。安全標(biāo)簽和各個客體附在一起,所以每一個文件、目錄和設(shè)備都有其自己的安全標(biāo)簽以及分類信息。一個用戶可能具有秘密(Secret)的訪問級別,他要訪問的數(shù)據(jù)具有絕密(Top Secret)的安全標(biāo)簽。這種情況下用戶會被拒絕訪問,因為他的安全級別不等于或低于客體的安全類別。目前,最常見的MAC系統(tǒng)是由美國國家安全局(NSA)和安全計算(Secure Computing)公司開發(fā)的SELinux。在較高版本的Linux發(fā)行套件中,如Red Hat Enterprise Linux(RHEL)5,RHEL6,F(xiàn)edora 1至Fedora 16等版本中,都包含對SELinux的支持。
二、如何啟動和關(guān)閉SELinux
使用SELinux的前提啟動它。啟動和禁用SELinux的步驟主要包括:1)修改其配置文件;2)執(zhí)行重啟。
首先需要介紹一下SELinux的主配置文件。主配置文件/etc/selinux/config控制系統(tǒng)下一次啟動過程中載入哪個策略,以及系統(tǒng)運行在哪個模式下,可以使用sestatus命令確定當(dāng)前SELinux的狀態(tài),下面顯示了一個config文件的例子:
SELinux模式(由上述例子中第6行的SELINUX選項確定):可以被設(shè)置為enforcing,permissive或disabled三種:
1) 在enforcing模式下,策略被完整執(zhí)行,這是SELinux的主要模式,應(yīng)該在所有要求增強(qiáng)Linux安全性的操作系統(tǒng)上使用。
2) 在permissive模式下,策略規(guī)則不被強(qiáng)制執(zhí)行,而只是進(jìn)行審核。除此之外,SELinux不會影響系統(tǒng)的安全性,這個模式在調(diào)試和測試一個策略時非常有用。
3) 在disabled模式下,SELinux內(nèi)核機(jī)制是完全關(guān)閉的,只有系統(tǒng)啟動時策略載入前系統(tǒng)才會處于disabled模式,這個模式和permissive模式有所不同。permissive模式不會拒絕任何訪問,只是進(jìn)行審核;而在disabled模式下,SELinux將不會有任何動作。特別地,在enforcing和permissive模式或disabled模式之間切換時要小心,當(dāng)返回enforcing模式時,通常會導(dǎo)致文件標(biāo)記不一致。SELinux配置文件中的模式設(shè)置由init使用,在它載入初始策略前配置SELinux使用。
以下是啟動SELinux的詳細(xì)步驟示意:
(1)編輯配置文件
根據(jù)上面的介紹,編輯確定SELinux的運行模式和活動策略(見下面配置文件中的黑體部分)即可:
(2)使用getenforce命令和sestatus命令查看SELinux的運行模式和詳細(xì)上下文信息:
#/usr/sbin/getenforce
#/usr/sbin/sestatus
(3)使用root用戶身份重啟系統(tǒng)即可:
#reboot
同理,禁用SELinux的步驟就是在編輯配置文件時設(shè)為“SELINUX=diabled”。
三、使用SELinux策略目錄
如上述的例子中,SELinux配置文件中的SELINUXTYPE選項告訴init在系統(tǒng)啟動過程中載入哪個策略,這里設(shè)置的字符串必須匹配用來存儲二進(jìn)制策略版本的目錄名,例如,用戶使用MLS(Multi-Level Security,多級安全)策略,因此用戶設(shè)置SELINUXTYPE=MLS,確保用戶想要內(nèi)核使用的策略在/etc/selinux/config文件中。在上述例子中,活動策略默認(rèn)為目標(biāo)策略(targeted),由第10行給出所示。
SELinux系統(tǒng)上安裝的每個策略在/etc/selinux/目錄下都它們自己的目錄,子目錄的名字對應(yīng)于策略的名字(如,strict,targeted,refpolicy等),在SELinux配置文件中就要使用這些子目錄名字,告訴內(nèi)核在啟動時載入哪個策略,在本章中提到的所有路徑都是相對域策略目錄路徑/etc/selinux/[policy]/的,圖1是在最新的Fedora 16系統(tǒng)上/etc/selinux/目錄的簡單列表輸出:
圖1 /etc/selinux/目錄的簡單列表輸出
如上面所看到的,在系統(tǒng)上安裝了一個策略目錄:targeted。注意目錄和策略子目錄都用selinux_config_t類型進(jìn)行標(biāo)記的。
semodule和semanage命令管理策略的許多方面,semodule命令管理可載入策略模塊的安裝、更新和移除,它對可載入策略包起作用,它包括一個可載入策略模塊和文件上下文消息,semanage工具管理添加、修改和移除用戶、角色、文件上下文、多層安全(MLS)/多范疇安全(MCS)轉(zhuǎn)換、端口標(biāo)記和接口標(biāo)記,關(guān)于這些工具的更多信息在它們的幫助手冊中。
每個策略子目錄包括的文件和文件如何標(biāo)記必須遵守一個規(guī)范,這個規(guī)范被許多系統(tǒng)實用程序使用,幫助管理策略,通常,任何設(shè)計優(yōu)良的策略源樹都將正確安裝策略文件,下面是targeted策略目錄的列表輸出,它就是一個典型,如圖2所示:
如上所示:一個正在運行的系統(tǒng)不需要src/目錄,它包括了安裝的策略源樹,要么是示例策略,要么是應(yīng)用策略源樹,實際上單片二進(jìn)制策略文件存儲在.policy/目錄中的policy.[ver]文件中,這里的[ver]就是策略二進(jìn)制文件的版本號,如policy.19,這就是系統(tǒng)啟動時載入內(nèi)核的文件。
四、管理網(wǎng)絡(luò)服務(wù)的文件系統(tǒng)訪問權(quán)限
在SELinux中,有一個非常重要的概念稱為布爾變量,它通常用來在運行時改變SELinux的部分策略,而不需要重新定義和改寫策略文件。并且,這些布爾變量在很大程度上也與許多網(wǎng)絡(luò)服務(wù)的訪問權(quán)限相關(guān),比如對網(wǎng)絡(luò)文件系統(tǒng)(NFS)的訪問,對FTP的訪問等等。
1.布爾變量的羅列和配置
通過列出系統(tǒng)中的布爾變量,可以知道與布爾變量相關(guān)的策略的開關(guān)情況(on或者是off狀態(tài)),從而知道相關(guān)網(wǎng)絡(luò)服務(wù)的訪問權(quán)限狀態(tài)。可以使用如圖3命令進(jìn)行羅列:
圖3 查看系統(tǒng)布爾變量
上述結(jié)果中的SELinux boolean列列出了系統(tǒng)中的布爾變量名稱,Description列則給出了該布爾變量的開關(guān)狀態(tài)。比如,如下的布爾變量表示的意思是阻止ftp用戶訪問用戶目錄:
ftp_home_dir -> 關(guān) Allow ftp to read and write files in the user home directories
如下命令可以僅僅給出布爾變量的開關(guān)狀態(tài),而不給出他們的具體描述信息,如圖4所示:
#/usr/sbin/getsebool –a
圖4 顯示布爾變量的開關(guān)狀態(tài)
并且,通過該命令可以查看具體的布爾變量(一個或者多個)的開關(guān)狀態(tài)信息,如下所示:
#/usr/sbin/getsebool allow_console_login
#/usr/sbin/getsebool allow_console_login allow_cvs_read_shadow
使用setsebool命令可以設(shè)置布爾變量(改變其開關(guān)狀態(tài))。下面給出具體的例子來對其進(jìn)行詳細(xì)介紹,該例子表明如何來對httpd_can_network_connect_db布爾變量來進(jìn)行狀態(tài)設(shè)置,該布爾變量控制httpd服務(wù)器進(jìn)程能否連接后臺數(shù)據(jù)庫系統(tǒng):
(1)使用getsebool命令查看該布爾變量的缺省狀態(tài),表明該變量的缺省狀態(tài)是off,即不允許httpd進(jìn)程訪問后端數(shù)據(jù)庫服務(wù)器:
# /usr/sbin/getsebool httpd_can_network_connect_db
httpd_can_network_connect_db --> off
(2)使用setsebool命令改變該布爾變量的狀態(tài),從而使得httpd進(jìn)程能夠訪問數(shù)據(jù)庫服務(wù)器:
#/usr/sbin/setsebool httpd_can_network_connect_db on
改變成功后,可以繼續(xù)使用getsebool命令進(jìn)行查看:
#/usr/sbin/getsebool httpd_can_network_connect_db
(3)上述狀態(tài)改變只是暫時性的,一旦系統(tǒng)重啟,該變量狀態(tài)將改變回初始狀態(tài),因此,可以使用如下命令永久性改變狀態(tài):
#/usr/sbin/setsebool -P httpd_can_network_connect_db on
2.網(wǎng)絡(luò)服務(wù)對于文件系統(tǒng)的訪問權(quán)限管理
對于大多數(shù)網(wǎng)絡(luò)服務(wù)來說,各種網(wǎng)絡(luò)服務(wù)缺省情況下都能使用具有各自的服務(wù)類型的文件,比如nfs服務(wù)可以使用nfs_t類型的文件,samba服務(wù)可以使用cifs_t類型的文件。然而,由于NFS和CIFS這兩個共享文件系統(tǒng)的特殊性,HTTP服務(wù)和FTP服務(wù)都不能使用標(biāo)記這兩個文件系統(tǒng)類型的文件,因此,在實際使用過程中,用戶需要對控制他們的布爾變量進(jìn)行顯式的狀態(tài)修改,如下所示:
(1)對于Apache HTTP服務(wù)器
允許訪問NFS文件系統(tǒng),需要運行如下命令,修改布爾變量:
#/usr/sbin/setsebool –P httpd_use_nfs on
允許訪問Samba文件系統(tǒng),需要運行如下命令,修改布爾變量:
#/usr/sbin/setsebool –P httpd_use_cifs on
(2)對于Samba服務(wù)
允許共享NFS文件系統(tǒng)的文件,需要運行如下命令,修改布爾變量:
#/usr/sbin/setsebool –P samb_share_nfs on
(3)對于FTP服務(wù)器
允許訪問NFS文件系統(tǒng),需要運行如下命令,修改布爾變量:
#/usr/sbin/setsebool –P allow_ftpd_use_nfs on
允許訪問Samba文件系統(tǒng),需要運行如下命令,修改布爾變量:
#/usr/sbin/setsebool –P llow_ftpd_use_cifs on
(4)對于其他服務(wù)
可以使用如下命令來查找相關(guān)的布爾變量并根據(jù)上述的例子進(jìn)行同樣修改即可:
查找與NFS相關(guān)的布爾變量:
#/usr/sbin/semanage boolean –l | grep nfs
查找與Samba相關(guān)的布爾變量:
#/usr/sbin/semanage bo
【編輯推薦】