SSHトンネルを利用して安全にphpMyAdminやコントロールパネルを開く方法に感動した
サーバーを吟味していたのですが、Amazon の LightSail を見ていてとても良いアイディアだと思ったところがあります。
それは LightSail 上の phpMyAdmin にアクセスするには、SSH でログインした状態でないとできないというもの。bitnami のパッケージを使ったサーバーはどれもこの方法を採っているようです。
これ、とても良い方法です。目から鱗です。
従来のアクセス制限はIP制限がメイン
phpMyAdmin は簡単にアクセスされないように、下のような設定をするのが巷の解説によくあります。
- ファイヤーウォールでIPアドレスを制限する
- WEBサーバーへのIPアドレス制限を行う
- WEBサーバーソフトウェアの待ち受けポートを変える
- phpMyAdmin のフォルダ名を変える
- ベーシック認証のパスワードを掛ける
このリストでは上にある方がセキュアです。つまり上の中で一番セキュアなのはファイヤーウォールでIPアドレス制限を掛ける方法。
でも自分のIPアドレスだけを許可する場合、IPアドレスが変わってしまった時にはファイヤーウォールの設定を変えてから phpMyAdmin などにアクセスする必要があり、面倒です。
そこで、私はIPアドレスの制限の範囲を広げて、待ち受けポートも変えるという二重の対応を取っていました。
ですがこれで本当に安全かというとそうではありません。
「他の人はアクセスしないでね!」と祈りを込めて使っていました。
スーパーハカー様の存在を考えると制限はできるだけ厳しくしなければなりません。
そこに登場したのが Amazon LightSail の方法。SSHで接続しているときだけアクセスできる、というシステム。
素晴らしい。ちなみに Google Cloud Platform も bitnami のインスタンスがあり、この方法を採っているらしいです。
日本ではこの方法が紹介されている記事には出会えませんでした。こんなに良い方法があるなんて。早速取り入れましょう。
SSHトンネルでアクセスすればOK
SSHで接続しているときだけアクセスできるという状況を作り出すためには「SSHトンネル( SSHトンネリング / SSHフォワーディング)」を使います。
実際にSSHトンネルを使って phpMyAdmin やコントロールパネルへアクセスするのを試してみたところ、本当に簡単でした。
感動したので他の人にも是非お勧めしたい。簡単ですぐにできます。
数分もかかりません。この記事を書く方が遥かに時間が掛かっています。
流れとしては
- SSHでログイン
- SSHクライアントでポート転送(トンネル)の設定をする(最初だけ。設定は保存)
- ローカルポートにアクセスする
- テストとして、SSHからログアウトした状態でアクセスしてみる。アクセスできなければ成功
- (アクセスのためにファイヤーウォールに穴を開けているなら閉じる)
SSHでログインはこの記事を読んでいる人はもうできる状態でしょう。
作業としてはSSHクライアントでローカルポート転送の設定をするだけです。SSHトンネルを利用して別サーバーへ踏み台アクセスをするわけではないので、サーバー側で何か設定をする必要はありません。
SSHのGUIソフトウェアを使っていない人もいるかもしれません。その場合は "ssh -L" のコマンドを使います。"-L" はローカルのポートへのアクセスをリモートへ転送するオプションです。
ssh -L LocalPort:RemoteAddress:RemotePort
私は TeraTerm を使っていますので、設定を開いてポート番号を入力するだけでOKでした。簡単です。
SSHクライアントでポート転送設定
TeraTerm では「設定 > SSH転送 (SSH Forwarding)」を開きます。putty では「SSH > tunnel」に同じ設定があります。
「リッスン」は空白で構いません。空白だと "localhost" が使われます(TeraTerm オンラインマニュアル)。
「リモート側ホスト」も空白でOK。
上のスクリーンショットではローカルポートの 8090 を SSH でログインした先のサーバーの 8090 に転送する設定です。
ローカルポートは 80 などでも構いませんが、他のソフトウェアと競合しやすいのでよく使われるポートとは違う番号が良いかもしれません。
ローカルポートが 80 ならブラウザでアクセスするときにポート番号の明示が要らないから楽だろうと思い設定し、Chrome で "localhost" と入力してアクセスを試してみたら、Chrome によってアクセスが弾かれました。
この場合「localhost:80」としたらアクセスできました。ブラウザーによって動作が違いそうですが、結局ポート番号の明示が必要なら使われそうもないものを選んだ方が良いでしょう。
まぁ試してみてダメだったら変えれば良いだけです。好きなポート番号をどうぞ。
設定画面を閉じると設定が反映されているはずです。
ブラウザーでアクセスしてみる
私の場合はWEBサーバーへのポート転送なので、ブラウザーでアクセスできるか試してみます。データベースならデータベースのソフトウェアでテストしてみましょう。
では、SSHにログインしたままの状態で、ブラウザーでローカルポートへアクセスしてみます。
私の場合は URL に "localhost:8090" と入力して Enter です。
こんな感じに、自分で設定したページが表示されればここまでは成功。
SSHへの接続を切ってからもう一度アクセス
SSHでログインしている時だけアクセスできるという方法なので、次はSSHからログアウトして試してみましょう。
SSHクライアントを終了させて、ブラウザーで先ほどと同じローカルポートへアクセス。
アクセスできなければ成功です。
これまでファイヤーウォールに穴を開けてWEBサーバーにアクセスしていた場合、穴を閉じてアクセスしてみましょう。
うまくいったら設定を保存しておきましょう。
この方法は凄く良い
自分のIPアドレスでアクセスを制限という方法は、自分のIPアドレスを使われる状態ならアクセスできてしまいます。家族とかですね。自分の家の Wi-Fi を使われてもこの制限が意味が無くなります。
他にはIPアドレスの切り替わりで、自分のIPアドレスを他の人が使っている場合もアクセスできます。そういう狙い撃ちした状況もなかなか無いとは思いますが。
SSHならかなりセキュアです。認証鍵が強固なので、他の人に使われると困るものはこの方法が適しています。
私の場合はWEBサーバーを介して使うアプリケーション、例えば phpMyAdmin やコントロールパネルが困りものでした。WEB上で公開しなければ使えないのですが、WEBという時点でもう怖い。
コントロールパネルなんて他の人に使われたらどうなるか分かりません。しかも私が不正アクセスに気付けない可能性が大です。
今回のようにSSHを介してなら他の人は認証鍵を何とかしない限りアクセスできません(有能なクラッカーが脆弱性を見つけてどうのこうのは除いて)。
とても良い方法ですね。SSHのアクセスは自宅以外からの接続でもセキュアな方法ですから、ファイヤーウォールのIPアドレスの制限の範囲を広げられます。
外部へ公開しないサーバーならWEBサーバーはファイヤーウォールに穴を開けておく必要がなく、とても安心です。
外部のデータベースへの接続とかも SSH を介して利用するのが良さそうです。