天天看點

SELinux初學者指南

SELinux(Security Enhanced Linux)是美國國家安全局2000年釋出的一種進階MAC(Mandatory Access Control,強制通路控制)機制,用來預防惡意入侵。SELinux在DAC(Discretionary Access Control,自主通路控制)的基礎上實作了強制通路控制,比如讀、寫和執行權限。

SElinux有三種模式,分别是Enforcing, permissive, disabled。

1. Enforcing,強制模式。該模式下會基于policy規則拒絕某些通路。

2. Permissive寬容模式。

3. Disabled,該模式下會關閉SELinux。

修改模式的預設配置檔案為/etc/selinux/config。

改變SELinux模式

setenforce 1 設定SELinux 成為enforcing模式

setenforce 0 設定SELinux 成為permissive模式

運作$ getenforce可以看到目前運作模式:

$ getenforce      

運作下面的指令切換到Permissive 模式

$ setenforce 0      

運作下面指令從permissive模式切換到enforcing模式

$ setenforce 1      

如果想要關閉SELinux,可以通過配置檔案修改。

$ vi /etc/selinux/config
SELINUX=disabled      

配置Selinux

每個檔案或程序用SELinux上下文環境上下文環境中含有SELinux使用者、角色、類型等額外的資訊。如果第一次開啟SELinux,需要配置上下文環境和标簽。配置修複label和上下文環境的過程叫做relabeling。在relabeling時,首先要切換到permissive模式。

$ vi /etc/selinux/config
SELINUX=permissive      

模式切換到permissive時,會在目錄/directory下建立一個隐藏的名為autorelabel的檔案。

$ touch /.autorelabel      

重新開機機器

$ init 6      

注:選擇用permissive模式而不是enforcing模式的原因是,enforcing模式下進行relabeling可能會造成系統奔潰。

Relabeling完成且系統重新開機後,可以更改到enforcing模式,并運作

$ setenforce 1      

這樣就成功地配置并開啟SELinux了。

監控日志

為了確定SELinux的正常運作,需要對日志進行監控。SELinux的日志檔案儲存在/var/log/audit/audit.log,日志檔案中有很多條記錄,但是檢查錯誤資訊時不需要閱讀全部日志,有一個簡單的工具是audit2why,運作下面的指令

$ audit2why < /var/log/audit/audit.log      

輸出檔案就是錯誤資訊。如果沒有錯誤,那麼就不會有輸出。

設定Selinux政策

SELinux政策是指導SELinux安全引擎的規則集。政策定義了特殊上下文環境下的規則集,下面是改變政策來允許對拒絕的服務的通路。

1. Booleans

Booleans允許運作時對政策進行改變而不需要寫政策。這允許在不重新加載或者編譯SELinux政策的同時,實作變化。

例1:

如果想要通過FTP分享使用者home目錄的讀寫權限,我們已經分享了該目錄,但是嘗試通路時看不到該目錄。這是因為SELinux政策阻止了FTP守護程序在使用者Home目錄進行讀寫。我們需要對SELinux政策進行改變,這樣FTP就可以通路home目錄了。我們利用Booleans來完成這個功能。

$ semanage boolean –l      

該指令會生成一系列可用的Booleans和對應的實時狀态和描述。可以通過grep指令找出關于ftp的結果:

$ semanage boolean –l | grep ftp
ftp_home_dir -> off 允許ftp在使用者目錄下進行讀寫狀态      

則是off的狀态,我們用setsebool來開啟

$ setsebool ftp_home_dir on      

現在ftp守護程序就可以通路使用者的Home目錄了。

getsebool -a也可以擷取可用的Booleans清單,但是不會顯示Boolean的描述。

2. Labelling &Context

這是在伺服器上實施SElinux政策的最常用方法。每個檔案、檔案夾、程序、端口都被SELinux context标記。

對于檔案和檔案夾,标簽是以檔案系統的擴充屬性存儲的,可以通過下面的指令進行檢視

$ ls –Z /etc/httpd      

對于程序和端口,kernel負責管理标簽,同樣地,可以通過下面的指令檢視對應的标簽:

$ ps –auxZ | grephttpd (for process)
$ netstat –anpZ | grephttpd (for port)      

例2:

我們有一個web伺服器,檔案目錄是/home/dan/html而不是預設的/var/www/html,這樣SELinux就會認為違反了政策,這樣就不能通路web頁面。這是因為還沒有設定與html檔案相關的安全上下文環境。可以用下面的指令來檢查html檔案的預設安全上下文環境;

$ ls –lz /var/www/html
 -rw-r—r—. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/      

上面就是我們得到的html檔案的安全上下文環境httpd_sys_content_t。同時需要設定目前目錄 安全上下文環境為–rw-r—r—. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/。

另一個檢查檔案或者目錄的安全上下文環境的指令為:

$ semanage fcontext -l | grep ‘/var/www’      

當我們找到正确的安全上下文環境時,semanage指令同樣可以用來改變安全上下文環境。可以用下面的semanage指令來改變/home/dan/html的安全上下文環境:

$ semanage fcontext -a -t httpd_sys_content_t ‘/home/dan/html(/.*)?’
$ semanage fcontext -l | grep ‘/home/dan/html’
/home/dan/html(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
$ restorecon -Rv /home/dan/html      

一旦semange操作改變了安全上下文環境,restorecon就會加載檔案和目錄的預設上下文環境。Web伺服器就可以從/home/dan/html檔案夾讀取檔案,同時,檔案的安全上下文環境就變成http_sys_content_t了。

3. 建立本地政策

如果上面的通路不能生效,而且audit.log中出現錯誤消息。當這種情況出現的話,我們需要建立本地政策來解決那些錯誤資訊。同時,可以用上面提到的audit2why檢視錯誤資訊。當擷取錯誤後,就可以建立本地政策(Local policy)來解決這些錯誤。比如,我們擷取了httpd或smbd錯誤,我們可以用grep查找錯誤資訊,并建立安全政策。

$ grep httpd_t /var/log/audit/audit.log | audit2allow -M http_policy (for apache)
$ grep smbd_t /var/log/audit/audit.log | audit2allow -M smb_policy (for samba)      

下面的http_policy和smb_policy是本地政策的名字。現在我們必須加載那些建立的本地政策到目前SELinux政策中,可以用semodule指令完成這個功能。

$ semodule –I http_policy.pp
$ semodule –I smb_policy.pp      

這樣本地政策就加載了,audit.log中也就不會有錯誤資訊了。

原文釋出時間為:2018-05-30

本文來自雲栖社群合作夥伴“

嘶吼網

”,了解相關資訊可以關注“

”。

繼續閱讀