ある日突然、MySQLのフロントエンドに使ってたDbeaverでクエリを実行したら、"Public Key Retrieval is not allowed"エラーが発生した。DBに接続しようとしても同じエラーで繋がらなくなった。
環境
サーバ(データベース)側は
- MySQL:8.0.35-0ubuntu0.22.04.1(確認コマンド:MySQLに入ってSELECT VERSION();)
- OS:Ubuntu 22.04.1 LTS(確認コマンド:lsb_release -a)
- CPU:i5-2520M CPU @ 2.50GHz 4core(確認コマンド:cat /proc/cpuinfo)
- メモリ:8GByte
クライアント(Dbeaver)側は
- Dbeaver:24.0.2.202404071654(確認方法:ヘルプ→Dbeaverについて)
- OS:Windows 10 Pro 22H2 ビルド19045.4046(確認方法:設定→システム)
- CPU:Intel(R) Xeon(R) CPU E3-1280 v3 @ 3.60GHz 3.59 GHz(確認方法:設定→システム)
- メモリ:24GByte(確認方法:設定→システム)
ネットワーク環境はサーバ、クライアント共にローカルネットワーク内で接続し、ネットワークアドレスも同一(192.168.0.0/24)
現象
Dbeaverは一か月くらいずっと開きっぱなしにしてて、毎日何度もクエリの実行ボタンを押して結果を見るという運用をしていたけど、ある日クエリを実行したら“Public Key Retrieval is not allowed”エラーのダイアログが出た。何このエラーって思いながらデータベースに接続を試すも変わらず。サーバ側も数か月設定を変更することも再起動することもなく動かし続けてたので昨日までと何も変わらないはずなのに。
原因を調べる
ググってみたらymzk jpxさんが原因と関連性を詳しく解説してくれてた。
"Public Key Retrieval is not allowed"が発生する条件は以下の2つとなってる。
- caching_sha2_passwordを利用してMySQLに接続しようとしている。
- クライアントとDBサーバー間の通信経路がTLSで保護されていない。
MySQLの認証プラグインが何になってるか確認してみた。
mysql> show variables like 'default_authentication_plugin'; +-------------------------------+-----------------------+ | Variable_name | Value | +-------------------------------+-----------------------+ | default_authentication_plugin | caching_sha2_password | +-------------------------------+-----------------------+
caching_sha2_passwordになってる。
caching_sha2_passwordを使って接続するには、通信経路の保護が推奨されててデフォルトでは保護なしでの接続はできないようになっているそうな。
allowPublicKeyRetrievalをtrueに設定することで、保護されていない経路でも接続できるようになるとのこと。
対処
Dbeaverの「データベースナビゲータ」ペインでデータベースを右クリックして「編集 接続」を選択して設定ダイアログを開く。
接続設定ダイアログの右ペインの「ドライバのプロパティ」タブを選択。
allowPublicKeyRetrievalはFALSEになってる。
allowPublicKeyRetrievalをTRUEにする。
これで、いつも通りデータベースへの接続やクエリの実行ができるようになった。
残された謎
昨日までずっと、allowPublicKeyRetrievalはFALSEになってる状態で問題なく動いていたのはなぜだろ?
気になったので、TRUEにしたallowPublicKeyRetrievalをFALSEに戻してみたけどエラーが出ない。。。なんで?本当の原因は違うのか?
allowPublicKeyRetrievalがTRUEで一旦経路が形成されると維持されるのかなと思ってFALSEにした状態でDbeaverを再起動してみたけどエラーは起こらない。なぜっ!
FALSEのままで使ってたらまた再発するのかな?と試してみたら2週間くらい経過したところで再発した。で、TRUEにしたら発生しなくなり、FALSEに戻しても再発しない。何かの刺激で発生して、TRUEにすることで発生する状態をリセットされる感じの動き。
原因の本質と対策が意図と違ってるのは気持ち悪いけど、今度はTRUEのままで運用して様子を見てみる。