*DeleGateプロキシサーバ上のsslwayフィルタを用いたSSL-VPN実装 [#xfc45615]
 RIGHT:川俣吉広, kaw@on.rim.or.jp~
 RIGHT:2003年 12月 20日
 
 現在、VPN (Virtual Private Network) の実現方法として、
 SSL-VPNという手法が脚光を浴びている。
 
 これは文字通り、ウェブブラウザに組み込まれたSSL (Secure Socket Layer)の
 認証と暗号化の機能を利用することにより、簡易にVPNを構築する手法である。
 
 SSL-VPNを実現するためには、市販されている専用のハードウェアを利用する方法も
 あるが、フリーソフトウェアを活用することにより、はるかに安価に同等の機能を
 実現することも可能である。
 
 本手順書では、そのような手法としてOpenSSLとDeleGateを利用した具体的な
 構築手順を紹介する。
 ----
 目次
 #contents
 **SIZE(10){おことわり} [#ddec718a]
 SIZE(10){このページで解説する内容は、川俣吉広が独自に調査した結果を公開したものです。ページの記述内容は正確を期すように努めておりますが、 記述内容を実行したことにより損害が発生しても当方では責任を負いかねますので、 実際の作業については各自の責任で行って下さい。}
 **必要なソフトウェアとその構成 [#w9f057e7]
 今回の構築には、以下のソフトウェアが必要となる。
 -[[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内を問わずどこに設置してもよい。
 **構築手順 [#e3610b4b]
 ***CAの構築と証明書の発行 [#e1382411]
 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通信路の確立 [#jb2f663d]
 前項の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
 ***クライアント証明書のウェブブラウザへの設定 [#z3683f96]
 クライアントのブラウザに読み込ませるためのクライアント証明書を作成する。
 作成手順は、サーバ証明書と同様。
  # 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"
  # cat client.key client-ca.crt ca.crt | openssl pkcs12 -export ↓
  -out client.p12 -name "client key"
 生成されたclient.p12ファイルをFD経由などでブラウザに転送し、インポートする。
 ***セキュリティ面の再点検 [#r2850766]
 -不要なポートを閉じる
 -パケットフィルタの設定
 -DeleGateによるアクセス制御
 **参考リンク [#wb05fd19]
 -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日
Reload  New Edit Diff Attach Copy Rename  Top Index Search Recent Backups  Help  RSS