1. 什麼是 SELinux?它有什麼用?
SELinux (Security-Enhanced Linux) 是一個安全模組,增強了傳統檔案權限控制模型,加入了強制訪問控制的概念。它讓管理員可以為用戶甚至是程序設定更嚴格的限制,來最大化減少潛在攻擊帶來的損害。
它有什麼特點?
想像一下你的系統是一個房子。傳統的訪問權限(rwx 為用戶、群組及其他人設定)就像給房門的鎖配置的鑰匙。但如果有人破門而入呢?SELinux 就像是第二層防線,透過行為規則來增強防護:"嘿,即使你已經進來了,也不能進浴室!"
SELinux 的主要任務:
- 防止未經授權的進程或檔案訪問。
- 即使進程被攻擊,也能減少損害。
- 落實 "預設防護" 原則(禁止一切,僅允許被授權的動作)。
SELinux 工作模式
SELinux 有三種工作模式:
- Enforcing — 啟用安全策略並阻止違規進程。
- Permissive — 只記錄違規行為到日誌中,但不阻止行為。
- Disabled — 完全停用
SELinux 在 enforcing 模式下就像是系統的嚴格大哥。而 permissive 模式則像是小弟弟,只會抱怨,但什麼都不做。
2. 檢查 SELinux 狀態
首先,我們來看看 SELinux 是否啟用,以及它正在運行什麼模式。有幾個方便的指令可以用來檢查。
指令 getenforce
這個指令會告訴你目前用的是哪一種模式:Enforcing、Permissive,還是 Disabled。
$ getenforce
Enforcing
如果輸出是 Disabled,那麼 SELinux 就是關閉狀態啦——這表示你需要花點時間來啟用它,但這部分我們待會兒再說。
指令 sestatus
要獲得更完整的 SELinux 狀態報告,可以使用這個指令。它會顯示當前狀態、活動模式以及使用的策略。
$ sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
在這裡,你可以看到:
- enabled/disabled — SELinux 是否啟用。
- current mode — 當前模式(enforcing, permissive)。
- loaded policy name — 加載的策略名稱。例如,"targeted" 表示 SELinux 只對重要進程進行控制。
3. 切換 SELinux 模式
要改變當前 SELinux 的運作模式,可以使用指令 setenforce。
切換到 permissive 模式
如果你暫時想要 "放鬆 SELinux 的限制",可以啟用 permissive 模式哦。
$ sudo setenforce 0
現在 SELinux 只會記錄違規行為,但不會阻止它們發生。你可以用指令 getenforce 檢查新的設定:
$ getenforce
Permissive
切換回 enforcing 模式
當你想要再次啟用嚴格控制時,可以執行:
$ sudo setenforce 1
然後,當然要檢查結果啦:
$ getenforce
Enforcing
這個更改是即時生效的,但只會持續到系統下一次重啟哦。
4. 啟用 SELinux
如果 SELinux 被禁用,需要修改配置文件。SELinux 是通過文件 /etc/selinux/config 管理的。
檢查當前的配置文件
來看看目前的設置。可以使用任何文字編輯器,例如 nano:
$ sudo nano /etc/selinux/config
你會看到類似這樣的內容:
# This file controls the state of SELinux on the system.
SELINUX=disabled
SELINUXTYPE=targeted
切換 SELinux 到啟用狀態
為了啟用 SELinux,把行 SELINUX=disabled 改成 SELINUX=enforcing 或 SELINUX=permissive。
修改後的文件範例如下:
# This file controls the state of SELinux on the system.
SELINUX=enforcing
SELINUXTYPE=targeted
編輯後保存文件,然後重新啟動系統:
$ sudo reboot
重啟後可以用 sestatus 檢查狀態,確認 SELinux 是否已經啟用。
5. SELinux 上下文解析
什麼是上下文?
上下文是 SELinux 用於管理訪問的標記。每個文件、進程和用戶都有自己的上下文。
你可以用指令 ls -Z 來查看文件的上下文。比如:
$ ls -Z /var/www/html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
這是什麼意思呢?
- unconfinedu — SELinux 用戶。
- objectr — 對象類型。
- httpdsyscontent_t — 訪問類型(在此情況下與 Web 伺服器相關)。
- s0 — 安全級別。
更改上下文
如果 SELinux 阻礙了你的應用程式運行,那可能需要修改文件的上下文。使用指令 chcon:
$ sudo chcon -t httpd_sys_content_t /var/www/html/index.html
這條指令臨時更改了文件上下文類型。但是重新啟動後更改可能會丟失,因此對於永久設置,最好修改 SELinux 策略(稍後我們會談到)。
6. 使用 SELinux 的範例
讓我們來看一個例子吧!你是一個伺服器管理員,想要部署一個 Web 伺服器,但 SELinux 阻止了對目錄 /var/www/html 中檔案的訪問。
步驟:
檢查 SELinux 的狀態:
$ sestatus確保 SELinux 已啟用並在 enforcing 模式下運行。
查看檔案的上下文:
$ ls -Z /var/www/html如果上下文不正確,修改它:
$ sudo chcon -t httpd_sys_content_t /var/www/html/*檢查 Web 伺服器是否可以正常運行。
7. 常見錯誤與問題
SELinux 被關閉,而你沒有注意到。 一定要用
sestatus檢查狀態。很多管理員在安裝系統後忘記打開 SELinux。「為什麼我的服務不起作用?」 SELinux 阻止了存取。用
audit.log進行分析:$ sudo cat /var/log/audit/audit.log | grep denied上下文的變更沒被保存。 不要用
chcon,而是使用能永久變更的指令,例如semanage。
學習 SELinux 就像準備一場馬拉松:一開始可能很困難,但隨著時間推移,你會了解這個工具如何顯著提升系統的安全性。運用這些知識成為一個無懼高手駭客的管理員吧。
GO TO FULL VERSION