紅帽SELinux資料-翻譯---第三章-Targeted策略
紅帽企業 Linux 7 SELinux
用戶和管理員指南
翻譯者:李天聰
第三章 Targeted策略
Targeted策略是紅帽企業Linux的默認SELinux策略。當使用targeted策略時,目標進程運行在受限的域中,非目標進程運行在不受限的域中。例如,默認情況下,登錄的用戶運行在unconfined_t域,由init啟動的系統進程運行在unconfined_service_t域;這兩個域都是非受限的。
可執行和可寫內存檢查可能適用于受限域和非受限域。然而默認情況下,在不受限制的域中運行的主體可以分配可寫內存并執行它。這些內存檢查可以通過設置布爾值來啟用,這允許 SELinux 策略在運行時修改。布爾配置將在后面討論。
3.1 受限進程
在紅帽企業Linux中,幾乎所有在網絡上偵聽的服務,如sshd或httpd,都是受限的。此外,大多數以root用戶身份運行并為用戶執行任務的進程,例如 passwd程序,也是受限的。當進程被限制時,它會在自己的域中運行,例如在httpd_t域中運行的httpd進程。如果受限進程被攻擊者破壞,由于SELinux策略配置,攻擊者對資源的訪問和可能造成的損害是有限的。
完成以下步驟以確保已啟用SELinux,并且系統已準備好執行以下示例:
如何驗證SELinux狀態
1) 確認SELinux已啟用,運行在enforcing模式下,并且使用targeted策略。正確的輸出應類似于下面的輸出:

關于更改SELinux模式的詳細信息,請參見第4.4節 “SELinux狀態和模式的永久更改”。
2) 以root用戶的身份,在/var/www/html目錄下創建一個文件:

3) 輸入下面的這條命令來查看這個新文件的SELinux安全上下文:

默認情況下,在紅帽企業Linux中,Linux用戶不受限制地運行,這就是testfile文件被標記為unconfined_u的原因。RBAC 用于進程,而不是文件。角色對文件來說沒有意義;object_r角色是用于文件的(在持久存儲和網絡文件系統)。在/proc目錄下,與進程相關的文件可能使用system_r角色。httpd_sys_content_t類型:允許httpd進程訪問此文件。
下面的示例演示了SELinux如何防止Apache HTTP服務器 (httpd)讀取未正確標記的文件,例如供Samba使用的文件。這是一個例子,并且不應在生產中使用。它假設安裝了httpd和wget軟件包,使用SELinux的targetd策略,并且 SELinux 在enforcing模式下運行。
例子:受限進程
1) 以root身份啟動httpd守護進程:

確認服務正在運行。輸出應包括以下信息(你電腦的打印應該僅時間戳不同):

2) 切換到您的Linux用戶具有寫入訪問權限的目錄,然后輸入以下內容命令。除非對默認配置進行了更改,否則此命令將成功:

3) chcon命令能夠重新標記文件;但是,當系統重新標記時,此類標簽更改不會繼續存在。對于在文件系統重新標記后繼續存在的永久更改,請使用semanage程序,稍后將討論。現在以root身份輸入以下命令把類型改為Samba使用的類型:

輸入下面這條命令來查看更改的結果

4) 請注意,當前的DAC權限允許httpd進程訪問testfile。現在進入一個你的linux用戶有寫權限的目錄,然后輸入以下命令。除非有更改默認配置時,此命令將失敗:

5) 以root用戶的身份刪除testfile

6) 最后,如果你不需要用httpd,就用root賬戶輸入下面的命令把它關掉

此示例演示了SELinux附加的安全性。盡管DAC規則允許httpd進程在步驟2中對testfile的訪問,但是因為該文件被標記為httpd進程無權訪問的tpye,SELinux拒絕了這個訪問。
如果auditd的守護程序正在運行,則會在/var/log/audit/audit.log中記錄類似于以下內容的錯誤:

此外,類似于以下內容的錯誤將記錄到/var/log/httpd/error_log:

3.2 非受限進程
非受限進程運行在不受約束的域中,例如,由init啟動的非受限服務最終運行在unconfined_service_t域中,由內核執行的非受限服務最終運行在kernel_t域中,由非受限Linux用戶執行的非受限服務最終運行在unconfined_t域中。對于非受限進程, SELinux策略規則被應用了,不過在非受限域中運行的進程幾乎被允許訪問所有的類。運行在非限域中的進程將回退到僅使用DAC規則的狀態。如果一個非限制進程被攻擊,SELinux不會阻止攻擊者訪問系統資源和數據,但是,當然了, DAC規則仍然在生效。SELinux是DAC規則之上的安全增強功能-而并不是把它替換掉了。
要確保SELinux啟用了,并且系統已準備好執行以下示例,參考第3.1節 “受限進程”中所述的例子 “如何驗證SELinux 狀態”流程。
以下示例演示了Apache HTTP服務器(httpd)如何訪問預期數據供Samba在不受限制的情況下使用。請注意,在紅帽企業 Linux 中,httpd 進程默認情況下在受限httpd_t域中運行。這是一個示例,不應在生產中使用。它假設安裝了httpd,wget,dbus和audit包,SELinux使用targeted策略,并且SELinux運行正在enforcing模式下。
一個非限制進程的例子:
1) 以root用戶輸入下面的命令,將testfile改為Samba使用的類型:

查看修改的結果:

2) 輸入以下命令來確認httpd進程有沒有運行,如果打印與下面這個相同,則代表沒有運行:

如果輸出與上面這個圖片不同,則執行下面的命令來把httpd程序停掉:

3) 要使httpd進程不受限制地運行,請以 root 身份輸入以下命令以更/usr/sbin/httpd文件的類型,轉換為不轉換為受限域的類型:

4) 確保/usr/sbin/httpd被標記為bin_t;

5) 以root用戶,啟動httpd進程,并確認它成功的啟動了:


6) 輸入下面的命令,可以看到httpd運行在unconfined_service_t域:

7) 進入你的linux用戶有寫權限的目錄,然后執行下面的命令。除非改過默認配置,否則這個命令應該能夠成功執行:

盡管根據selinux策略httpd進程無法訪問標有samba_share_t類型的文件,但是httpd在不受限制的unconfined_service_t域中運行,因此回退到只使用DAC規則的狀態了,因此,wget命令能夠成功執行。如果httpd一直運行在受控的httpd_t域中,wget 命令將失敗。
8) restorencon程序用于恢復文件的默認SELinux上下文。以root用戶身份輸入以下命令恢復/usr/sbin/httpd的默認SELinux上下文

確認/usr/sbin/httpd標記為httpd_exec_t類型:

9) 以root用戶身份輸入以下命令重新啟動httpd。重新啟動后,確認httpd是在受限域httpd_t中運行:


10) 以root用戶身份,刪掉testfile

11) 如果你不用httpd服務的話,以root用戶身份,運行下面這條命令把它停掉:

這個例子展示了當受限進程被攻擊后,數據能夠被保護(受SELinux的保護),以及當非受限進程被攻擊后,數據更容易被攻擊者獲取(不受SELinux保護)。
3.3 受限和非受限用戶
基于SELinux策略,每一個linux用戶都能夠映射到一個SELinux用戶,這就使得linux用戶能夠繼承這個SELinux用戶的限制。Linux用戶與SELinux用戶之間的映射關系,可以運行“semanage login -l”命令來查看(需要以root用戶身份來運行):

在紅帽企業Linux中,Linux用戶默認被映射到__default__,它會被映射到SELinux用戶“unconfined_u”。下面這行定義了這個默認映射關系:

以下過程演示如何將新的Linux用戶添加到系統以及如何映射該用戶到 SELinux用戶unconfined_u。它假設root用戶不受限制地運行,就像在紅帽企業Linux中默認情況下一樣:
將新的Linux用戶映射到SELinux用戶unconfined_u
1) 以root用戶身份,執行下面這條命令,創建一個新的linux用戶newuser:

2) 以root用戶身份,運行下面這條命令,給新用戶設置一個密碼:


3) 注銷當前會話,然后以新用戶newuser登錄,當你登錄時,“pam_selinux”PAM模塊會自動將Linux用戶映射到SELinux用戶(在這個例子中,是unconfined_u),并設置生成SELinux安全上下文。然后linux用戶的shell基于這個安全上下文啟動。輸入下面這條命令來查看linux用戶(shell)的安全上下文:

4) 如果你不需要newuser用戶,先退出newuser的會話,然后登錄你自己的賬戶,以root用戶身份運行“userdel -r newuser”命令,這條命令將刪除newuser用戶,以及它的家目錄。
受限和非受限Linux用戶需要受制于可執行和可寫內存檢查,并且也受到MCS和MLS的限制。
運行下面這條命令可以查看所有可用的SELinux用戶:

注意:seinfo命令由“setools-console package”包提供,這個包默認是不安裝的。
如果一個非受限的linux 用戶執行了一個應用程序,這個應用程序被SELinux策略定義為可以從unconfined_t域轉換為自己的受限域,那么這個非受限的linux用戶則將依然受限與對這個受限域的限制。這樣做的優勢在于,即使一個linux用戶運行在非受限狀態,應用程序依然是受限的。一個應用的漏洞造成的危害能夠被規則限制。

浙公網安備 33010602011771號