Config pour ne plus taper ses mots de passe MySQL et plus encore avec les Options file

Depuis quelques mois je suis devops à plein temps et je passe une bonne partie de mon temps à jongler entre les différents serveurs MariaDB. Du coup je dois constamment taper des commandes à rallonge avec le host, le user, le nom de la bdd pour me connecter aux différentes instances.

La connexion sur une base de dev va me donner cette commande.

~$ mysql -hsql.local.dev -uulrich -p blog

TIP: ne mettez jamais votre mot de passe dans la ligne de commande, il est exposé dans les logs ou via un simple "ps".

Mais il est possible de se simplifier la vie avec le fichier .my.cnf à la racine de votre compte linux.

[mysql]
pager  = grcat ~/.grcat
 
[client]
user = ulrich
password = "aucun!pourquoi?"
database = blog
host = sql.local.dev
 

Si vous êtes curieux sur la première ligne, je vous invite à lire mon article pour avoir de la coloration dans le client mysql.
Le group "client" ne sera lu que par les clients mysql.  Ainsi ma commande précédente devient:

~$ mysql

Ok facile, seulement j'ai dis en intro que j'étais constamment en train de jongler entre les serveurs et là ma configuration ne me permet pas d'avoir plusieurs configs. Faisons donc évoluer le fichier de .my.cnf


[mysql]
pager  = grcat ~/.grcat
 
[clientdev_blog]
user = ulrich
password = "aucun!pourquoi?"
database = blog
host = sql.local.dev
 
[clientprod_blog]
user = ulrich
password = "CaSertARien"
database = blog
host = sql.exemple.com
 

On voit ici qu'il y a 2 groupes qui sont préfixés par "client" pour être sûr que seul les clients les lisent.  Et pour chaque groupe je définis le user, le mot de passe, le nom de la base et le host.
Pour utiliser cette configuration il faut utiliser l'option --defaults-group-suffix avec le nom du groupe. La commande au dessus va donc devenir:

~$ mysql --defaults-group-suffix=dev_blog

L'avantage ici, c'est que je n'ai pas besoin de me souvenir du nom du serveur, même si ma config ssh me simplifie le travail, idem pour le user associé à la base. Quant au mot de passe, il ne m'est pas demandé contrairement à la première commande.

C'est bien mais au final le gain n'est pas si énorme car l'option est tout de même assez longue.
J'ai résolu ce problème en ajoutant un alias dans mon .bashrc:

function mysqlgr {
     mysql --defaults-group-suffix="$1"; 
}

Du coup ma commande devient:

~$ mysqlgr dev_blog

C'est plutôt pas mal, mais j'ai tout de même quelques limitations, il m'est impossible de chaîner les commandes avec mon alias ou de rajouter des options. Typiquement la commande ci dessous me connectera sur MySQL et ne fera rien d'autre:

~$ mysqlgr dev_blog -e "show create table test;"

Il reste encore un point super gênant. Votre mot de passe est en clair dans un fichier. Il faut donc veiller à changer les droits du fichier .my.cnf avec un chmod 600 ou 400 pour le limiter à votre utilisateur.

Tout ce dont j'ai parlé est compatible avec MySQL et MariaDB.
Il existe une autre solution qui est l'utilitaire mysql_editor_config. Cet utilitaire va créer un fichier .mylogin.cnf à la raçine du home. Son avantage est que le mot de passe est crypté et ne sera donc jamais exposé, en contrepartie on ne peut pas spécifier la base de donnée associé à l'utilisateur. Et malheureusement il n'est pas pris en charge par MariaDB, mais si vous avez la chance d'utiliser MySQL essayez le. Il faut installer libmysqlclient-dev sur debian/ubuntu pour l'installer.

Si vous êtes root sur l'ensemble de votre infrastructure vous pouvez aussi vous connecter à MySQL/MariaDB via votre compte linux en passant par le socket auth.

Il y a 2 commentaires.

Ecrit par Bruno le 18 févr. 2018

Je ne comprend pas bien la dernière phrase de l'article. L'utilisation du plugin « unix_socket » permet justement à n'importe quel utilisateur ayant un compte Unix standard de se conecter à mysql sans avoir à saisir de mot de passe. À condition , bien sûr, qu'il soit dans la table mysql.user.

Réponse de Ulrich le 18 févr. 2018

En effet Bruno si l'utilisateur à un compte déclaré dans la table user via le plugin unix_socket il peut se connecter sans mot de passe. Dans la dernière ligne de l'article je fais référence à l'utilisateur root car cette configuration (utilisateur + unix_socket) est fait par défaut à l'installation mais uniquement sur le localhost.

Ajouter un commentaire