首先需明確SELinux是否啟用及當前運行模式,這是診斷的基礎。常用命令:
sestatus
:顯示SELinux狀態(enabled/disabled)、運行模式(enforcing/permissive/targeted)、策略類型等詳細信息。getenforce
:快速查看當前運行模式(enforcing/permissive/disable)。SELinux的錯誤信息主要記錄在**/var/log/audit/audit.log
**(審計日志)中,需通過以下命令篩選AVC(Access Vector Cache)拒絕記錄(最常見的SELinux錯誤類型):
sudo tail -f /var/log/audit/audit.log | grep avc
:實時查看最新的AVC拒絕記錄。sudo ausearch -m avc -ts recent
:搜索指定時間范圍(recent)內的AVC拒絕事件,輸出包含違規進程、操作類型(如read/write)、上下文等關鍵信息。sudo grep -i "denied" /var/log/audit/audit.log
(Ubuntu系統):過濾日志中的“denied”關鍵字,定位SELinux拒絕事件。原始日志信息較晦澀,需通過工具解析以明確問題根源:
ausearch
+ audit2allow
:用ausearch
提取AVC拒絕事件,通過audit2allow
生成允許規則(示例:sudo ausearch -m avc -ts today | audit2allow
)。但需注意,audit2allow
會強制允許錯誤,可能降低系統安全性,非必要不推薦直接使用。sealert
(推薦):安裝setroubleshoot
工具(sudo yum install setroubleshoot
或sudo apt-get install setroubleshoot
),通過sealert -a /var/log/audit/audit.log
生成可視化報告,包含違規原因、受影響進程、推薦的解決方案(如修改布爾值、調整文件上下文),更直觀且安全。SELinux通過安全上下文(security context)控制對象(文件、進程、端口)的訪問權限,上下文錯誤是常見問題根源。常用命令:
ls -Z
:查看文件/目錄的SELinux上下文(示例:drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html
),重點關注類型(type)(如httpd_sys_content_t
)。id -Z
:查看當前用戶的SELinux上下文(示例:unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
)。restorecon
:恢復文件/目錄的默認上下文(示例:sudo restorecon -R /path/to/directory
),適用于上下文被誤修改的情況。根據日志和上下文檢查結果,選擇合適的策略調整方式:
getsebool -a | grep service_name
查看相關布爾值,用setsebool -P boolean_name=1
永久啟用(示例:sudo setsebool -P httpd_can_network_connect=1
允許Apache訪問網絡)。sudo semanage port -a -t http_port_t -p tcp 8080
將8080端口添加到http_port_t
類型)。audit2allow
生成自定義策略(示例:sudo ausearch -m avc -ts today | audit2allow -M mymodule
生成模塊,sudo semodule -i mymodule.pp
加載模塊),但需評估安全性。**setroubleshoot
**是SELinux問題診斷的圖形化工具,可簡化日志分析過程:
sealert
命令查看告警,點擊“Report”生成詳細報告,包含問題描述、可能的原因及推薦的解決方案(如“修改httpd_sys_content_t上下文”),適合新手使用。若問題嚴重影響系統使用,可臨時禁用SELinux以確認是否為SELinux導致:
sudo setenforce 0
(從enforcing切換到permissive,僅記錄違規不阻止操作)。/etc/selinux/config
文件,將SELINUX=enforcing
改為SELINUX=disabled
,重啟系統生效。