Securizar Mysql / MariadDB

En esta ocasión os traemos algunos consejos para securizar MySQL o MariaDB (Forks en general de Mysql) de forma algo más segura.

# Ejecutar mysql_secure_installation

Este script nos hace pasar por varios pasos:

  1. Cambiar la password de root si procede.
  2. Eliminar las bases de datos de test.
  3. Eliminar el acceso de root desde remoto (direcciones IP externas al servidor).

Es decir que solo con este script que viene en las instalaciones nos permite generar un alto grado de seguridad.

Deshabilitar el histórico de mysql

En el caso de que queramos deshabilitar este log, recordamos que se guarda todo lo realizado en el cliente de mysql, podemos eliminar el contenido o apuntarlo a null para que no guarde nada.

cd /root && ln -s .mysql_history /dev/null

Cambiar el usuario root por otro nombre

Podemos cambiar el usuario por defecto de root por otro usuario que nos convenga. Esto lo hacemos para que no se tenga acceso a través del mismo.

RENAME USER ‘root’@’localhost’ TO ‘foobar’@’localhost’;

FLUSH PRIVILEGES;

Cada base de datos debe tener su usuario/host/permisos

Por temas de seguridad es recomendable seguir los siguientes pasos por cada base de datos:

  1. Crear un usuario por cada base de datos.
  2. Crear el origen desde el cual se va a conectar.
  3. Darle los permisos que va a utilizar.

Función REPLACE de MySQL

Introducción

En este post vamos a usar la función REPLACE de MySQL la cual nos va a permitir cambiar valores que encontremos en nuestras tablas por unos nuevo.

Uno de los ejemplos donde comúnmente se suele usar es a la hora de cambiar el dominio a un blog WordPress, ya que hay que cambiar estos valores en la base de datos.

Usando la función REPLACE de MySQL

Vamos a analizar un ejemplo clásico:

UPDATE wp_posts SET post_content = REPLACE( post_content, 'a class="url" href="www.', 'a class="url" href="http://www.' );

En este ejemplo lo que nos encontramos es lo siguiente:

  • tabla: wp_posts
  • campo: post_content
  • sustituir: vamos a sustituir ‘a class=”url” href=”www.’, ‘a class=”url” href=”http://www.’.
    • Es decir que donde había un href=”www. ahora será href=”http://www. Hemos agregado la parte del http.

Con esto lo que conseguimos, en el caso de wordpress, es que funcionen las imágenes a la hora de cambiar el nombre del dominio.

Incompatibilidad de versiones MySQL

Introducción

Nos encontramos con un problema de incompatibilidad de versiones MySQL. Tenemos 2 servidores 1 con una versión de MySQL 5.0.x y otro con versión 5.5.x y teníamos que tener una conexión entre ambos.

En este caso la conexión se estaba realizando desde el servidor nuevo al viejo.

El error que nos daba era algo similar a esto:

Connect Error (2000) mysqlnd cannot connect to MySQL 4.1+ using old authentication

Lo cual indicaba un problema de compatibilidades entre versiones (evidentemente porque en el nuevo servidor usaba las librerías nuevas).

Solución Incompatibilidad de versiones MySQL

La solución que hemos tomado para solventar este problema fueron dos pasos:

1) En la configuración del MySQL viejo (/etc/my.cnf) tuvimos que quitar la compatibilidad de old-password. En nuestro caso tuvimos que comentar la siguiente línea:

#old_passwords=1

2) Lo siguiente fue revisar el usuario que estábamos usando para conectar si tenía un formato de contraseñas correcto. Para ello tuvimos que acceder a nuestra consola de MySQL y ejecutar la siguiente sentencia:

SELECT `User`, `Host`, Length(`Password`) FROM mysql.user;

Esto nos daba un listado de los usuarios que tienen contraseñas débiles y que deberíamos cambiar para mayor seguridad. Para ser exactos las contraseñas con tamaño 16 son las de contraseñas débiles.

Evidentemente entre ellas estaba el usuario que estábamos usando y tuvimos que ejecutar el siguiente comando para volver a reajustar la contraseña:

SET PASSWORD FOR 'usuariocambiar'@'host'=PASSWORD('mismacontraseña');

Con esto hemos vuelto a ejecutar de nuevo el comando y esta vez nos salía con un tamaño de 41 caracteres.

Con esto dejamos resuelto el problema del cliente.

Too Many Open Files Mysql o MariaDB

Introducción

Mirando los logs de Mysql o MariaDB nos hemos percatado de que un cliente estaba teniendo problemas de apertura (Too Many Open Files) con tablas aleatorias de distintas bases de datos. No había un patrón claro pero tuvimos que pasar por varios pasos para detectar el problema.

Los logs los encontramos en: /var/log/mariadb/mariadb.log

En el artículo vamos a mirar los siguientes puntos:

  1. Revisión de los permisos del directorio “datadir” de mysql/mariadb
  2. Revisión de la variable open_file de mysql.
  3. Revisión de las limitaciones del sistema a la hora de abrir ficheros por un servicio.

Con esto hemos conseguido acotar el problema y solventar la incidencia que se nos había presentado.

Leer más