Subscribe:

2011/03/29

MYSQLをSSHトンネル経由で接続

少し前からさくらVPS以外にもサーバーを借りたのでデータベース(MYSQL)とメール(Postfix)はそっちに移した。

Wordpressは平文で流れても問題ないがウェブメールとか平文で流れるとあまりよろしくないので
SSHトンネルを掘って暗号化通信した時のメモ



まず、自動化したいのでパスワード掛かっていない鍵を作成する。
$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/centos/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):[何も入力せずにEnter]
Enter same passphrase again:[何も入力せずにEnter]
Your identification has been saved in /home/centos/.ssh/id_dsa.
Your public key has been saved in /home/centos/.ssh/id_dsa.pub.
The key fingerprint is:
12:34:56:78:90:12:34:56:78:90:12:34:56:78:90:12 centos@calltella.com
鍵の配置は改めて書かないのでこの辺りの配置部分を見る。
http://blog.calltella.com/2010/10/httpsssh.html


起動スクリプトを書く前にとりあえずテストしてみる。
$ ssh -i ~/.ssh/id_dsa -2 -N -f -L 10000:localhost:3306 hoge@hoge.com -p 22
エラーとかでなかったらたぶん成功

-i 鍵のある場所を指定
-2 SSH2で接続
-4 IPV4で接続(省略するとIPV6も開く)
-N SSHトンネルのみ使用
-f バックグラウンドで実行
-L 「自ポート:自アドレス:相手ポート 相手ユーザー@相手アドレス」形式で記述
-p 相手のSSHポートを指定(22番なら省略化)


MYSQLの接続確認
mysql -u user -p -h 127.0.0.1 --port=10000
接続できたら成功!

-u MYSQLにログインするユーザー名
-p パスワード使用
-h ログインするホスト(localhostだとログインできません。)
--port さっき設定したポート番号

※ 上記の例10000番ポートを使用してもSSHのポートを使用して外部に出ているのでファイアウォールを設定は必要なし。
SSHトンネルを停止させるにはサーバーをrebootするかPIDを調べてkillする。
ps aux|grep ssh
kill 12345
起動スクリプトの配置
vi /etc/init.d/ssh-tunnel
#!/bin/sh
#
# Startup script for the SSH-Tunnel
#
# chkconfig: 2345 55 25

SSH_PORT=22
LOCAL_PORT=10000
REMOTE_PORT=3306
DSA_KEY=~/.ssh/id_dsa
REMOTE_USER=hoge@hoge.com

ssh -i $DSA_KEY -2 -N -f -L $LOCAL_PORT:localhost:$REMOTE_PORT $REMOTE_USER -p $SSH_PORT


※ 「chkconfig: 2345 55 25」は意味もわからず使ってますw。

サービスとして登録して再起動
# chkconfig --add ssh-tunnel
# chkconfig ssh-tunnel on
# chkconfig --list ssh-tunnel
ssh-tunnel      0:off   1:off   2:on    3:on    4:on    5:on    6:off

# reboot

PHPなどのDSN接続例
mysql://MYSQLユーザー名:MYSQLパスワード@127.0.0.1:SSHトンネルポート番号/MYSQLデータベース名

0 件のコメント: