SELinux 『 Security Enhanced Linux 』的縮寫,字面上的意義就是安全強化的 Linux 之意
傳統的文件權限與賬號關係--》自主式存取控制(Discretionary Access Control, DAC)
是依據程序的擁有者與文件資源的 rwx 權限來決定有無存取的能力
以政策守則制訂特定程序讀取特定文件--》委任式存取控制 (Mandatory Access Control, MAC)
主體不再是使用者 而變成了程序 目標是該程序能否讀取的文件資源
先要大概明白幾個概念
主體 (Subject):
SELinux 主要想要管理的就是程序,因此你可以將『主體』可以同 process 劃上等號;目標 (Object):
主體程序能否存取的『目標資源』一般就是文件系統。因此這個目標可以同文件系統劃上等號;政策 (Policy):
由於程序與文件數量龐大,因此 SELinux 會依據某些服務來制訂基本的存取安全性政策。這些政策內還會有詳細的守則 (rule) 來指定不同的服務開放某些資源的存取與否。在目前的 CentOS 5.x 裏面僅有提供兩個主要的政策,分別是:targeted:針對網絡服務限制較多,針對本機限制較少,是默認的政策;
strict:完整的 SELinux 限制,限制方面較爲嚴格。
建議使用默認的 targeted 政策即可。
守則:只要知道如何開啓和關閉某項守則的放行與否即可
安全性本文 (security context):
我們剛剛談到了主體、目標與政策面,但是主體能不能存取目標除了政策指定之外,主體與目標的安全性本文(有點類似文件系統的 rwx )必須一致才能夠順利存取。
安全性文本需要自行配置
程序在內存中 所以安全性本文可以存入
文件的安全性本文放置在文件的inode中
在inode中就可以進行安全性本文的比對以及rwx權限的確認
查看文件的安全性本文
[root@www ~]# ll -Z /usr/local/nginx/html/index.html
-rw-r--r--. root root unconfined_u:object_r:usr_t:s0 /usr/local/nginx/html/index.html
身份識別 : 角色 :類型
身份識別 (Identify):
相當於帳號方面的身份識別!主要的身份識別則有底下三種常見的類型: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 搭配,則該程序才能夠順利的讀取文件資源!
主體程序與 文件type欄位的相關性
[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
首先,我們觸發一個可運行的目標文件,那就是具有 httpd_exec_t 這個類型的 /usr/sbin/httpd 文件;
該文件的類型會讓這個文件所造成的主體程序 (Subject) 具有 httpd 這個領域 (domain), 我們的政策針對這個領域已經制定了許多守則,其中包括這個領域可以讀取的目標資源類型;
由於 httpd domain 被配置爲可以讀取 httpd_sys_content_t 這個類型的目標文件 (Object), 因此你的網頁放置到 /var/www/html/ 目錄下,就能夠被 httpd 那支程序所讀取了;
但最終能不能讀到正確的數據,還得要看 rwx 是否符合 Linux 權限的規範!
第一個是政策內需要制訂詳細的 domain/type 相關性;
第二個是若文件的 type 配置錯誤, 那麼即使權限配置爲 rwx 全開的 777 ,該主體程序也無法讀取目標文件資源
查看SELinux的模式
[root@www ~]# getenforce
Enforcing
以前兩種爲啓動模式後一種爲關閉
enforcing:強制模式,代表 SELinux 運行中,且已經正確的開始限制 domain/type 了;
permissive:寬容模式:代表 SELinux 運行中,不過僅會有警告信息並不會實際限制 domain/type 的存取。這種模式可以運來作爲 SELinux 的 debug 之用;
disabled:關閉,SELinux 並沒有實際運行
查看SELinux的政策
targeted 主要是管理網絡服務
strict 本機端的程序
[root@www ~]# sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: enforcing
Mode from config file: enforcing
Policy version: 24
Policy from config file: targeted
SELinux配置文件
[root@www ~]# vim /etc/selinux/config
SELINUX=enforcing 啓動模式
SELINUXTYPE=targeted 政策
SELinux的啓動與關閉
改變政策需要reboot
模式的開啓(enforcing或permissive)轉爲關閉(disabled) 或相反 需要reboot
模式的開啓之間轉換不需要rebbot
reboot之前需要觀察開機時核心是否啓動SELinux
[root@www wanjiadi]# vim /boot/grub/menu.lst
觀察’kernel’ 行 不包含 selinux=0 則 reboot之後就會啓動
啓動模式之間的切換
[root@www ~]# setenforce 0 切換成寬鬆模式
[root@www ~]# setenforce 1 切換成強制模式
操作安全性本文
查看程序的安全性本文
[root@www wanjiadi]# ps aux -Z | grep httpd
查看文件安全性本文
[root@www ~]# ll -Z /var/www/html/1.html
-rw-r--r--. apache apache unconfined_u:object_r:httpd_sys_content_t:s0 1.html
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 2.html root目錄下創建mv過來的2.html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 4.html root在/var/www/html下創建的
修改文件的安全性本文
這裏有一點又一點需要聲明:軟件安裝後比如apache 在安裝完產生/var/www之後type httpd_sys_content_t就已經確定
[root@www ~]# chcon -t httpd_sys_content_t /var/www/html/index.html
-R :遞歸修改;
-t :後面接安全性本文的類型欄位!例如 httpd_sys_content_t ;
-u :後面接身份識別,例如 system_u;
-r :後面街角色,例如 system_r;
--reference=範例文件:拿某個文件當範例來修改後續接的文件的類型!
還原文件的默認安全性本文(根據當前目錄設置)
[root@www ~]# restorecon -v /var/www/html/index.html
restorecon reset /var/www/html/5.html context unconfined_u:object_r:admin_home_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0