はじめに
例えば、DMZ上にあるサーバを経由して、内部ネットワーク上にあるサーバにアクセスするWebアプリケーションを考える上で、
- リバースプロキシによるSSL-VPN通信
- リバースプロキシするHTTPS通信
は何が違うのでしょうか?
一見、リバ-スプロキシ型のSSL-VPNとは、HTTPS通信をリバースプロキシで変換しているだけのようにも感じられます。
何をもってSSL-VPNであると言えるのか。
通常のHTTPS通信はSSL-VPNといって良いのか。
まずはVPNとは何かというところから理解すると良さそうです。
VPNに必要なこと
VPNとは、Virtuial Private Networkの言葉どおり、パブリックな環境でも仮想的なプライベートネットワークが実現できるものです。
このとき、プライベートであるということは、
- ネットワーク通信が秘匿されること
- 誰でもアクセスできるものではないこと
を意味します。また、どのようなプロトコルでもVPNを使えるためには、
- 利用したいプロトコルの実装に制限されないこと
も必要になります。
まとめると、VPNに必要な要件として、
①暗号化
②認証
③カプセル化
これら3つが行われている状態でしか、プライベートネットワークにアクセスできない、という環境であればVPNと言えそうです。
では、リバースプロキシ型SSL-VPNと、リバースプロキシするHTTPS通信ではそれぞれどういう扱いでしょうか?
リバースプロキシ型SSL-VPN
①SSLによる暗号化
②パスワードや電子証明書などによるVPN装置との認証
③SSLによるカプセル化
が行われているので、確かにVPNであると言えそうです。
リバースプロキシするHTTPS通信
①SSLによる暗号化
③SSLによるカプセル化
は満たしていると言えそうです。ただし、
②認証
を伴わないため、SSL-VPNとは異なるものになります。
認証の必要性について書いている資料が少なく、
整理に苦労しましたが、やっとモヤモヤが晴れました。
疑問点
これで定義としての違いは明確になりました。ただ、実装を考える上ではまだ疑問が残ります。
ECサイトのようにユーザー認証を行うサイトなら、SSL-VPNと言えるのか?
Noです。
確かに、一見「ログイン認証を行わなければ利用できないアプリケーション」の仕様にすれば、近い扱いにはなると思います。
ただし、そのようなアプリで認証するときは、「プライベートなネットワーク上にあるDBサーバにアクセスしてユーザ認証している」ことになると思います。
これは先の、
次の3つが行われている状態でしか、プライベートネットワークにアクセスできない
を満たせていませんので、SSL-VPNではない、ということになります。
では認証のためのユーザ情報をDMZ上のWebサーバに持たせればSSL-VPNといえるのか?
これは一応Yesになりそうです。
ただしアプリで使う認証情報をDMZに置いたら危険、という別の問題が発生するので、
1.アプリ用の認証とVPNを確立するための認証は別(クライアント証明書など)にする。
2.DMZ上はリバースプロキシ専用サーバとして、Webサーバ以下は内部ネットワークに実装する。
などの工夫が必要であると考えられます。