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报告。