6.5.6 SELinux 故障排除

对 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。您可以通过搜索“被拒绝”消息来检查是否被拒绝。

grep "denied" /var/log/audit/audit.log

以下各节描述了可能遇到 SELinux 相关问题的一些常见领域。

File Contexts

如果 MySQL 目录或文件的 SELinux 上下文不正确,则访问可能会被拒绝。如果将 MySQL 配置为读取或写入非默认目录或文件,则会发生此问题。例如,如果将 MySQL 配置为使用非默认数据目录,则该目录可能没有预期的 SELinux 上下文。

尝试在具有无效 SELinux 上下文的非默认数据目录上启动 MySQL 服务会导致以下启动失败。

shell> 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.

在这种情况下,“拒绝”消息将记录到/var/log/audit/audit.log

shell> 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 上下文的信息,请参见第 6.5.4 节“ SELinux 文件上下文”

Port Access

SELinux 希望 MySQL Server 之类的服务使用特定的端口。在不更新 SELinux 策略的情况下更改端口可能会导致服务失败。

mysqld_port_t端口类型定义了 MySQL 侦听的端口。如果将 MySQL Server 配置为使用非默认端口(例如端口 3307),并且不更新策略以反映更改,则 MySQL 服务将无法启动:

shell> 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

shell> 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 端口上下文的信息,请参见第 6.5.5 节“ SELinux TCP 端口上下文”。当启用使用未使用所需上下文定义的端口的 MySQL 功能时,可能会发生类似的端口访问问题。有关更多信息,请参见第 6.5.5.2 节“设置 MySQL 功能的 TCP 端口上下文”

Application Changes

SELinux 可能不知道应用程序的更改。例如,新版本,应用程序扩展或新功能可能会以 SELinux 不允许的方式访问系统资源,从而导致访问被拒绝。在这种情况下,您可以使用 audit2allowUtil 创建自定义策略以允许在需要的位置进行访问。创建自定义策略的典型方法是将 SELinux 模式更改为许可模式,在 SELinux 审核日志中标识访问拒绝消息,并使用 audit2allow Util 创建允许访问的自定义策略。

有关使用 audit2allow Util 的信息,请参阅发行版的 SELinux 文档。

如果您认为应该由标准 MySQL SELinux 策略模块处理的 MySQL 访问问题,请在发行版的错误跟踪系统中打开错误报告。