$ mysql56 -utest -ptest -e "SELECT current_user()" Warning: Using a password on the command line interface can be insecure. +----------------+ | current_user() | +----------------+ | test@localhost | +----------------+
こんなのが出るようになりました。
読んで字のごとく、パスワードをコマンドラインインターフェイス(つまり-pオプション)で渡すのはセキュアじゃねーぞ、というワーニングです。
これ、標準エラー出力に吐くんですよね。
標準エラー出力に吐くということは、
$ crontab -l 1 3 * * * /usr/mysql/5.6.24/bin/mysqladmin -uflush -pxxxx flush-tables
週末に仕込んだこんなcronのエントリーがぼんぼんぼんぼんメールを投げてくるわけです。午前3時に。インセキュアだぞって。 '`,、'`,、( ´∀`)'`,、'`,、
さてこのメッセージ、mysys_ssl/my_getopt.cc にハードコードされています。エラーログドリブン ソースコードリーディング ですね。
653 /** 654 * This function should be called to print a warning message 655 * if password string is specified on the command line. 656 */ 657 658 void print_cmdline_password_warning() 659 { 660 static my_bool password_warning_announced= FALSE; 661 662 if (!password_warning_announced) 663 { 664 fprintf(stderr, "Warning: Using a password on the command line " 665 "interface can be insecure.\n"); 666 (void) fflush(stderr); 667 password_warning_announced= TRUE; 668 } 669 }
mysql-server/my_getopt.cc at cac6fc837a5f72203058e4acc6b8b4dba8a98294 · mysql/mysql-server
( ´-`).oO(password_warning_announcedってここ以外で使ってないので、if文なしでいきなりfprintfでいいんじゃないかって気がするんだけども。
これを出力させないように、いくつかの方法を考えてみました。セキュアかどうかは別問題です。出力させないことが大事です。
1) コマンドラインオプションから渡さずに、my.cnf系(~/.my.cnfとか、~/.mylogin.cnfも含む)で渡す。
5.6からは mysql_config_editor がありますね。かつてのわたしのお気に入りでした。日々の覚書: MySQL5.6 .mylogin.cnfで遊んでみる$ mysql_config_editor set --login-path=mysql --user=test --password Enter password: $ mysql56 -e "SELECT current_user()" +----------------+ | current_user() | +----------------+ | test@localhost | +----------------+
使 っ て ま せ ん '`,、'`,、( ´∀`)'`,、'`,、
MySQL 5.6にできたサーバーと、まだ5.6未満で稼動しているサーバーでスクリプト作り分けるのが
あと.mylogin.cnf別にセキュアじゃなかったし => セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor , ~/.my.cnfだって平文で書くからセキュアじゃないし。
2) MYSQL_PWD環境変数を使ってパスワードを渡す。
これ知らない人多そう。MYSQL_PWD環境変数が設定されていて かつ -pオプションが指定されていない場合、MYSQL_PWD環境変数の中身がパスワードとして扱われます。つまりがパスワード未設定時のデフォルト値をオーバーライドしてくれる。というわけでこれを使うと
$ MYSQL_PWD="test" mysql56 -utest -e "SELECT current_user()" +----------------+ | current_user() | +----------------+ | test@localhost | +----------------+
全然セキュアになってませんが、インセキュアだと怒られることはなくなります。管理対象が増えるわけでなくてもとのcronエントリーを
$ crontab -l 1 3 * * * MYSQL_PWD=xxxx /usr/mysql/5.6.24/bin/mysqladmin -uflush flush-tables
とだけ書き換えればいいですね。らくちん。
3) mysqlコマンドラインクライアントだけダウングレードする。
yumでrpmを突っ込んでいる環境だとつらい気がしますが、バイナリーやソースコードから突っ込んでいるならこれも手です。5.5 => 5.6のmysqlコマンドラインクライアントの新機能ってhistignoreや.mylogin.cnf対応くらいじゃないかと思うので(5.6 => 5.7はCtrl + C対応とsyslogがある)、別に最新じゃなくてもいいやって割り切りは十分アリじゃないかと思います。
4) ほげる。
オチは想像がついていると思いますが、print_cmdline_password_warningをほげります。もうバッサリreturn (void) 0; だけでいいんじゃないかな。$ diff -c mysys_ssl/my_getopt.cc{.orig,} *** mysys_ssl/my_getopt.cc.orig 2015-03-26 01:34:52.000000000 +0900 --- mysys_ssl/my_getopt.cc 2015-05-18 12:35:56.314531829 +0900 *************** *** 657,671 **** void print_cmdline_password_warning() { ! static my_bool password_warning_announced= FALSE; ! ! if (!password_warning_announced) ! { ! fprintf(stderr, "Warning: Using a password on the command line " ! "interface can be insecure.\n"); ! (void) fflush(stderr); ! password_warning_announced= TRUE; ! } } --- 657,663 ---- void print_cmdline_password_warning() { ! return (void) 0; } $ client/mysql -utest -ptest -S /usr/mysql/5.6.24/data/mysql.sock -e "SELECT current_user()" +----------------+ | current_user() | +----------------+ | test@localhost | +----------------+
ちょっと別件でmysqlコマンドラインクライアントをほげってrpmにすることが決まってるので、まさかの4) を採用するかも知れません。
0 件のコメント :
コメントを投稿