DeleGateプロキシサーバ上のsslwayフィルタを用いたSSL-VPN実装

川俣吉広, kaw@on.rim.or.jp
2003年 12月 20日

現在、VPN (Virtual Private Network) の実現方法として、 SSL-VPNという手法が脚光を浴びている。

これは文字通り、ウェブブラウザに組み込まれたSSL (Secure Socket Layer)の 認証と暗号化の機能を利用することにより、簡易にVPNを構築する手法である。

SSL-VPNを実現するためには、市販されている専用のハードウェアを利用する方法も あるが、フリーソフトウェアを活用することにより、はるかに安価に同等の機能を 実現することも可能である。

本手順書では、そのような手法としてOpenSSLとDeleGateを利用した具体的な 構築手順を紹介する。


目次

おことわり

このページで解説する内容は、川俣吉広が独自に調査した結果を公開したものです。ページの記述内容は正確を期すように努めておりますが、 記述内容を実行したことにより損害が発生しても当方では責任を負いかねますので、 実際の作業については各自の責任で行って下さい。

必要なソフトウェアとその構成

今回の構築には、以下のソフトウェアが必要となる。

  • OpenSSL ... CA (Certificate Authority - 認証局)を構築し、証明書を作成するために必要。
  • DeleGate ... リバースプロキシを実現するために必要なデーモン。付属のフィルタプログラムsslwayも同時に構築し、SSLによる通信が可能なようにする。
    (internet)                   FireWall                       (LAN)
                                    ||
    +-------------+  HTTPS    ______||________  HTTP  +-------------+
    | Web Browser | <======>[[sslway] DeleGate]<=====>| Web Server  |
    |(client cert)|         [ (server cert)   ]       +-------------+
    +-------------+          ~~~~~~~||~~~~~~~~
     User                           ||

                  OpenSSL
                 +----+
                 | CA | -----> (client cert)
                 |    | -----> (server cert)
                 +----+
    本手法の構成概念図を上図に示す。

インターネットとLANはファイウォールで隔てられ、直接通信することはできない。

インターネット上のユーザがウェブブラウザを使用して、LAN内部のウェブサーバに アクセスできるようにするため、ファイアウォール上に「リバースプロキシ」を 構築し、内部への通信はこのプロキシを経由するようにする。

さらに、この通信が許可されたユーザと正しいプロキシサーバ間のみで行える ようにするため、

  1. クライアントとプロキシサーバ間の通信はHTTPSプロトコルを用い、暗号化を行う。
  2. 更にプロキシ内に「サーバ証明書」、クライアント内には「クライアント証明書」を置くことにより、通信開始時に相互に認証を行い、認証が成功した時点で通信が行われるように設定する。
  3. 前項のサーバ証明書、およびクライアント証明書は独自に構築したCA(Certificate Authority - 認証局)より発行する。CAは安全に保護された場所であれば、インターネット上、LAN内を問わずどこに設置してもよい。

構築手順

CAの構築と証明書の発行

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.keyCAの秘密鍵/etc/CA/private/ca.key - 公開不可
ca.csrCAのx509証明書発行要求(CSR)証明書発行後は不要
ca.crtCAの証明書(base64エンコード)配布用、オリジナルも1部保管

リバースプロキシの立ち上げとSSL通信路の確立

前項の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
  • シェル関数dgcmdを定義し、その中で起動に必須なパラメータを指定している。
  • クライアントとの間にsslwayを双方向フィルタとして挟み込む。sslwayには-Vrfyオプションを指定し、クライアント証明書を持つブラウザのみ通信を許可している。-CAfileはCA証明書のファイルを指定するオプションである。
  • MOUNTオプションによりサーバのURL変換を行う。インターネットから https://firewall.foo.bar.jp/foo/bar にアクセスすると、実際には、内部の http://internal-host/foo/bar にアクセスされる。 以上でリバースプロキシの設定は完了。起動は以下のように行う。
    /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経由などでブラウザに転送し、インポートする。

セキュリティ面の再点検

  • 不要なポートを閉じる
  • パケットフィルタの設定
  • DeleGateによるアクセス制御

参考リンク


川俣吉広, kaw@on.rim.or.jp
2002年 12月 20日


*1 OpenSSLはセキュリティ問題がかなり頻繁に報告されるソフトウェアであるため、システムにインストール済であってもバージョンが古くセキュリティ的に問題がある場合は、新規にインストールしなおすのが望ましい。
Reload  New Edit Freeze Diff Attach Copy Rename  Top Index Search Recent Backups  Help  RSS
Last-modified: 2005-11-05 (Sat) 12:07:49 (4787d)