第一步:查看 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
它會用比較完整的敘述解釋每一筆拒絕事件,並提供建議的修正指令。
排查流程總結
- 先用
getenforce確認目前是 Enforcing 還是 Permissive - 重現問題後,用
ausearch -m avc -ts recent找出對應的 AVC 紀錄 - 用
audit2why理解原因,優先檢查是否有對應的 Boolean 可開啟 - 若沒有合適的 Boolean,檢查 context 是否正確(
ls -Z、restorecon) - 真的都不行,才考慮用
audit2allow產生最小範圍的客製化政策
養成「先查 log 再動手」的習慣,能避免在錯誤的方向上浪費大量時間。