現在請け負った業務で、拠点AからXserverにあるMariaDBへデータをinsert/updateする必要があった。やり方を調べても2020年くらいの古いものしかなく、いくつか躓いたので纏めとどめておく。
PHPでSSHサーバ経由でMySQLに接続したい のだが
やりたいことの概要は、https://qiita.com/march_f/items/ae9f80b0af07dae1dfceの「秘密鍵を使ったSSHでPDO接続」や、https://teratail.com/questions/248689の「PHPでSSHサーバ経由でMySQLに接続したい。(How to connect to MySQL over SSH)」と同じである。
しかし、この通りにやると引っかかるポイントがある
- エラー「SQLSTATE[HY000] [2002] Connection refused」何が言いたいのかわからん
- XserverのSSH接続先ポート番号が22じゃない
- 秘密鍵のファイルのアクセス権で引っかかる
- 秘密鍵につけたパスフレーズの入力が自動でできない
1つずつ解説する。
エラー「SQLSTATE[HY000] [2002] Connection refused」何が言いたいのかわからん
いや、判るんだけど。コネクションできなかったって。
この場合の「わからん」は、SSH側のコネクションがダメなのか、PDO側のコネクションがダメなのか、判断することが難しい。
SSHのオプションで-fを入れると、コネクション系でエラーしてても特に何も言ってくれないので切り分けにてこずってしまった。
やはりこういう時は基本のSSHオプションだけにして切り分けするのが重要。
結論としては、この後のSSHサーバのポートが22じゃなかったので、セッションタイムアウトしていてSSHトンネルはつながっておらず、結果としtPDOは接続先がないので「Connection refused」となっていた。
XserverのSSH接続先ポート番号が22じゃない
これは、最近のほとんどのSSHがもうポート番号22を使わなくなってる。不正アクセスから少しでも逃れるため。
よくあるパターンはポート443を使ったり、ポート10022を使うパターン。Xserverは10022を使うタイプ。
もちろんVSCodeからのSSH経由サーバ接続の設定はポート番号10022にしているのに、SSHコマンドのオプションにポート番号指定を忘れていて、「接続先サーバ合ってるのにつながんねぇなぁ」と頭を抱えていた。
・・・今までの経験上、だいたい簡単なことのはずなのにうまくいかないのは、ほぼ思い込みからのミスのパターンが(私の経験では)多いので、すぐさま初心に帰るよう心掛けている。
よく知ったSSHだけど、–helpでオプション調べると、案の定「-pとは???」って気づきが得られた。
秘密鍵のファイルのアクセス権で引っかかる
ここまでやってもSSHトンネルが開通しない。SSHのエラーメッセージが読めないと解析も進まないので、sshコマンド出力を
ssh ・・・ >> log.txt 2>&1
として、ログファイルに吐かせてみると
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0777 for './key/rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "./key/rsa": bad permissions
foge@sv0000.xserver.jp: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
と、秘密鍵ファイルのアクセス権が無防備すぎるので何とかせいという怒られが発生していた。
結果的には
sudo chmod 500 -R ./key
でアクセス権を0500に設定すると、通るようになる。0777の他、0555や0550、0505などもダメ。
逆に0600とかになってるとアクセスできないので
Warning: Identity file ./key/rsay not accessible: Permission denied.
hoge@sv0000.xserver.jp: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
と別の怒られになる。
秘密鍵につけたパスフレーズの入力が自動でできない
ここまで来るとついにSSHでトンネルが接続できる。が、ログファイルには悲しいメッセージが残される
続きはまた明日。
コメント