MySQLで幸せになれるヤツの続き-パスワードを隠蔽する方法
パスワードをゴニョゴニョする前に
で
パスワードを生テキストで書くなって人はゴニョゴニョしてください。
って書いた話の件ですが、なんでこんな話になるの、ってところをまず押さえましょう。
mysqlクライアントでのログイン方法あれこれ
普通は、以下のように指定してログインを行うと、パスワードについてプロンプトがきて、そこで入力します。入力内容は見えないやつです。
(サンプル古くてすみません。5.6.23です。)
$ mysql -u ユーザ -p -h 接続先 Enter passowrd: パスワードを入力してEnter Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 480 Server version: 5.6.23-log MySQL Community Server (GPL) Copyright (c) 2000, 2016, 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>
起動時にオプションでパスワードを与える事ができますが、つまりパスワード丸見えなので、ワーニングが表示されます。
$ mysql -u ユーザ -pパスワード -h 接続先 Warning: Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 481 Server version: 5.6.23-log MySQL Community Server (GPL) Copyright (c) 2000, 2016, 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>
シェルスクリプトの中からの呼び出しなど、インタラクティブではない状況で実行したい場合、後者に頼ってしまいがちですが、パスワードをプレーンテキストで記述することになるので、できれば避けたいですよね。
この問題について、公式ドキュメントに言及がありますので、おってみていきましょう。
mysqlクライアントのパスワードを隠蔽する
やっと本題です。
MySQLの公式ドキュメントでは、こちらになります。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 6.1.2.1 パスワードセキュリティーのためのエンドユーザーガイドライン
・mysql_config_editor ユーティリティーを使用します。これは、.mylogin.cnf という名前の暗号化されたログインファイルに認証情報を格納できます。このファイルは、MySQL Server に接続するための認証情報を取得するために、MySQL クライアントプログラムによってあとで読み取ることができます。セクション4.6.6「mysql_config_editor ? MySQL 構成ユーティリティー」を参照してください。
いきなり、別ページへの参照です。すみません。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.6.6 mysql_config_editor — MySQL 構成ユーティリティー
つまり、MySQLに付属するパスワードマネージャーツール「mysql_config_editor」を使って、.mylogin.cnf ファイルに暗号化して記録しましょう、ということ。
で、その詳細の前に、mysql_config_editor以外の手段について軽く触れておきましょう。
mysql_config_editor以外の手段と欠点
.my.cnf ファイル
[clinet]セクションに、「password=パスワード」を記載すると、mysqlクライアントで読み込むようになります。
.my.cnf以外のところに切り出したい場合は、別ファイルに記述しつつ、「--defaults-file=外部化したファイル」で利用できます。
いずれにせよファイルおよびパスワードはは暗号化されませんので、OSのファイルアクセス権限を適切なものにしないと危険です。
mysql_config_editorを使う
もとに戻って、mysql_config_editorのお話。
ログインパス(login-path)というタグでログイン情報セットを管理し、ログイン時にはそのlogin-pathを指定すると、対応する情報が使用されます。
mysql_config_editorで、login-pathに紐付けて管理できる情報は、今のところ以下の5つで、一部だけの設定(mysqlログイン時に別途指定)も可能です。
- user
- password
- host
- port
- socket
こんな感じでセットします。
$ mysql_config_editor set --login-path=local --host=localhost --user=localuser --password Enter password: localuserでMySQLにログインする際のパスワードを入力
$ mysql --login-path=local
とすると、mysql_config_editorで登録した内容でログインが実行されます。
mysql_config_editorによって「.mylogin.cnf」に書き出した内容は暗号化されているのですが、以下のように確認することができます。
$ mysql_config_editor print --all [local] user = root password = *****
修正する場合は、同じsetコマンドを打ち直して上書きします。
このファイル自体は、OSユーザ毎に保存されるので、別のOSユーザで「例のヤツ」を実行するようにしてあげましょう。
おなじOSユーザーになってしまえば、login_pathさえ正しければ、パスワードを知らなくてもログインできてしまいますので要注意。(もちろん、print --allでlogin_pathはバレバレ)