所需工具
semanage 二进制文件是 policycoreutils-python 包的一部分:
# yum install policycoreutils-python
要在带有 python 2.6 的早期版本的 RHEL 6 中使用 semanage,我们可能需要使用 EPEL 存储库中的 python-pip 安装 OrderedDict python 集合模块的反向移植。
安装 EPEL 存储库:
# rpm -ivh http://dl.fedoraproject.org/pub/epel/6/$(uname -m)/epel-release-6-8.noarch.rpm
安装 python-pip:
# yum install python-pip
如果安装 python-pip 返回此错误:
Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
我们可能需要使用以下方法更新 SSL CA 证书:
# yum --disablerepo=epel -y update ca-certificates
如何列出当前的 MySQL 上下文
我们可以使用以下方法列出当前上下文:
# semanage fcontext -l | grep -i mysql
如何设置unix域套接字上下文
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
如何设置 secure_file_priv 目录上下文
对于 MySQL 5.5.53. 5.6.34 和 5.7.16 之后的版本。
安装服务器 RPM 会创建一个目录 /var/lib/mysql-files/,但不会在此目录上设置 SELinux 上下文。
该目录旨在用于诸如“SELECT ... INTO OUTFILE”之类的操作。
如果我们通过设置 secure_file_priv 启用使用此目录,则可能需要使用以下方法设置上下文:
# semanage fcontext -a -t mysqld_db_t "/var/lib/mysql-files/(/.*)?" # restorecon -Rv /var/lib/mysql-files
如果将其设置为新位置,则需要编辑路径。
有关此变量的更多信息,请参阅 https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_secure_file_priv。
为了安全起见,此目录不应位于数据目录中。
如何设置数据目录上下文
数据目录的默认位置是 /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
什么是 SELinux 上下文
在系统中强制执行 SELinux 时,它会检查哪些进程可以访问哪些文件、目录和端口的规则。
每个文件、进程、目录和端口都有一个称为 SELinux 上下文的特殊安全标签,该名称用于确定进程是否可以访问文件、目录或者端口。
默认情况下,除非显式规则授予访问权限,否则该策略不允许任何交互。
SELinux 标签具有不同的上下文:用户、角色、类型和敏感度。
大多数 Linux 命令都有 -Z 选项来显示 SELinux 上下文。
例如,ps、ls、cp 和 mkdir 都使用 -Z 选项来显示或者设置文件、目录、进程或者端口的 SELinux 上下文。
如果在这些文件上没有正确设置 SELinux 上下文,MySQL 服务器读取和写入各种文件,mysqld 进程可能会被阻止访问这些文件。
在某些情况下,这可能会阻止 mysqld 记录错误。
如何设置 TCP 端口上下文
默认 TCP 端口是 3306 ,使用的 SELinux 上下文是 mysqld_port_t 。
如果编辑配置文件以使用不同的 TCP 端口,或者启用使用添加端口(通常为端口 13306)的组复制,则可能需要使用以下命令设置新端口的上下文:
# semanage port -a -t mysqld_port_t -p tcp 13306 # restorecon
如何设置错误日志文件上下文
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文件上下文
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