インターネット(クラウド)上のサーバー間でセキュリティを考慮して通信させたい
【シチュエーション】
インターネット(クラウド)上のサーバー間で(バックエンドNW:裏LAN を使わずに)
・ DBのレプリケーションしたい
・ バックアップサーバーへ日々、バックアップを行いたい
などなど、インターネット上に(素で)3306/TCPや873/TCPを使わない為には・・・
【方法】
Tunnelを張る。ぱっと思いつくアプリは
・ OpenVPN
・ stunnel
・ OpenSSH
【(比較的簡単な)OpenSSHを使ってトンネルを張る】
最近はSSHがデフォでインストールされているし、追加インストール無で済む。
しかし、root権限レベルの設定変更は必要だが、googleと設定方法はたくさんHitするし、
比較的、簡単に設定できると思う。
googleなら、「SSH」「ポートフォワーディング」
【設定を行うにあたり】
OpenSSHの本来の使われ方は、対象機器に(Secureに)ログインする為に利用。
ログイン後は、対象機器で色々なコマンドを(権限の範囲で)実行可能。
〇 対象機器の管理者=SSHログイン利用者
普通に対象機器のアカウント/パスワードを作成すれば良い。
リモート端末上では、MySQL TCP/IP Socket 127.0.0.1:3306 がListen状態の場合、
トンネル ローカル端末(127.0.0.1:33306)→リモート端末(127.0.0.1:3306) フォワード設定
ちょっと難しいですが、
SSH接続(通信方向: ローカル端末 -> リモート端末
トンネル通信方向: ローカル端末 -> リモート端末
トンネル通信方向で、設定が微妙に異なりますので注意が必要です。
[Windows機でTeratermなら]
① 事前設定
Teratermのメニューバー [設定] -> [SSH転送] -> [追加]
(1) ローカルのポートをチェック。「33306」を入力
(2) リッスンは未入力 (未入力だと127.0.0.1)
(3) リモート側ホスト 「127.0.0.1」を入力
(4) ポート 「3306」を入力
[OK] -> [OK] で、設定完了
② 対象機器にログインする
Teratermのメニューバー [ファイル] -> [新しい接続]
ホスト 「203.0.113.1 ポート 「22」
でSSHログインする
③ ローカル端末のTCP/IPソケット確認
コマンドプロンプトを開いて、「netstat -ant」とかで見ると、
ローカル端末で、33306/TCP ポートがListenされているはず。
④ ポートフォワード(トンネル)で接続
C:\>mysql -h 127.0.0.1 -P 33306 -u foo -p'takoika'
すると、リモート端末(172.16.20.1)で動作しているMySQLへ接続できる。
[Linux端末なら]
$ ssh -L 33306:127.0.0.1:3306 operator001@203.0.113.1
~~~~~~~~~~~~~~~
LocalPort:リモートIP:リモートポート
※ ポートフォワードするローカル端末側のIP(リッスンIP)は、127.0.0.1 としてください。
もしプライベートIPアドレス 192.168.1.1 を設定しまうと、
Bさんが、Aさんの端末を踏み台にして、172.16.20.1:3306 (MySQL)へ接続できてしまうかもしれません。
→ Windows端末だとWindowsファイアーウォール設定や、MySQLの接続許可ホスト設定など通信拒否されるかもしれませんが。
teratermのSSH転送設定 「リモートサーバーのポート(ラジオボタン)」とか、ssh の -R オプションがあるが、
トンネルの通信を逆方向(リモート端末->ローカル端末)にするものだが、滅多に使わないので忘れて良い。
=> 逆方向も出来たよな~ぐらい覚えておいて、使う必要が出来たら、改めて調べたら良いレベル。
=> 著者は、業務上で-R は使った事がない。
〇 対象機器の管理者ではない、SSHログイン利用者
結局の話、どこまで信用できる?という話になってしまいます。
① SSHのポートフォワードだけやりたい。(コマンド実行しない)
sshd_configを編集しないといけないので、設定はサーバー管理者が行う事になるだろう。
ログイン不要(/bin/bashは必要ない)なので、sshd_config に
Match User user001
AllowTCPForwarding yes
ChrootDirectory /root/dummylogin/user001
とか書いておいて、公開鍵認証するなら、
/root/dummylogin/user001/.ssh/authorized_keys
設定しておく。
利用者には、ポートフォワード利用時に、sshの "-N" オプションを付けて接続を行ってもらう。
※ ずっと張りっぱなしなら、'autossh' が便利。
万一セッションが切断されたら、autosshが再接続してくれる。
② SSHログインしたい場合
[方法1] rbashを使う。
[方法2] CHROOT環境を構築する。(sshd_config ChrootDirectoryを使う)
どちらの方法も、一長一短です。
結局のところ、どこまで「SSHログイン者を信用できるか」というレベルになります。
rbashの設定は比較的設定が簡単ですが、正しく設定しないと期待した効果が得られないかもしれません。
chroot環境を構築するのは、手間がかかります。
著者の場合は、設定に手間はかかるけど、chroot環境を作って設定しています。
手間がかかる部分(chroot環境の構築)は、自作スクリプトで簡易化しています。
自作スクリプトは、別の記事で公開予定です。