SELinux 基礎入門

第六章:疑難排解與稽核工具

第一步:查看 Audit Log

SELinux 拒絕的操作(AVC denial)會記錄在稽核日誌中:

sudo ausearch -m avc -ts recent      # 查看最近的 AVC 拒絕紀錄
sudo tail -f /var/log/audit/audit.log

如果看到一筆 type=AVC ... denied { read } ... scontext=...httpd_t ... tcontext=...some_type_t,代表 httpd_t 嘗試對某個 some_type_t 的物件做 read,但被政策拒絕了。

audit2why:看懂為什麼被拒絕

sudo ausearch -m avc -ts recent | audit2why

這個工具會把生硬的稽核紀錄,轉換成比較容易理解的說明,並且常常會直接建議「你可以開啟哪個 Boolean」來解決問題。

audit2allow:產生客製化政策(謹慎使用)

如果問題不是 Boolean 能解決的特殊情境,可以讓系統根據拒絕紀錄,自動產生一個客製化政策模組:

sudo ausearch -m avc -ts recent | audit2allow -M mypolicy
sudo semodule -i mypolicy.pp

注意audit2allow 只是「把曾經被拒絕的操作都允許」,並不會幫你判斷這個操作合不合理。應該先確認這個操作本身是預期內的行為,再決定是否套用,避免把真正的安全問題也一併放行。

sealert:圖形化說明(桌面環境)

如果系統有安裝 setroubleshoot,可以用:

sealert -a /var/log/audit/audit.log

它會用比較完整的敘述解釋每一筆拒絕事件,並提供建議的修正指令。

排查流程總結

  1. 先用 getenforce 確認目前是 Enforcing 還是 Permissive
  2. 重現問題後,用 ausearch -m avc -ts recent 找出對應的 AVC 紀錄
  3. audit2why 理解原因,優先檢查是否有對應的 Boolean 可開啟
  4. 若沒有合適的 Boolean,檢查 context 是否正確(ls -Zrestorecon
  5. 真的都不行,才考慮用 audit2allow 產生最小範圍的客製化政策

養成「先查 log 再動手」的習慣,能避免在錯誤的方向上浪費大量時間。