Blog

Utiliser un fichier de conf chiffré pour le client mysql

Écrit le 21 07 2017 par Kévin MET _

Introduction

Ç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 de 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 :

  • host
  • user
  • password
  • port
  • socket

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.

Un exemple concret d'utilisation

Pour commencer, on va faire créer notre fichier avec un premier groupe que l'on va nommer bob :

  • host : 127.0.0.1
  • user : bob
  • password : unpassword
  • port : 3306

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 :

  • host : 127.0.0.1
  • user : bob
  • password : unpassword
  • socket : /var/run/mysqld/mysqld.sock

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é.

Sécurité

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 chiffrage utilisant AES-128 ECB comme algorithme mais évidemment, si mysql_config_editor peut le lire c'est que le code source pour le lire est disponible et qu'il est donc assez simple d'écrire un petit programme ou de modifier les sources de mysql_config_editor pour ne pas cacher le password lors de l'affichage. Et pourtant, il y a une méthode encore plus simple, il suffit d'utiliser l'utilitaire my_print_defaults avec l'option -s qui permet d'afficher les passwords.

Dans notre cas, voici ce que cela donne en spécifiant le groupe alice :


my_print_defaults -s alice
--user=alice
--password=unpassword
--socket=/var/run/mysqld/mysqld.sock

Bref, on voit que ce n'est pas super sécurisé, cela reste un peu mieux que ce bon vieux .my.cnf car peu de monde connaît ce petit tour de passe-passe mais une personne qui en veut vraiment à votre BDD le connaîtra très certainement. Il faut donc bien veiller à appliquer les bons droits sur ce fichier et à ne pas se reposer complètement sur cette pseudo sécurité de façade.

Source : https://www.percona.com/blog/2016/09/07/get-passwords-plain-text-mylogin-cnf/

♥ Partage sur tes réseaux sociaux ♥
Kévin MET
Kévin MET

Auteur de ce blog et gérant de la société MNT-TECH, je publie sur ce blog lorsque le temps me le permet et lorsqu'un sujet qui me parait intéressant n'a pas encore été abordé en français. Toutes les informations techniques présentes sur cette page peuvent être réutilisées moyennant le fait de citer la source.