現在、VPN (Virtual Private Network) の実現方法として、 SSL-VPNという手法が脚光を浴びている。
これは文字通り、ウェブブラウザに組み込まれたSSL (Secure Socket Layer)の 認証と暗号化の機能を利用することにより、簡易にVPNを構築する手法である。
SSL-VPNを実現するためには、市販されている専用のハードウェアを利用する方法も あるが、フリーソフトウェアを活用することにより、はるかに安価に同等の機能を 実現することも可能である。
本手順書では、そのような手法としてOpenSSLとDeleGateを利用した具体的な 構築手順を紹介する。
目次
このページで解説する内容は、川俣吉広が独自に調査した結果を公開したものです。ページの記述内容は正確を期すように努めておりますが、 記述内容を実行したことにより損害が発生しても当方では責任を負いかねますので、 実際の作業については各自の責任で行って下さい。
今回の構築には、以下のソフトウェアが必要となる。
(internet) FireWall (LAN) || +-------------+ HTTPS ______||________ HTTP +-------------+ | Web Browser | <======>[[sslway] DeleGate]<=====>| Web Server | |(client cert)| [ (server cert) ] +-------------+ +-------------+ ~~~~~~~||~~~~~~~~ User ||
OpenSSL +----+ | CA | -----> (client cert) | | -----> (server cert) +----+本手法の構成概念図を上図に示す。
インターネットとLANはファイウォールで隔てられ、直接通信することはできない。
インターネット上のユーザがウェブブラウザを使用して、LAN内部のウェブサーバに アクセスできるようにするため、ファイアウォール上に「リバースプロキシ」を 構築し、内部への通信はこのプロキシを経由するようにする。
さらに、この通信が許可されたユーザと正しいプロキシサーバ間のみで行える ようにするため、
OpenSSLはあらかじめインストールされていると仮定する。 勿論インストールされていない場合は、ソース、あるいはバイナリのパッケージを 入手し、インストールする*1。
OpenSSLの設定ファイル(openssl.cnf)を設定する。
openssl.cnfの設定例 → http://www.yggdrasil.jp/ygg16_1.html
CA構築に必要なディレクトリを作成する。
# mkdir -p /etc/CA /etc/CA/certs /etc/CA/crl /etc/CA/newcerts # touch /etc/CA/index.txt # echo "01" > /etc/CA/serial # mkdir /etc/CA/private # chmod 700 /etc/CA/private
上記のディレクトリ作成パスは一例である。
CAの秘密鍵を作成する。
# cd /etc/CA # openssl genrsa -rand /var/log/maillog -out ca.key 1024
オプション-randで指定するファイルはランダムなエントロピの発生源であれば何でもよい。
CA秘密鍵からCSR(CA証明書発行要求)を生成する。
# openssl req -new -key ca.key -out ca.csr
この後、発行に必要な事項の入力を求められるので、適宜入力する。
次に、CSRを元にCA証明書への自己署名と発行を行う。
# openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt
これまでの手順で、以下のファイルが生成された。
ファイル | 説明 | 保管場所 |
ca.key | CAの秘密鍵 | /etc/CA/private/ca.key - 公開不可 |
ca.csr | CAのx509証明書発行要求(CSR) | 証明書発行後は不要 |
ca.crt | CAの証明書(base64エンコード) | 配布用、オリジナルも1部保管 |
前項のCA構築の手順と同様、サーバの秘密鍵を生成する。
# openssl genrsa -out server.key 1024
サーバ証明書発行要求(CSR)を生成する。
# openssl req -new -key server.key -out server.csr
この後、必要事項の入力を要求されるので、入力する。
前述のCSRを元に、サーバ証明書の発行とCAによる署名を行う。
# openssl ca -out server-ca.crt -infiles server.csr
サーバ秘密鍵server.keyとサーバ証明書server.crtが認証つきSSL通信のために 必要となる。
次に、リバースプロキシを実現するプログラムDeleGateを作成・インストールする(勿論インストール済の場合はこの項は飛ばしてよい)。
# tar xvzf delegateX.Y.Z.tar.gz ... (X.Y.ZはDeleGateのバージョン番号) # cd delegateX.Y.Z # CFLAGS=-O2 ADMIN=admuser@foo.bar.jp make # install -m 0755 -s src/delegated /usr/local/sbin
DeleGateを実行する専用のユーザdelegate, グループdelegateを作成する。
# addgroup delegate ... (OSに依存する) # adduser delegate ... (OSに依存する)
DeleGateが動作するための一時ファイルやログなどが置かれる各種ディレクトリの起点となるパス(DGROOT)を作成する。以下では、DGROOTを/var/spool/delegateとする。
# mkdir /var/spool/delegate # chown delegate /var/spool/delegate # chgrp delegate /var/spool/delegate # chmod 0750 /var/spool/delegate
sslwayを作成し、インストールする。
# cd delegateX.Y.Z/filters # make sslway # make /var/spool/delegate/lib # install -m 0755 -s sslway /var/spool/delegate/lib
sslwayの読み込み位置にCA証明書、サーバ秘密鍵、サーバ証明書を設置する。
# cd /etc/ca # cp ca.crt /var/spool/delegate/lib/ca-cert.pem # cp server.key /var/spool/delegate/lib/server-key.pem # cp server.crt /var/spool/delegate/lib/server-cert.pem
DeleGateは、設定ファイルを持たず、動作指定は起動時にコマンドラインから指定する。そのため、決まった動作をさせるためにはシェルスクリプトでラッパーを作成するのが一般的。 以下にラッパーの例を示す。
#!/bin/sh # rc.delegate --- rc file for DeleGate proxy server function dgcmd { /usr/local/sbin/delegated \ DGROOT=/var/spool/delegate \ OWNER=delegate/delegate \ "$@" } case X"$1" in Xstart) dgcmd \ -P443 \ SERVER=https MOUNT="/* http://internal-host/*" \ FCL='sslway -Vrfy -CAfile ca-cert.pem' ;; Xstop) dgcmd -Fkill ;; *) echo "$0 start|stop" >&2 ;; esac
/usr/local/sbin/rc.delegate start
クライアントのブラウザに読み込ませるためのクライアント証明書を作成する。 作成手順は、サーバ証明書と同様。
# openssl genrsa -out client.key 1024 # openssl req -new -key client.key -out client.csr # openssl ca -out client-ca.crt -infiles client.csr
次に、今の手順で作成したクライアントの秘密鍵とクライアント証明書、そしてCAの構築時に作成したCAの証明書を結合し、ウェブブラウザで読込み可能なPKCS12形式に変換する。
# cat client.key client-ca.crt ca.crt | openssl pkcs12 -export ↓ -out client.p12 -name "client key"
生成されたclient.p12ファイルをFD経由などでブラウザに転送し、インポートする。