*DeleGateプロキシサーバ上のsslwayフィルタを用いたSSL-VPN実 RIGHT:川俣吉広, kaw@on.rim.or.jp~ RIGHT:2003年 12月 20日 #author("2023-03-02T11:25:56+09:00","default:kaw","kaw") 現在、VPN (Virtual Private Network) の実現方法として、 SSL-VPNという手法が脚を浴びている。 これは文字通り、ウェブブラウザに組み込まれたSSL (Secure Socket Layer)の 認証と暗号化の機能を利用することにより、簡易にVPNを構築する手法である。 SSL-VPNを実現するためには、市販されている専用のハードウェアを利用する方法も あるが、フリーソフトウェアを活用することにより、はるかに安価に同等の機能を 実現することも可能である。 本手順書では、そのような手法としてOpenSSLとDeleGateを利用した体的な 構築手順を紹介する。 ---- 目次 #contents **SIZE(10){おことわり} SIZE(10){このページで解説する容は、川俣吉広が独自に調査した結果を公開したものです。ページの記述内容は正確を期すように努めておりますが、 記述内容を実行したことにより損害が発生しても当方では責任を負いかねますので、 実際の作業については各自の責任で行って下さい。} **要なソフトウェアとその構成 今回の構築には、以下のソフトウェアが要となる。 -[[OpenSSL:http://www.openssl.org/]] ... CA (Certificate Authority - 認証局)を構築し、証明書を作成するために要。 -[[DeleGate:http://www.delegate.org/]] ... リバースプロキシを実現するために要なデーモン。付属のフィルタプログラム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部のウェブサーバに アクセスできるようにするため、ファイアウォール上に「リバースプロキシ」を 構築し、部への通信はこのプロキシを経由するようにする。 さらに、この通信が許可されたユーザと正しいプロキシサーバ間のみで行える ようにするため、 +クライアントとプロキシサーバ間の通信はHTTPSプロトコルを用い、暗号化を行う。 +更にプロキシに「サーバ証明書」、クライアント内には「クライアント証明書」を置くことにより、通信開始時に相互に認証を行い、認証が成功した時点で通信が行われるように設定する。 +前のサーバ証明書、およびクライアント証明書は独自に構築したCA(Certificate Authority - 認証局)より発行する。CAは安全に保護された場所であれば、インターネット上、LAN内を問わずどこに設置してもよい。 **構築手順 ***CAの構築と証明書の発行 OpenSSLはあらかじめインストールされていると仮定する。 勿論インストールされていない場合は、ソース、あるいはバイナリのパッケージを 手し、インストールする((OpenSSLはセキュリティ問題がかなり頻繁に報告されるソフトウェアであるため、システムにインストール済であってもバージョンが古くセキュリティ的に問題がある場合は、新規にインストールしなおすのが望ましい。))。 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 これまでの手順で、以下のファイルが生成された。 |CENTER:ファイル|CENTER:説明 |CENTER:保管場所 | |ca.key |CAの秘密鍵 |/etc/CA/private/ca.key - 開不可| |ca.csr |CAのx509証明書発行要求(CSR) |証明書発行後は不要 | |ca.crt |CAの証明書(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によるアクセス制御 **参考リンク -DeleGate --DeleGate ... http://www.delegate.org/ -SSL --OpenSSL ... http://www.openssl.org/ --OpenSSLでPKI ... http://www.yggdrasil.jp/ygg16.html ---- RIGHT:川俣吉広, kaw@on.rim.or.jp~ RIGHT:2002年 12月 20日