Delegate + OpenSSL による SSL対応リバースプロキシの構築


2003年3月28日 第2版

はじめに(事の経緯とか)

某所にLinuxのサーバ機を導入し、TeamWARE Office 200X という富士通製グループウェアソフト(Linux版)を稼働させることになった。ここ数年のトレンドではあるが、グループウェアもWebブラウザからの利用が前提となってきており、このTeamWARE Officeも一つ前のバージョンからhttpでのアクセスをサポートしている。今回、某所では、このグループウェアサーバをインターネット上に公開して利用することが条件だったので、その前提としてSSLで暗号化されたセキュアな通信環境を構築する必要があった。
httpサーバとしてApacheを使用するのであれば、mod_sslなどを組み込み、OpenSSLの暗号化ライブラリを利用すればいいんだけど、TeamWARE Office の場合、自身に実装されたhttpdを使っているもんだから、こいつをSSL対応にしなきゃいけない。実は、本製品にはSSL対応オプションてのがあるんだけど、これがWindows系サーバ用しかない。そこで今回、DeleGateをフロントエンドのSSLサーバとして、TeamWARE Officeサーバのhttp通信を仲介させよう、ということになった。(下図)

SSL-Clients(Webブラウザ) --(https)-- SSLacceptor(FCL-filter) - DeleGate --(http)-- TeamWARE Office Server

上図にあるSSLacceptor とは、DeleGate用のSSL暗号化/非暗号化フィルタであり、SSLwayと呼ばれている。SSlwayは自分で開発することもできるが、今回はパッケージに同梱のプログラムを使用した。
全体の作業手順を整理すると、次のようになる。
  1. DeleGate の make と インストール
  2. SSLwayの make と DeleGateへの組み込み
  3. OpenSSLによる秘密鍵、認証書の作成とDeleGateへの組み込み
  4. DeleGateの起動
以下、上記の手順をVine Linux2.5上で検証した結果をまとめておく。

DeleGate の make と インストール

DeleGateは、多目的の汎用プロキシサーバで、Unix、Windows、OS/2 など広範なプラットフォームで稼働させることができる。DeleGateはHTTP, FTP, NNTP, POP, Telnetなどといった多様なプロトコルによる通信を中継するとともに、データのキャッシュや加工、クライアントのアクセス制御や目的サーバへのルーティングなどをサポートしている。
今回は、このDeleGateのプロトコルゲートウェイ機能やフィルタ機能を利用し、SSL対応のリバースプロキシを構築する。
まずは DeleGateをゲットしmake。DeleGateのホームページより、DeleGate の最新版(現時点で8.5.2)をゲットし展開すると、README.MAKEというファイルがあるので、これに従ってmake。
インストールは、make install といきたいところだが、何故かinstallというターゲットがMakefileにないので、src以下にあるdelegated を手作業で/usr/sbin以下にインストール。その後、必要なディレクトリを作らないといけないが、面倒なので、とりあえず "delegated -P8080" などとしてDeleGateを起動すれば、勝手に/var/spool/delegate-nobody/ というディレクトリを作ってくれるので、面倒な人はこれを利用。:-)
(DeleGateは、起動時、DGROOTパラメタで指定されたディレクトリをログやキャッシュ用の作業ディレクトリとして使用するが、ない場合は、/var/spool/delegate-${OWNER}を作成し使用する。${OWNER}のデフォルトはnobody。)
その後、以下のように、必要なディレクトリを追加しておく。
  # cd /var/spool/delegate-nobody
  # mkdir lib cache
  # chown nobody.nobody lib cache
  # chmod 750 lib cache

SSLwayの make と DeleGateへの組み込み

SSLwayは、DeleGate用のSSL暗号化/非暗号化フィルタであり、パッケージのfilters以下にソースがある。これをmakeするためには、OpenSSLが必要であるが、Vine Linuxでは、openssl、openssl-develの両パッケージ(rpm形式)が必要となる。未インストールの場合は、事前に、apt-get install されたい。
準備ができたら、以下の手順でmake & インストール。
1) OpenSSLのライブラリの場所を指定
  # cd /usr/local/src/delegate8.5.2/filters
  # vi Makefile.go
  SSLEAY=         /usr/lib

2) make &install
  # make -f Makefile.go sslway CC=gcc LDFLAGS="-L../lib -ldl"
  # cp sslway /var/spool/delegate-nobody/lib/

OpenSSLによる秘密鍵、認証書の作成とDeleGateへの組み込み

本来、セキュアなWebサーバを運用するためには、適切な認証局から署名付きの証明書を発行してもらう必要がある。認証局は、CA(Certification Authority)とも呼ばれ、証明書を発行する第三者機関であるが、今回は認証局を利用しないで、独自でCAの証明書を発行し、認証することにする。
1)ランダム情報ファイルの作成
opensslのメッセージダイジェスト機能(md5)を使って、ランダム情報ファイルを作成。
  $ cd ~
  $ openssl dgst * > rand.dat

2)秘密鍵の生成
opensslのRSAパラメータ生成機能を使って、パスフレーズ付き秘密鍵を生成。生成した秘密鍵は、/var/spool/delegate-nobody/lib/ 以下にserver-key.pem というファイル名でコピーする。
  # openssl genrsa -rand rand.dat -out ca.key -des3 1024
  Enter PEM pass phrase:XXXXXXXX
  Verifying password - Enter PEM pass phrase:XXXXXXXX

  # cp ca.key /var/spool/delegate-nobody/lib/server-key.pem
  # chmod 600 /var/spool/delegate-nobody/lib/server-key.pem

3)認証書の作成
opensslの認証要求ファイル作成機能と、x509にもとづく署名機能を使って、独自で認証した認証書を作成する。作成した認証書は、/var/spool/delegate-nobody/lib/ 以下にserver-cert.pem というファイル名でコピーする。
  # ./openssl req -new -x509 -days 365 -key ca.key -out ca.crt
    Enter PEM pass phrase:XXXXXXXX
    Country Name (2 letter code) []:JP
    State or Province Name (full name) [Some-State]:Kumamoto
    Locality Name (eg, city) []:Kumamoto
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:MQS
    Organizational Unit Name (eg, section) []:SS
    Common Name (eg, YOUR name) []:www.somewhere.myserver
    Email Address []: xxxxxxxx@xxxxxxxx.xxx

  # cp ca.crt /var/spool/delegate-nobody/lib/server-cert.pem
  # chmod 600 /var/spool/delegate-nobody/lib/server-cert.pem

4)パスフレーズの解除
  # cd /var/spool/delegate-nobody/lib/
  # cp -p server-key.pem server-key.pem.org
  # ./openssl rsa -in server-key.pem.org -out server-key.pem
  パスフレーズの入力

DeleGateの起動

以上の手順が完了したら、以下のコマンドを投入し、DeleGateを起動。
  # /usr/sbin/delegated -P443 SERVER=https FCL=sslway \
  MOUNT="/* http://localhost:81/*" RELIABLE="*" REACHABLE="localhost"

ここでは、ターゲットとなるTeamWARE Officeサーバは、DeleGateが動作するサーバと同一マシン上で動作し、81番ポートで通信する、という前提。
delegatedが起動したら、WebブラウザよりURL "https://server-name/" を指定し、正しく暗号化通信ができるか確認する。
問題がなければ、上記の起動コマンドを、/etc/rc.d/rc.local あたりに入れてあげればOK。

さいごに

GroupWare Server behind the Firewall 今回、DeleGateによるリバースプロキシをターゲットとなるサーバに同居させたが、これを別のサーバに分散させることで、サーバ負荷の分散によるレスポンス向上が期待できるのみならず、ファイアウォールを介してDMZにDelegate、イントラゾーンにターゲットサーバを配することで、ターゲットサーバの隠蔽によるセキュリティ向上も期待できる。予算的に余裕があれば検討の価値あり。

参考文献など



Copyright (c) 2000-2004 Ryoichi "Rio" MURASHIMA
[戻る] [R!o Interactive top]