Migración de usuarios y passwords de un servidor MySQL

Ciertamente, debe haber muchos posts respecto a este asunto en otros blogs, foros o el foro oficial de MySQL, sin embargo en mi búsqueda no encontré una solución inmediata al problema.

Bien, pues como dice el título era necesario realizar una migración de las bases de datos de un servidor a otro. Bien, ciertamente había hecho volcados (dumps) de bases de datos para reinsertarlas en otro servidor. Hasta ahí todo bien. La pregunta es… ¿Y cómo copio los usuarios? Y es que una vez que lograra copiar todas las bases de datos, tendría que recrear a mano cada uno de los usuarios, lo cual no parece ser una buena solución.

Bueno, la herramienta típicamente utilizada para efectuar estas tareas es mysqldump

Y para copiar una base de datos a un archivo de texto, tenemos esto

mysqldump -u usuariodb -p basededatosacopiar > volcado.sql

Leyendo un poco la documentación, sabemos dos cosas para solucionar el problema con los usuarios:

  • Los privilegios y usuarios/passwords se guardan en la base de datos de nombre mysql.
  • El comando mysqldump provee una opción para dumpear todas las bases de datos llamada –all-databases

Así que me animé a hacer mis pruebas:

mysqldump -u root -p --all-databases > dump.sql

SCP al otro servidor, y ahi dentro…

mysql -u root -p < dump.sql

Termina la copia, salgo, entro en un shell MySQL, todo bien… Ok, reiniciemos el servidor MySQL:

service mysql restart

Stopping MySQL database server: mysqld failed!
Starting MySQL database server: mysqld already running.
/usr/bin/mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)'

Wow! ¿Y eso qué onda!?!? En debian, existe un usuario denominado debian-sys-maint, que se encarga de realizar algunas tareas de mantenimiento al iniciar y detener el servidor MySQL, y algunas tareas con los logs del servicio.
Así que buscando un poco, hay un archivo /etc/mysql/debian.cnf similar al .my.cnf que se puede crear en nuestro home para acceder automáticamente a un servidor determinado, sin preguntar usuario, host, o incluso el password.
Comparando ambos archivos, en el servidor anterior y el nuevo, tenían passwords diferentes. El archivo tiene una estructura así:

# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host     = localhost
user     = debian-sys-maint
password = passdedebiansysmaint
socket   = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
user     = debian-sys-maint
password =  passdedebiansysmaint
socket   = /var/run/mysqld/mysqld.sock
basedir  = /usr

Y como dice do not touch, mejor le hacemos caso 😛
Así que hay que decidí seguir el procedimiento para cambiar el password de un usuario en MySQL:
update user set password=PASSWORD("passdedebiansysmaint") where User='debian-sys-maint';
Y finalmente hacemos un:
flush privileges;
Y listo! El servidor reinicia normalmente:
service mysql restart

Stopping MySQL database server: mysqld.
Starting MySQL database server: mysqld.
Checking for corrupt, not cleanly closed and upgrade needing tables..

Espero les sirva =)

Hardening WordPress – WordPress Security Scan (wp-security-scan)

Una de las cosas que me preocupan, es la seguridad (no me refiero a la seguridad en México…).

Y es que cuando entras al mundillo de los sitios web, empiezas a darte cuenta que todo puede pasar de ser miel sobre hojuelas, a un sitio crackeado por algún script kiddie con ganas de molestar.

Así que investigando un poco, dí con éste plugin

http://wordpress.org/extend/plugins/wp-security-scan/

Que nos permite hacer ciertos cambios en nuestro blog de wordpress para evitar los puntos de ataque más típicos:

  • Bruteforcing de usuarios
  • SQL injection
  • Permisos

Pues bien, este post es para dos cosas, recomendar el plugin, y recomendar la solución a uno de los problemas que ocasiona utilizarlo…

Resulta ser que uno de los “fixes” que aplica, es el de renombrar las tablas con el prefijo por default de wordpress “wp_” por algún otro menos típico, que nos permita evitar ciertos tipos de ataques. Pues bueno, una vez que lo aplicas, te encuentras con un problemita al entrar al admin del sitio:

“No tienes suficientes permisos para acceder a esta página”

Genial… pues el plugin tiene un pequeño defecto, ya que renombra incorrectamente algunas cosas. Para esto, encontré la siguiente solución en

http://www.neoegm.com/es/tech/wordpress/how-to-fix-the-you-do-not-have-sufficient-permissions-to-access-this-page-message-in-wordpress/

que se debe ejecutar directamente como una consulta en nuestra base de datos (donde newprefix_ es el nuevo prefijo de nuestras tablas):


UPDATE `newprefix_usermeta` SET `meta_key` = REPLACE(`meta_key`, 'wp_', 'newprefix_');
UPDATE `newprefix_options` SET `option_name` = 'newprefix_user_roles' WHERE `option_name` = 'wp_user_roles' AND `blog_id` = 0;

Y el problema se debe a que en el contenido de las tablas se mencionan referencias al prefijo de las tablas, donde faltó renombrar.

Así que si alguien quiere utilizar el plugin, y tienen este problema, prueben esta solución:

PD: SIEMPRE hay que hacer copias de seguridad antes de hacer los cambios.