MySQL道普請便り

第57回 mysql_config_editorを試してみよう

この記事を読むのに必要な時間:およそ 2.5 分

MySQLアカウントのログインパスワードを,開発/運用する人のPCごとに管理している時に,退職や異動などによってパスワードの変更がどうしても必要になってしまった場合に,パスワードの変更周知と変更したパスワードの配布に困ったことはありませんか。

今回は,そんな時に少し便利なmysql_config_editorについて紹介していきます。

mysql_config_editorを使ってみる

mysql_config_editorはMySQL5.6からバンドルされるようになったコマンドで,パスワードやアカウント,接続情報などを難読化して,LinuxやMacではホームディレクトリの.mylogin.cnfに,WindowsではAppDataフォルダ内に.mylogin.cnfというファイルにして置くことができます。

ドキュメントでは暗号化と表記されています。しかし,複号に使う鍵と暗号化されたデータが.mylogin.cnf内に一緒に格納されており解読ができてしまうため,この記事では「難読化」と表現させていただきます。

余談ではありますが,mysql_config_editorと似た名前のコマンドにmysql_configがありますが,こちらはMySQLクライアントやプラグインなどをコンパイルするのに必要な情報を取得するコマンドで,まったくの別物なのでご注意ください。

難読化して登録する

それではさっそくmysql_config_editorを使って接続情報を難読化してみましょう。登録するにはsetコマンドを使って登録を行います。--login-pathオプションで,mysql_config_editorで管理をする時の名前を指定しています。このオプションのデフォルト値はclientです。--hostオプションで接続するホストを指定しています。--userオプションで接続の際に使用するユーザー名を指定しています。--passwordオプションを付けることで保存するパスワードを入力するダイアログを出します。

この他にも,今回は使いませんでしたが,UNIXソケットファイルを指定する--socketオプションや,port番号を保存するための--portオプションなどがあります。ただし,--socketオプションや--portオプションは5.6.11から導入された機能になりますのでご注意ください。

$ mysql_config_editor set --login-path=local --host=localhost --user=root --password
Enter password: #パスワードを入力する
$

以上のようにコマンドを実行すると,LinuxとMacでは以下のように現在のユーザのホームディレクトリに.mylogin.cnfファイルが作成されていることがわかります。

$ cat .mylogin.cnf


�uFb�������Q��_�IC)tش��A��  �����Մ�+�ԝs� �j��,L]q��F`a{jn>�S|��|Ņ�qh�
$

このようにcatを使って.mylogin.cnfファイルの中身を表示してみようとしてみても,難読化されているため読めないことがわかります。

Windowsでは,AppDataフォルダ内に.mylogin.cnfファイルが作成されていることがわかります。

図1 AppDataフォルダ内に生成された.mylogin.cnfファイル

図1 AppDataフォルダ内に生成された.mylogin.cnfファイル

難読化した情報を確認する

ここでは登録された情報を確認してみましょう。以下のようにprintコマンドを使うと,登録した情報を確認することができます。--allオプションを使うと登録されている接続情報を確認することができます。

$ mysql_config_editor print --all
[client]
user = root
password = *****
host = localhost
[local]
user = root
password = *****
host = localhost
$

また,--login-pathオプションを指定することで個別に表示することもできます。

$ mysql_config_editor print --login-path=local
[local]
user = root
password = *****
host = localhost
$

接続する

次に,登録した情報を使って接続してみましょう。接続に利用するには,mysqlクライアントに--login-pathで接続したいログインパスを設定します。

$ mysql --login-path=local
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 5.7.19-log Homebrew

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>

接続情報を削除する

登録した情報を消したい場合は,removeコマンドもしくはresetコマンドを使います。

removeコマンドを使う場合は,以下のように--login-pathと消したい情報をオプションとして付与します。以下では--hostオプションを使っています。--login-pathを設定しなかった場合はデフォルトのclientの情報を削除します。

$ mysql_config_editor print --login-path=local
[local]
user = root
password = *****
host = localhost #host情報があります。

$ mysql_config_editor remove --login-path=local --host

$ mysql_config_editor print --login-path=local
[local]
user = root
password = ***** #host情報が削除されてなくなっています。
$

続いて--resetオプションですが,こちらのオプションを付けて実行すると,登録した情報すべてが文字通りリセットされて削除されます。

$ mysql_config_editor print --all
[client]
user = root
password = *****
[local]
user = root
password = *****
host = localhost

上記のように2件の登録があった場合,以下のように実行すると登録された情報がすべて削除されていることがわかります。

$ mysql_config_editor reset
$ mysql_config_editor print --all
$

5.6以前のMySQLで同様のことがしたい場合

mysql_config_editorが使える環境ではないけれども,mysqlクライアントでログインする際に,パスワードを打ち込むのが辛い場合があります。たとえば,複数台のMySQLを管理していてパスワードを管理しきれない場合や,cron等でbatchを実行する際にcronにパスワードを直書きするような事を避けたい場合等です。

そういった場合には,難読化はできませんが,以下のようにmy.cnfファイルにパスワードを書いておくことで認証を楽にできます。

$ cat .my.cnf
[client]
password="パスワード"

こちらを利用すると以下のようにログインすることができます。

$ mysql -uroot

また,このmy.cnfファイルにパスワードを書いておくと,難読化すらされてない状態になるためパーミッションを適切に設定するなどの対策を実施して,他のユーザから見えないようにする必要があります。うっかり隣に人がいる状態でcatコマンドなどで確認した時に,中身が見えてしまうこともあるので注意しましょう。

まとめ

mysql_config_editorで設定したキーがあれば,IDや生パスワードを知らなくてもログインができるようになるため,環境を5.6またはそれ以降で揃えることができるのであれば設定しておくと便利かもしれません。

しかし,mysql_config_editorで生成された.mylogin.cnfファイルに入っているパスワードは難読化はされているものの,解読しようとすれば読めてしまうことがわかっているため,過信をせずに取り扱いには注意しましょう。

著者プロフィール

木村浩一郎(きむらこういちろう)

GMOメディア株式会社 技術推進室所属のWebアプリケーションエンジニア。最近はミドルウェア・インフラ周りのことも少しずつ学習しています。趣味は将棋。好きな戦法は四間飛車。

Twitter:@kk2170