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/
通過配置文件修改的selinux的狀態屬於永久修改,要重新啓動服務才能生效
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工作狀態
b、selinuxenabled檢查selinux是否開啓,配合echo $?.傳回值是0爲開啓,1爲關閉.
c、getenforce查看selinux的狀態
d、setenforce設定selinux運行狀態,1開啓(Enforcing),0關閉(Permissive)
2、查看安全上下文相關命令
a.查看文件上下文可以通過ls -Z
b.查看進程上下文可以使用ps Z
c.查看用戶上下文可以用id –Z
安全上下文以用戶:角色:類型(域)標識符的形式出現.(這裏的用戶指的是selinu用戶)
3、以下是複製和移動文件時安全上下文的變化:
以httpd爲例,這個httpd的進程可以訪問/var/www/html下的文檔對象在一個直接創建到網站的根目錄下,另一個創建在root下,然後用mv命令移動到網站的
查看html目錄下文件的安全上下文
通過上圖可以看到剪切操作時文件的上下文沒有發生改變,仍然是原上下文,而複製操作時文件的上文繼承了目標目錄的上下文。通過瀏覽器訪問這兩個網頁文件
可以看到lala.html頁面能訪問而haha.html卻被拒絕訪問
查看權限發現apache用戶對這兩個文件都具有r權限,但haha.html文件卻拒絕訪問。
原因就是因爲httpd進程不能訪問域類型標籤是admin_home_t的資源,被selinux將訪問拒絕了。
查看日誌/var/log/audit/audit.log 通過日誌記錄也能看到haha.html文件拒絕httpd進程訪問。
由於此文件記錄的信息很多不宜直接查看,可以藉助audit2why和audit2allow
#audit2why</var/log/audit/audit.log
注:提供audit2why和audit2allow工具軟件包
收集Selinux產生的日誌,另一個工具是setroubleshoot,對應的軟件包爲
Setroubleshoot將錯誤信息寫入/var/log/messages中
#tail/var/log/messages | grep setroubleshoot
上面的錯誤信息大概說的是”selinux阻止httpd訪問這個文件,要查看完整的信息,請執行sealert命令”
可以用sesearch [--allow] [-s 主體類別] [-t 目標類別] [-b]查詢詳細規則
sesearch命令由下列軟件包提供
找出目標資源類別爲httpd_sys_content_t的相關信息
從上圖顯示信息表示[allow 主體程序安全上下文類別 目標資源安全上下文類別],說明這個資源類別可以被哪個主體程序類別所讀取。
找出主體程序爲httpd_t相關的所有信息
從上面的數據就可以看出程序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就可以訪問該目錄下的文件了。
semanage和restorecon命令是由下列軟件包提供的
b.使用chcon (change context) 修改當前的上下文
注:
chcon意思是change context
-t type 類型
-R recursive 遞歸(特別適用於改變某個目錄下所有文件的context)
-u user
-r role
或
--reference表示用lala.html文件的上下文修改haha.html文件的上下文。
最後再看一個概念,SELinux的布爾值。這個布爾值類似一個開關,打開的話,他對應的一些服務就允許執行,否則的話就拒絕執行。
看看有哪些布爾值
也可用semanage命令#semanageboolean –l
知道了布爾值的名字,可以通過sesearch 來確認他關聯了哪些服務的域,比如httpd_enable_homedir允許下列規則,如果設置爲off的話,那麼他們都是無法訪問的。
設置boolean值,-P爲設置永久生效.
#setsebool [-P] 布爾值 on/off
下面看一個與布爾值有關的例子
確認已經啓用了 Selinux、啓動 FTP:
在匿名訪問目錄下創建 2 個文件進行測試,一個是在該目錄下手動創建,這樣
該文件會自動繼承/var/ftp/pub 下的目錄上下文的值,一個用 mv 命令從 root 目錄下移
動過來,這樣的文件會保留 root 目錄下的安全上下文,如下
使用匿名登錄測試:
發現這裏看不到haha 文件
已知系統啓動了 Selinux,先查看系統日誌,有兩個工具可以收集到 Selinux 產生的
日誌,一個是 setroubleshoot,一個是 audit,先使用 audit 工具,使用方法
如下:
系統中提供了 audit 相關的命令,常用的有 audit2why 和 audit2allow,audit 產生的日誌
放在/var/log/audit, 由於此文件記錄的信息很多不宜直接查看,可以藉助 audit2why
命令,首先啓動 audit
在客戶端登錄 FTP 服務器時會出發 audit deamon 產生日誌:
AVC 是 access vector cache 的縮寫, 目的是記錄所有與 SELinux 有關的存取統計資料。
根據日誌中的建議,使用 audit2allow 命令查看給出的建議如下:
驗證布爾值中有關 FTP 的定義
發現ftp_home_dir --> off,文件 root.txt 的類型剛好是 root:object_r:user_home_t:s0
所以更改此 bool 值就可以
(-P 是把該修改寫到文件,下次啓動仍然有效)
客戶端登錄測試,發現 haha 文件就可以訪問了
總結一下,如果搭配了某個服務器,然後客戶端無法正常訪問,應該按照下面的順序進行排錯:
1.該服務的配置文件中是否開啓了相關的權限 ,比如是否允許匿名用戶寫入等等;
2.文件系統的權限,比如是否需要使用chmod修改權限
3.SELinux的上下文和布爾值