Contrasenas

El siguiente artículo explica cómo restablecer la contraseña del usuario root (administrador) de un servidor de bases de datos MySQL.

Puede ser el caso que seamos pésimos administradores de sistemas y no hayamos guardado de forma segura nuestras contraseñas. O tal vez que hayamos tomado un servidor instado por otro Sysadmin y no tengamos la información de todas las credenciales. Sea cual sea la razón, si hemos olvidado o desconocemos el password del usuario "root" de MySQL, es posible restablecerlo de forma sencilla.

En el manual de MySQL existen instructivos para llevar a cabo este procedimiento sobre diferentes plataformas para cada versión de MySQL. Esto se debe a que dicha tarea ha cambiado en cada versión de MySQL. Sin embargo, el método que se utiliza en este artículo debería funcionar perfectamente para cualquier versión de MySQL (actualmente soportada), e incluso para cualquier plataforma (incluyendo Microsoft Windows).

Por supuesto se debe contar con acceso como superusuario ("root") o Administrador sobre el sistema operativo en cuestión.

El primer paso consiste en detener el servidor MySQL:

root@cloud:/var/www# service mysql stop

Luego, se debe iniciar el proceso servidor MySQL (mysqld_safe) agregando la opción --skip-grant-tables:

root@cloud:/var/www# /usr/bin/mysqld_safe --skip-grant-tables > /dev/null 2>&1 &
[1] 3531

Esta opción hace que el servidor inicie sin utilizar el sistema de privilegios, lo cual otorga acceso irrestricto al mismo (y a todas sus bases de datos) a cualquier usuario, sin autenticar. No hace falta aclarar el riesgo incurrido al mantener al servidor MySQL corriendo con esta opción.

A partir de este momento es posible gestionar el servidor MySQL sin usuario ni contraseña:

root@cloud:/var/www# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.44-0+deb7u1 (Debian)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Una vez conectado al servidor, ejecutar la consulta flush privileges; para que se inicie el sistema de gestión de privilegios. A partir de este momento el manejo de cuentas de usuarios comienza a funcionar y ya no es posible acceder de manera irrestricta sin autenticación.

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

MySQL almacena la información de usuarios (incluyendo sus credenciales) en la tabla user:

mysql> describe mysql.user;
+------------------------+-----------------------------------+------+-----+---------+-------+
| Field                  | Type                              | Null | Key | Default | Extra |
+------------------------+-----------------------------------+------+-----+---------+-------+
| Host                   | char(60)                          | NO   | PRI |         |       |
| User                   | char(16)                          | NO   | PRI |         |       |
| Password               | char(41)                          | NO   |     |         |       |
| Select_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Insert_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Update_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Delete_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Create_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Drop_priv              | enum('N','Y')                     | NO   |     | N       |       |
| Reload_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Shutdown_priv          | enum('N','Y')                     | NO   |     | N       |       |
| Process_priv           | enum('N','Y')                     | NO   |     | N       |       |
| File_priv              | enum('N','Y')                     | NO   |     | N       |       |
| Grant_priv             | enum('N','Y')                     | NO   |     | N       |       |
| References_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Index_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Alter_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Show_db_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Super_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Create_tmp_table_priv  | enum('N','Y')                     | NO   |     | N       |       |
| Lock_tables_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Execute_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Repl_slave_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Repl_client_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Create_view_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Show_view_priv         | enum('N','Y')                     | NO   |     | N       |       |
| Create_routine_priv    | enum('N','Y')                     | NO   |     | N       |       |
| Alter_routine_priv     | enum('N','Y')                     | NO   |     | N       |       |
| Create_user_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Event_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Trigger_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Create_tablespace_priv | enum('N','Y')                     | NO   |     | N       |       |
| ssl_type               | enum('','ANY','X509','SPECIFIED') | NO   |     |         |       |
| ssl_cipher             | blob                              | NO   |     | NULL    |       |
| x509_issuer            | blob                              | NO   |     | NULL    |       |
| x509_subject           | blob                              | NO   |     | NULL    |       |
| max_questions          | int(11) unsigned                  | NO   |     | 0       |       |
| max_updates            | int(11) unsigned                  | NO   |     | 0       |       |
| max_connections        | int(11) unsigned                  | NO   |     | 0       |       |
| max_user_connections   | int(11) unsigned                  | NO   |     | 0       |       |
| plugin                 | char(64)                          | YES  |     |         |       |
| authentication_string  | text                              | YES  |     | NULL    |       |
+------------------------+-----------------------------------+------+-----+---------+-------+
42 rows in set (0.00 sec)

Entonces, para modificar la contraseña de "root" simplemente se puede ejecutar la siguiente consulta SQL:

update mysql.user SET password=password('1234') where user='root';

"1234" es una excelente contraseña, útil para todo tipo de cuentas, desde acceso a servidores en producción hasta home banking.

mysql> update mysql.user SET password=password('1234') where user='root';
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

En este ejemplo se observan 4 filas afectadas, esto se debe a que las credenciales de acceso para "root" se encuentran replicadas para distintos campos "host" (desde qué sitio accede el usuario "root").

Inmediatamente ejecutar nuevamente flush privileges; para que se apliquen estos cambios:

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

Cerrar la sesión con el servidor MySQL:

mysql> quit
Bye
root@cloud:/var/www#

Ahora se debe detener el servidor que fue iniciado manualmente, no a través del gestor de servicios del sistema operativo. Tanto en Linux como en Windows es posible volver a la terminal donde fue lanzado el proceso y presionar Ctrl+C para detenerlo.

Si el proceso fue lanzado en segundo plano (&) en un sistema Linux, es posible recuperar su control con la herramienta fg.

Primero obtener el número de tarea ejecutando jobs:

root@cloud:/var/www# jobs
[1]+  Running                 /usr/bin/mysqld_safe --skip-grant-tables > /dev/null 2>&1 &

Luego, traer el proceso a primer plano con fg y presionar Ctrl+C para finalizarlo:

root@cloud:/var/www# fg 1
/usr/bin/mysqld_safe --skip-grant-tables > /dev/null 2>&1
^Croot@cloud:/var/www#

Otra forma de detener el proceso consiste en primero obtener su PID (porcess ID) utilizando el comando ps ax | grep mysql, para luego enviar la señal TERM utilizando el comando kill.

Por último sólo resta reiniciar el servidor MySQL desde el gestor de servicios del sistema operativo en cuestión:

root@cloud:/var/www# service mysql start
[ ok ] Starting MySQL database server: mysqld ..
[info] Checking for tables which need an upgrade, are corrupt or were 
not closed cleanly..
root@cloud:/var/www#

Verificar el acceso como "root" con la nueva contraseña:

root@cloud:/var/www# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 38
Server version: 5.5.44-0+deb7u1 (Debian)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Para más información:

MySQL 5.5 Reference Manual - How to Reset the Root Password

MySQL 5.7 Reference Manual - Server Command Options - option_mysqld_skip-grant-tables

man mysql
man mysqld
man mysqld_safe

 

Fuente: linuxito

¿Quién está en línea?

Hay 26785 invitados y ningún miembro en línea