セキュアそうでセキュア
 じゃない少しセキュアな
     気分になれる
 mysql_config_editor

2013/04/17   MySQL Casual Talks vol.4 do_aki
do_aki (どぅーあき)
|所属| > 株式会社もしも
      (ドロップシッピング・アフィリエイトASP)
|仕事| > インフラ(サーバ管理)兼
     Webアプリケーション開発
|出現| > 渋谷・山手線沿線
|特性| > PHPer


                       http://do-aki.net/
mysql_config_editor
使い方
$ mysql_config_editor set --login-path=path1 
--host=127.0.0.1 --user=user1 --password
Enter password: <- パスワード入力

$ mysql –login-path=path1
mysql>
バイナリで保存されてる
$ hexdump   -C   ~/.mylogin.cnf
00000000    00   00 00 00 01 18   0d   0d   18   01   0b   0e   1a   15   0f   1b   |................|
00000010    12   12 00 02 12 1e   1f   03   10   00   00   00   4a   c8   d0   d9   |............J...|
00000020    f0   de 9a fa 7d f5   2f   0b   80   ef   20   58   10   00   00   00   |....}./... X....|
00000030    7e   36 64 73 58 b7   d0   1f   78   93   43   0d   c2   db   d8   0c   |~6dsX...x.C.....|
00000040    20   00 00 00 4e a7   5d   18   3e   46   ba   33   8d   fa   1f   57   | ...N.].>F.3...W|
00000050    89   e1 db b2 4d 87   4f   da   4f   f3   48   86   b7   e6   00   79   |....M.O.O.H....y|
00000060    8b   28 59 68 20 00   00   00   44   f2   5a   10   20   36   05   41   |.(Yh ...D.Z. 6.A|
00000070    99   30 99 65 f1 b5   b3   e3   60   71   a4   e2   ac   17   6b   f2   |.0.e....`q....k.|
00000080    0d   b2 e9 d1 60 74   7d   57                                           |....`t}W|
00000088
明示的なパスワード指定無しで読める

$ mysql_config_editor print --all
user = user1
password = *****
host = 127.0.0.1
mysql_config_editor
(MySQL 5.6 Reference Manual)

• The mysql_config_editor utility (available as
  of MySQL 5.6.6) enables you to store
  authentication credentials in an encrypted
  login file named .mylogin.cnf.




  http://dev.mysql.com/doc/refman/5.6/en/mysql-config-editor.html より抜粋
パスワード無しに
  暗号化?
Code Reading!!
client/mysql_config_editor.cc


• ほとんどこのファイルのみで構成
  (一部、 mysys_ssl/my_aes.cc )

• 暗号化処理は TaoCrypt (extra/yassl 以下)
  もしくは OpenSSL が担当

• AES (鍵長 128bit) ECB
check_and_create_login_file
login file を探す
  ●ファイルがある場合
      ファイルパーミッションをチェック
      鍵の読み込み (read_login_key)

 ●ファイルがない場合
  鍵の生成 (generate_login_key)
    -> 実体は乱数生成してるだけ
  鍵を含むヘッダの書き込み (add_header)
鍵はファイルに埋め込まれてる
.mylogin.cnf のファイル構造
予約領域 (4byte)

00   00   00   00   01   18   0d   0d   18   01   0b   0e   1a   15   0f   1b
12   12   00   02   12   1e   1f   03   10   00   00   00   4a   c8   d0   d9
f0   de   9a   fa   7d   f5   2f   0b   80   ef   20   58   10   00   00   00
7e   36   64   73   58   b7   d0   1f   78   93   43   0d   c2   db   d8   0c
20   00   00   00   4e   a7   5d   18   3e   46   ba   33   8d   fa   1f   57
89   e1   db   b2   4d   87   4f   da   4f   f3   48   86   b7   e6   00   79
8b   28   59   68   20   00   00   00   44   f2   5a   10   20   36   05   41
99   30   99   65   f1   b5   b3   e3   60   71   a4   e2   ac   17   6b   f2
0d   b2   e9   d1   60   74   7d   57
LOGIN_KEY (20byte)
                                         20byte から鍵 (16byte) を構築


00   00   00   00   01   18   0d   0d   18   01   0b   0e   1a   15   0f   1b
12   12   00   02   12   1e   1f   03   10   00   00   00   4a   c8   d0   d9
f0   de   9a   fa   7d   f5   2f   0b   80   ef   20   58   10   00   00   00
7e   36   64   73   58   b7   d0   1f   78   93   43   0d   c2   db   d8   0c
20   00   00   00   4e   a7   5d   18   3e   46   ba   33   8d   fa   1f   57
89   e1   db   b2   4d   87   4f   da   4f   f3   48   86   b7   e6   00   79
8b   28   59   68   20   00   00   00   44   f2   5a   10   20   36   05   41
99   30   99   65   f1   b5   b3   e3   60   71   a4   e2   ac   17   6b   f2
0d   b2   e9   d1   60   74   7d   57
block size (4byte)
     block data (16*n byte)
                                        AES が 16byte block なので

00   00   00   00   01   18   0d   0d   18   01   0b   0e   1a   15   0f   1b
12   12   00   02   12   1e   1f   03   10   00   00   00   4a   c8   d0   d9
f0   de   9a   fa   7d   f5   2f   0b   80   ef   20   58   10   00   00   00
7e   36   64   73   58   b7   d0   1f   78   93   43   0d   c2   db   d8   0c
20   00   00   00   4e   a7   5d   18   3e   46   ba   33   8d   fa   1f   57
89   e1   db   b2   4d   87   4f   da   4f   f3   48   86   b7   e6   00   79
8b   28   59   68   20   00   00   00   44   f2   5a   10   20   36   05   41
99   30   99   65   f1   b5   b3   e3   60   71   a4   e2   ac   17   6b   f2
0d   b2   e9   d1   60   74   7d   57
• パスワードも含め、全て表示する perl
  script 組んでみた

• https://gist.github.com/do-aki/5402830
実は既に言及されてる




http://mysqlblog.fivefarmers.com/2012/08/16/understanding-
           mysql_config_editors-security-aspects/
まとめ
• 暗号化と言うより難読化
• 安全性は平文ファイルと同程度
• 平文で書かれてるよりはまし?

• うっかりgithub 等に公開しないように注意
ありがとうご
ざいました

セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor