SELinux (Security-Enhanced Linux) 是 Linux 核心強制存取控制 (MAC) 安全模組,預設啟用於 RHEL/CentOS/Fedora 等發行版。本文詳解 SELinux 三種模式、狀態查看命令、臨時/永久關閉方法、策略調整替代方案,助你在安全與相容性間取得平衡。
| 命令 | 輸出範例 | 說明 |
getenforce | Enforcing | 快速查看當前模式 |
sestatus -v | 詳細狀態含策略版本、模式、載入模組 | 完整資訊 |
cat /etc/selinux/config | 設定檔內容 | 永久生效設定來源 |
臨時切換模式 (重啟失效)
# 切換到 Permissive (推薦除錯用)
sudo setenforce 0
# 或
sudo setenforce Permissive
# 切換回 Enforcing
sudo setenforce 1
# 或
sudo setenforce Enforcing
注意: setenforce 僅在當前模式為 Enforcing/Permissive 間切換,無法從 Disabled 切換出來(需重啟)。
永久關閉/修改模式 (需重啟)
- 編輯配置檔:
sudo vim /etc/selinux/config
- 修改
SELINUX= 行:
SELINUX=disabled # 完全關閉
# 或
SELINUX=permissive # 永久寬容模式
- 重啟系統:
sudo reboot
關鍵參數說明:
SELINUXTYPE=targeted:預設策略類型,僅保護網路服務等目標進程。
SELINUXTYPE=mls:多層級安全策略,極少使用。
替代方案:調整策略而非關閉 (強烈推薦)
關閉 SELinux 會降低系統安全性,優先嘗試以下方法:
1. 利用 audit2allow 產生自定義策略模組
# 1. 確保 auditd 運行
systemctl start auditd
# 2. 重現問題操作(如啟動服務失敗)
# 3. 從審計日誌產生允許規則
grep denied /var/log/audit/audit.log | audit2allow -M myapp
# 4. 安裝模組
semodule -i myapp.pp
2. 設定布林值開關
# 查看所有布林值
getsebool -a
# 例:允許 httpd 連接資料庫
setsebool -P httpd_can_network_connect_db on
# 例:允許 ftpd 完整存取
setsebool -P ftpd_full_access on
3. 修正檔案安全上下文
# 查看上下文
ls -Z /var/www/html/
# 恢復預設上下文
restorecon -Rv /var/www/html/
# 自定義上下文 (如非標準目錄)
semanage fcontext -a -t httpd_sys_content_t "/data/www(/.*)?"
restorecon -Rv /data/www
驗證修改生效
# 重啟後
getenforce
sestatus
# 測試原本被阻擋的操作是否通過
常見誤區
| 誤區 | 正確做法 |
直接改 /etc/sysconfig/selinux | 此為 /etc/selinux/config 符號連結,改任一均可,但以標準路徑為準 |
| 關閉 SELinux 解決所有權限問題 | DAC (rwx) 權限仍生效,SELinux 是額外層,需區分 |
| Permissive 模式不記錄日誌 | Permissive 完整記錄 AVC 拒絕日誌,是除錯利器 |
| 容器內關閉宿主機 SELinux | 容器共享宿主機核心,SELinux 策略在宿主機層面生效 |
企業級建議
- 預設保持 Enforcing,建立標準化部署流程包含 SELinux 策略調整。
- 使用
udica 從容器運行記錄自動生成策略:udica -j container.json mypolicy。
- 納入基線檢查:
oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_stig /usr/share/xml/scap/ssg/content/ssg-rhel8-ds.xml。
理解 SELinux 機制並善用策略調整工具,比單純關閉更能保障系統長期安全穩定運行。