SELinux 故障排除通常涉及将 SELinux 设置为宽松模式,重新运行问题操作,检查 SELinux 审核日志中的访问拒绝消息,然后在问题解决后将 SELinux 设置回强制模式。
要避免将整个系统设置为宽松模式使用 setenforce,可以仅将 MySQL 服务设置为宽松模式,将其 SELinux 域 (mysqld_t
) 设置为宽松模式使用 semanage 命令:
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 上下文,将导致启动失败。
$> 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 服务器)使用特定端口。更改端口而不更新 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 端口上下文”。