SELinux 疑難排解通常涉及將 SELinux 置於寬鬆模式、重新執行有問題的操作、檢查 SELinux 稽核記錄中是否有存取拒絕訊息,以及在問題解決後將 SELinux 放回強制執行模式。
為了避免使用 setenforce 將整個系統置於寬鬆模式,您可以使用 semanage 命令將其 SELinux 網域 (mysqld_t
) 置於寬鬆模式,僅允許 MySQL 服務以寬鬆模式執行。
semanage permissive -a mysqld_t
完成疑難排解後,請使用此命令將 mysqld_t
網域放回強制執行模式
semanage permissive -d mysqld_t
SELinux 會將拒絕的操作記錄寫入 /var/log/audit/audit.log
。您可以搜尋 「denied」 訊息來檢查是否有拒絕。
grep "denied" /var/log/audit/audit.log
以下章節描述一些可能遇到與 SELinux 相關問題的常見區域。
如果 MySQL 目錄或檔案具有不正確的 SELinux 內容,可能會拒絕存取。如果 MySQL 設定為從非預設目錄或檔案讀取或寫入,則可能會發生此問題。例如,如果您設定 MySQL 使用非預設資料目錄,則該目錄可能不具有預期的 SELinux 內容。
嘗試在具有無效 SELinux 內容的非預設資料目錄上啟動 MySQL 服務會導致以下啟動失敗。
$> systemctl start mysql.service
Job for mysqld.service failed because the control process exited with error code.
See "systemctl status mysqld.service" and "journalctl -xe" for details.
在這種情況下,「denial」訊息會記錄到 /var/log/audit/audit.log
$> grep "denied" /var/log/audit/audit.log
type=AVC msg=audit(1587133719.786:194): avc: denied { write } for pid=7133 comm="mysqld"
name="mysql" dev="dm-0" ino=51347078 scontext=system_u:system_r:mysqld_t:s0
tcontext=unconfined_u:object_r:default_t:s0 tclass=dir permissive=0
如需設定 MySQL 目錄和檔案的正確 SELinux 內容的相關資訊,請參閱第 8.7.4 節,〈SELinux 檔案內容〉。
SELinux 預期 MySQL Server 等服務會使用特定的連接埠。變更連接埠而不更新 SELinux 原則可能會導致服務失敗。
mysqld_port_t
連接埠類型定義 MySQL 監聽的連接埠。如果您將 MySQL 伺服器設定為使用非預設連接埠,例如連接埠 3307,並且未更新政策以反映變更,MySQL 服務將無法啟動。
$> systemctl start mysqld.service
Job for mysqld.service failed because the control process exited with error code.
See "systemctl status mysqld.service" and "journalctl -xe" for details.
在此情況下,拒絕訊息會記錄到 /var/log/audit/audit.log
。
$> grep "denied" /var/log/audit/audit.log
type=AVC msg=audit(1587134375.845:198): avc: denied { name_bind } for pid=7340
comm="mysqld" src=3307 scontext=system_u:system_r:mysqld_t:s0
tcontext=system_u:object_r:unreserved_port_t:s0 tclass=tcp_socket permissive=0
有關設定 MySQL 正確的 SELinux 連接埠內容的資訊,請參閱第 8.7.5 節,「SELinux TCP 連接埠內容」。當啟用使用未定義必要內容的連接埠的 MySQL 功能時,可能會發生類似的連接埠存取問題。有關詳細資訊,請參閱第 8.7.5.2 節,「設定 MySQL 功能的 TCP 連接埠內容」。
SELinux 可能不了解應用程式變更。例如,新版本、應用程式擴充功能或新功能可能會以 SELinux 不允許的方式存取系統資源,導致存取遭拒。在這種情況下,您可以使用 audit2allow 公用程式來建立自訂政策,以允許在需要時進行存取。建立自訂政策的典型方法是將 SELinux 模式變更為寬容模式,在 SELinux 稽核記錄中識別存取遭拒的訊息,並使用 audit2allow 公用程式建立自訂政策以允許存取。
有關使用 audit2allow 公用程式的資訊,請參閱您發行版本的 SELinux 文件。
如果您遇到您認為應由標準 MySQL SELinux 政策模組處理的 MySQL 存取問題,請在您發行版本的錯誤追蹤系統中開啟錯誤報告。