Ça faisait un bon moment que je n’avais pas publié sur le blog alors je reviens avec un petit billet un peu court sur une découverte que j’ai faites il y a peu. Il s’agit de l’option –login-path du client mysql.
Cela permet de chiffrer un fichier de config qui reprend un peu la même syntaxe qu’un fichier .my.cnf. On peut ensuite utiliser ce fichier avec l’option –login-path en ciblant un groupe qui peut comprendre les éléments suivants :
On voit de suite le côté pratique de ce genre de fonctionnalité pour les scripts car cela permet enfin de se passer du fichier .my.cnf et on peut enfin être sur que le password ne va ni traîner dans le script en lui même, ni dans un fichier .my.cnf sur lequel on aura oublié de mettre les bons droits. Par contre, il ne faut pas oublier que ce fichier est un simple fichier chiffré qui peut être plus ou moins simplement déchiffré et qu’il faut donc y faire aussi attention que si il s’agissait d’un .my.cnf. J’aborderai ce point dans une troisième partie.
La génération et l’édition du fichier se fait avec l’utilitaire mysql_config_editor et rien de tel qu’un cas d’utilisation concrète pour en comprendre le fonctionnement.
Pour commencer, on va créer notre fichier avec un premier groupe que l’on va nommer bob :
mysql_config_editor set -G bob -u bob -h 127.0.0.1 -P 3306 -p
Enter password:
Une fois qu’on a rentré notre password, le fichier .mylogin.cnf est créé à la racine de notre dossier utilisateur et on peut l’utiliser pour se connecter :
mysql --login-path=bob
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 34096
Server version: 5.6.36-82.0 Percona Server (GPL), Release 82.0, Revision 58e846a
Copyright (c) 2009-2017 Percona LLC and/or its affiliates
Copyright (c) 2000, 2017, 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> quit
Bye
Maintenant qu’on a vu ça, on va ajouter un groupe avec les éléments suivants :
mysql_config_editor set -G alice -u alice -S /var/run/mysqld/mysqld.sock -p
Enter password:
On peut maintenant se connecter avec le groupe alice :
mysql --login-path=alice
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 34288
Server version: 5.6.36-82.0 Percona Server (GPL), Release 82.0, Revision 58e846a
Copyright (c) 2009-2017 Percona LLC and/or its affiliates
Copyright (c) 2000, 2017, 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> quit
Bye
Si on veut afficher les différents groupes, il faut utiliser le paramètre print avec le flag –all :
mysql_config_editor print --all
[bob]
user = bob
password = *****
host = 127.0.0.1
port = 3306
[alice]
user = alice
password = *****
socket = /var/run/mysqld/mysqld.sock
Et maintenant, on va supprimer le groupe bob :
mysql_config_editor remove -G bob
Et du coup, quand on affiche le contenu de .mylogin.cnf
mysql_config_editor print --all
[alice]
user = alice
password = *****
socket = /var/run/mysqld/mysqld.sock
Bref, vous avez compris comment ça marche, c’est facile à mettre en place et à utiliser mais il ne faut pas penser que c’est totalement sécurisé car le fichier est chiffré.
Comme on peut le voir, le fichier .mylogin.cnf est chiffré :
cat .mylogin.cnf
R1�ei�RFU���A4U*������lb��� u�O@|�=�͐�TȰ�d���9��dJ�ƁL0��S�!�{}r8<)�f[]c��Ƅ�L�H�O݆��|=Ւ��D�
Il s’agit d’un chiffrement symétrique utilisant un cipher AES-128 ECB. La clé est générée aléatoirement lors de la création du fichier .mylogin.cnf et est stockée dans l’entête de ce fichier. Il est donc très simple de le déchiffrer si on cherche un peu dans le code source de MySQL. Mais il existe une solution encore plus simple ! Il suffit d’utiliser l’utilitaire my_print_defaults avec l’option -s qui permet d’afficher les mots de passe.
Dans notre cas, voici ce que cela donne en spécifiant le groupe alice :
my_print_defaults -s alice
--user=alice
--password=monpassword
--socket=/var/run/mysqld/mysqld.sock
Il s’agit donc d’une bonne alternative au fait de laisser les mots des passe en clair dans des scripts ou dans l’historique bash mais si ce fichier est compromis, il faut considérer que toutes les connexions stockées sont compromises, et donc, à changer. Il est donc important de continuer à appliquer des droits très strictes sur ce fichier, 0400
quand c’est possible ou 0600
.
Source : https://www.percona.com/blog/2016/09/07/get-passwords-plain-text-mylogin-cnf/