MySQL Workbenchでssh接続できないとき(Ed25519鍵編)
これはなに?
OpenSSHのポートフォワーディング機能を使って、ローカルホストから踏み台サーバを経由してDBサーバへ接続する方法を説明します。
MySQL Workbenchを題材にしていますが、OpenSSHを用いた汎用的な手法を用いているので、TCPで待ち受けるサーバに他のツールで接続する場合にも応用できます。
だれ向け?
主に、MySQL WorkbenchのSSH接続機能を使ってDBサーバへ接続ができない人向けです。
ですが、先述の通り、MySQL Workbenchに依った話ではないので、TCPを使って接続をするツールを使用する人であれば参考になると思います。
次のようなシステム構成で利用することを想定しています。
何が問題?
執筆時点では、MySQL WorkbenchはDBサーバに接続する際のSSH接続で、OpenSSHで作成したEd25519な秘密鍵(パスフレーズ付)を使用することに対応していないようです[1]。
Access denied for 'none'. Authentication that can continue: publickey
したがって、Ed25519な鍵を使って踏み台サーバ経由でDBサーバへ接続する場合、パスフレーズなしの秘密鍵を用意するか、自前でSSHのトンネルを用意する必要があります。
どうすればよいの?
OpenSSHのローカルポートフォワーディング機能を使って、踏み台サーバを経由して、ローカルホストのポートへの通信をDBサーバのポートへと転送します。
やることとしては、次の通りです。
- ローカルホストのポートへの通信がDBサーバのポートに転送されるようなSSHトンネルを作成する
- MySQL Workbenchの接続設定で1で作成したローカルホストのポートに接続するようにする
1. ローカルのポートへの通信がDBサーバのポートに転送されるようなSSHトンネルを作成する
次のコマンドは、ローカルホストのTCP13306番ポートをDBサーバのTCP3306番ポートに転送するものです。db.example.com
がDBサーバ、bastion.example.com
が踏み台サーバのホスト名とし、DBサーバはTCP3306番でサービスを、踏み台サーバはTCP22番でSSHを待受ているものとします。
$ ssh -fNL 13306:db.example.com:3306 bastion.example.com
ローカルホストのポートは必ずしも13306番である必要はなく、使用中でない任意のポート番号を指定することができます。1023番以下のいわゆるWell Known Portを使用する場合はroot権限が必要です。
ここで使っているsshコマンドのオプションは次の通りです。
f バックグラウンドで実行
N リモート(踏み台サーバ)でコマンドを実行しない
L ローカルホストのポートを指定したホストのポートに転送する
他にもたくさんのオプションがあるので、興味がある方は$ man ssh
で調べてみてください。
2. MySQL Workbenchの接続設定で1で作成したローカルホストのポートに接続するようにする
MySQL Workbenchの接続設定で、Standard (TCP/IP)
を選んでローカルホストのポートにMySQL Workbenchを接続します。
- Connection Method:
Standard (TCP/IP)
- Hostname:
127.0.0.1
またはlocalhost
- Port: SSHトンネル時に指定したポート番号(ここでは
13306
) - Username/Password: DBサーバのアカウント
Test Connection
を押して Successfully made the MySQL connection
のメッセージが表示されれば接続成功です。
検証環境
- OS
$ sw_vers ProductName: macOS ProductVersion: 12.6.1 BuildVersion: 21G217
- OpenSSH
$ ssh -V OpenSSH_8.6p1, LibreSSL 3.3.6
- MySQL Workbench 8.0.28
株式会社SODAの開発組織がお届けするZenn Publicationです。 是非Entrance Bookもご覧ください! → recruit.soda-inc.jp/engineer
Discussion