Datalbi  
Créé le 29/06/2021 par Laurent Bourcier
Mis à jour le 24/08/2021 par Laurent Bourcier

Gestion du compte root sous MySQL 8.0 et MariaDB 10.5

Sommaire
1. Introduction
2. Gestion de root@localhost sous MySQL
3. Gestion de root@localhost sous MariaDB

Introduction

Lors de l'installation de MySQL / MariaDB par packages linux, un mot de passe root est demandé. Il est important de le noter et le garder.

Nous voyons ici comment changer le mot de passe de root@localhost, ainsi que le cas où l'on a oublié le mot de passe.

La version de MySQL utilisée est : 8.0.25.

La version de MariaDB utilisée est : 10.5.10.

A noter que MySQL et MariaDB n'offrent pas exactement les mêmes fonctionnalités.

Gestion de root@localhost sous MySQL

Connexion avec root@localhost

MySQL, depuis la version 5.6.6, permet de stocker les credentials dans un fichier obfusqué.

Le fichier par défaut, qui est utilisé par les utilitaires mysql, mysqladmin, mysql_config_editor, est :

$HOME/.mylogin.cnf

Il est aussi possible de forcer l'utilisation d'un autre fichier en utilisant la variable d'environnement MYSQL_TEST_LOGIN_FILE.

export MYSQL_TEST_LOGIN_FILE=/app/mylogin.cnf

La connexion via ce fichier se fait en précisant l'option --login-path=nom_du_login_path dans les programmes utilitaires. Par défaut, le login path utilisé est "client" (ou a défaut "mysql").

Lorsque le fichier de crédentials existe et contient un login-path nommé "client" avec un user et password valides, il est ainsi possible de se connecter "sans mot de passe".

Exemple avec le compte root :

# id
uid=0(root) gid=0(root) groupes=0(root)
ls -l ~/.mylogin.cnf
-rw------- 1 root root 136 juin  29 13:41 /root/.mylogin.cnf
# mysql
mysql> select current_user();
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0,00 sec)

mysql> exit
Bye

A noter que la création du compte root possède plusieurs options sous MySQL :

mysql> SHOW CREATE USER 'root'@'localhost';
+-------------------------------------------------------------------------+
| CREATE USER for root@localhost                                          |
+-------------------------------------------------------------------------+
| CREATE USER 'root'@'localhost' IDENTIFIED WITH 'caching_sha2_password' 
  AS '$A$005$\'Ry<       3JU\nVGH\\v1.Wl6b8W7W7ZTozVP49jfgBYRr0j1lNCJACl233J4pg8' 
  REQUIRE NONE 
  PASSWORD EXPIRE DEFAULT 
  ACCOUNT UNLOCK 
  PASSWORD HISTORY DEFAULT 
  PASSWORD REUSE INTERVAL DEFAULT 
  PASSWORD REQUIRE CURRENT DEFAULT
+-------------------------------------------------------------------------+
1 row in set (0,00 sec)

Changement du mot de passe root@localhost

Le changement se fait en deux étapes : tout d'abord en base, puis dans le fichier de crédentials.

# mysql
mysql> alter user 'root'@'localhost' identified with mysql_native_password by 'MyNewPassword';
mysql> flush privileges;
mysql> exit
# mysql_config_editor set --login-path=client --host=localhost --user=root --password
Enter password:********
# mysql
mysql> select current_user();
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0,00 sec)

mysql> exit

Perte du mot de passe root@localhost

La solution consiste à redémarrer MySQL sans gestion de mot de passe, puis à fixer le mot de passe.

# id
uid=0(root) gid=0(root) groupes=0(root)
# systemctl stop mysql
# mysqld --user=mysql --skip-grant-tables &
# echo "alter user 'root'@'localhost' identified with mysql_native_password by 'MyNewPassword';" > /tmp/init.sql
# mysqld --user=mysql --init-file=/tmp/init.sql &
# kill -9 le_pid_mysqld
# systemctl start mysql
# mysql_config_editor set --login-path=client --host=localhost --user=root --password
Enter password:********

Gestion de root@localhost sous MariaDB

Connexion avec root@localhost

MariaDB ne possède pas encore la fonctionnalité d'obfuscation de crédentials, à l'heure de la version 10.5.10.

MariaDB utilise l'ancienne méthode MySQL, celle qui consiste à utiliser le fichier de mot de passe en clair (mais protégé en 600) :

# ls -la ~/.my.cnf
-rw------- 1 root root 37 juin  29 13:33 /root/.my.cnf
# cat ~/.my.cnf
[client]
user=root
password=MyRootPassword

Lorsque ce fichier existe et contient une entrée "client" ou "mysql" avec un mot de passe valide, la connexion via mysql se fait "sans mot de passe".

A noter que la création du compte root se présente comme ceci sous MariaDB :

MariaDB [(none)]> SHOW CREATE USER 'root'@'localhost';
+---------------------------------------------------------------------------------------------------+
| CREATE USER for root@localhost                                                                    |
+---------------------------------------------------------------------------------------------------+
| CREATE USER `root`@`localhost` IDENTIFIED BY PASSWORD '*D03D21AAAB81818582D15F2C0E61939FF5E2EE75' |
+---------------------------------------------------------------------------------------------------+
1 row in set (0.000 sec)

Changement du mot de passe root@localhost

Le changement se fait en deux étapes : tout d'abord en base, puis dans le fichier .my.cnf.

# mariadb
MariaDB> alter user 'root'@'localhost' identified with mysql_native_password by 'MyNewPassword';
MariaDB> flush privileges;
MariaDB> exit
# vi ~/.my.cnf
[client]
user=root
password=MyNewRootPassword
# mariadb
MariaDB> select current_user();
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0,00 sec)

MariaDB> exit

Perte du mot de passe root@localhost

La procédure est similaire à MySQL, au détail près que le fichier de configuration n'est pas le même.

# id
uid=0(root) gid=0(root) groupes=0(root)
# kill -9 le_pid_mysqld
# mariadbd --user=mysql --skip-grant-tables &
# mariadb
mysql> alter user 'root'@'localhost' identified with mysql_native_password by 'MyNewPassword';
mysql> flush privileges;
mysql> exit
# vi ~/.my.cnf
# mysqladmin shutdown
# systemctl start mariadb