¿Qué es el contexto de SELinux?
Cuando se aplica SELinux en el sistema, verifica las reglas sobre qué proceso puede acceder a qué archivos, directorios y puertos. Cada archivo, proceso, directorio y puerto tiene una etiqueta de seguridad especial conocida como contexto SELinux, que es un nombre que se usa para determinar si un proceso puede acceder a un archivo, directorio o puerto. De forma predeterminada, la política no permite ninguna interacción a menos que una regla explícita otorgue acceso.
Las etiquetas de SELinux tienen diferentes contextos:usuario, rol, tipo y sensibilidad. La mayoría de los comandos de Linux tienen la opción -Z para mostrar contextos de SELinux. Por ejemplo, ps, ls, cp y mkdir usan la opción -Z para mostrar o establecer contextos SELinux de un archivo, directorio, proceso o puerto.
El servidor MySQL lee y escribe en varios archivos si el contexto de SELinux no está configurado correctamente en estos archivos, es posible que el proceso mysqld no pueda acceder a los archivos. En algunos casos, esto puede evitar que mysqld registre errores.
Cómo enumerar los contextos MySQL actuales
Puede listar los contextos actuales usando:
# semanage fcontext -l | grep -i mysql
Cómo configurar el contexto del directorio de datos
La ubicación predeterminada para el directorio de datos es /var/lib/mysql/ , el contexto de SELinux utilizado es mysqld_db_t . Si edita el archivo de configuración para usar una ubicación diferente para el directorio de datos, o cualquiera de los archivos que normalmente se encuentran en el directorio de datos (por ejemplo, los registros binarios), es posible que deba establecer el contexto para la nueva ubicación usando
# 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
Cómo configurar el contexto del archivo de registro de errores
La ubicación predeterminada para los RPM de RedHat es /var/log/mysqld.log , el contexto de SELinux utilizado es mysqld_log_t . Si edita el archivo de configuración para usar una ubicación diferente, es posible que deba establecer el contexto para la nueva ubicación usando:
# semanage fcontext -a -t mysqld_log_t "/path/to/my/custom/error.log" # restorecon -Rv /path/to/my/custom/error.log
Cómo configurar el contexto del archivo PID
La ubicación predeterminada para el archivo PID es /var/run/mysqld/mysqld.pid , el contexto de SELinux utilizado es mysqld_var_run_t . Si edita el archivo de configuración para usar una ubicación diferente, es posible que deba establecer el contexto para la nueva ubicación usando:
# semanage fcontext -a -t mysqld_var_run_t "/path/to/my/custom/pidfile/directory/.*?" # restorecon -Rv /path/to/my/custom/pidfile/directory
Cómo establecer el contexto de socket de dominio Unix
La ubicación predeterminada para el socket de dominio Unix es /var/lib/mysql/mysql.sock , el contexto de SELinux utilizado es mysqld_var_run_t . Si edita el archivo de configuración para usar una ubicación diferente, es posible que deba establecer el contexto para la nueva ubicación usando:
# semanage fcontext -a -t mysqld_var_run_t "/path/to/my/custom/mysql.sock" # restorecon -Rv /path/to/my/custom/mysql.sock
Cómo configurar el contexto del puerto TCP
El puerto TCP predeterminado es 3306 , el contexto de SELinux utilizado es mysqld_port_t . Si edita el archivo de configuración para usar un puerto TCP diferente, o habilita la replicación de grupo que usa un puerto adicional (generalmente el puerto 13306), es posible que deba establecer el contexto para el nuevo puerto usando:
# semanage port -a -t mysqld_port_t -p tcp 13306 # restorecon
Cómo configurar el contexto del directorio secure_file_priv
Para versiones de MySQL desde 5.5.53, 5.6.34 y 5.7.16. La instalación del RPM del servidor crea un directorio /var/lib/mysql-files/, pero no establece el contexto de SELinux en este directorio. Este directorio está destinado a ser utilizado para operaciones como 'SELECCIONAR... EN OUTFILE '. Si habilita el uso de este directorio configurando secure_file_priv, es posible que deba configurar el contexto usando:
# semanage fcontext -a -t mysqld_db_t "/var/lib/mysql-files/(/.*)?" # restorecon -Rv /var/lib/mysql-files
Si establece esto en una nueva ubicación, deberá editar la ruta. Para obtener más información sobre esta variable, consulte https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_secure_file_priv. Por seguridad, este directorio nunca debe estar dentro del directorio de datos.
Herramientas necesarias
El binario semanage es parte del paquete policycoreutils-python:
# yum install policycoreutils-python
Para usar semanage con versiones anteriores de RHEL 6 con python 2.6, es posible que deba instalar un backport del módulo de colección de python OrderedDict usando python-pip del repositorio de EPEL.
Instale el repositorio EPEL:
# rpm -ivh http://dl.fedoraproject.org/pub/epel/6/$(uname -m)/epel-release-6-8.noarch.rpm
Instalar python-pip:
# yum install python-pip
Si la instalación de python-pip devuelve este error:
Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
es posible que deba actualizar sus certificados SSL CA usando:
# yum --disablerepo=epel -y update ca-certificates