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