SELinux的簡單介紹

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)

   主體要符合指定的策略以外,主體和目標的安全性環境必須一致才能順利訪問目標文件

    SELinux 運做的各組件之相關性

   上圖的重點在『主體』如何取得『目標』的資源訪問權限! 由上圖咱們能夠發現,(1)主體程序必需要經過 SELinux 政策內的規則放行後,就能夠與目標資源進行安全性本文的比對, (2)若比對失敗則沒法存取目標,若比對成功則能夠開始存取目標。問題是,最終可否存取目標仍是與文件系統的 rwx 權限設定有關喔!如此一來,加入了 SELinux 以後,出現權限不符的狀況時,你就得要一步一步的分析可能的問題了! 

   這個安全性本文你就將他想成 SELinux 內必備的 rwx 就是了,安全性本文是放置到檔案的 inode 內

   安全性本文主要用冒號分爲三個字段 (最後一個字段先略過不看),這三個字段的意義爲:

 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 搭配,則該程序纔可以順利的讀取檔案資源啦!

   

程序與檔案 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 相互關係
圖 7.4-二、主體程序取得的 domain 與目標檔案資源的 type 相互關係

上圖的意義咱們能夠這樣看的:

  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 權限的規範!

上述的流程告訴咱們幾個重點,第一個是政策內須要制訂詳細的 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 囉!


  • 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』呢?那能夠參考底下的指令來進行呦! 


  • restorecon
[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 才行!

相關文章
相關標籤/搜索