仮想マシンでアクセスサーバ

SSHポートフォワーディングを受けるアクセスサーバ(つまりSSHサーバが動いているマシン)がセキュリティ上の弱点となる。勿論、サーバを直接インターネットの回線に繋ぐようなことはせず、ブロードバンドバンドルータで特定のポート(SSHを受けるポート)をアクセスサーバに一旦転送する。(それ以外のポートは基本的に全て閉じておく)それでも、転送先のマシンとしては普段使っているマシンにするのはリスクもあるし、気分的にも悪い。古くなって使っていないマシンを使っても良いが、また、一台、電源を入れっぱなしのマシンが増えて、お金もかかるし地球環境ににもよろしくない。

こういった時に便利なのが仮想マシンである。

仮想マシンを仮想NAT空間に1台立てて、そのマシンに(勿論ホストOS経由で)ブロードバンドルータからSSHプロトコルを転送する。確率的には私以外の人間がアクセスすることは有り得ないが、万一、ハッキングされても被害を最小限に抑えることができる。(仮想マシンの中で幾つかの工夫は必要だが。例えば、Linuxであればrootにはなれないようにパスワードを潰すとか、SELinuxは勿論Enforcingにするとか、etc....)

今回ははLinuxFedora 8)をOSとする仮想マシンを作り、SSHサーバとProxy機能を実現するのに必要最小限の構成にした。従って、メモリは256MB、HDDは4GBで十分だ。

仮想アクセスサーバの設定

VMwareを使った仮想マシン環境で運用する。仮想マシンの作り方はここでは割愛する。仮想アクセスサーバは(リスクを少しでも抑えるために)BridgeネットワークではなくNATネットワーク空間につくる。(できれば、アクセスサーバ専用のNAT空間を1つ作った方がいい。)仮想アクセスサーバから見えるマシンは必要最小限つまりホストマシンだけにして、仮想アクセスサーバからホストマシンにはアクセスできないようにしておく。
次に、ホストマシン上でブロードバンドルータから転送されて来たSSHプロトコルをさらに仮想アクセスサーバに転送するように /etc/vmware/vmnet7/nat/nat.conf というファイルを設定する。(ここではNATネットワークとして「vmnet7」を使うと仮定する。)

[root@vmhost ~]# cat /etc/vmware/vmnet7/nat/nat.conf
	:
	:
# SSH
#      ssh -p 8889 root@localhost
8889 = 192.168.7.3:22
	:
	:

この例では、ブロードバンドルータからSSHプロトコルを8889でホストマシンが受けて、それをNAT空間にある仮想アクセスサーバ(192.168.7.3)の22ポートに転送するようにしている。(従って、仮想アクセスサーバのSSHデーモンは通常通り22番ポートでSSH通信を受ければ良い。)この8889というポート番号は任意である。これでVMwareのサービスを再起動すればOK。(※SSHの待受けポート番号(この例では8889)をファイヤーウォールで開放するのは忘れずに!)

ブロードバンドルータの設定

次に、ブロードバンドバンドルータの設定である。これはブロードバンドルータによって設定が異なるので説明は割愛するが、ポイントは以下の通りである。

  1. インターネットから受けるSSHのポートは標準の22は避ける。例えば上の例の8889とか、(ポートスキャンされる可能性の少ない)もっと数字の大きいポートが良いだろう。60000台とか。
  2. 外部からのSSHサーバへのアクセスはこのルータのグローバルIPアドレスになる。フィルタ機能でSSH待受けポートを開放する。できればそれ以外の管理用のポート(例えば標準のSSH 22番ポートとかTelnetとかWebコンソール用の80ポートとか)は閉じておく。(ルータによって入力パケット扱いになるのか、転送パケット扱いになるのか分からないので、どちらか該当するフィルタのみを開放する。また、ルータによっては入力/出力という概念がなく、転送フィルタしか設定できないものもあるので、ここは環境に合わせて臨機応変に。)
  3. このSSH待受けポートをホストマシンの該当ポート(上の例では8889)へ転送するように設定する。ルータによってはアドレス変換だけでなくポート番号変換もできるものがあると思うが、その場合には別のポート番号へ転送しても良いだろう。


SSHサーバの設定

仮想アクセスサーバの中でSSHサーバの設定をする。Fedora 8では標準でsshdが起動するようになっているが、今回は外部からのアクセスサーバとして使うので特にセキュリティに対しては厳重に設定する必要がある。今回は次のようにした。

  1. テキストパスワードは受け付けない。公開鍵方式による認証だけにする。
  2. SSHプロトコルはバージョン2のみ使う
  3. rootでのアクセスは受け付けない

SSH2 の設定と利用(PuTTY)」はsshdの設定とクライアント側のターミナルソフトの設定が詳しく書かれているので大変参考になる。ちなみに、私の設定した /etc/ssh/sshd_config はオリジナル(インストール時のデフォルト)と比べ数ヶ所違うだけである。

 [root@access-server ssh]# diff sshd_config sshd_config.org
 43d42
 < PermitRootLogin no
 48d46
 < RSAAuthentication no
 64d61
 < PasswordAuthentication no
 65a63
 > PasswordAuthentication yes

もともとSSHはデフォルト設定でもセキュリティが高い状態になっている。心配であればコメントを外して明示的に指定してもいい。sshdサービスを再起動してOK。("RSAAuthentication"を"no"にしているが、RSAAuthenticationはSSH Protocol version 1のみ有効なので、version 2だけを使用する場合は"no"にしておくということらしい。)「SSH サーバの設定」参照。
sshd_configの設定が終わったらsshdを再起動しておく。

[root@access-server ~]# service sshd restart
Stopping sshd:                                             [  OK  ]
Starting sshd:                                             [  OK  ]

この状態でSSH通信ができるかどうかホストOS上で確認してみる(公開鍵、秘密鍵は既に設定されているものとする)。自分自身(localhost)のSSH待受けポード番号(この例では8889)へsshする。ホストマシンの8889ポートへアクセスしようとするとVMwareのNATサービスが働き、仮想マシン(この例では192.168.7.3)の22番ポートへパケットを転送するため、結果として仮想マシンにログインできるはずである。

[root@vmhost ~]# ssh -p 8889 user@localhost -i ~/.ssh/id_rsa
The authenticity of host '[localhost]:8889 ([127.0.0.1]:8889)' can't be established.
RSA key fingerprint is 01:23:45:67:89:ab:cd:ef:01:23:45:67:89:ab:cd:ef.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:8889' (RSA) to the list of known hosts.
Enter passphrase for key '/root/.ssh/id_rsa':
Last login: Mon Mar  3 23:04:48 2008 from 192.168.0.1
[user@access-server ~]$

ちゃんとアクセスできれば、外出先の裸の無線LANアクセスポイントからもセキュアにSSHでログインできる筈である。(あとはブロードバンドルータの設定とかに間違いがなければ、だが。)