centos7的selinux的原理及相關配置

           centos7的selinux的原理及相關配置


SELinux的全稱是Security Enhanced Linux, 就是安全加強的Linux。在SELinux之前,root賬號能夠任意的訪問所有文檔和服務;如果某個文件設爲777,那麼任何用戶都可以訪問甚至刪除;這種方式稱爲DAC(主動訪問機制),很不安全。

DAC 自主訪問控制: 用戶根據自己的文件權限來決定對文件的操作,也就是依據文件的own,group,other/r,w,x權限進行限制。Root有最高權限無法限制。r,w,x權限劃分太粗糙。無法針對不同的進程實現限制。

SELinux則是基於MAC(強制訪問機制),簡單的說,就是程序和訪問對象上都有一個安全標籤(即selinux上下文)進行區分,只有對應的標籤才能允許訪問。否則即使權限是777,也是不能訪問的。

在SELinux中,訪問控制屬性叫做安全上下文。所有客體(文件、進程間通訊通道、套接字、網絡主機等)和主體(進程)都有與其關聯的安全上下文,一個安全上下文由三部分組成:用戶(u)、角色(r)和類型(t)標識符。但我們最關注的是第三個部分

當程序訪問資源時,主體程序必須要通過selinux策略內的規則放行後,就可以與目標資源進行安全上下文的比對,若比對失敗則無法存取目標,若比對成功則可以開始存取目標,最終能否存取目標還要與文件系統的rwx權限的設定有關。所以啓用了selinux後出現權限不符的情況時,你就得一步一步的分析可能的問題了。

以上簡單瞭解即可,下面的是要重點掌握的

.selinux的狀態查看與配置

    Selinux的配置文件位置:/etc/selinux/config,它還有個鏈接在/etc/sysconfig/selinux

使用config文件來配置selinux(通過配置文件修改selinux的狀態屬於永久修改,要重啓系統才生效)

   查看selinux的配置文件/etc/selinux/config 或者他的鏈接文件 /etc/sysconfig/selinux/

wKiom1kcBeDwOW1lAAL4mMLGOeM922.jpg

  通過配置文件修改的selinux的狀態屬於永久修改,要重新啓動服務才能生效

  wKioL1kcBgCykzjZAAuL6Jonc5M852.jpg

SELINUX=enforcing
#此項定義selinux狀態。
#enforcing—是強制模式系統受selinux保護。就是你違反了策略,你就無法繼續操作下去
#permissive—是提示模式系統不會受到selinux保護,只是收到警告信息。
permissive就是Selinux有效,但是即使你違反了策略的話它讓你繼續操作,但是把你的違反的內容記錄下來(警告信息)
#disabled—禁用selinux。
SELINUXTYPE=targeted
#此項定義selinux使用哪個策略模塊保護系統。targeted只對apache ,sendmail,bind,postgresql,nfs,cifs等網絡服務保護。

以上策略配置都放置在/etc/selinux目錄中,目錄和策略名稱相同


1.使用selinux的相關命令查看和修改狀態:(屬於立即生效但臨時性的

a、sestatus 查詢selinux工作狀態

wKiom1kcBlvCi64RAAY3nJIskvQ035.jpg

b、selinuxenabled檢查selinux是否開啓,配合echo $?.傳回值是0爲開啓,1爲關閉.

wKiom1kcBnHjFUVCAAKXOObTH6w853.jpg

c、getenforce查看selinux的狀態

wKiom1kcBoDDPw7hAAF0WDwofbY638.jpg

d、setenforce設定selinux運行狀態,1開啓(Enforcing),0關閉(Permissive)

wKiom1kcBpnza8eVAAGOWNGhz_4511.jpg

2、查看安全上下文相關命令

a.查看文件上下文可以通過ls -Z

wKioL1kcBrLRbEKdAAH4IFwiumg918.jpg

b.查看進程上下文可以使用ps Z

wKioL1kcBr7DB6YBAAMOQFEW7es520.jpg

c.查看用戶上下文可以用id –Z

wKioL1kcBs-gdtqaAAGGsCEEcJ8064.jpg

安全上下文以用戶:角色:類型(域)標識符的形式出現.(這裏的用戶指的是selinu用戶)


 

3、以下是複製和移動文件時安全上下文的變化:


以httpd爲例,這個httpd的進程可以訪問/var/www/html下的文檔對象在一個直接創建到網站的根目錄下,另一個創建在root下,然後用mv命令移動到網站的

wKioL1kcBvDTkjB4AAKT_C7BW_4135.jpg

查看html目錄下文件的安全上下文

wKioL1kcBwCRNxllAANz-DQ81F8412.jpg

通過上圖可以看到剪切操作時文件的上下文沒有發生改變,仍然是原上下文,而複製操作時文件的上文繼承了目標目錄的上下文。通過瀏覽器訪問這兩個網頁文件

wKiom1kcBxbDuw5qAAbzFP8V1SE333.jpgwKioL1kcBzehhLZEAAltKJrSqlA317.jpg

可以看到lala.html頁面能訪問而haha.html卻被拒絕訪問

查看權限發現apache用戶對這兩個文件都具有r權限,但haha.html文件卻拒絕訪問。

wKiom1kcB3ajnAZsAAMIMJ0EiWc710.jpg

原因就是因爲httpd進程不能訪問域類型標籤是admin_home_t的資源,被selinux將訪問拒絕了。

查看日誌/var/log/audit/audit.log 通過日誌記錄也能看到haha.html文件拒絕httpd進程訪問。


wKiom1kcB4WiOU-5AAO3IKvrdfQ892.jpg由於此文件記錄的信息很多不宜直接查看,可以藉助audit2why和audit2allow

#audit2why</var/log/audit/audit.log

wKioL1kcB_Sgzs5uAAqb_Ln29dM174.jpg

注:提供audit2why和audit2allow工具軟件包

wKiom1kcCBLhGKQ8AALDCD9dgiI919.jpg

收集Selinux產生的日誌,另一個工具是setroubleshoot,對應的軟件包爲

wKiom1kcCCqy9R5tAAHpgKdS180027.jpg

Setroubleshoot將錯誤信息寫入/var/log/messages

#tail/var/log/messages | grep setroubleshoot

wKiom1kcCEaA1SIOAAsfUCBG70E300.jpg

上面的錯誤信息大概說的是”selinux阻止httpd訪問這個文件,要查看完整的信息,請執行sealert命令”

wKioL1kcCF7hCeRhAAFX0PXTlts400.jpg 

可以用sesearch [--allow] [-s 主體類別] [-t 目標類別] [-b]查詢詳細規則

sesearch命令由下列軟件包提供

 wKiom1kcCG_jTRPjAAMuvKvBSaY387.jpg

找出目標資源類別爲httpd_sys_content_t的相關信息

 wKioL1kcCIOAd51PAAFljPgYtPQ798.jpg

wKioL1kcCLSCpdBCAAlCONUlrlk668.jpg

 

從上圖顯示信息表示[allow 主體程序安全上下文類別 目標資源安全上下文類別],說明這個資源類別可以被哪個主體程序類別所讀取。

找出主體程序爲httpd_t相關的所有信息

 

wKiom1kcCOXRKwF2AAHKEPt8d6Y837.jpg


 

從上面的數據就可以看出程序httpd_t爲個類別可以訪問的哪些資源類別。

如何解決上述問題呢?解決方法就是更改test2.html文件的上下文。有兩種方式,一種是通過restorerecon( restore context) 修復繼承當前目錄默認的上下文;一種是通過chcon (change context) 修改當前的上下文。

a.使用restorerecon( restore context) 修復繼承當前目錄默認的上下文

分兩步實現:

首先爲 /var/www/html 這個目錄下的所有文件添加默認標籤類型:

semanagefcontext  -a  -t httpd_sys_content_t  '/var/www/html(/.*)?' 

因爲html目錄的默認標籤類型就是httpd_sys_content_t,所以此步可以省略

然後用新的標籤類型標註已有文件:

restorecon -Rv /var/www/html/, 之後httpd就可以訪問該目錄下的文件了。

wKiom1kcCObTSXr2AAPMLH7wM-U974.jpg

wKiom1kcCRTyM4SEAAhLGHyI0pI428.jpg

semanage和restorecon命令是由下列軟件包提供的

 wKiom1kcCVGRop27AANYHIOuWQo491.jpg

b.使用chcon (change context) 修改當前的上下文

 wKioL1kcCWjwDHpjAAGaJK8jsmo727.jpg

注:

chcon意思是change context 

    -t type 類型

    -R recursive 遞歸(特別適用於改變某個目錄下所有文件的context) 

    -u user 

    -r role

 

--reference表示用lala.html文件的上下文修改haha.html文件的上下文。

wKioL1kcCZex2mKhAAIlgCvHUjI966.jpg

最後再看一個概念,SELinux的布爾值。這個布爾值類似一個開關,打開的話,他對應的一些服務就允許執行,否則的話就拒絕執行。

看看有哪些布爾值

 wKioL1kcCaviWq6WAAEMWLQanrQ196.jpgwKioL1kcCb_SVmPLAARu-FP4HTU330.jpg

也可用semanage命令#semanageboolean –l

知道了布爾值的名字,可以通過sesearch 來確認他關聯了哪些服務的域,比如httpd_enable_homedir允許下列規則,如果設置爲off的話,那麼他們都是無法訪問的。

 wKioL1kcCfDAnzRuAAGLtLQ4lHk086.jpgwKioL1kcCgThPPwhAAdLDJJ_kFw484.jpg

設置boolean值,-P爲設置永久生效.

#setsebool [-P] 布爾值  on/off

下面看一個與布爾值有關的例子

確認已經啓用了 Selinux、啓動 FTP:

 wKiom1kcCiaSvqdjAAjW3Bp7yeo191.jpg

在匿名訪問目錄下創建 2 個文件進行測試,一個是在該目錄下手動創建,這樣

該文件會自動繼承/var/ftp/pub 下的目錄上下文的值,一個用 mv 命令從 root 目錄下移

動過來,這樣的文件會保留 root 目錄下的安全上下文,如下

 wKiom1kcCkHw967mAAYkIFpVlF8334.jpg

使用匿名登錄測試:

 wKioL1kcClqBSbCJAA4HYM5b6vI016.jpg

發現這裏看不到haha 文件

已知系統啓動了 Selinux,先查看系統日誌,有兩個工具可以收集到 Selinux 產生的

日誌,一個是 setroubleshoot,一個是 audit,先使用 audit 工具,使用方法

如下:

系統中提供了 audit 相關的命令,常用的有 audit2why 和 audit2allow,audit 產生的日誌

放在/var/log/audit, 由於此文件記錄的信息很多不宜直接查看,可以藉助 audit2why

命令,首先啓動 audit

在客戶端登錄 FTP 服務器時會出發 audit deamon 產生日誌:

 wKiom1kcCoeBri1ZAAEBmPB8_6Q936.jpgwKiom1kcCp_hPX4XAAxRgLLwSWE748.jpgwKioL1kcCsHy7CS3AAvzmGEOqE0572.jpg

 

AVC 是 access vector cache 的縮寫, 目的是記錄所有與 SELinux 有關的存取統計資料。

根據日誌中的建議,使用 audit2allow 命令查看給出的建議如下:

 

 

驗證布爾值中有關 FTP 的定義

 wKiom1kcCumQ0I9ZAAowOMV1b0E005.jpg

發現ftp_home_dir --> off,文件 root.txt 的類型剛好是 root:object_r:user_home_t:s0

所以更改此 bool 值就可以

 

wKiom1kcCwDA0lAnAAHU-FTNfKs364.jpg

wKioL1kcCwHxKfcDAAF4SOh635Q925.jpg

wKioL1kcCxDj7SoLAAwIkATGMnY467.jpg

(-P 是把該修改寫到文件,下次啓動仍然有效)

客戶端登錄測試,發現 haha 文件就可以訪問了

總結一下,如果搭配了某個服務器,然後客戶端無法正常訪問,應該按照下面的順序進行排錯:

1.該服務的配置文件中是否開啓了相關的權限 ,比如是否允許匿名用戶寫入等等;

2.文件系統的權限,比如是否需要使用chmod修改權限

3.SELinux的上下文和布爾值

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章