1.Ubuntu11.10支持SELinux :apt-get install selinuxphp
2.安裝軟件:selinux 、 setools 、 policycoreutilshtml
3.selinux的配置文件:/etc/selinux/confignode
4.SELinux的工做模式(以centos爲標準)python
SELinux是經過委任式訪問控制(Mandatory Access Control ,MAC),他能夠針對特定耳朵程序與特定的文件資源進行權限管理,他控制的主體是程序,並且表則是該程序可否讀取文件資源。linux
主體(Subject)centos
SELinux主要管理的就是程序。安全
目標(Object)服務器
主體程序訪問的目標資源通常是文件系統。網絡
策略(Policy)dom
因爲程序與文件數量龐大,所以SELinux會依據某些服務來指定基本的訪問安全策略。這些策略內會有詳細的規則來指定不一樣的服務開放某些資源的訪問與否。
目前有targeted 和 mls 兩個主要策略,其中targeted是默認的策略,他針對網絡服務限制較多,針對本機限制較少。
安全性環境(Security Context)
主體要符合指定的策略以外,主體和目標的安全性環境必須一致才能順利訪問目標文件
上圖的重點在『主體』如何取得『目標』的資源訪問權限! 由上圖咱們能夠發現,(1)主體程序必需要經過 SELinux 政策內的規則放行後,就能夠與目標資源進行安全性本文的比對, (2)若比對失敗則沒法存取目標,若比對成功則能夠開始存取目標。問題是,最終可否存取目標仍是與文件系統的 rwx 權限設定有關喔!如此一來,加入了 SELinux 以後,出現權限不符的狀況時,你就得要一步一步的分析可能的問題了!
這個安全性本文你就將他想成 SELinux 內必備的 rwx 就是了,安全性本文是放置到檔案的 inode 內。
安全性本文主要用冒號分爲三個字段 (最後一個字段先略過不看),這三個字段的意義爲:
Identify:role:type
身份識別:角色:類型
程序與檔案 SELinux type 字段的相關性
那麼這三個字段如何利用呢?首先咱們來瞧瞧主體程序在這三個字段的意義爲什麼!透過身份識別與角色字段的定義, 咱們能夠約略知道某個程序所表明的意義喔!基本上,這些對應資料在 targeted 政策下的對應以下:
身份識別 | 角色 | 該對應在 targeted 的意義 |
root | system_r | 表明供 root 帳號登入時所取得的權限 |
system_u | system_r | 因爲爲系統帳號,所以是非交談式的系統運做程序 |
user_u | system_r | 通常可登入用戶的程序囉! |
但就如上所述,其實最重要的字段是類型字段,主體與目標之間是否具備能夠讀寫的權限,與程序的 domain 及檔案的 type 有關!這二者的關係咱們可使用達成 WWW 服務器功能的 httpd 這支程序與 /var/www/html 這個網頁放置的目錄來講明。 首先,看看這兩個咚咚的安全性本文內容先:
[root@www ~]# apt-get install httpd [root@www ~]# ll -Zd /usr/sbin/httpd /var/www/html -rwxr-xr-x. root root system_u:object_r:httpd_exec_t:s0 /usr/sbin/httpd drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html # 二者的角色字段都是 object_r ,表明都是檔案!而 httpd 屬於 httpd_exec_t 類型, # /var/www/html 則屬於 httpd_sys_content_t 這個類型! |
httpd 屬於 httpd_exec_t 這個能夠執行的類型,而 /var/www/html 則屬於 httpd_sys_content_t 這個可讓 httpd 領域 (domain) 讀取的類型。文字看起來不太容易瞭解吧!咱們使用圖示來講明這二者的關係!
上圖的意義咱們能夠這樣看的:
上述的流程告訴咱們幾個重點,第一個是政策內須要制訂詳細的 domain/type 相關性;第二個是若檔案的 type 設定錯誤, 那麼即便權限設定爲 rwx 全開的 777 ,該主體程序也沒法讀取目標檔案資源的啦!不過如此一來, 也就能夠避免用戶將他的家目錄設定爲 777 時所形成的權限困擾。
SELinux type 的修改
既然 SELinux 的類型字段 (type) 這麼重要,那如何修改與變動這個字段,固然就是最重要的一件事囉。 首先,咱們來看看若是複製一個檔案到不一樣的目錄去,會發生什麼情況吧!
# 範例:將 /etc/hosts 複製到 root 家目錄,並觀察相關的 SELinux 類型變化 [root@www ~]# cp /etc/hosts /root [root@www ~]# ls -dZ /etc/hosts /root/hosts /root -rw-r--r--. root root system_u:object_r:net_conf_t:s0 /etc/hosts dr-xr-x---. root root system_u:object_r:admin_home_t:s0 /root -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /root/hosts # 範例:將 /root/hosts 移動到 /tmp 下,並觀察相關的 SELinux 類型變化 [root@www ~]# mv /root/hosts /tmp [root@www ~]# ls -dZ /tmp /tmp/hosts drwxrwxrwt. root root system_u:object_r:tmp_t:s0 /tmp -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /tmp/hosts |
看到沒有?當你單純的複製時,SELinux 的 type 字段是會繼承目標目錄的,因此 /root/hosts 的類型就會變成 admin_home_t 這個類型了。可是若是是移動呢?那麼連同 SELinux 的類型也會被移動過去,所以 /tmp/hosts 會依舊保持 admin_home_t 而不會變成 /tmp 的 tmp_t 這個類型呦!要注意!要注意!那麼,如何將 /tmp/hosts 變動成爲最原始的 net_conf_t 這個類型呢?那就得要使用 chcon 囉!
[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=範例文件:拿某個檔案當範例來修改後續接的檔案的類型! # 範例:將剛剛的 /tmp/hosts 類型改成 etc_t 的類型 [root@www ~]# chcon -t net_conf_t /tmp/hosts [root@www ~]# ll -Z /tmp/hosts -rw-r--r--. root root unconfined_u:object_r:net_conf_t:s0 /tmp/hosts # 範例:以 /var/spool/mail/ 爲依據,將 /tmp/hosts 修改爲該類型 [root@www ~]# ll -dZ /var/spool/mail drwxrwxr-x. root mail system_u:object_r:mail_spool_t:s0 /var/spool/mail [root@www ~]# chcon --reference=/var/spool/mail /tmp/hosts [root@www ~]# ll -Z /tmp/hosts -rw-r--r--. root root system_u:object_r:mail_spool_t:s0 /tmp/hosts |
chcon 的修改方式中,咱們必需要知道最終咱們的 SELinux type 是啥類型後,纔可以變動成功。 若是你想要做的是『復原成原有的 SELinux type』呢?那能夠參考底下的指令來進行呦!
[root@www ~]# restorecon [-Rv] 檔案或目錄 選項與參數: -R :連同次目錄一塊兒修改; -v :將過程顯示到屏幕上 # 範例:將剛剛 /tmp/hosts 移動至 /root 並以預設的安全性本文改正過來 [root@www ~]# mv /tmp/hosts /root [root@www ~]# ll -Z /root/hosts -rw-r--r--. root root system_u:object_r:mail_spool_t:s0 /root/hosts [root@www ~]# restorecon -Rv /root restorecon reset /root/hosts context system_u:object_r:mail_spool_t:s0-> system_u:object_r:admin_home_t:s0 # 上面這兩行實際上是同一行喔!表示將 hosts 由 mail_spool_t 改成 admin_home_t |
默認目錄的安全性本文查詢與修改
透過上面這幾個練習,你就會知道啦,SELinux type 恐怕會在檔案的複製/移動時產生一些變化,所以須要善用 chcon, restorecon 等指令來進行修訂。那你應該仍是會想到一件事,那就是, restorecon 怎麼會知道每一個目錄記載的默認 SELinux type 類型呢?這是由於系統有記錄嘛!記錄在 /etc/selinux/targeted/contexts,可是該目錄內有不少不一樣的數據, 要使用文本編輯器去查閱很麻煩,此時,咱們能夠透過 semanage 這個指令的功能來查詢與修改喔!
[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 :刪除的意思。 # 範例:查詢一下 /var/www/ 的預設安全性本文設定爲什麼! [root@www ~]# yum install policycoreutils-python [root@www ~]# semanage fcontext -l | grep '/var/www' SELinux fcontext 類型 Context /var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0 /var/www(/.*)?/logs(/.*)? all files system_u:object_r:httpd_log_t:s0 ....(後面省略).... |
從上面的說明,咱們知道其實 semanage 能夠處理很是多的任務,不過,在這個小節咱們主要想了解的是每一個目錄的默認安全性本文。 如上面範例所示,咱們能夠查詢的到每一個目錄的安全性本文啦!而目錄的設定可使用正規表示法去指定一個範圍。那麼若是咱們想要增長某些自定義的目錄的安全性本文呢? 舉例來講,我想要制訂 /srv/vbird 成爲 public_content_t 的類型時,應該如何指定呢?
# 範例:利用 semanage 設定 /srv/vbird 目錄的默認安全性本文爲 public_content_t [root@www ~]# mkdir /srv/vbird [root@www ~]# ll -Zd /srv/vbird drwxr-xr-x. root root unconfined_u:object_r:var_t:s0 /srv/vbird # 如上所示,預設的狀況應該是 var_t 這個咚咚的! [root@www ~]# semanage fcontext -l | grep '/srv' /srv directory system_u:object_r:var_t:s0 <==看這裏 /srv/.* all files system_u:object_r:var_t:s0 ....(底下省略).... # 上面則是預設的 /srv 底下的安全性本文數據,不過,並無指定到 /srv/vbird 啦 [root@www ~]# semanage fcontext -a -t public_content_t "/srv/vbird(/.*)?" [root@www ~]# semanage fcontext -l | grep '/srv/vbird' /srv/vbird(/.*)? all files system_u:object_r:public_content_t:s0 [root@www ~]# cat /etc/selinux/targeted/contexts/files/file_contexts.local # This file is auto-generated by libsemanage # Please use the semanage command to make changes /srv/vbird(/.*)? system_u:object_r:public_content_t:s0 # 其實就是寫入這個檔案的囉! ^_^ [root@www ~]# restorecon -Rv /srv/vbird* <==嘗試恢復默認值 [root@www ~]# ll -Zd /srv/vbird drwxr-xr-x. root root system_u:object_r:public_content_t:s0 /srv/vbird # 有默認值,之後用 restorecon 來修改比較簡單! |
semanage 的功能不少,不過鳥哥主要用到的僅有 fcontext 這個項目的動做而已。如上所示, 你可使用 semanage 來查詢全部的目錄默認值,也可以使用他來增長默認值的設定!若是您學會這些基礎的工具, 那麼 SELinux 對你來講,也不是什麼太難的咚咚囉!
SELinux 政策內的規則布爾值修訂
前面講到,要經過 SELinux 的驗證以後才能開始檔案權限 rwx 的判斷,而 SELinux 的判斷主要是 (1)政策內的規則比對與 (2)程序與檔案的 SELinux type 要符合纔可以放行。前一個小節談的是 SELinux 的 type ,這個小節就是要談一下政策內的規則囉, 包括如何查詢與修改相關的規則放行與否囉。
CentOS 6.x 預設使使用 targeted 政策,那麼這個政策提供多少相關的規則呢?此時能夠透過 seinfo 來查詢喔!(Ubuntu :apt-get install setools)
[root@www ~]# yum install setools-console [root@www ~]# seinfo [-Atrub] 選項與參數: -A :列出 SELinux 的狀態、規則布爾值、身份識別、角色、類別等全部信息 -t :列出 SELinux 的全部類別 (type) 種類 -r :列出 SELinux 的全部角色 (role) 種類 -u :列出 SELinux 的全部身份識別 (user) 種類 -b :列出全部規則的種類 (布爾值) # 範例一:列出 SELinux 在此政策下的統計狀態 [root@www ~]# seinfo tatistics for policy file: /etc/selinux/targeted/policy/policy.24 Policy Version & Type: v.24 (binary, mls) <==列出政策所在檔與版本 Classes: 77 Permissions: 229 Sensitivities: 1 Categories: 1024 Types: 3076 Attributes: 251 Users: 9 Roles: 13 Booleans: 173 Cond. Expr.: 208 Allow: 271307 Neverallow: 0 Auditallow: 44 Dontaudit: 163738 Type_trans: 10941 Type_change: 38 Type_member: 44 Role allow: 20 Role_trans: 241 Range_trans: 2590 ....(底下省略).... # 從上面咱們能夠看到這個政策是 targeted ,此政策的 SELinux type 有 3076 個; # 而針對網絡服務的規則 (Booleans) 共制訂了 173 條規則! # 範例二:列出與 httpd 有關的規則 (booleans) 有哪些? [root@www ~]# seinfo -b | grep httpd Conditional Booleans: 173 allow_httpd_mod_auth_pam httpd_setrlimit httpd_enable_ftp_server ....(底下省略).... # 你能夠看到,有很是多的與 httpd 有關的規則訂定呢! |
從上面咱們能夠看到與 httpd 有關的布爾值,一樣的,若是你想要找到有 httpd 字樣的安全性本文類別時, 就可使用『 seinfo -t | grep httpd 』來查詢了!若是查詢到相關的類別或者是布爾值後,想要知道詳細的規則時, 就得要使用 sesearch 這個指令了!
[root@www ~]# sesearch [--all] [-s 主體類別] [-t 目標類別] [-b 布爾值] 選項與參數: --all :列出該類別或布爾值的全部相關信息 -t :後面還要接類別,例如 -t httpd_t -b :後面還要接布爾值的規則,例如 -b httpd_enable_ftp_server # 範例一:找出目標檔案資源類別爲 httpd_sys_content_t 的有關信息 [root@www ~]# sesearch --all -t httpd_sys_content_t Found 683 semantic av rules: allow avahi_t file_type : filesystem getattr ; allow corosync_t file_type : filesystem getattr ; allow munin_system_plugin_t file_type : filesystem getattr ; ....(底下省略).... # 『 allow 主體程序安全性本文類別 目標檔案安全性本文類別 』 # 如上,說明這個類別能夠被那個主題程序的類別所讀取,以及目標檔案資源的格式。 |
你能夠很輕易的查詢到某個主體程序 (subject) 能夠讀取的目標檔案資源 (Object)。 那若是是布爾值呢?裏面又規範了什麼?讓咱們來看看先:
# 範例三:我知道有個布爾值爲 httpd_enable_homedirs ,請問該布爾值規範多少規則? [root@www ~]# sesearch -b httpd_enable_homedirs --all Found 43 semantic av rules: allow httpd_user_script_t user_home_dir_t : dir { getattr search open } ; allow httpd_sys_script_t user_home_dir_t : dir { ioctl read getattr } ; ....(後面省略).... |
從這個布爾值的設定咱們能夠看到裏面規範了很是多的主體程序與目標檔案資源的放行與否! 因此你知道了,實際規範這些規則的,就是布爾值的項目啦!那也就是咱們以前所說的一堆規則是也! 你的主體程序可否對某些目標檔案進行存取,與這個布爾值很是有關係喔!由於布爾值能夠將規則設定爲啓動 (1) 或者是關閉 (0) 啦!
上面咱們透過 sesearch 知道了,其實 Subject 與 Object 可否有存取的權限,是與布爾值有關的, 那麼系統有多少布爾值能夠透過 seinfo -b 來查詢,但,每一個布爾值是啓動的仍是關閉的呢?這就來查詢看看吧:
[root@www ~]# getsebool [-a] [布爾值條款] 選項與參數: -a :列出目前系統上面的全部布爾值條款設定爲開啓或關閉值 # 範例一:查詢本系統內全部的布爾值設定情況 [root@www ~]# getsebool -a abrt_anon_write --> off allow_console_login --> on allow_cvs_read_shadow --> off ....(底下省略).... # 您瞧!這就告訴你目前的布爾值狀態囉! |
那麼若是查詢到某個布爾值,而且以 sesearch 知道該布爾值的用途後,想要關閉或啓動他,又該如何處置?
[root@www ~]# setsebool [-P] 布爾值=[0|1] 選項與參數: -P :直接將設定值寫入配置文件,該設定數據將來會生效的! # 範例一:查詢 httpd_enable_homedirs 是否爲 on,若不爲 on 請啓動他! [root@www ~]# getsebool httpd_enable_homedirs httpd_enable_homedirs --> off <==結果是 off ,依題意給他啓動! [root@www ~]# setsebool -P httpd_enable_homedirs=1 [root@www ~]# getsebool httpd_enable_homedirs httpd_enable_homedirs --> on |
這個 setsebool 最好記得必定要加上 -P 的選項!由於這樣才能將此設定寫入配置文件! 這是很是棒的工具組!你必定要知道如何使用 getsebool 與 setsebool 才行!