文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

MySQL5.6のUsing a password on the command line interface can be insecureの対応

この警告は対応できるので、やっておいた方が色々安心で無難です〜


f:id:treeapps:20180418131549p:plain

MySQL5.6を使っていると、以下をよく目にします。

Warning: Using a password on the command line interface can be insecure.

これは言葉通り、コマンドラインからパスワード入力するのやめーや!ってことですね。
コマンドラインでパスワードまで入力すると、コマンド履歴等に残ってしまってセキュリティリスクになるから、warningを出すようにしたのでしょうね。

それにしてもこの警告が鬱陶しいんです。
以前以下の記事で、watchコマンドでshow processlistを定期的に実行するスクリプトを書きましたが、このwarningのせいでコンソールが流れてしまうのです・・

流石に鬱陶しくなってきたので、根本的に対応する事にしました。

my.cnfを使った解決策

色々ネット調べましたが、一番よさそうなのがmysql接続時にmy.cnfを指定し、そのmy.cnfに接続情報を書く方式が一番よいと思いました。

今までのMySQLの接続方法

今まではシェルスクリプトの.shファイルにユーザ・パスワード等を定義し、svnで管理していました。

MYSQL_CON="mysql -h${MYSQL_HOST} -u${MYSQL_USER} -p${MYSQL_PASS} -D${MYSQL_SCHEMA}"

こんな感じでした。

今回はこれをやめ、my.cnfにユーザ名・パスワード・ホスト名を書くようにしました。

my.cnfを指定したMySQL接続方法に変更

my.cnfのサンプル
[client]
user = hoge-user
password = hoge-password
host = localhost

このmy.cnfは/etc/my.cnfに置かなくてもよく、どこに置いても大丈夫です。

my.cnfを指定したMySQLの接続例
mysql --defaults-extra-file=/tmp/my.cnf schema

こうなります。これでユーザ・パスワード・ホストの指定をしなくなるので、warningは起きなくなります。

ユーザを変えたい場合は、例えば、

  • user1-my.cnf
  • user2.my.cnf

のように複数用意し、--defaults-extra-fileでそれを指定すればユーザを分けられます。
ファイル名はmy.cnf以外でも大丈夫です。

「--defaults-extra-file=/tmp/.user1-my.cnf」の方式で、MySQL5.0とMySQL5.6に接続できた事を確認できたので、旧バージョンのMySQLでも利用可能です。

セキュリティ面の考慮

パーミッションを600にする

セキュリティ面が不安であれば、以下のようにパーミッション「600」でオーナー以外に触れないようにするとよいです。

treemacpro-3:tmp tree$ chmod 600 my.cnf
treemacpro-3:tmp tree$ ll my.cnf
-rw-------  1 tree  wheel     0B  8  2 18:49 my.cnf
隠しファイル化する

更にセキュリティを強化するなら、「my.cnf」ではなく「.my.cnf」とし、隠しファイルにすると尚よいです。
隠しファイル化する事で、以下のように「ls」では見えないが、「ls -a」で見える、という状態にできるので、接続情報が設定されたファイルを発見されにくくできます。

treemacpro-3:tmp tree$ ls -l
srwxrwxrwx  1 _mysql      wheel    0  7 29 22:07 mysql.sock
treemacpro-3:tmp tree$ ls -la
-rw-------   1 tree        wheel    0  8  2 18:49 .my.cnf
srwxrwxrwx   1 _mysql      wheel    0  7 29 22:07 mysql.sock
実はセキュリティ面に不安はある

例えばjavaでSaStrutsフレームワークでアプリを開発しているとします。SaStrutsはDBの接続情報を「jdbc.dicon」というファイルで管理しているので、このファイルさえ発見してしまえば、DBの接続先がバッチリ解っちゃうんですよね・・・前述のmy.cnfの工夫をしても、アプリ経由で発見される可能性もあるので、サーブレットコンテナのオーナーとグループを工夫して、第三者にアクセスされにくくするとよいでしょう。

--defaults-group-suffixを使った解決法


↑この記事で--defaults-group-suffixを使った方法も記述しています。

ついでにmycliという便利なMySQLクライアントも紹介しているので、合わせてご覧下さい。

ちなみに--defaults-group-suffixを使う場合は、1ファイルに複数の接続先を定義し、それぞれの定義にグループ名を付けます。実際に接続する際は以下のように接続する事ができるようになります。

mysql --defaults-group-suffix GROUP1

結果的に--defaults-extra-filesよりもシンプルに記述できるので、こちらの方がいいかもしれません。

雑感

今までのシェルスクリプトでのユーザ・パスワード・ホスト名の管理をやめて、my.cnf式に変更しました。今後シェルスクリプトからMySQLに接続する場合はmy.cnfを使用します。

これで鬱陶しい警告ともお別れで、今までのように快適なMySQL接続となります!