1. 程式人生 > >Linux(RadHat)基礎學習—了解SELinux

Linux(RadHat)基礎學習—了解SELinux

f2c 信息 pre 技術分享 我們 des 網絡 etc 例如

基本SELinux安全概念

SELINUX ( 安全增強型 Linux ) 是可保護你系統安全性的額外機制。
SELinux(Security-Enhanced Linux) 是美國國家安全局(NSA)對於強制訪問控制的實現,是 Linux歷史上最傑出的新安全子系統。NSA是在Linux社區的幫助下開發了一種訪問控制體系,在這種訪問控制體系的限制下,進程只能訪問那些在他的任務中所需要文件。SELinux 默認安裝在 Fedora 和 Red Hat Enterprise Linux 上,也可以作為其他發行版上容易安裝的包得到。

(1).在某種程度上 , 它可以被看作是與標準權限系統並行的權限系統。在常規模式中 , 以用戶身份運行進程 , 並且系統上的文件
(2).和其他資源都設置了權限標簽 ( 控制哪些用戶對哪些文件具有哪些訪問權 SELINUX 的另一個不同之處在於 , 若要訪問文件 ,你必須具有普通訪問權限和 SELINUX 訪問權限。因此 , 即使以超級用戶身份root運行進程 , 根據進程以及文件或資源的SELinux安全性上下文可能拒絕訪問文件或資源限 )

1.SELinux模式


SELinux共有3個狀態enforcing (執行中)、permissive (不執行但產生警告)、disabled(關閉)

getenforce  ##顯示當前selinux安全模式

在shell中直接更改狀態:

setenforce 0|1  ##強制性、警告性之間的模式更改
0 表示 permissive # 警告
1 表示 enforcing  # 強制

disaled模式與上面這兩種模式的更改,在文件/etc/sysconfig/selinux中更改,並且重啟才會生效。
當然這三種模式都可以再這個文件中更改。

技術分享圖片

SELINUX=enforcing | permissive | disabled
enfirocing  ##強制模式
permissive  ##警告模式
disabled    ##關閉

2.SELinux安全上下文訪問規則

-------->參考文章: SELinux安全上下文的認識

在SELinux中,訪問控制屬性叫做安全上下文。所有操作系統訪問控制都是以關聯的客體和主體的某種類型的訪問控制屬性為基礎的。所有客體(文件、進程間通訊通道、套接字、網絡主機等)和主體(進程)都有與其關聯的安全上下文,一個安全上下文由三部分組成:用戶、角色和類型標識符。常常用下面的格式指定或顯示安全上下文:

 USER : ROLE :  TYPE [ LEVEL [: CATEGORY] ]


① USER

1) useridentity:類似Linux系統中的uid,提供身份識別,用來記錄身份;安全上下文的一部分;

2) 三種常見的 user:

     ? user_u :普通用戶登錄系統後的預設
     ? system_u :開機過程中系統進程的預設
     ? root :root 登錄後的預設

3) 在 targeted policy 中 users 不是很重要;
4) 在strict policy 中比較重要,所有預設的 SELinux Users 都是以 “_u” 結尾的,root 除外。


② ROLE

1) 文件、目錄和設備的role:通常是 object_r;
2) 程序的role:通常是 system_r;
3) 用戶的role:targeted policy為system_r; strict policy為sysadm_r、staff_r、user_r;用戶的role,類似系統中的gid,不同角色具備不同的的權限;用戶可以具備多個role;但是同一時間內只能使用一個role;


③ TYPE

1) type:用來將主體(subject)和客體(object)劃分為不同的組,給每個主體和系統中的客體定義了一個類型;為進程運行提供最低的權限環境;
2) 當一個類型與執行中的進程相關聯時,其type也稱為domain;
3) type是SElinux security context 中最重要的部位,是 SELinux Type Enforcement 的心臟
4)在SELinux中,類型標識符是安全上下文的主要組成部分,由於歷史原因,一個進程的類型通常被稱為一個域(domain),"域"和"域類型"意思都一樣,即都是安全上下文中的“TYPE”。

?WEB 服務器的 HTTPD 進程設置了 SELinux 上下文system_u:system_r:httpd_t 標簽。該上下文的重要部分是第三個用冒號分隔的字段 SELinux類型 :。
?系統上的文件和資源也設置了 SELinux上下文標簽 , 並且重要的部分是 SELINUX 類型。例如 , /var/www/html 中的文件具有類型 httpd_sys_content_t 。/tmp 和/var/tmp 中的文件通常具有類型 tmp_t。
?SEliux 策略具有允許以 httpd_t 身份運行的進程訪問標記為 httpd_sys_content_t 的文件的規則。沒有規則允許這些進程訪問標記有 tmp_t 的文件 , 因此將拒絕這些訪問 , 即使常規文件權限指出應該允許這些訪問。

還有一個比較特殊的訪問控制屬性:unconfined_u:unconfined_r:unconfined_t

3.顯示SELinux文件上下文

?什麽確定文件的初始 SELinux 上下文 ? 通常是父目錄。將父目錄的上下文指定給新創建的文件。這對 vimcp 和 touch等命令其作用 , 但是 , 如果文件是在其他位置創建的並且保留了權限 ( 與 mv 或 cp -a 一樣 ) 則還將保留 SELinux上下文

?許多處理文件的命令具有一個用於顯示或設置 SELinux 上下文的選項 ( 通常是 -Z ) 。例如 , ps 、 ls 、 cp 和mkdir 都使用 -Z 選項顯示或設置 SELinux 上下文

查看目錄及文件:
1.
技術分享圖片
2.
技術分享圖片

3.
技術分享圖片
查看進程:
技術分享圖片

4.修改 selinux 安全上下文

(1)chcon 參數 目錄/文件
    -u   修改user
        -r    修改role
        -t    修改type

技術分享圖片

chcon命令是一次性定制安全上下文 , 系統重啟會還原,執行 restorecon 刷新目錄後也還原

restorecon -Rv 文件/目錄
//-R 表示遞歸,如果是目錄,則該目錄下的所有子目錄、文件都會得到修復
restorecon -FvvR   目錄  ##刷新列表,使目錄下所有內容恢復

(2)semanage命令
semanage命令是用來查詢與修改SELinux默認目錄的安全上下文。

 semanage fcontext -{a|d|m} [-frst] file_spec
 選項:
         -l:查詢。 fcontext:主要用在安全上下文方面。 
         -a:增加。你可以增加一些目錄的默認安全上下文類型設置。 
         -m:修改。 
         -d:刪除。

示例:
查詢/var/ftp/test目錄的安全上下文:

semanage fcontext -l | grep /var/ftp/test

semanage fcontext 使用擴展正則表達式來指定路徑和文件名。
fcontext 規則中最常用的擴展正則表達式是 (/.*)?, 表示隨意地匹配 / 後跟任何數量的字符
semanage fcontext 將遞歸地與在表達式前面列出的目錄以及該目錄中的所有內容相匹配

5. SELinux 布爾值

SELinux 布爾值是更改 SELinux 策略行為的開關。 SELinux 布爾值是可以啟用或禁用的規則。安全管理員可以使 SELinux 布爾值來調整策略 。

1.使用getsebool工具顯示布爾值列表和當前值。

查詢命令:getsebool -a

技術分享圖片
以上輸出我使用了管道符過濾了大部分,因為系統中把整個SELinux策略加載以後,不同的布爾值輕松達到200+。


2.獲得布爾值信息

並不是所有布爾值都命名都能讓人輕易讀懂。使用semanage boolean –l可以知道布爾值的相關描述。
技術分享圖片


3.改變布爾值狀態

(1).改變SELinux布爾值可以通過setsebool命令實現(需要設置的布爾值,on或者off)。

setsebool xxxxx on | off   ##設置xxxxx策略開啟或關閉

技術分享圖片

當你完成這些命令,改變的值將會立刻生效,但是只在當前加載策略的活動期間。也就是說,如果系統重啟,之前修改的將失效。或者當你直接地重新加載SELinux策略,之前的設置也會失效。換句話說,就是切換booleans這個方法快捷,它是幫助調試問題用的。
(2).使用-P選項可以使,SELinux布爾值的修改將永久生效。

setsebool -P xxxxx on | off   ##設置xxxxx策略永久開啟或關閉

-----> 需要註意的是,參數P必須是大寫的字母P,否則是無效參數,如下圖所示。
技術分享圖片

另外,這個命令要一會兒時間才能完成,因為SELinux策略本身需要重建、保存和布爾值也會被註冊。一旦完成,布爾值將會一直為活動狀態。

6.監控 SELinux 沖突

(1).必須安裝 setroubleshoot-server 軟件包 , 才能將 SELinux消息發送至 /var/log/messages
(2).setroubleshoot-server 偵聽 /var/log/audit/audit.log 中的審核信息並將簡短摘要發送至 /var/log/messages。摘要包括 SELinux 沖突的唯一標識符 ( UUIDs ), 可用於收集更多信息。
(3).Sealert -l UUID 用於生成特定事件的報告。
(4).Sealert -a /var/log/audit/audit.log 用於在該文件中生成所有事件的報告

示例:

1.在/var/ftp/目錄下我們首先存在一些內容
技術分享圖片
我們遠程ftp登陸可以看到這些文件
技術分享圖片

2.在/mnt目錄下新建文件,然後把文件移動到/var/ftp目錄下,

技術分享圖片

3.再在ftp登陸用戶中看,卻並沒有我這些新文件。
技術分享圖片

這個就跟我們的SELinux的安全策略有關系了,我們在ftp目錄下查看:
技術分享圖片

*可以看到原來在ftp目錄中建的文件目錄都是public_content_t,而我們在/mnt目錄下建的文件上下文類型是mnt_t。因為我們此時的SELinux的工作模式是 enforcing,所以對於違反策略的行動是被禁止的,所以我們刷新頁面並不會出現我們從/mnt目錄移動到ftp的幾個文件。

*那為什麽我們建的文件上下文類型不一致呢?因為我們剛才是在 /mnt 目錄下創建的文件,所以其默認會繼承上一層目錄的SELinux的類型信息。在/var/ftp目錄下建的文件目錄也會默認繼承上一層目錄的SELinux的類型信息。而這兩個目錄mnt和ftp的SELinux的類型信息本就不一樣,所以在其下創建的文件目錄也就不一樣了。

*通常解決辦法由兩種:

①直接將SELinux的工作模式設置成 disabled,這樣就不會出現策略攔截問題了,但是這樣的話我們的系統就沒有SELinux安全防護了

②通過 restorecon 或者 chcon 命令來修復我們的文件上下文信息

restorecon -Rv /var/ftp/*

技術分享圖片

再看遠程ftp登陸的用戶也能看到所有的文件了。

技術分享圖片

Linux(RadHat)基礎學習—了解SELinux