天天看點

Linux SELinux筆記整理

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的具體的工作狀态

Linux SELinux筆記整理

工作原理如下圖:

Linux 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的軟連結檔案

Linux SELinux筆記整理

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

2.2 工作類型

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

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

Linux SELinux筆記整理

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

Linux SELinux筆記整理

三、安全上下文

3.1 security context介紹

安全上下文存在于程序與檔案中,context随程序一起存入記憶體中,檔案的context存放在其對應的inode中,是以程序在通路檔案時,要先讀取inode,再判斷是否能夠通路該檔案。

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

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

Linux SELinux筆記整理

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

Linux SELinux筆記整理
Linux SELinux筆記整理

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 目錄(/.*)?      
Linux SELinux筆記整理

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

Linux SELinux筆記整理

四、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服務

Linux SELinux筆記整理

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

Linux SELinux筆記整理

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

Linux SELinux筆記整理

4.我們在配置服務的時候确定了沒有問題,這時候我們要想到可能是SELinux阻止了我們通路。我們通過指令

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

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

Linux SELinux筆記整理

5.執行指令restorecon -v /var/www/html/index.html,就是修改該檔案為httpd能夠通路的預設标簽

Linux SELinux筆記整理

6.再用浏覽器通路檢視結果,這次成功。

繼續閱讀