Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Troubleshooting SELinux

8.7.6 SELinux故障排除

SELinux故障排除通常涉及将SELinux置于可疑模式,重新运行问题操作,检查SELinux审核日志中的访问否决消息,并将SELinux置于强制模式后解决问题。

为了避免将整个系统置于可疑模式使用setenforce,可以允许MySQL服务在可疑模式下运行,使用semanage命令将MySQL服务的SELinux域(mysqld_t)置于可疑模式:

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上下文。

尝试在非默认数据目录上启动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 File Context”

SELinux期望服务,如MySQL Server使用特定的端口。更改端口而不更新SELinux策略可能会导致服务失败。

mysqld_port_t端口类型定义了MySQL监听的端口。如果您配置MySQL Server使用非默认端口,例如端口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 Port Context”。类似端口访问问题可能发生在启用MySQL功能时,这些功能使用端口,而这些端口没有定义正确的上下文。有关更多信息,请见第8.7.5.2节,“设置MySQL功能的TCP端口上下文”

SELinux可能不了解应用程序的变化。例如,一個新的版本、應用程序扩展或新功能可能会访问系统资源的方式违反SELinux的权限,导致访问被拒绝。在这种情况下,您可以使用audit2allow实用工具创建自定义策略,以允许在需要的地方访问。创建自定义策略的典型方法是将SELinux模式更改为可疑模式,identify访问拒绝消息在SELinux审核日志中,然后使用audit2allow实用工具创建自定义策略以允许访问。

有关使用audit2allow实用工具的信息,请参阅您的分布式SELinux文档。

如果您遇到MySQL访问问题,您认为应该由标准MySQL SELinux策略模块处理,请在您的分布式bug跟踪系统中打开一个bug报告。