從一個常見情境說起
你可能遇過這種狀況:檔案的擁有者、群組、權限(rwx)看起來都設定正確,chmod、chown 也都對了,但服務(例如 nginx、PHP-FPM)就是讀不到檔案,畫面顯示空白或 403。這背後的原因,很可能就是 SELinux。
DAC:傳統的權限機制
我們在 Linux 基礎入門學過的 rwx 權限、chown、chmod,屬於 DAC(Discretionary Access Control,自主式存取控制):檔案的擁有者可以自行決定要把權限開放給誰。問題是,一旦某個程式被攻破,攻擊者就會擁有跟這個程式一樣的權限,DAC 無法進一步限制。
MAC:SELinux 帶來的第二道防線
SELinux(Security-Enhanced Linux) 是由美國國家安全局(NSA)開發、整合進 Linux 核心的安全模組,提供 MAC(Mandatory Access Control,強制式存取控制)。即使 DAC 權限允許,SELinux 的政策(Policy)也可能拒絕這個操作——兩道關卡都要通過,操作才會成功。
核心概念
- Subject(主體):發起動作的程序(process),例如 nginx
- Object(客體):被存取的對象,例如檔案、目錄、網路連接埠
- Context(標籤):每個主體與客體都有一個 SELinux context,格式為
使用者:角色:類型:等級(例如 system_u:object_r:httpd_sys_content_t:s0)
- Policy(政策):定義「哪種 type 的程序可以對哪種 type 的物件做什麼操作」的規則集合
為什麼值得學?
- 即使網站程式被入侵,SELinux 也能限制攻擊者能做的事(例如不讓 web server 的程序讀取
/etc/shadow) - 容器技術(Podman / Docker)大量依賴 SELinux 來隔離不同容器的檔案存取
- 排查「權限明明對卻讀不到」這類問題時,SELinux 往往是關鍵線索
接下來幾章,我們會從查看狀態開始,逐步學會如何「看懂」與「調整」SELinux。