centos7的selinux的原理及相關配置html
SELinux的全稱是Security Enhanced Linux, 就是安全增強的Linux。在SELinux以前,root帳號可以任意的訪問全部文檔和服務;若是某個文件設爲777,那麼任何用戶均可以訪問甚至刪除;這種方式稱爲DAC(主動訪問機制),很不安全。linux
DAC 自主訪問控制: 用戶根據本身的文件權限來決定對文件的操做,也就是依據文件的own,group,other/r,w,x權限進行限制。Root有最高權限沒法限制。r,w,x權限劃分太粗糙。沒法針對不一樣的進程實現限制。sql
SELinux則是基於MAC(強制訪問機制),簡單的說,就是程序和訪問對象上都有一個安全標籤(即selinux上下文)進行區分,只有對應的標籤才能容許訪問。不然即便權限是777,也是不能訪問的。apache
在SELinux中,訪問控制屬性叫作安全上下文。全部客體(文件、進程間通信通道、套接字、網絡主機等)和主體(進程)都有與其關聯的安全上下文,一個安全上下文由三部分組成:用戶(u)、角色(r)和類型(t)標識符。但咱們最關注的是第三個部分centos
當程序訪問資源時,主體程序必需要經過selinux策略內的規則放行後,就能夠與目標資源進行安全上下文的比對,若比對失敗則沒法存取目標,若比對成功則能夠開始存取目標,最終可否存取目標還要與文件系統的rwx權限的設定有關。因此啓用了selinux後出現權限不符的狀況時,你就得一步一步的分析可能的問題了。瀏覽器
以上簡單瞭解便可,下面的是要重點掌握的安全
一.selinux的狀態查看與配置
服務器
Selinux的配置文件位置:/etc/selinux/config,它還有個連接在/etc/sysconfig/selinux網絡
使用config文件來配置selinux(經過配置文件修改selinux的狀態屬於永久修改,要重啓系統才生效)ide
查看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)
二、查看安全上下文相關命令
a.查看文件上下文能夠經過ls -Z
b.查看進程上下文可使用ps Z
c.查看用戶上下文能夠用id –Z
安全上下文以用戶:角色:類型(域)標識符的形式出現.(這裏的用戶指的是selinu用戶)
三、如下是複製和移動文件時安全上下文的變化:
以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的上下文和布爾值