2022年8月、ホームページを全面リニューアルしました! 情報を分かりやすくお伝えできるサイト作りを目指してまいります。

Stoneで作る透過型Web鯖!

DebianでStone-SSLを使ってローカルサーバを公開する。ゲートウェイサーバでラッパーしてOpenSSLで暗号化したセキュアーなアクセスの実現方法を説明する。実は、このモジュールstoneはDebianのパッケージもしくはソースしかない。さらに、あまり資料が無く文献も英文である。なんとか、理解して俺の会社で動かしているのでセットアップも含めネタ化した。

参考文献: http://www.gcd.org/sengoku/stone/Welcome.ja.html
http://www.gcd.org/sengoku/docs/NikkeiLinux00-09/stone.ja.html


俺の会社でやってるstoneでローカル鯖公開の構造を簡単な図にしてみた。


1.Stone-SSLのセットアップ

◆ apt-getでインストール

# apt-get update

OpenSSLを入れる。
# apt-get install openssl

SSLライブラリを入れる。
# apt-get install libssl-dev

Stone本体を入れる。
woodyの場合
# apt-get install stone-ssl
Sargeの場合
# apt-get install stone

これで、stoneとopensslがインストールされる。

◆ 起動スクリプトを作る

例えば、myinit.stone-sslってなファイルを作るとすると、

# vi /etc/init.d/myinit.stone-ssl

#!/bin/sh

test -f /usr/bin/stone || exit 0

# 社内マシンで公開したいhttpサーバのIPアドレス(ローカルアドレス)を指定
TGT=”192.168.0.36″

# 社外から受け付けるhttpsサーバ(ゲートウェイ)のIPアドレス(グローバルアドレス)を指定
DES=”xxx.xxx.xxx.xxx”

# コマンドpath指定
PS=”/bin/ps”
GREP=”/bin/grep”
CUT=”/usr/bin/cut”
KILL=”/usr/bin/killall”

STONE=”/usr/bin/stone”
STONE_OPT=”-l -f 2 -a /var/log/stone.log ${TGT}:http ${DES}:443/ssl”

case “$1” in
start)
echo -n “Starting stone-ssl server: stone”
${STONE} ${STONE_OPT} 2> /dev/null &
echo “.”
;;
stop)
echo -n “Stopping stone-ssl server: stone… “
${KILL} stone
;;
*)
echo “Usage: /etc/init.d/stone-ssl {start|stop}”
exit 1
;;
esac

exit 0

◆ アクセスログファイルを生成しパーミッションを変更する

# touch /var/log/stone.log
# chmod 640 /var/log/stone.log

◆ 自動起動できる様に登録する

# update-rc.d myinit.stone-ssl defaults 99

◆ マシンの再起動なくサービスを起動したい場合はここで、

# /etc/init.d/myinit.stone-ssl start


2.DER形式のセキュリティ証明書を作成する

あらかじめ Web ブラウザに(自前ででっち上げたアバウトな)認証局の証明書をインストールしておく。
OpenSSL の x509 コマンドを実行することにより, DER 形式の証明書「cacert.der」を作成し、 Webブラウザでインポートする。

# openssl x509 -outform DER -out cacert.der < /usr/lib/ssl/misc/demoCA/cacert.pem
 ↑一行で打つ

もしくは、

# openssl x509 -outform DER -out stone.der < /etc/ssl/certs/stone.pem
 ↑一行で打つ

カレントディレクトリにcacert.derが出来るのでこの証明書をクライアントのブラウザにインポートして認証とする。
アクセスは、hoge.hogehoge.com(ゲートウェイ)と言うホストにStone-SSLをセットアップしたとして、web.hogehoge.comがローカルWebサーバだとしたら、 https://hoge.hogehoge.com/index.html でweb.hogehoge.comのindex.htmlが参照できる。

注: ローカルWebサーバのhtmlのリンクは全て相対パスで記述すること。絶対パスで記述すると、SSLサーバとのラッパーが外れてしまうので注意すること。


3.Stoneをソースからインスコする

Debianのstoneバイナリの方がインストールは簡単だが、最新の機能を利用できるのはやはり最新のソースだろう。stoneの場合はその時点で最新のソースをコンパイルして使った方が良さそうだ。 また、Debian以外のLinuxでstoneを試してみたが、どうもDebianが一番セットアップしやすいようだ。stoneのバイナリパッケージが用意されてるせいも有るかも知れない。

◆ dpkgのstoneを削除する

ソースを入れるなら、すでにstoneが入れてあるなら削除しておこう。

# /etc/init.d/myinit.stone-ssl stop

# apt-get remove stone-ssl

◆ OpenSSLのインスコ

stoneをソースで入れる前に、OpenSSLをソースから入れておこう。OpenSSLバイナリがインコされているなら、この作業は必要なし。
ここ からOpenSSLのソースをゲットする。2005年10月現在では、 openssl-0.9.8a.tar.gz が最新であった。

# tar zxvf openssl-0.9.8a

# chown -R root.root openssl-0.9.8a

# cd openssl-0.9.8a

# ./config

# make

# make install

◆ ソースのゲット

ソースをゲットする前に、stoneをコンパイルするにはssl.hみたいなライブラリが必要になる。これは、dpkgのopensslをインスコしただけでは入らない。そのため、libssl-devというパッケージが必要になる。まず、それをインスコする。stoneのソースは ここ にある。執筆時点(2005年10月現在)では、stone-2.2e.tar.gz が最新であった。

# apt-get update

# apt-get install libssl-dev

# cd /usr/local/src

# wget http://www.gcd.org/sengoku/stone/stone-2.2e.tar.gz

# tar zxvf stone-2.2e.tar.gz

# cd stone-2.2e

# make linux-ssl

# cp stone /usr/bin/

# /etc/init.d/myinit.stone-ssl start

これで一応プロセス確認。

# ps axw | grep stone

2355 pts/0 S 0:00 /usr/bin/stone -X 10000 -l -f 2 -a /var/log/stone.log 192.168.0.22 http 210.196.76.148 443 ssl

これで、OK!

◆ stone-2.2eのオプションパラメータ

使用方法

stone [-C file] [-P command] [-Q options] [-d] [-p] [-n] [-u max] [-f n] [-l] [-L file] [-a file] [-i file] [-X n] [-T n] [-r] [-b n master:port backup:port] [-B host:port host1:port1… –] [-o n] [-g n] [-t dir] [-D] [-c dir] [-q SSL] [-z SSL] st [– st]…

-C はオプションおよび をコマンドラインで指定するかわりに設定ファイルから読み込みます。-P は設定ファイルを読み込む際のプリプロセッサを指定します。プリプロセッサへ与える引数は -Q で指定できます。

オプションとして -d を指定すると、デバッグレベルを増加させす。

-p を指定すると中継したデータをダンプします。-n を指定すると、ホ
スト名やサービス名の代わりに IP アドレスやサービス番号を表示しま
す。

-u オプションは同時に記憶できる UDP パケットの発信元の最大数を指定します。デフォルトは 10 です。

-f オプションは子プロセスの数を指定します。デフォルトは子プロセス無しです。

-l を指定すると、エラーメッセージ等を syslog へ出力します。

-L を指定すると、エラーメッセージ等を file へ出力します。

-a を指定すると、アクセスログを file へ出力します。-i は stone のプロセス ID を出力するファイルを指定します。

-X は中継を行なう際のバッファの大きさを指定します。デフォルトは1000 バイトです(これは結構大切なパラメータのようです)。

-T を指定すると TCP セッションのタイムアウトの秒数を変更できます。デフォルトは 600 (10 分) です。

-r を指定すると のソケットに SO_REUSEADDR を設定します。

-b は中継先 : に接続できないときのバックアップとして : を指定します。すなわち 秒ごとに: に接続可能かチェックし、もし接続不可の場合は、中継先を : へ変更します。

-B は中継先グループの指定です。中継先が : である場合、このグループの中からランダムに一つの中継先を選んで中継します。

-o と -g はそれぞれユーザ ID とグループ ID を指定します。ID は数字のみ指定可能です。

-t を指定すると、dir へ chroot します。

-D を指定すると、stone をデーモンとして起動します。

-c はコアダンプを行なうディレクトリを指定します。

-q および -z は、SSL 暗号化/復号 のオプションです。-q は、stone が SSL クライアントとして、他の SSL サーバへ接続するとき、すなわち中継先が SSL サーバの時の、SSL オプションです。-z は stone が SSL サーバとして、他の SSL クライアントからの接続を受付ける時の、SSL オプションです。


4.Stoneのログローテーション

stoneのログのローテーションはsyslogでは無いため別途ログローテーションファイルを作ってローテートさせねばならない。

# vi /etc/logrote.d/stone

/var/log/stone.log {
  rotate 10
  monthly
  compress
  copytruncate
  missingok
  postrotate
  /etc/init.d/myinit.stone-ssl stop > /dev/null
  /bin/sleep 5
  /etc/init.d/myinit.stone-ssl start > /dev/null
  endscript
}

以上

コメント