首頁 > 軟體

Linux SELinux 工作原理及紀錄檔管理詳解

2020-06-16 16:49:24

SELinux(Security Enhanced Linux)

系統資源都是通過進程來讀取更改的,為了保證系統資源的安全,傳統的Linux使用使用者、檔案許可權的概念來限制資源的存取,通過對比進程的發起使用者和檔案許可權以此來保證系統資源的安全,這是一種自由存取控制方式(DAC);但是隨著系統資源安全性要求提高,出現了在Linux下的一種安全強化機制(SELinux),該機制為進程和檔案加入了除許可權之外更多的限制來增強存取條件,這種方式為強制存取控制(MAC)。這兩種方式最直觀的對比就是,採用傳統DAC,root可以存取任何檔案,而在MAC下,就算是root,也只能存取設定允許的檔案。

目錄

  • SELinux的工作原理

  • 工作模式和工作型別

  • 安全上下文

  • SELinux紀錄檔管理

一、SELinux的工作原理

先說下SELinux下的幾個基本的概念

    主體    # SELinux管理的主體為進程

    目標    # SELinux通過管理進程,來限制進程存取的目標,指檔案

    工作模式    # 決定SELinux機制的啟動與否

        enforcing ===>強制模式,SELinux已經啟動   

        permissive===>寬容模式,SELinux已經啟動,但不會禁止,只是會提出警告資訊

        disabled  ===>關閉模式,關閉SELinux

    工作型別(SELinux type)   # 表示SELinux具體的安全性策略

        strict  ===>每個進程都受限制(僅在CentOS5)

        targeted===>預設型別為targeted,主要限制網路服務

        minimum ===>簡化版的targetd,限制部分網路服務(centos7)

        mls     ===>多級安全限制,較為嚴格

    安全上下文(security context)

        這個是我們主要修改的地方,進程必須和檔案的安全上下文對應(不是必須一樣)才能對其進行存取。

        ls -Z 檔名    # 檢視檔案的安全上下文

        ps -eZ           # 檢視進程的安全上下文

sestatus    # 檢視SELinux的具體的工作狀態

工作原理如下圖:

二、工作模式和工作型別

2.1 工作模式

getenforce可以檢視當前SELinux的工作模式;setenforce可以修改SELinux的工作模式,不過僅能在permissive和enforcing之間切換

        [root@CentOS6 ~]# setenforce 0|1  分別代表permissive、enforcing   

使用命令修改工作模式只在當前有效,想要開機生效,而且如果想要在disabled和其他兩種模式之間切換,只有修改組態檔引數然後重新啟動,該組態檔是/etc/selinux/config,另外也可以通過/etc/sysconfig/selinux檔案修改,其實該檔案是/etc/selinux/config的軟連結檔案

    notice:SELinux從disabled切換到其他模式的時候,系統的重新啟動會花費很長的時間,因為需要為每個受管制的進程和檔案寫入安全上下文,我的小夥伴以為是設定過程中出錯然後直接恢復快照了。

2.2 工作型別

SELinux下存在不同的規則,SELinux根據不同的工作型別對這些規則開啟或關閉(on|off<布林值1|0>),然後通過規則的開啟與關閉具體地限制不同進程對檔案的讀取。

    getsebool -a 或者 sestatus -b      # 檢視當前工作型別下各個規則的開啟與否

    setsebool -P 規則名稱 [0|1]    # 修改當前工作型別下指定規則的開啟關閉,-P表示同時修改檔案使永久生效

三、安全上下文

3.1 security context介紹

安全上下文存在於進程與檔案中,context隨進程一起存入記憶體中,檔案的context存放在其對應的inode中,因此進程在存取檔案時,要先讀取inode,再判斷是否能夠存取該檔案。

    ls -Z    # 顯示檔案的安全上下文

    ps -eZ   # 顯示所有進程的安全上下文

context可以有5個欄位,以:為分割符,分別代表的含義如下

user role type  sensitivity category

身份識別

unconfined_u不受限的使用者或檔案

system_u受限的進程或檔案

檔案、進程、使用者

object_r檔案

system_r進程和使用者

資料型別,重要

何種型別進程???問何種檔案

安全級別

s0最低

只要在msl下才有意義

劃分的不同分類,當它不存在了

 

context查詢工具seinfo、sesearch

    seinfo -u    # 查詢所有的user欄位的種類

    seinfo -r    # 查詢所有的role欄位的種類

    seinfo -t    # 查詢所有的type欄位的種類 

sesearch -A 可以查詢什麼型別進程可以讀取什麼type型別的檔案

    sesearch -A -s 進程type    # 查詢type型別的進程能夠讀取的檔案type   

    sesearch -A -b 規則(規則的boolean值,所以為-b選項,理解為bool規則)

                               # 查詢指定規則下放行的進程能夠讀取的檔案type

 

3.2 當前context和期望context  

系統中的每個檔案都會有context,我們使用ls -Z查詢出來的我們看到的context就是當前context;那期望context又是什麼呢,系統會把每個檔案的預設context記錄下來並儲存,這樣系統記錄下來的就是期望context。semanage命令可以管理每個檔案的期望context,也叫期望標籤。

    semanage fcontext -l                     # 檢視所有的期望SELinux標籤

    semanage fcontext -a -t type 目標目錄    # 新增期望SELinux標籤

     semanage fcontext -m -t type 目標目錄    # 修改期望SELinux標籤

     semanage fcontext -d -t type 目標目錄    # 刪除期望SELinux標籤

    修改規範:

~]# semanage fcontext -a -t type 目錄(/.*)?

3.3 修改當前context    

使用chcon命令手動修改security context,格式chcon 選項 目標檔案

        chcon        # 手動修改檔案的context,-R選項可以遞回修改目錄,-v選項可以顯示context的修改前後的結果

        chcon -t     # 修改檔案的context的type欄位

        chcon -u     # 修改檔案的context的user欄位

        chcon -r     # 修改role欄位

       chcon -l    # 修改安全級別

       chcon -h     # 針對軟連結檔案的修改,不加-h則會修改軟連結對應的原檔案

        chcon --reference=file # 以file的context為模板修改

使用restorecon命令修改context為期望context,格式restorecon 選項 目標檔案,    

        restorecon -R    # 遞回修改目錄

        restorecon -v    # 顯示修改的過程

3.3 semanage修改進程存取的埠號

雖然聽起來是修改埠號的,但是到底還是修改安全上下文的,我們用semanage工具,命令為semanage port

查詢某個服務的context type欄位

        語法:semanage port -l |grep 服務名

新增某個埠為指定服務的存取埠       

        語法:semanage port -a -t type -p 協定 埠號(不要與常用埠重複)

例如新增ssh服務的埠號,預設為22

四、SELinux紀錄檔管理

SELinux阻止的進程的紀錄檔記錄存放在/var/log/audit/audit.log檔案中,但是該檔案中的內容使用者閱讀體驗很差,可以去cat /var/log/audit/audit.log看看,因此系統為我們提供了sealert工具,幫助我們整理該紀錄檔檔案,sealert工具處理紀錄檔檔案的時候需要花費一點時間,請耐心等待。

    另外SELinux的紀錄檔功能需要auditd.service服務的開啟。

 結合案例(apache SELinux設定)來了解sealert工具

1.確保本機設定了httpd服務並處於開啟狀態,httpd服務設定方法請參考:Apache部署httpd服務  https://www.linuxidc.com/Linux/2018-05/152278.htm

2./usr/sbin/httpd命令會開啟進程去讀取/var/www/html/目錄下以.html結尾的檔案,現在在家目錄下建立檔案~/index.html,隨意編寫內容,之後把新建立的檔案移動至/var/www/html/下。

3.我們通過瀏覽器,在位址列輸入本機IP,檢視成功與否,當出現如下介面的時候表示存取失敗。

4.我們在設定服務的時候確定了沒有問題,這時候我們要想到可能是SELinux阻止了我們存取。我們通過命令

    sealert -a /var/log/audit/audit.log

檢視SELinux紀錄檔,我們找到httpd的關鍵字,閱讀內容,下圖中的內容是我們主要關注的部分,其他則是/var/log/audit/audit.log的內容,我們可以忽略。最後我們優先考慮改動最小的解決方案,即修改SELinux標籤。

5.執行命令restorecon -v /var/www/html/index.html,就是修改該檔案為httpd能夠存取的預設標籤

6.再用瀏覽器存取檢視結果,這次成功。

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

本文永久更新連結地址https://www.linuxidc.com/Linux/2018-08/153454.htm


IT145.com E-mail:sddin#qq.com