今まではMySQLの接続情報を.my.cnf
に保存して楽をしていましたが、.mylogin.cnf
という形式があるというのを恥ずかしながら最近知りました。
.my.cnf
と .mylogin.cnf
は、どちらも MySQL サーバーへの接続に使用される設定ファイルです。認証情報を保存することができ、設定するとログインパスを指定するだけでMySQLにログインできるようになります。
.my.cnf
はクレデンシャル情報(ユーザー名やパスワード)が平文で保存されるため、セキュリティ上の懸念があるのに対し、.mylogin.cnf
はクレデンシャル情報を暗号化することが可能なので、.my.cnf
に比べてセキュリティが高いです。
なお.mylogin.cnf
はmysql_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
ログインパスを操作します。
今回はローカルのMySQLにmysqlユーザーで接続できるように設定します。
$ mysql_config_editor set --host=localhost --login-path=tomozo6 --user=tomozo6user --password Enter password: ※パスワードを入力する
設定内容と確認
mysql_config_editorのprint
コマンドを使うことで設定内容を確認できます。
$ 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 構成ユーティリティー