天天看點

SELinux

1.SElinux 就是 Security Enhanced Linux,用于加強系統的安全管理。

傳統的檔案系統依據程序的擁有者與檔案資源的 rwx 權限來決定程序有無存取檔案的能力,它又一定的缺陷,比如某人非法獲得具有root權限的某程序,那他就能利用該程序存取任何檔案資源,或者有人無意間把檔案的屬性改為777,而他自己并未認識到危害。

而SElinux則采取了特定程式讀取特定檔案的方式,即使你是 root ,那麼在使用不同的程式時,你所能取得的權限并不一定是 root , 而得要看當時該程式的設定而定。隻有程式的權限和檔案的權限相對應,才能夠讀取。

2.SELinux 的運作模式

  • 主體 (Subject):

    主體即程序

  • 目标 (Object):

    目标即檔案

  • 政策 (Policy):

    由于程式與檔案數量龐大,是以 SELinux 會依據某些服務來制訂基本的存取安全性政策。這些政策内還會有詳細的規則 (rule) 來指定不同的服務開放某些資源的存取與否。在目前的 CentOS 5.x 裡面僅有提供兩個主要的政策,分别是:

    • targeted:針對網路服務限制較多,針對本機限制較少,是預設的政策;
    • strict:完整的 SELinux 限制,限制方面較為嚴格。
    建議使用預設的 targeted 政策即可。
  • 安全性本文 (security context):

    安全性本文 (security context) 有點類似檔案系統的 rwx ,主體與目标的安全性文本必須一緻才能夠讀取

SELinux

3.安全性文本

通過ls -Z可以檢視檔案的安全性文本

  1. [root@www ~]# ls -Z 
  2. drwxr-xr-x  root root root:object_r:user_home_t   Desktop 
  3. -rw-r--r--  root root root:object_r:user_home_t   install.log 
  4. -rw-r--r--  root root root:object_r:user_home_t   install.log.syslog 
  5. # 上述特殊字型的部分,就是安全性本文的内容! 

安全性本文是放置到檔案系統的 inode 内的,它有3個欄位:

Identify:role:type
身份識别:角色:類型      
  • 身份識别 (Identify):

    相當于帳号方面的身份識别!主要的身份識别則有底下三種常見的類型:

    • root:表示 root 的帳号身份,如同上面的表格顯示的是 root 家目錄下的資料啊!
    • system_u:表示系統程式方面的識别,通常就是程式啰;
    • user_u:代表的是一般使用者帳号相關的身份。
  • 角色 (Role):

    透過角色欄位,我們可以知道這個資料是屬于程式、檔案資源還是代表使用者。一般的角色有:

    • object_r:代表的是檔案或目錄等檔案資源,這應該是最常見的啰;
    • system_r:代表的就是程式啦!不過,一般使用者也會被指定成為 system_r 喔!
  • 類型 (Type) :(最重要!)

    在預設的 targeted 政策中, Identify 與 Role 欄位基本上是不重要的!重要的在于這個類型 (type) 欄位! 基本上,一個主體程式能不能讀取到這個檔案資源,與類型欄位有關!而類型欄位在檔案與程式的定義不太相同,分别是:

    • type:在檔案資源 (Object) 上面稱為類型 (Type);
    • domain:在主體程式 (Subject) 則稱為領域 (domain) 了!
    domain需要與type搭配,則該程式才能夠順利的讀取檔案資源啦!

以httpd為例:

  1. [root@www ~]# ll -Zd /usr/sbin/httpd /var/www/html 
  2. -rwxr-xr-x  root root system_u:object_r:httpd_exec_t   /usr/sbin/httpd 
  3. drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t /var/www/html 
  4. # 兩者的角色欄位都是 object_r ,代表都是檔案!而 httpd 屬于 httpd_exec_t 類型, 
  5. # /var/www/html 則屬于 httpd_sys_content_t 這個類型! 
SELinux
  1. 首先,我們觸發一個可執行的目标檔案,那就是具有 httpd_exec_t 這個類型的 /usr/sbin/httpd 檔案;
  2. 該檔案的類型會讓這個檔案所造成的主體程序(Subject)具有 httpd 這個領域 (domain), 我們的政策針對這個領域已經制定了許多規則,其中包括這個領域可以讀取的目标資源類型;
  3. 由于 httpd domain 被設定為可以讀取 httpd_sys_content_t 這個類型的目标檔案 (Object), 是以你的網頁放置到 /var/www/html/ 目錄下,就能夠被 httpd 那支程序所讀取了;
  4. 但最終能不能讀到正确的資料,還得要看 rwx 是否符合 Linux 權限的規範!

4.SELinux 的啟動、關閉與觀察

目前 SELinux 支援三種模式,分别如下:

  • enforcing:強制模式,代表 SELinux 運作中,且已經正确的開始限制 domain/type 了;
  • permissive:寬容模式:代表 SELinux 運作中,不過僅會有警告訊息并不會實際限制 domain/type 的存取。這種模式可以運來作為 SELinux 的 debug 之用;
  • disabled:關閉,SELinux 并沒有實際運作。

getenforce指令可以檢視SElinux處于什麼模式

sestatus可以檢視SElinux的狀态,包括模式和政策

  1. [root@www ~]# sestatus [-vb] 
  2. 選項與參數: 
  3. -v  :檢查列于 /etc/sestatus.conf 内的檔案與程式的安全性本文内容; 
  4. -b  :将目前政策的規則布林值列出,亦即某些規則 (rule) 是否要啟動 (0/1) 之意; 

SELinux 的設定檔是 /etc/selinux/config

模式切換:

enforcing和permissive的切換不需要重新開機,但是他們和disable之間的切換需要重新開機

  1. [root@www ~]# setenforce [0|1] 
  2. 選項與參數: 
  3. 0 :轉成 permissive 寬容模式; 
  4. 1 :轉成 Enforcing 強制模式 

重設 SELinux 安全性本文:

  1. [root@www ~]# chcon [-R] [-t type] [-u user] [-r role] 檔案 
  2. [root@www ~]# chcon [-R] --reference=範例檔 檔案 
  3. 選項與參數: 
  4. -R  :連同該目錄下的次目錄也同時修改; 
  5. -t  :後面接安全性本文的類型欄位!例如 httpd_sys_content_t ; 
  6. -u  :後面接身份識别,例如 system_u; 
  7. -r  :後面街角色,例如 system_r; 
  8. --reference=範例檔:拿某個檔案當範例來修改後續接的檔案的類型! 

或者,利用上層目錄的預設屬性來還原:

  1. [root@www ~]# restorecon [-Rv] 檔案或目錄 
  2. 選項與參數: 
  3. -R  :連同次目錄一起修改; 
  4. -v  :将過程顯示到螢幕上 

5.SELinux 的政策與規則管理

一個主體程序能否讀取到目标檔案的重點在于 SELinux 的政策以及政策内的各項規則, 然後再透過該規則的定義去處理各目标檔案的安全性本文,尤其是‘類型’的部分

政策查閱:

  1. [root@www ~]# seinfo [-Atrub] 
  2. 選項與參數: 
  3. -A  :列出 SELinux 的狀态、規則布林值、身份識别、角色、類别等所有資訊 
  4. -t  :列出 SELinux 的所有類别 (type) 種類 
  5. -r  :列出 SELinux 的所有角色 (role) 種類 
  6. -u  :列出 SELinux 的所有身份識别 (user) 種類 
  7. -b  :列出所有規則的種類 (布林值) 

如果查詢到相關的類别或者是布林值後,想要知道詳細的規則時, 就得要使用 sesearch 這個指令:

  1. [root@www ~]# sesearch [-a] [-s 主體類别] [-t 目标類别] [-b 布林值] 
  2. 選項與參數: 
  3. -a  :列出該類别或布林值的所有相關資訊 
  4. -t  :後面還要接類别,例如 -t httpd_t 
  5. -b  :後面還要接布林值的規則,例如 -b httpd_enable_ftp_server 
  6. 範例一:找出目标檔案資源類别為 httpd_sys_content_t 的有關資訊 
  7. [root@www ~]# sesearch -a -t httpd_sys_content_t 
  8. Found 74 av rules: 
  9.    allow readahead_t httpd_sys_content_t : file { ioctl read getattr lock }; 
  10.    allow readahead_t httpd_sys_content_t : dir { ioctl read getattr lock search }; 
  11. ....(底下省略).... 
  12. # ‘ allow  主體程式安全性本文類别  目标檔案安全性本文類别 ’ 
  13. # 如上,說明這個類别可以被那個主題程式的類别所讀取,以及目标檔案資源的格式。 

布林值的查詢與修改:

透過 sesearch 知道了,其實 Subject 與 Object 能否有存取的權限,是與布林值有關的, 那麼系統有多少布林值可以透過 seinfo -b 來查詢,但,每個布林值是啟動的還是關閉的呢?

查詢:

  1. [root@www ~]# getsebool [-a] [布林值條款] 
  2. 選項與參數: 
  3. -a  :列出目前系統上面的所有布林值條款設定為開啟或關閉值 

開啟和關閉:

  1. [root@www ~]# setsebool [-P] 布林值=[0|1] 
  2. 選項與參數: 
  3. -P  :直接将設定值寫入設定檔,該設定資料未來會生效的! 

預設目錄的安全性本文查詢與修改:

在使用restorecon時談到每個目錄或檔案都會有預設的安全性本文,

  1. [root@www ~]# semanage {login|user|port|interface|fcontext|translation} -l 
  2. [root@www ~]# semanage fcontext -{a|d|m} [-frst] file_spec 
  3. 選項與參數: 
  4. fcontext :主要用在安全性本文方面的用途, -l 為查詢的意思; 
  5. -a :增加的意思,你可以增加一些目錄的預設安全性本文類型設定; 
  6. -m :修改的意思; 
  7. -d :删除的意思。 

這裡我們主要用到fcontext屬性

繼續閱讀