SSHからトンネルでMySQLサーバーに接続することが複数ある場合、その切り替えや使い分けをSSH Tunnel Managerで行えず困ったので別の解決方法を執りました。
macOS10.12 Sierra でトンネル接続 という記事の中で SSH Tunnel Manager を取り上げました。
SSH Tunnel Manager はとても小気味よいアプリで、FileMakerをMySQLサーバーに接続させて運用する際に活躍してくれています。
このページ内の見出し
公開鍵の認証
それ以前に使っていた Coccinellida というもっと優れたアプリがありましたが10.11El Capitanまでしか使えません。それ以降で使える SSH Tunnel Manager は Coccinellida と違って公開鍵の指定ができません。指定はできませんがお約束通り ~/.ssh/id_rsa があれば勝手に繋げてくれます。でも明示的に ~/.ssh/id_rsa を指定することができません。これは実に残念。

id_rsa
.sshという見えないフォルダに収めるid_rsaはサーバーに接続するための認証の仕組みです。ssh 接続では多くの場合IDとパスワードによる認証ではなくて公開鍵認証を用います。鍵の名前や保存場所は基本的にどこでもいいのですが、デフォルトで ~/.ssh/ii_rsa と定まっているようですのでそれに準じるのが良いようです。
複数のサーバー
さて接続したいサーバーが一つだけならいいんですけど増えてくると困ったことになります。サーバーごとに公開鍵が異なるだからです。id_rsaを複数用意して使い分けたい。でもそれどうやんの?
id_rsaを使い回せないか
同じ id_rsa を複数サーバーで使い回せないかと思いましたができませんでした。できるんですか?私の場合はできませんでした。サーバーごとにSSHの認証鍵のペアを作る必要がありました。
複数の id_rsa
id_rsa を複数用意する必要に迫られまして、サーバーごとに例えば id_rsa_xsrv1, id_rsa_xsrv2 と名前を変えて ~/.ssh/ に置きます。
SSH Tunnel Manager はわかってくれない
SSH Tunnel Manager では公開鍵認証の在処を指定することができません。問答無用で ~/.ssh/id_rsa を利用して繋げようとします。id_rsa_xsrv1 ではだめなんです。
その都度 id_rsa を書き換えて利用するか?そんなの現実的ではありません。自動処理を作って書き換えるか?馬鹿らしいです。
config
さて config というファイルを使ってコンフィグすることができると聞き及んで「これだ」と小躍りしました。
configはsshの設定ファイルです。~/.ssh/config に収めます。
configの書き方を教えてくれる親切なブログを検索し、サーバーごとに設定やどの鍵を利用するかの指定を書き記します。
Host siteA HostName sv99999.xserver.jp port 10022 User siteAadmin IdentityFile ~/.ssh/id_rsa_siteA Host siteB HostName sv88888.xserver.jp port 10022 User siteBadmin IdentityFile ~/.ssh/id_rsa_siteB
こんなふうに見様見真似で書いて、それぞれサーバーごとに id_rsa を指定してみました。
最初の Host がタイトルみたいなもので、Host 以下次のHostまでの間に設定を書きます。ターミナルで「ssh Host」と入力するだけでその設定に基づいたコマンドを送り込んでくれるというものです。
sshの設定を施し、ターミナルで 「ssh siteA」「ssh siteB」とテストすると上手く動いてくれました。やれ上手くいったぞとまた小躍りして、今度は SSH Tunnel Manager で試します。SSH Tunnel Manager が config を読み込んでくれると期待したんです。
SSH Tunnel Manager では config が効かない
SSH Tunnel Manager では config が無視されました。configがあろうがなかろうが単に.ssh/id_rsa のパスフレーズを訊ねられるだけです。
config に書いたことなどなかった扱いでした。つまりやっぱり SSH Tunnel Manager ではひとつの公開鍵認証しか使えないということです。がっかり。
じゃあ仕方ない、ターミナルでやるか
諦めきれず半日格闘したあげくにふと基本的なことを思いつきます。
そもそも SSH Tunnel Manager を使う理由は、ターミナルでその都度ややこしいコマンドを入力するのが苦痛だったからです。
でも config というものの存在を知りました。これはもちろん id_rsa を管理するだけのものではありません。設定を保存してショートカットで繋げやすくすることができます。
ターミナルで「ssh siteA」と入力するだけで済むんだから、ちょっと不便とはいえ専用アプリを使うまでもなくターミナルで接続すればいいだけなのでは。
よく使うメインの接続だけ SSH Tunnel Manager を引き続き利用して、他のサーバーはターミナルから接続するしかないと判断しました。
config にトンネル設定を書く
config に何をどう書けばいいのか、さらに半日格闘して見つけた結果だけを以下に書きます。
その前に前提の条件は次の通りです
- 普通のレンタルサーバーです。例ではXserverです。
- レンタルサーバーでSSHを有効にして、鍵のペアを作成済み、id_rsa_個別名 とリネームして .ssh フォルダに放り込んでいます。
- そこからMySQLサーバーに接続します(トンネル接続、ポートフォワード)
必要な情報は
- SSHで接続するサーバー名
- ポート番号
- ユーザー名
- そこからトンネルで繋げるMySQLサーバー名
- 公開鍵の名前とローカルの在処
- 公開鍵作成時に設定したパスフレーズ
さて config の書き方、具体的にいきます
Host (例)d_boo … 好きな管理名。簡素に。これがコマンドにもなります。
HostName (例)sv0000.xserver.jp … sshで接続するサーバー名
port (例)10222 …ポート番号(xserverは10022)
User (例)hoxo … サーバーのユーザー名。
IdentityFile (例)~/.ssh/id_rsa_xsrvA … id_rsaのローカルの在処
LocalForward (例)2022 mysql9999.xserver.jp:3306
これは Localhost のポート番号(何でもいい)+ 目的のMySQLサーバー名 + :3306(ポート番号)ということで、最初の2022ってところは何でもいいそうです。この数字、もし後にODBC Manager でDSNを作成するならその設定時にローカルホストのポート番号として使用します。3306はよくわかりませんがトンネル使ってMySQLサーバーに接続する際のポート番号ですか。3306で繋がっているので3306にしています。
あとはオプション的な扱いです。
ServerAliveInterval (例)120 … 接続したら120秒に1度何かを送信して、接続が勝手に切れないようにします。SSHの接続は一定時間で勝手に接続切れますから防止策。
AddKeysToAgent (例)yes … AddKeysToAgent 接続する際、パスフレーズをその都度訊ねられます。パスフレーズを保存してしまいますか、はい。です。わざわざ AddKeysToAgent を書くんだからその値は大抵yesですわなあ。
UseKeychain yes … これはMacのキーチェーンにパスフレーズを保存するか、はい。です。いいえなら最初から書く必要ないし。
ということで、セキュリティ上の観点からパスフレーズを保存しない場合は AddKeysToAgent yes も UseKeychain yes も書きません。
ということで設定はこれくらいでOKでしょうか。
接続
ターミナルに「ssh Host」と入力するだけでsshトンネルでMySQLに接続できます。上記の例では「ssh d_boo」です。
その状態で ODBC Manager の DNSを設定して保存しておけば、FileMakerからも利用できますね。ODBC Manager と DNS 設定についてはFileMaker関連の別の記事をお読みください(関連記事に上手く出てくるかな)
接続の終了
接続を終了するときはターミナルに「exit」と入力してリターンします。
実は私はあまりにもアホで、接続を切る方法が全然わかりませんでした。exit が出口です。こんな基本的で当たり前なこと、誰もわざわざ教えてくれなかったんですよ😭
ということで、複数のサーバーでsshトンネルするための設定を使い分けることに成功しました。
ほんというと SSH Tunnel Manager みたいな小粋なアプリで使い分けたい。接続中のアイコンがメニューバーに出てきたりクリック一発でオンオフできますからね。やっぱそっちがいいんです。でも仕方ないのでターミナルで「ssh ○○」とだけ打って逃げ切ります。