MySQLの.mylogin.cnfを使ってみる

今まではMySQLの接続情報を.my.cnfに保存して楽をしていましたが、.mylogin.cnfという形式があるというのを恥ずかしながら最近知りました。

.my.cnf.mylogin.cnf は、どちらも MySQL サーバーへの接続に使用される設定ファイルです。認証情報を保存することができ、設定するとログインパスを指定するだけでMySQLにログインできるようになります。

.my.cnfはクレデンシャル情報(ユーザー名やパスワード)が平文で保存されるため、セキュリティ上の懸念があるのに対し、.mylogin.cnfはクレデンシャル情報を暗号化することが可能なので、.my.cnfに比べてセキュリティが高いです。

なお.mylogin.cnfmysql_config_editorユーティリティを使用して作成します。

使い方

ログインパスの設定をする必要があります。

ログインパスとは

.mylogin.cnf の各オプションのグループを「ログインパス」と呼びます。 ログインパスは、接続先のMySQLサーバーおよび認証に使用するアカウントを指定する一連のオプショングループと考えてください。 暗号化を解除した例を次に示します。

[client]
user = mydefaultname
password = mydefaultpass
host = 127.0.0.1
[tomozo6]
user = tomozo6user
password = tomozo6pass
host = localhost

なおcat等で.mylogin.cnf

ログインパスの設定

mysql_config_editorユーティリティを使用してログインパスを設定します。 構文は以下の通りです。

$ mysql_config_editor set --host=${接続するサーバ} --login-path=${ログインパス名} --user=${使用するMySQLのユーザー} --password

なお使用するログインパスを明示的に示す --login-path=オプションを指定しない場合、mysql_config_editor はデフォルトでclientログインパスを操作します。

今回はローカルのMySQLmysqlユーザーで接続できるように設定します。

$ mysql_config_editor set --host=localhost --login-path=tomozo6 --user=tomozo6user --password
Enter password:   ※パスワードを入力する

設定内容と確認

mysql_config_editorprintコマンドを使うことで設定内容を確認できます。

$ mysql_config_editor print --all
[tomozo6]
user = "tomozo6user"
password = *****
host = "localhost"

MySQLに接続

mysqlコマンドを使えば.mylogin.cnfの設定が読み込まれます。ただ何も指定しないと、clientログインパスを参照するので、client以外のログインパスを使用したい場合は明示的に指定する必要があります。

$ mysql --login-path=tomozo6
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 20
Server version: 8.0.29 MySQL Community Server - GPL

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

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>

設定したログインパスを削除

設定したログインパスを削除するにはremoveコマンドを使用します。

$ mysql_config_editor remove --login-path=tomozo6
$ mysql_config_editor print --all
$ 

以下のように--userなどの指定した部分だけを削除することもできます。あんまり使うシチュエーションは思いつきませんが...

$ mysql_config_editor remove --login-path=tomozo6 --user
$ mysql_config_editor print --all
[tomozo6]
password = *****
host = "localhost"

Q&A

Q: 暗号化ってどうやっている?鍵は? A: 実は複号に使う鍵と暗号化されたデータが.mylogin.cnf内に一緒に格納されています。なので暗号化と言いつつ、.mylogin.cnfファイル単体で解読できてしまう。暗号化よりも難読化のほうが正しい表現かもしれません。

参考文献

MySQL 8.0 リファレンスマニュアル::4.6.7 mysql_config_editor — MySQL 構成ユーティリティー