1.SElinux 就是 Security Enhanced Linux,用于加強系統的安全管理。
傳統的檔案系統依據程序的擁有者與檔案資源的 rwx 權限來決定程序有無存取檔案的能力,它又一定的缺陷,比如某人非法獲得具有root權限的某程序,那他就能利用該程序存取任何檔案資源,或者有人無意間把檔案的屬性改為777,而他自己并未認識到危害。
而SElinux則采取了特定程式讀取特定檔案的方式,即使你是 root ,那麼在使用不同的程式時,你所能取得的權限并不一定是 root , 而得要看當時該程式的設定而定。隻有程式的權限和檔案的權限相對應,才能夠讀取。
2.SELinux 的運作模式
-
主體 (Subject):
主體即程序
-
目标 (Object):
目标即檔案
-
政策 (Policy):
由于程式與檔案數量龐大,是以 SELinux 會依據某些服務來制訂基本的存取安全性政策。這些政策内還會有詳細的規則 (rule) 來指定不同的服務開放某些資源的存取與否。在目前的 CentOS 5.x 裡面僅有提供兩個主要的政策,分别是:
- targeted:針對網路服務限制較多,針對本機限制較少,是預設的政策;
- strict:完整的 SELinux 限制,限制方面較為嚴格。
-
安全性本文 (security context):
安全性本文 (security context) 有點類似檔案系統的 rwx ,主體與目标的安全性文本必須一緻才能夠讀取
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuIDMzgzMzADMx8CX1ATMxAjMvwFduVWboNWY0RXYvwVbvNmLvR3YxUjL5M3Lc9CX6MHc0RHaiojIsJye.gif)
3.安全性文本
通過ls -Z可以檢視檔案的安全性文本
- [root@www ~]# ls -Z
- drwxr-xr-x root root root:object_r:user_home_t Desktop
- -rw-r--r-- root root root:object_r:user_home_t install.log
- -rw-r--r-- root root root:object_r:user_home_t install.log.syslog
- # 上述特殊字型的部分,就是安全性本文的内容!
安全性本文是放置到檔案系統的 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) 了!
以httpd為例:
- [root@www ~]# ll -Zd /usr/sbin/httpd /var/www/html
- -rwxr-xr-x root root system_u:object_r:httpd_exec_t /usr/sbin/httpd
- drwxr-xr-x root root system_u:object_r:httpd_sys_content_t /var/www/html
- # 兩者的角色欄位都是 object_r ,代表都是檔案!而 httpd 屬于 httpd_exec_t 類型,
- # /var/www/html 則屬于 httpd_sys_content_t 這個類型!
- 首先,我們觸發一個可執行的目标檔案,那就是具有 httpd_exec_t 這個類型的 /usr/sbin/httpd 檔案;
- 該檔案的類型會讓這個檔案所造成的主體程序(Subject)具有 httpd 這個領域 (domain), 我們的政策針對這個領域已經制定了許多規則,其中包括這個領域可以讀取的目标資源類型;
- 由于 httpd domain 被設定為可以讀取 httpd_sys_content_t 這個類型的目标檔案 (Object), 是以你的網頁放置到 /var/www/html/ 目錄下,就能夠被 httpd 那支程序所讀取了;
- 但最終能不能讀到正确的資料,還得要看 rwx 是否符合 Linux 權限的規範!
4.SELinux 的啟動、關閉與觀察
目前 SELinux 支援三種模式,分别如下:
- enforcing:強制模式,代表 SELinux 運作中,且已經正确的開始限制 domain/type 了;
- permissive:寬容模式:代表 SELinux 運作中,不過僅會有警告訊息并不會實際限制 domain/type 的存取。這種模式可以運來作為 SELinux 的 debug 之用;
- disabled:關閉,SELinux 并沒有實際運作。
getenforce指令可以檢視SElinux處于什麼模式
sestatus可以檢視SElinux的狀态,包括模式和政策
- [root@www ~]# sestatus [-vb]
- 選項與參數:
- -v :檢查列于 /etc/sestatus.conf 内的檔案與程式的安全性本文内容;
- -b :将目前政策的規則布林值列出,亦即某些規則 (rule) 是否要啟動 (0/1) 之意;
SELinux 的設定檔是 /etc/selinux/config
模式切換:
enforcing和permissive的切換不需要重新開機,但是他們和disable之間的切換需要重新開機
- [root@www ~]# setenforce [0|1]
- 選項與參數:
- 0 :轉成 permissive 寬容模式;
- 1 :轉成 Enforcing 強制模式
重設 SELinux 安全性本文:
- [root@www ~]# chcon [-R] [-t type] [-u user] [-r role] 檔案
- [root@www ~]# chcon [-R] --reference=範例檔 檔案
- 選項與參數:
- -R :連同該目錄下的次目錄也同時修改;
- -t :後面接安全性本文的類型欄位!例如 httpd_sys_content_t ;
- -u :後面接身份識别,例如 system_u;
- -r :後面街角色,例如 system_r;
- --reference=範例檔:拿某個檔案當範例來修改後續接的檔案的類型!
或者,利用上層目錄的預設屬性來還原:
- [root@www ~]# restorecon [-Rv] 檔案或目錄
- 選項與參數:
- -R :連同次目錄一起修改;
- -v :将過程顯示到螢幕上
5.SELinux 的政策與規則管理
一個主體程序能否讀取到目标檔案的重點在于 SELinux 的政策以及政策内的各項規則, 然後再透過該規則的定義去處理各目标檔案的安全性本文,尤其是‘類型’的部分
政策查閱:
- [root@www ~]# seinfo [-Atrub]
- 選項與參數:
- -A :列出 SELinux 的狀态、規則布林值、身份識别、角色、類别等所有資訊
- -t :列出 SELinux 的所有類别 (type) 種類
- -r :列出 SELinux 的所有角色 (role) 種類
- -u :列出 SELinux 的所有身份識别 (user) 種類
- -b :列出所有規則的種類 (布林值)
如果查詢到相關的類别或者是布林值後,想要知道詳細的規則時, 就得要使用 sesearch 這個指令:
- [root@www ~]# sesearch [-a] [-s 主體類别] [-t 目标類别] [-b 布林值]
- 選項與參數:
- -a :列出該類别或布林值的所有相關資訊
- -t :後面還要接類别,例如 -t httpd_t
- -b :後面還要接布林值的規則,例如 -b httpd_enable_ftp_server
- 範例一:找出目标檔案資源類别為 httpd_sys_content_t 的有關資訊
- [root@www ~]# sesearch -a -t httpd_sys_content_t
- Found 74 av rules:
- allow readahead_t httpd_sys_content_t : file { ioctl read getattr lock };
- allow readahead_t httpd_sys_content_t : dir { ioctl read getattr lock search };
- ....(底下省略)....
- # ‘ allow 主體程式安全性本文類别 目标檔案安全性本文類别 ’
- # 如上,說明這個類别可以被那個主題程式的類别所讀取,以及目标檔案資源的格式。
布林值的查詢與修改:
透過 sesearch 知道了,其實 Subject 與 Object 能否有存取的權限,是與布林值有關的, 那麼系統有多少布林值可以透過 seinfo -b 來查詢,但,每個布林值是啟動的還是關閉的呢?
查詢:
- [root@www ~]# getsebool [-a] [布林值條款]
- 選項與參數:
- -a :列出目前系統上面的所有布林值條款設定為開啟或關閉值
開啟和關閉:
- [root@www ~]# setsebool [-P] 布林值=[0|1]
- 選項與參數:
- -P :直接将設定值寫入設定檔,該設定資料未來會生效的!
預設目錄的安全性本文查詢與修改:
在使用restorecon時談到每個目錄或檔案都會有預設的安全性本文,
- [root@www ~]# semanage {login|user|port|interface|fcontext|translation} -l
- [root@www ~]# semanage fcontext -{a|d|m} [-frst] file_spec
- 選項與參數:
- fcontext :主要用在安全性本文方面的用途, -l 為查詢的意思;
- -a :增加的意思,你可以增加一些目錄的預設安全性本文類型設定;
- -m :修改的意思;
- -d :删除的意思。
這裡我們主要用到fcontext屬性