<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 7.4 SELinux 管理原則 ## 7.4 SELinux 管理原則 SELinux 使用所謂的委任式訪問控制 (Mandatory Access Control, MAC) ,他可以針對特定的程序與特定的檔案資源來進行權限的控管! 也就是說,即使你是 root ,那么在使用不同的程序時,你所能取得的權限并不一定是 root ,而得要看當時該程序的設定而定。 如此一來,我們針對控制的『主體』變成了『程序』而不是『使用者』喔!因此,這個權限的管理模式就特別適合網絡服務的『程序』了! 因為,即使你的程序使用 root 的身份去啟動,如果這個程序被攻擊而被取得操作權,那該程序能作的事情還是有限的, 因為被 SELinux 限制住了能進行的工作了嘛! 舉例來說, WWW 服務器軟件的達成程序為 httpd 這支程序, 而默認情況下, httpd 僅能在 /var/www/ 這個目錄底下存取檔案,如果 httpd 這個程序想要到其他目錄去存取數據時,除了規則設定要開放外,目標目錄也得要設定成 httpd 可讀取的模式 (type) 才行喔!限制非常多! 所以,即使不小心 httpd 被 cracker 取得了控制權,他也無權瀏覽 /etc/shadow 等重要的配置文件喔! - - - - - - ### 7.4.1 SELinux 的運作模式 再次的重復說明一下,SELinux 是透過 MAC 的方式來控管程序,他控制的主體是程序, 而目標則是該程序能否讀取的『檔案資源』!所以先來說明一下這些咚咚的相關性啦! - 主體 (Subject): SELinux 主要想要管理的就是程序,因此你可以將『主體』跟本章談到的 process 劃上等號; - 目標 (Object): 主體程序能否存取的『目標資源』一般就是文件系統。因此這個目標項目可以等文件系統劃上等號; - 政策 (Policy): 由于程序與檔案數量龐大,因此 SELinux 會依據某些服務來制訂基本的存取安全性政策。這些政策內還會有詳細的規則 (rule) 來指定不同的服務開放某些資源的存取與否。在目前的 CentOS 6.x 里面僅有提供兩個主要的政策如下,一般來說,使用預設的 target 政策即可。 - targeted:針對網絡服務限制較多,針對本機限制較少,是預設的政策; - mls:完整的 SELinux 限制,限制方面較為嚴格。 - 安全性本文 (security context): 我們剛剛談到了主體、目標與政策面,但是主體能不能存取目標除了要符合政策指定之外,主體與目標的安全性本文必須一致才能夠順利存取。 這個安全性本文 (security context) 有點類似文件系統的 rwx 啦!安全性本文的內容與設定是非常重要的! 如果設定錯誤,你的某些服務(主體程序)就無法存取文件系統(目標資源),當然就會一直出現『權限不符』的錯誤訊息了! ![](https://box.kancloud.cn/2016-05-13_5735da4f51be6.gif) 圖 7.4-1、SELinux 運作的各組件之相關性(本圖參考小州老師的上課講義) 上圖的重點在『主體』如何取得『目標』的資源訪問權限! 由上圖我們可以發現,(1)主體程序必須要通過 SELinux 政策內的規則放行后,就可以與目標資源進行安全性本文的比對, (2)若比對失敗則無法存取目標,若比對成功則可以開始存取目標。問題是,最終能否存取目標還是與文件系統的 rwx 權限設定有關喔!如此一來,加入了 SELinux 之后,出現權限不符的情況時,你就得要一步一步的分析可能的問題了! - - - - - - - 安全性本文 (Security Context) CentOS 6.x 的 target 政策已經幫我們制訂好非常多的規則了,因此你只要知道如何開啟/關閉某項規則的放行與否即可。 那個安全性本文比較麻煩!因為你可能需要自行配置文件案的安全性本文呢!為何需要自行設定啊? 舉例來說,你不也常常進行檔案的 rwx 的重新設定嗎?這個安全性本文你就將他想成 SELinux 內必備的 rwx 就是了!這樣比較好理解啦。 安全性本文存在于主體程序中與目標檔案資源中。程序在內存內,所以安全性本文可以存入是沒問題。 那檔案的安全性本文是記錄在哪里呢?事實上,安全性本文是放置到檔案的 inode 內的,因此主體程序想要讀取目標檔案資源時,同樣需要讀取 inode , 這 inode 內就可以比對安全性本文以及 rwx 等權限值是否正確,而給予適當的讀取權限依據。 那么安全性本文到底是什么樣的存在呢?我們先來看看 /root 底下的檔案的安全性本文好了。 觀察安全性本文可使用『 ls -Z 』去觀察如下:(注意:你必須已經啟動了 SELinux 才行!若尚未啟動,這部份請稍微看過一遍即可。底下會介紹如何啟動 SELinux 喔!) ``` [root@www ~]# ls -Z -rw-------. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 bin -rw-r--r--. root root system_u:object_r:admin_home_t:s0 install.log -rw-r--r--. root root system_u:object_r:admin_home_t:s0 install.log.syslog # 上述特殊字體的部分,就是安全性本文的內容! ``` 如上所示,安全性本文主要用冒號分為三個字段 (最后一個字段先略過不看),這三個字段的意義為: ``` 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 ~]# yum 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) 讀取的類型。文字看起來不太容易了解吧!我們使用圖示來說明這兩者的關系! ![](https://box.kancloud.cn/2016-05-13_5735da4f69ce2.gif) 圖 7.4-2、主體程序取得的 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 時所造成的權限困擾。 - - - - - - ### 7.4.2 SELinux 的啟動、關閉與觀察 并非所有的 Linux distributions 都支持 SELinux 的,所以你必須要先觀察一下你的系統版本為何! 鳥哥這里介紹的 CentOS 6.x 本身就有支持 SELinux 啦!所以你不需要自行編譯 SELinux 到你的 Linux 核心中! 目前 SELinux 支持三種模式,分別如下: - enforcing:強制模式,代表 SELinux 運作中,且已經正確的開始限制 domain/type 了; - permissive:寬容模式:代表 SELinux 運作中,不過僅會有警告訊息并不會實際限制 domain/type 的存取。這種模式可以運來作為 SELinux 的 debug 之用; - disabled:關閉,SELinux 并沒有實際運作。 那你怎么知道目前的 SELinux 模式呢?就透過 getenforce 吧! ``` [root@www ~]# getenforce Enforcing <==諾!就顯示出目前的模式為 Enforcing 啰! ``` 另外,我們又如何知道 SELinux 的政策 (Policy) 為何呢?這時可以來觀察配置文件啦: ``` [root@www ~]# vim /etc/selinux/config SELINUX=enforcing <==調整 enforcing|disabled|permissive SELINUXTYPE=targeted <==目前僅有 targeted 與 mls ``` - - - - - - - SELinux 的啟動與關閉 上面是默認的政策與啟動的模式!你要注意的是,如果改變了政策則需要重新啟動;如果由 enforcing 或 permissive 改成 disabled ,或由 disabled 改成其他兩個,那也必須要重新啟動。這是因為 SELinux 是整合到核心里面去的, 你只可以在 SELinux 運作下切換成為強制 (enforcing) 或寬容 (permissive) 模式,不能夠直接關閉 SELinux 的! 如果剛剛你發現 getenforce 出現 disabled 時,請到上述檔案修改成為 enforcing 然后重新啟動吧! 不過你要注意的是,如果從 disable 轉到啟動 SELinux 的模式時, 由于系統必須要針對檔案寫入安全性本文的信息,因此開機過程會花費不少時間在等待重新寫入 SELinux 安全性本文 (有時也稱為 SELinux Label) ,而且在寫完之后還得要再次的重新啟動一次喔!你必須要等待粉長一段時間! 等到下次開機成功后,再使用 [getenforce](#getenforce) 來觀察看看有否成功的啟動到 Enforcing 的模式啰! 如果你已經在 Enforcing 的模式,但是可能由于一些設定的問題導致 SELinux 讓某些服務無法正常的運作, 此時你可以將 Enforcing 的模式改為寬容 (permissive) 的模式,讓 SELinux 只會警告無法順利聯機的訊息, 而不是直接抵擋主體程序的讀取權限。讓 SELinux 模式在 enforcing 與 permissive 之間切換的方法為: ``` [root@www ~]# setenforce [0|1] 選項與參數: 0 :轉成 permissive 寬容模式; 1 :轉成 Enforcing 強制模式 # 范例一:將 SELinux 在 Enforcing 與 permissive 之間切換與觀察 [root@www ~]# setenforce 0 [root@www ~]# getenforce Permissive [root@www ~]# setenforce 1 [root@www ~]# getenforce Enforcing ``` 不過請注意, setenforce 無法在 Disabled 的模式底下進行模式的切換喔! **Tips:** 在某些特殊的情況底下,你從 Disabled 切換成 Enforcing 之后,竟然有一堆服務無法順利啟動,都會跟你說在 /lib/xxx 里面的數據沒有權限讀取,所以啟動失敗。這大多是由于在重新寫入 SELinux type (Relable) 出錯之故,使用 Permissive 就沒有這個錯誤。那如何處理呢?最簡單的方法就是在 Permissive 的狀態下,使用『 restorecon -Rv / 』重新還原所有 SELinux 的類型,就能夠處理這個錯誤! ![](https://box.kancloud.cn/2016-05-13_5735736501917.gif) - - - - - - ### 7.4.3 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 可以處理非常多的任務,不過,在這個小節我們主要想了解的是每個目錄的默認安全性本文。 如上面范例所示,我們可以查詢的到每個目錄的安全性本文啦!而目錄的設定可以使用[正規表示法](http://linux.vbird.org/linux_basic/0330regularex.php)去指定一個范圍。那么如果我們想要增加某些自定義的目錄的安全性本文呢? 舉例來說,我想要制訂 /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 對你來說,也不是什么太難的咚咚啰! - - - - - - ### 7.4.4 SELinux 政策內的規則布爾值修訂 前面講到,要通過 SELinux 的驗證之后才能開始檔案權限 rwx 的判斷,而 SELinux 的判斷主要是 (1)政策內的規則比對與 (2)程序與檔案的 SELinux type 要符合才能夠放行。前一個小節談的是 SELinux 的 type ,這個小節就是要談一下政策內的規則啰, 包括如何查詢與修改相關的規則放行與否啰。 - - - - - - - 政策查閱 CentOS 6.x 預設使使用 targeted 政策,那么這個政策提供多少相關的規則呢?此時可以透過 seinfo 來查詢喔! ``` [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 才行! - - - - - - ### 7.4.5 SELinux 登錄文件記錄所需服務 上述的指令功能當中,尤其是 setsebool, chcon, restorecon 等,都是為了當你的某些網絡服務無法正常提供相關功能時, 才需要進行修改的一些指令動作。但是,我們怎么知道哪個時候才需要進行這些指令的修改啊?我們怎么知道系統因為 SELinux 的問題導致網絡服務不對勁啊?如果都要靠客戶端聯機失敗才來哭訴,那也太沒有效率了!所以,我們的 CentOS 6.x 有提供幾支偵測的服務在登錄 SELinux 產生的錯誤喔!那就是 auditd 與 setroubleshootd。 - - - - - - - setroubleshoot --> 錯誤訊息寫入 /var/log/messages 幾乎所有 SELinux 相關的程序都會以 se 為開頭,這個服務也是以 se 為開頭!而 troubleshoot 大家都知道是錯誤克服, 因此這個 setroubleshoot 自然就得要啟動他啦!這個服務會將關于 SELinux 的錯誤訊息與克服方法記錄到 /var/log/messages 與 /var/log/setroubleshoot/\* 里頭,所以你一定得要啟動這個服務才好。啟動這個服務之前當然就是得要安裝它啦! 這玩意兒總共需要兩個軟件,分別是 setroublshoot 與 setroubleshoot-server,如果你沒有安裝,請自行使用 yum 安裝吧! 此外,原本的 SELinux 信息本來是以兩個服務來記錄的,分別是 auditd 與 setroubleshootd。既然是同樣的信息, 因此 CentOS 6.x 將兩者整合在 auditd 當中啦!所以,并沒有 setroubleshootd 的服務存在了喔!因此, 當你安裝好了 setroubleshoot-server 之后,請記得要重新啟動 auditd,否則 setroubleshootd 的功能不會被啟動的。 ``` [root@www ~]# yum install setroubleshoot setroubleshoot-server [root@www ~]# /etc/init.d/auditd restart <==整合到 auditd 當中了! ``` **Tips:** 事實上,CentOS 6.x 對 setroubleshootd 的運作方式是: (1)先由 auditd 去呼叫 audispd 服務, (2)然后 audispd 服務去啟動 sedispatch 程序, (3)sedispatch 再將原本的 auditd 訊息轉成 setroubleshootd 的訊息,進一步儲存下來的! ![](https://box.kancloud.cn/2016-05-13_5735736501917.gif) 那么如果有發生錯誤時,訊息像什么呢?我們使用 httpd 這支程序產生的錯誤來說明好了。假設你需要啟動 WWW 服務器, 我們的 WWW 是由 httpd 這支服務提供的,因此你必須要安裝且啟動它才行: ``` [root@www ~]# /etc/init.d/httpd start [root@www ~]# netstat -tlnp | grep http tcp 0 0 :::80 :::* LISTEN 2218/httpd # 看到沒?有啟動 port 80 了!這是重點! ``` 這個時候我們的 WWW 服務器就安裝妥當了。我們的首頁其實是放置到 /var/www/html 目錄下的,且文件名必須要是 index.html。 那如果我使用底下的模式來進行首頁的處理時,可能就會產生 SELinux 的問題了!我們就來模擬一下出問題的狀況吧! ``` [root@www ~]# echo "My first selinux check" > index.html [root@www ~]# ll index.html -rw-r--r--. 1 root root 23 2011-07-20 18:16 index.html <==權限沒問題 [root@www ~]# mv index.html /var/www/html ``` 此時我們就可以打開瀏覽器,然后在瀏覽器上面輸入 Linux 自己的 IP 來查察看,看能不能連上自己的 WWW 首頁。 因為我們這次安裝并沒有圖形接口,所以使用 links 來查察 <http://localhost/index.html> 看看!你會得到如下的訊息: ``` [root@www ~]# links http://localhost/index.html -dump Forbidden You don't have permission to access /index.html on this server. -------------------------------------------------------------------------- Apache/2.2.15 (CentOS) Server at localhost Port 80 ``` 畫面最明顯的地方就是告訴你,你并沒有權限可以存取 index.html 的!見鬼了!明明權限是對的喔!那怎辦? 沒關系,就透過 setroubleshoot 的功能去檢查看看。此時請分析一下 /var/log/messages 的內容吧!有點像這樣: ``` [root@www ~]# cat /var/log/messages | grep setroubleshoot Jul 21 14:53:20 www setroubleshoot: SELinux is preventing /usr/sbin/httpd "getattr" access to /var/www/html/index.html. For complete SELinux messages. run sealert -l 6c927892-2469-4fcc-8568-949da0b4cf8d ``` 上面的錯誤訊息可是同一行喔!大綱說的是『SElinux 被用來避免 httpd 讀取到錯誤的安全性本文, 想要查閱完整的數據,請執行 sealert -l ...』沒錯!你注意到了!重點就是 sealert -l 啦! 上面提供的信息并不完整,想要更完整的說明得要靠 sealert 配合偵測到的錯誤代碼來處理。 實際處理后會像這樣: ``` [root@www ~]# sealert -l 6c927892-2469-4fcc-8568-949da0b4cf8d Summary: SELinux is preventing /usr/sbin/httpd "getattr" access to /var/www/html/index.html. <==剛剛在 messages 里面看到的信息! Detailed Description: <==接下來是詳細的狀況解析!要看喔! SELinux denied access requested by httpd. /var/www/html/index.html may be a mislabeled. /var/www/html/index.html default SELinux type is httpd_sys_content_t, but its current type is admin_home_t. Changing this file back to the default type, may fix your problem. ....(中間省略).... Allowing Access: <==超重要的項目!要看要看! You can restore the default system context to this file by executing the restorecon command. restorecon '/var/www/html/index.html', if this file is a directory, you can recursively restore using restorecon -R '/var/www/html/index.html'. Fix Command: /sbin/restorecon '/var/www/html/index.html' <==知道如何解決了嗎? Additional Information: <==還有一些額外的信息! ....(底下省略).... [root@www ~]# restorecon -Rv '/var/www/html/index.html' restorecon reset /var/www/html/index.html context unconfined_u:object_r: admin_home_t:s0->system_u:object_r:httpd_sys_content_t:s0 ``` 重點就是上面特殊字體顯示的地方!你只要照著『Allowing Access』里面的提示去進行處理, 就能夠完成你的 SELinux 類型設定了!比對剛剛我們上個小節提到的 [restorecon](#restorecon) 與 [chcon](#chcon) 你就能夠知道, setroubleshoot 提供的訊息有多有效了吧!不管出了啥 SELinux 的問題,絕大部分在 setroubleshoot 的服務中就會告訴你解決之道!所以,很多東西都不用背的! - - - - - - - 用 email 或在指令列上面直接提供 setroubleshoot 錯誤訊息 如果每次測試都得要到 /var/log/messages 去分析,那真是挺麻煩的啊!沒關系,我們可以透過 email 或 console 的方式來將信息產生!也就是說,我們可以讓 setroubleshoot 主動的發送產生的信息到我們指定的 email,這樣可以方便我們實時的分析喔!怎么辦到?就修改 setroubleshoot 的配置文件即可。你可以查閱 /etc/setroubleshoot/setroubleshoot.cfg 這個檔案的內容,我們只需要修改的地方如下: ``` [root@www ~]# vim /etc/setroubleshoot/setroubleshoot.cfg [email] # 大約在 81 行左右,這行要存在才行! recipients_filepath = /var/lib/setroubleshoot/email_alert_recipients # 大約在 147 行左右,將原本的 False 修改成 True 先! console = True [root@www ~]# vim /var/lib/setroubleshoot/email_alert_recipients root@localhost your@email.address [root@www ~]# /etc/init.d/auditd restart ``` 之后你就可以透過分析你的 email 來取得 SELinux 的錯誤訊息啰!非常的簡單吧!只是要注意,上述的填寫 email 的檔案中, 不能只寫賬號,你要連同 @localhost 都寫上,這樣本機上面的 root 才能收到信件喔!就這么簡單哩! ^\_^ - - - - - - - SELinux 錯誤克服的總結 我們來簡單的做個總結吧!因為你的網絡聯機要通過 SELinux 才的權限判定后才能夠繼續 rwx 的權限比對。而 SELinux 的比對主要又分為: (1)需要通過政策的各項規則比對后 (2)才能夠進行 SELinux type 安全性本文的比對,這兩項工作都得要正確才行。而后續的 SELinux 修改主要是透過 chcon, restorecon, setsebool 等指令來處理的。但是如何處理呢?可以透過分析 /var/log/messages 內提供的 setroubleshoot 的信息來處置!這樣就很輕松的可以管理你的 SELinux 啰! 但是如果因為某些原因,舉例來說 CentOS 沒有規范到的 setroubleshoot 信息時,可能你還是無法了解到事情到底是哪里出錯。 那此時我們會這樣建議: 1. 在服務與 rwx 權限都沒有問題,卻無法成功的使用網絡服務時; 2. 先使用 setenforce 0 設定為寬容模式; 3. 再次使用該網絡服務,如果這樣就能用,表示 SELinux 出問題,請往下繼續處理。如果這樣還不能用,那問題就不是在 SELinux 上面!請再找其他解決方法,底下的動作不適合你; 4. 分析 /var/log/messages 內的信息,找到 sealert -l 相關的信息并且執行; 5. 找到 Allow Access 的關鍵詞,照里面的動作來進行 SELinux 的錯誤克服; 6. 處理完畢重新 setenforce 1 ,再次測試網絡服務吧! 這樣就能夠很輕松的管理你的 SELinux 啦!不需要想太多!分析登錄檔就對啦! **Tips:** 當鳥哥第一次修改這個 SELinux 的部分時,在 sealert 的部分一直出現錯誤,信息為: query\_alert error (1003)... 后來經過更新軟件后,又發現無法以 UTF8 進行文字譯碼的問題!實在傷腦筋~最后還是修改了 /etc/sysconfig/i18n 將里面的數據設定為: LANG=en\_US 并且重新啟動,才順利恢復 sealert 的信息說明!真的是很怪異! ![](https://box.kancloud.cn/2016-05-13_5735736501917.gif) - - - - - -
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看