なからなLife

geekに憧れと敬意を抱きながら、SE、ITコンサル、商品企画、事業企画、管理会計、総務・情シス、再び受託でDB屋さんと流浪する人のブログです。

MySQLで幸せになれるヤツの続き-パスワードを隠蔽する方法

パスワードをゴニョゴニョする前に

atsuizo.hatenadiary.jp

パスワードを生テキストで書くなって人はゴニョゴニョしてください。

って書いた話の件ですが、なんでこんな話になるの、ってところをまず押さえましょう。

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_PWDに、パスワードをセットしておきます。
そのパスワードに対応するユーザーで
mysql -u ユーザー
を打つと、環境変数のパスワードを利用してログインされます。


公式ドキュメントでも警告されているとおり、セキュリティ的にまずいですね。
psコマンドで「e」オプションをつけると、使用している環境変数が見えてしまいます。

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にログインする際のパスワードを入力

で、localhostmysqlに接続するときは

$ 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はバレバレ)

まとめ


あれ、nolgoinユーザでmysql_config_editor(.mylogin.cnf)とか.my.cnfって使えるのかな?

やさしく学べるMySQL運用・管理入門【5.7対応】

やさしく学べるMySQL運用・管理入門【5.7対応】