sql >> Base de Datos >  >> RDS >> MariaDB

Cómo configurar SELinux para sistemas basados ​​en MySQL (MySQL/MariaDB Replication + Galera)

En la era en la que vivimos ahora, cualquier cosa con un entorno menos seguro es fácilmente un objetivo para un ataque y se convierte en una recompensa para los atacantes. En comparación con los últimos 20 años, los piratas informáticos de hoy en día son más avanzados no solo con las habilidades sino también con las herramientas que utilizan. No sorprende por qué algunas empresas gigantes están siendo pirateadas y se filtran sus valiosos datos.

Solo en el año 2021, ya hay más de 10 incidentes relacionados con violaciones de datos. El incidente más reciente fue informado por BOSE, un conocido fabricante de audio que ocurrió en mayo. BOSE descubrió que los atacantes accedieron a parte de la información personal de sus empleados actuales y anteriores. La información personal expuesta en el ataque incluye nombres, números de seguro social, información de compensación y otra información relacionada con recursos humanos.

¿Cuál cree que es el propósito de este tipo de ataque y qué motiva al hacker a hacerlo? Obviamente, todo se trata del dinero. Dado que los datos robados también se venden con frecuencia, al atacar a las grandes empresas, los piratas informáticos pueden ganar dinero. No solo los datos importantes se pueden vender a los competidores del negocio, sino que los piratas informáticos también pueden pedir un gran rescate al mismo tiempo.

Entonces, ¿cómo podríamos relacionar esto con las bases de datos? Dado que la base de datos es uno de los grandes activos de la empresa, se recomienda cuidarla con mayor seguridad para que nuestros datos valiosos estén protegidos la mayor parte del tiempo. En mi última publicación de blog, ya vimos una introducción sobre SELinux, cómo habilitarlo, qué tipo de modo tiene SELinux y cómo configurarlo para MongoDB. Hoy veremos cómo configurar SELinux para sistemas basados ​​en MySQL.

Los 5 principales beneficios de SELinux

Antes de continuar, tal vez algunos de ustedes se pregunten si SELinux brinda algún beneficio positivo dado que es un poco complicado habilitarlo. Estos son los 5 principales beneficios de SELinux que no querrá perderse y que debería considerar:

  • Hacer cumplir la confidencialidad e integridad de los datos al mismo tiempo que se protegen los procesos

  • La capacidad de confinar servicios y demonios para que sean más predecibles

  • Reducción del riesgo de ataques de escalada de privilegios

  • La política se aplica en todo el sistema, no se establece a discreción del usuario ni se define administrativamente

  • Proporcionar un control de acceso detallado

Antes de comenzar a configurar SELinux para nuestras instancias de MySQL, ¿por qué no explica cómo habilitar SELinux con ClusterControl para todas las implementaciones basadas en MySQL? Aunque el paso es el mismo para todos los sistemas de administración de bases de datos, creemos que es una buena idea incluir algunas capturas de pantalla para su referencia.

Pasos para habilitar SELinux para la replicación de MySQL

En esta sección, implementaremos la replicación de MySQL con ClusterControl 1.8.2. Los pasos son los mismos para MariaDB, Galera Cluster o MySQL:asumiendo que todos los nodos están listos y que SSH sin contraseña está configurado, comencemos la implementación. Para habilitar SELinux para nuestra configuración, debemos desmarcar "Deshabilitar AppArmor/SELinux", lo que significa que SELinux se configurará como "permisivo" para todos los nodos.

A continuación, elegiremos a Percona como proveedor (también puede elegir MariaDB , Oracle o MySQL 8 también), luego especifique la contraseña "root". Puede usar una ubicación predeterminada o sus otros directorios según su configuración.

Una vez que se han agregado todos los hosts, podemos iniciar la implementación y dejar que termine antes de que podamos comenzar con la configuración de SELinux.

Pasos para habilitar SELinux para la replicación de MariaDB

En esta sección, implementaremos la replicación de MariaDB con ClusterControl 1.8.2.

Elegiremos MariaDB como proveedor y la versión 10.5, así como también especificaremos el contraseña "raíz". Puede usar una ubicación predeterminada o sus otros directorios según su configuración.

Una vez que se han agregado todos los hosts, podemos iniciar la implementación y dejar que termine antes de que podamos continuar con la configuración de SELinux.

Pasos para habilitar SELinux para Galera Cluster

En esta sección, implementaremos Galera Cluster con ClusterControl 1.8.2. Una vez más, desmarque "Desactivar AppArmor/SELinux", lo que significa que SELinux se configurará como "permisivo" para todos los nodos:

A continuación, elegiremos Percona como proveedor y MySQL 8, así como especifique la contraseña "raíz". Puede usar una ubicación predeterminada o sus otros directorios según su configuración. Una vez que se hayan agregado todos los hosts, podemos comenzar la implementación y dejar que finalice.


 

Como de costumbre, podemos monitorear el estado de la implementación en la sección "Actividad" de la interfaz de usuario.

Cómo configurar SELinux para MySQL

Teniendo en cuenta que todos nuestros clústeres están basados ​​en MySQL, los pasos para configurar SELinux también son los mismos. Antes de comenzar con la configuración y dado que este es un entorno de configuración reciente, le sugerimos que deshabilite el modo de recuperación automática tanto para el clúster como para el nodo como se muestra en la captura de pantalla a continuación. Al hacer esto, podríamos evitar que el clúster se ejecute en una conmutación por error mientras realizamos la prueba o reiniciamos el servicio:

Primero, veamos cuál es el contexto de “mysql”. Continúe y ejecute el siguiente comando para ver el contexto:

$ ps -eZ | grep mysqld_t

Y el ejemplo de salida es el siguiente:

system_u:system_r:mysqld_t:s0       845 ?        00:00:01 mysqld

La definición de la salida anterior es:

  • system_u - Usuario

  • system_r - Rol

  • mysqld_t - Tipo

  • s0 845 - Nivel de sensibilidad

Si verifica el estado de SELinux, puede ver que el estado es "permisivo", que aún no está completamente habilitado. Necesitamos cambiar el modo a "hacer cumplir" y para lograrlo tenemos que editar el archivo de configuración de SELinux para que sea permanente.

$ vi /etc/selinux/config
SELINUX=enforcing

Proceda a reiniciar el sistema después de los cambios. Como estamos cambiando el modo de "permisivo" a "forzoso", necesitamos volver a etiquetar el sistema de archivos nuevamente. Por lo general, puede elegir si desea volver a etiquetar todo el sistema de archivos o solo para una aplicación. La razón por la que se requiere volver a etiquetar se debe al hecho de que el modo de "aplicación" necesita la etiqueta o función correcta para ejecutarse correctamente. En algunos casos, esas etiquetas se cambian durante el modo "permisivo" o "deshabilitado".

Para este ejemplo, volveremos a etiquetar solo una aplicación (MySQL) usando el siguiente comando:

$ fixfiles -R mysqld restore

Para un sistema que se ha utilizado durante bastante tiempo, es una buena idea volver a etiquetar todo el sistema de archivos. El siguiente comando hará el trabajo sin reiniciar y este proceso puede llevar un tiempo dependiendo de su sistema:

$ fixfiles -f -F relabel

Al igual que muchas otras bases de datos, MySQL también exige leer y escribir muchos archivos. Sin un contexto SELinux correcto para esos archivos, el acceso será incuestionablemente denegado. Para configurar la política para SELinux, se requiere "semanage". “semanage” también permite cualquier configuración sin necesidad de recompilar las fuentes de la política. Para la mayoría de los sistemas Linux, esta herramienta ya está instalada por defecto. En nuestro caso, ya viene instalado con la siguiente versión:

$ rpm -qa |grep semanage
python3-libsemanage-2.9-3.el8.x86_64
libsemanage-2.9-3.el8.x86_64

Para el sistema que no lo tenga instalado, el siguiente comando le ayudará a instalarlo:

$ yum install -y policycoreutils-python-utils

Ahora, veamos cuál es el contexto del archivo MySQL:

$ semanage fcontext -l | grep -i mysql

Como puede notar, hay un montón de archivos que se conectan a MySQL una vez que se ejecuta el comando anterior. Si recuerda al principio, estamos usando un "Directorio de datos del servidor" predeterminado. Si su instalación utiliza una ubicación de directorio de datos diferente, debe actualizar el contexto de "mysql_db_t", que se refiere a /var/lib/mysql/

El primer paso es cambiar el contexto de SELinux usando cualquiera de estas opciones:

$ semanage fcontext -a -t mysqld_db_t /var/lib/yourcustomdirectory
$ semanage fcontext -a -e /var/lib/mysql /var/lib/yourcustomdirectory

After the step above, run the following command:

$ restorecon -Rv /var/lib/yourcustomdirectory

Y por último, reinicie el servicio:

$ systemctl restart mysql

En algunas configuraciones, es probable que se requiera una ubicación de registro diferente para cualquier propósito. Para esta situación, también se debe actualizar “mysqld_log_t”. “mysqld_log_t” es un contexto para la ubicación predeterminada /var/log/mysqld.log y se pueden ejecutar los siguientes pasos para actualizarlo:

$ semanage fcontext -a -t mysqld_log_t "/your/custom/error.log"
$ restorecon -Rv /path/to/my/custom/error.log
$ systemctl restart mysql

Habrá una situación en la que el puerto predeterminado se configure usando un puerto diferente al 3306. Por ejemplo, si está usando el puerto 3303 para MySQL, necesita definir el contexto de SELinux con el siguiente comando :

$ semanage port -a -t mysqld_port_t -p tcp 3303

Y para verificar que el puerto ha sido actualizado, puede usar el siguiente comando:

$ semanage port -l | grep mysqld

Uso de audit2allow para generar políticas

Otra forma de configurar la política es usando "audit2allow", que ya se incluyó durante la instalación de "semanage" hace un momento. Lo que hace esta herramienta es extraer los eventos de registro de audit.log y usar esa información para crear una política. A veces, MySQL puede necesitar una política no estándar, por lo que esta es la mejor manera de lograrlo.

Primero, establezcamos el modo en permisivo para el dominio MySQL y verifiquemos los cambios:

$ semanage permissive -a mysqld_t
$ semodule -l | grep permissive
permissive_mysqld_t
permissivedomains

El siguiente paso es generar la política usando el siguiente comando:

$ grep mysqld /var/log/audit/audit.log | audit2allow -M {yourpolicyname}
$ grep mysqld /var/log/audit/audit.log | audit2allow -M mysql_new

Debería ver un resultado como el siguiente (diferirá según el nombre de la política que establezca):

******************** IMPORTANTE ******************** **

Para activar este paquete de políticas, ejecute:

semodule -i mysql_new.pp

Como se indicó, debemos ejecutar “semodule -i mysql_new.pp” para activar la política. Continúe y ejecútelo:

$ semodule -i mysql_new.pp

El paso final es volver a poner el dominio MySQL en el modo de "aplicación":

$ semanage permissive -d mysqld_t

libsemanage.semanage_direct_remove_key:eliminando el último módulo permissive_mysqld_t (no existe ningún otro módulo permissive_mysqld_t con otra prioridad).

¿Qué debe hacer si SELinux no funciona?

Muchas veces, la configuración de SELinux requiere muchas pruebas. Una de las mejores formas de probar la configuración es cambiando el modo a "permisivo". Si desea configurarlo solo para el dominio MySQL, puede usar el siguiente comando. Esta es una buena práctica para evitar configurar todo el sistema como "permisivo":

$ semanage permissive -a mysqld_t

Una vez que todo esté hecho, puede volver a cambiar el modo a "aplicar":

$ semanage permissive -d mysqld_t

Además de eso, /var/log/audit/audit.log proporciona todos los registros relacionados con SELinux. Este registro lo ayudará mucho a identificar la causa raíz y el motivo. Todo lo que tienes que hacer es filtrar "denegado" usando "grep".

$ more /var/log/audit/audit.log |grep "denied"

Ya hemos terminado de configurar la política de SELinux para el sistema basado en MySQL. Una cosa que vale la pena mencionar es que se debe realizar la misma configuración en todos los nodos de su clúster, es posible que deba repetir el mismo proceso para ellos.