SELinux 初學者指南

SELinux 初學者指南

為課程學生準備的文章翻譯 《Linux 安全》

SELinux或SecurityEnhancedLinux是美國國家安全局(NSA)為防止惡意入侵而開發的增強存取控制機制。它在現有的自主(或選擇性)模型(英文Discretionary Access Control,DAC)之上實現了強制(或強制)存取控制模型(英文Mandatory Access Control,MAC),即讀取、寫入、執行的權限。

SELinux 有三種模式:

  1. 強制執行 — 基於策略規則的存取拒絕。
  2. 允許的 — 記錄違反政策的行為,這在強制模式下是被禁止的。
  3. 殘疾人 — 完全停用 SELinux。

預設情況下,設定位於 /etc/selinux/config

更改 SELinux 模式

若要找出目前模式,請執行

$ getenforce

若要將模式變更為寬容,請執行以下命令

$ setenforce 0

或者,更改模式 寬容強制執行, 執行

$ setenforce 1

如果需要完全停用SELinux,那麼只能透過設定檔來完成

$ vi /etc/selinux/config

若要停用,請變更 SELINUX 參數,如下所示:

SELINUX=disabled

設定 SELinux

每個檔案和程序都標有 SELinux 上下文,其中包含使用者、角色、類型等附加資訊。如果這是您第一次啟用 SELinux,您首先需要設定上下文和標籤。分配標籤和上下文的過程稱為標記。要開始標記,在設定檔中我們將模式變更為 寬容.

$ vi /etc/selinux/config
SELINUX=permissive

設定模式後 寬容,在根目錄中建立一個空的隱藏文件,名稱為 autorelabel

$ touch /.autorelabel

並重新啟動計算機

$ init 6

注意:我們使用的模式 寬容 用於標記,因為使用該模式 強制執行 可能會導致系統在重新啟動時崩潰。

如果下載卡在某些文件上,請不要擔心,標記需要一段時間。標記完成並且系統啟動後,您可以轉到設定檔並設定模式 強制執行並且還運行:

$ setenforce 1

您現在已成功在電腦上啟用 SELinux。

監控日誌

您可能在標記過程中或系統運行時遇到了一些錯誤。要檢查您的 SELinux 是否正常工作以及它是否沒有阻止對任何連接埠、應用程式等的訪問,您需要查看日誌。 SELinux 日誌位於 /var/log/audit/audit.log,但您不需要閱讀整篇文章來尋找錯誤。您可以使用audit2why實用程式來尋找錯誤。運行以下命令:

$ audit2why < /var/log/audit/audit.log

結果,您將收到錯誤清單。如果日誌中沒有錯誤,則不會顯示任何訊息。

配置 SELinux 策略

SELinux 策略是一組管理 SELinux 安全機制的規則。策略定義了針對特定環境的一組規則。現在我們將學習如何設定策略以允許存取禁止的服務。

1.邏輯值(開關)

開關(布林值)可讓您在執行時間變更策略的部分內容,而無需建立新策略。它們允許您無需重新啟動或重新編譯 SELinux 策略即可進行更改。

例子
假設我們想透過 FTP 讀取/寫入共享使用者的主目錄,並且我們已經共享了它,但是當我們嘗試存取它時,我們什麼也看不到。這是因為 SELinux 策略阻止 FTP 伺服器讀取和寫入使用者的主目錄。我們需要更改策略,以便 FTP 伺服器可以存取主目錄。讓我們看看是否有任何開關可以這樣做

$ semanage boolean -l

此命令將列出可用開關及其當前狀態(開啟或關閉)和說明。您可以透過新增 grep 來尋找僅限 ftp 的結果來最佳化搜尋:

$ semanage boolean -l | grep ftp

你會發現以下內容

ftp_home_dir        -> off       Allow ftp to read & write file in user home directory

該開關已停用,因此我們將啟用它 setsebool $ setsebool ftp_home_dir on

現在我們的 ftp 守護程式將能夠存取使用者的主目錄。
注意:您也可以透過執行以下操作來取得沒有說明的可用開關列表 getsebool -a

2. 標籤和上下文

這是實作 SELinux 策略最常見的方式。每個檔案、資料夾、進程和連接埠都標有 SELinux 上下文:

  • 對於檔案和資料夾,標籤作為擴充屬性儲存在檔案系統上,可以使用以下命令檢視:
    $ ls -Z /etc/httpd
  • 對於進程和端口,標籤由核心管理,您可以按如下方式查看這些標籤:

過程

$ ps –auxZ | grep httpd

端口

$ netstat -anpZ | grep httpd

例子
現在讓我們看一個範例以更好地理解標籤和上下文。假設我們有一個 Web 伺服器,而不是目錄 /var/www/html/ использует /home/dan/html/。 SELinux 會認為這違反了政策,您將無法查看您的網頁。這是因為我們尚未設定與 HTML 檔案關聯的安全性上下文。若要查看預設安全上下文,請使用以下命令:

$ ls –lz /var/www/html
 -rw-r—r—. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/

在這裡我們得到了 httpd_sys_content_t 作為 html 檔案的上下文。我們需要為目前目錄設定此安全上下文,目前目錄具有以下上下文:

-rw-r—r—. dan dan system_u:object_r:user_home_t:s0 /home/dan/html/

檢查檔案或目錄的安全上下文的替代命令:

$ semanage fcontext -l | grep '/var/www'

一旦找到正確的安全上下文,我們也會使用 semanage 來更改上下文。若要變更 /home/dan/html 的上下文,請執行下列命令:

$ semanage fcontext -a -t httpd_sys_content_t ‘/home/dan/html(/.*)?’
$ semanage fcontext -l | grep ‘/home/dan/html’
/home/dan/html(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
$ restorecon -Rv /home/dan/html

使用 semanage 更改上下文後,restorecon 命令將載入檔案和目錄的預設上下文。我們的網頁伺服器現在可以從該資料夾中讀取文件 /home/dan/html因為該資料夾的安全上下文已變更為 httpd_sys_content_t.

3.制定地方政策

在某些情況下,上述方法可能對您沒有用,並且您會在audit.log 中收到錯誤(avc/denial)。發生這種情況時,您需要建立本機原則。您可以使用audit2why 找到所有錯誤,如上所述。

您可以建立本機原則來解決錯誤。例如,我們收到與 httpd (apache) 或 smbd (samba) 相關的錯誤,我們 grep 錯誤並為它們建立策略:

apache
$ grep httpd_t /var/log/audit/audit.log | audit2allow -M http_policy
samba
$ grep smbd_t /var/log/audit/audit.log | audit2allow -M smb_policy

這裡 http_policy и smb_policy 是我們建立的本機策略的名稱。現在我們需要將這些已建立的本機策略載入到目前的 SELinux 策略中。這可以如下完成:

$ semodule –I http_policy.pp
$ semodule –I smb_policy.pp

我們的本機策略已下載,我們不應再在audit.log 中收到任何avc 或denail。

這是我試圖幫助您了解 SELinux 的嘗試。我希望讀完這篇文章後您會對 SELinux 感到更加得心應手。

來源: www.habr.com

添加評論