localhost しか許可していない mysql に HeidiSQL や Workbench でつなぐ
やりたいこと
- mysql のユーザはすべて localhost のみ
- 22, 80, 443 以外のポートは閉じている
- ssh (root) は繋がる
という状況で Windows から HeidiSQL や Workbench などのビジュアルなソフトで mysql に繋ぎたい。
深淵な理由で localhost 以外の mysql ユーザを作成するのは不可。
まずやったこと
「ssh が繋がるんだからポートフォワードでリモートの 3306 を引っ張りゃよくね?」って思った。
ssh -f -N -L 13306:remote-host:3306 user@remote-host
mysql -h 127.0.0.1 -P 13306
ERROR 1045 (28000): Access denied for user 'user'@'remote-ip' (using password: NO)
フォワードされてるし、 remote-ip
は接続先 IP ですがダメでした。
まさに user@locahost
しか許可されていないためです。
※ 2016/04/20 追記
コメントで指摘を頂きました。
ssh -f -N -L 13306:localhost:3306 user@remote-host
mysql -h 127.0.0.1 -P 13306
で OK です。
私がなにか勘違いしていたみたいです。
※ 追記ここまで
次に試したこと
会社の先輩に「socat で unixドメインソケットを引っ張れば出来る」とアドバイスを貰ったので試してみました。
結論から言えば出来ました。
基本的な流れは下記です。
- socat で mysql の unixドメインソケットを適当なポートで listen (ex. 1234)
- 1234 は開いていないので ssh でポートフォワード (ex. 2345)
- 引っ張った 2345 へ mysql 接続すると リモートの mysql へローカル接続できる
まず、リモートの 1234 を引っ張りつつ ssh 接続します。
ssh -L 2345:remote-host:1234 user@remote-host
次にリモートの mysql の unixドメインソケット を 1234 で listen します。
socat TCP-LISTEN:1234,reuseaddr,fork UNIX-CLIENT:/var/lib/mysql/mysql.sock
最後にローカルに戻って 2345 へ mysql 接続します。
mysql -h 127.0.0.1 -P 2345
すると接続することが出来ます。
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 154
Server version: 5.1.73-log Source distribution
mysql> SELECT user();
+----------------+
| user() |
+----------------+
| user@localhost |
+----------------+
1 row in set (0.00 sec)
あとはこのホストに向けて HeidiSQL なり Workbench なりで接続すればビジュアルにデータベースをいじることができます。
ただ、上の手順に記述はないですが -g
オプションが必要です。
unixドメインソケットでリッスンする系のサービスで色々出来そう。
mysql しか知らないけど…。