ローカルのphpMyAdminから、SSHトンネル経由で外部サーバーのMySQLデータベースに接続する方法

2017年01月02日

外部(本番)サーバにはphpMyAdminをインストールしたくない!でも、本番環境データベースへの外部からの接続は許可したくない…そんな時に便利なデータベースへの接続方法です!

前提条件

すでに下記の準備設定が整っていることを前提にこの記事を書いています。

  • ・外部サーバ上でMySQLが問題なく動いている
  • ・外部サーバへローカルからSSH接続できている
  • ・ローカル環境上で、phpMyAdminが問題なく動いている

SSHのポートフォワーディング設定

今回はSSHのポートフォワーディングという機能を使用して、外部サーバのMySQLデータベースに接続します。

下記のコマンドをローカルのTerminalで実行します。

[bash]
ssh -i ~/.ssh/id_rsa sampleUser@SampleHost.com -p 7777 -N -f -L 12345:localhost:3306
[/bash]

自分のサーバ環境に合わせて、オプション部分を書き換えます。

sshSSH接続するためのコマンド
-isshの鍵のパスを指定するオプション
sampleUserSSH接続先のユーザ名(MySQLユーザ名ではなく、SSH接続のユーザ名)
SampleHost.com接続先のホスト名
-pSSH接続時のポートを指定するオプション
7777SSH接続時のポート番号。デフォルトは22ですが、セキュリティ向上のために変更している場合はその番号を指定
-NSSHトンネルのみに使用することを指定するオプション
-fバックグラウンドで実行することを指定するオプション
-Lポートを指定するためのオプション
12345ローカルで外部MySQLサーバ接続のために使用したいポート番号を入れます。他のプロセスと被らない番号であればなんでも。
3306外部サーバ側のMySQLポート番号を指定します。

他にも色々なオプションがあります

実行すると、SSH鍵のパスフレーズの入力を求められます。
パスフレーズを入力すると、ポートフォワーディングが開始されます。

ポートフォワーディングできているか確認する

下記のコマンドをTerminalで打ち、無事に接続できるか確かめます。

[bash]
mysql -u userName -p -h 127.0.0.1 -P 12345
[/bash]

userNameはMySQLのユーザ名、12345は先ほどのコマンドで指定したローカル用のポート番号を指定します。
MySQLのパスワード入力を求められますので、入力します。
ログインできれば、接続が成功しています!

phpMyAdminに外部サーバの設定を追加する

phpMyAdminのconfig.inc.phpに、外部サーバへの接続設定を追加します。
標準的な状態であれば、Servers configurationの下に「First server」という設定が既に存在しています。
その下に、今回接続したいサーバの設定を追加します。

[php]
/**
* Servers configuration
*/
$i = 0;

/**
* First server
*/
$i++;
/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'cookie';
/* Server parameters */
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['compress'] = false;
$cfg['Servers'][$i]['AllowNoPassword'] = false;

/**
* HOGE SERVER
*/
$i++;
/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'cookie';
/* Server parameters */
$cfg['Servers'][$i]['verbose'] = 'HOGE VPS';
$cfg['Servers'][$i]['host'] = '127.0.0.1';
$cfg['Servers'][$i]['port'] = '12345';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['compress'] = false;
$cfg['Servers'][$i]['AllowNoPassword'] = false;
[/php]

外部サーバの仕様に応じて適当に設定を変更します。
hostには「127.0.0.1」、portにはSSHコマンドで指定したローカル用のポート番号を指定します。
verboseに適当なサーバ名を指定しておくと、後でログインする時に分かりやすくなります。

ブラウザからログインする

ローカル環境のphpMyAdminにアクセスすると、Server Choiceから、先ほど指定した外部サーバが選べるようになっているはずです。
ローカルのphpMyAdminから、SSHトンネル経由で外部サーバーのMySQLデータベースに接続

MySQLのユーザ名とパスワードを入力の上、ログインできたら、設置成功です!
これでローカル環境のphpMyAdminから、外部サーバのMySQLにSSHで接続できるようになりました。

ポートフォワーディングを終了する時

「ps aux|grep ssh」コマンドをTerminalで入力してプロセスのIDを確認し、「kill [プロセスのID]」で終了します。

例:
[bash wraplines="false"]
$ ps aux|grep ssh
hoge 1530 0.0 0.0 2432804 804 s000 S+ 12:59PM 0:00.00 grep ssh
hoge 721 0.0 0.0 2480068 1004 ?? Ss 12:17PM 0:00.02 ssh -i /Users/hoge/.ssh/id_rsa sampleUser@SampleHost.com -p 7777 -g -N -f -L 12345:localhost:3306
hoge 720 0.0 0.0 2445964 2224 ?? S 12:17PM 0:00.02 /usr/bin/ssh-agent -l

$ kill 721

$ ps aux|grep ssh
hoge 720 0.0 0.0 2445964 2224 ?? S 12:17PM 0:00.02 /usr/bin/ssh-agent -l
hoge 1533 0.0 0.0 2432804 804 s000 S+ 1:00PM 0:00.00 grep ssh
[/bash]