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.
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)
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
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:********
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)
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
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