MySQL 服务器从许多文件读取数据并写入许多文件。如果这些文件的 SELinux 上下文设置不正确,则可能会拒绝访问这些文件。
以下说明使用 semanage
二进制文件来管理文件上下文;在 RHEL 上,它是 policycoreutils-python-utils
包的一部分。
yum install -y policycoreutils-python-utils
安装 semanage
二进制文件后,可以使用带有 fcontext
选项的 semanage
列出 MySQL 文件上下文。
semanage fcontext -l | grep -i mysql
默认数据目录位置为 /var/lib/mysql/
;使用的 SELinux 上下文为 mysqld_db_t
。
如果编辑配置文件以使用数据目录的不同位置,或者使用通常位于数据目录中的任何文件(例如二进制日志),则可能需要设置新位置的上下文。例如
semanage fcontext -a -t mysqld_db_t "/path/to/my/custom/datadir(/.*)?"
restorecon -Rv /path/to/my/custom/datadir
semanage fcontext -a -t mysqld_db_t "/path/to/my/custom/logdir(/.*)?"
restorecon -Rv /path/to/my/custom/logdir
RedHat RPM 的默认位置为 /var/log/mysqld.log
;使用的 SELinux 上下文类型为 mysqld_log_t
。
如果编辑配置文件以使用其他位置,则可能需要设置新位置的上下文。例如
semanage fcontext -a -t mysqld_log_t "/path/to/my/custom/error.log"
restorecon -Rv /path/to/my/custom/error.log
PID 文件的默认位置为 /var/run/mysqld/mysqld.pid
;使用的 SELinux 上下文类型为 mysqld_var_run_t
。
如果编辑配置文件以使用其他位置,则可能需要设置新位置的上下文。例如
semanage fcontext -a -t mysqld_var_run_t "/path/to/my/custom/pidfile/directory/.*?"
restorecon -Rv /path/to/my/custom/pidfile/directory
Unix 域套接字的默认位置为 /var/lib/mysql/mysql.sock
;使用的 SELinux 上下文类型为 mysqld_var_run_t
。
如果编辑配置文件以使用其他位置,则可能需要设置新位置的上下文。例如
semanage fcontext -a -t mysqld_var_run_t "/path/to/my/custom/mysql\.sock"
restorecon -Rv /path/to/my/custom/mysql.sock
对于 5.6.34、5.7.16 和 8.0.11 之后的 MySQL 版本。
安装 MySQL 服务器 RPM 会创建一个 /var/lib/mysql-files/
目录,但不会设置它的 SELinux 上下文。该 /var/lib/mysql-files/
目录旨在用于 SELECT ... INTO OUTFILE
等操作。
如果通过设置 secure_file_priv
启用此目录的使用,则可能需要像这样设置上下文
semanage fcontext -a -t mysqld_db_t "/var/lib/mysql-files/(/.*)?"
restorecon -Rv /var/lib/mysql-files
如果使用不同的位置,请编辑此路径。出于安全目的,此目录绝不应位于数据目录内。
有关此变量的更多信息,请参见 secure_file_priv
文档。