GA

2018/10/26

MySQL 8.0のcaching_sha2_password + 非SSL接続が転ける

$ mysql80 -h 127.0.0.1 -u yoku0825 --ssl-mode=disabled -p
Enter password:
ERROR 2061 (HY000): Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
このエラーになる条件。
  • caching_sha2_password プラグインを使っているアカウント
    かつ
  • まだサーバー側にSHA2キャッシュが作られていないアカウント
    かつ
  • サーバーの公開鍵を指定していない非SSLのTCP接続
この条件に合致しているとログインが転けて↑のエラーを食らう。

解決策1. caching_sha2_password プラグインをやめて mysql_native_password プラグインを指定する

mysql> ALTER USER yoku0825 IDENTIFIED WITH mysql_native_password BY 'new_password`;

解決策2. 一度ログインに成功すればサーバー側にSHA2キャッシュが作成されるので、一度「エラーになる条件を満たさない」接続をしてやる

$ mysql80 -h localhost -S /usr/mysql/8.0.13/data/mysql.sock -u yoku0825 -p ## ソケット接続
$ mysql80 -h 127.0.0.1 -u yoku0825 --ssl-mode=PREFERRED -p ## SSL接続
$ mysql80 -h 127.0.0.1 -u yoku0825 --ssl-mode=disabled -p --server-public-key-path=/usr/mysql/8.0.13/data/public_key.pem ## サーバー公開鍵を指定した非SSL接続

解決策3. サーバーの公開鍵を指定する

↑と一緒で、 mysql コマンドラインクライアントだとこう。

$ mysql80 -h 127.0.0.1 -u yoku0825 --ssl-mode=disabled -p --server-public-key-path=/usr/mysql/8.0.13/data/public_key.pem ## サーバー公開鍵を指定した非SSL接続
のいずれかをやればOK。

要は、 caching_sha2_password だと初回の認証成功時にパスワードキャッシュをサーバーサイドに作るらしいんだけど、そこでMITM攻撃を食らうとマズいからこんな仕様になっているらしい。
その理屈(どうして1回目だけがmysql_native_passwordとかと比べてダメなのか)はよくわからないんだけど誰か読んで教えてくだしあ(ソースを読まないとこれ以上の理解は出てこないような気もする)
なお、
  • mysqldの再起動
  • FLUSH PRIVILEGES
  • キャッシュはアカウント単位なので、 CREATE USER 直後
もこれ(SHA2キャッシュがない状態)にあたるので、おとなしくSSL接続使うようにした方が良いと思われるのでした。
なお、このネタはご覧のスポンサー(?)の提供でお送りしました














2 件のコメント :

  1. MySQL Client/server protocol でサーバーから公開鍵を取得することができます。
    このオプションで公開鍵取得を有効にできるようです。
    https://dev.mysql.com/doc/refman/8.0/en/mysql-command-options.html#option_mysql_get-server-public-key

    SSLやUnix domain socket じゃない (非secureな) 接続でRSA暗号化するのは sha256_password も同じだと思うので、
    同じ現象は MySQL 5.7 で sha256_password を使ったときも起こると思います。

    返信削除
  2. おお、そんな便利なものがあるんですね!
    sha256_password はその通りでした!

    これ、エラーコードが2000番台なあたりからわかるようにクライアントサイドエラーで、サーバーが「キャッシュがないからフル認証寄越せ」パケットを送って、それを受け取ったクライアントが「いや、SSLじゃないからアボート」ってやってるっぽいんですよね…(いいのかなその実装で)

    返信削除