Kozupon.com    
 
 HAVP HTTP AntiVirus Proxy でセキュアーなProxyServerを作る!


HAVPの オフィシャルサイト
HAVPは、AntiVirus付きProxyServerとでも言おうか。ClamAVなどのAntiVirusをプラグインさせてセキュアーProxyServerを作るソフトである。串を刺している環境ではProxyServerがAntiVirusゲートウェイになると言う訳だ。ウィルスソフトもゲートウェイ型になっていた方がウィルスブロックも効果的に出来ると思う。今回は、VirusScannerはClamAVを使用して、HAVPのProxyServer機能を使わず、既に動いているProxyServer( squid )と連携する方法を紹介する。


1.インストールの準備
havpをインストールする前に、ClamAVを入れる。
1)DebianGNULinux 3.1Sargeの場合
jerry: /# apt-get install clamav clamav-daemon libclamav-dev

2)その他ソースからインストールする場合
ここ を参照。

havpのインストールでClamAVのライブラリを必要とするため、インストール後動かしておく。


2.havpのインストール
1)ソースのゲット
執筆時点 2006年6月現在 havp-0.80.tar.gz が最新であった。
jerry:/usr/local/src# wget http://www.server-side.de/download/havp-0.80.tar.gz

2)ソースの展開
jerry:/usr/local/src# tar zxvf havp-0.80.tar.gz
jerry:/usr/local/src# cd havp-0.80

3)ユーザ・グループの作成
jerry:/usr/local/src/havp-0.80# groupadd havp
jerry:/usr/local/src/havp-0.80# useradd -g havp -s /bin/false -c "HAVP - HTTP AntiVirus Proxy" havp

4)havpに必要なディレクトリの作成とオーナー設定
jerry:/usr/local/src/havp-0.80# mkdir /var/tmp/havp
jerry:/usr/local/src/havp-0.80# mkdir /var/log/havp
jerry:/usr/local/src/havp-0.80# mkdir /var/run/havp
jerry:/usr/local/src/havp-0.80# chown havp /var/tmp/havp
jerry:/usr/local/src/havp-0.80# chown havp /var/log/havp
jerry:/usr/local/src/havp-0.80# chown havp /var/run/havp

5)コンパイル&リンク
以下のように、./configureでClamAVのライブラリパスを自動認識した場合には、※1のようにenabled!が表示される。
もし、自動認識に失敗するようで有れば --with-scanner=libclamav オプションを付けてやってみること。
jerry:/usr/local/src/havp-0.80# ./configure 又は ./configure --with-scanner=libclamav
configure: loading cache /dev/null
./configure: line 1: ./configure:: No such file or directory
checking for g++... g++
checking for C++ compiler default output file name... a.out
checking whether the C++ compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
checking Include debugging?... no
*** ClamAV library found, support enabled! ←※1

NOTICE: /etc/iscan/libvsapi.so not found, Trend Micro support disabled!

configure: creating ./config.status
config.status: creating Makefile
config.status: creating havp/Makefile
config.status: creating havp/default.h
config.status: creating config.h
config.status: config.h is unchanged
configure: creating ./config.status
config.status: creating Makefile
config.status: creating havp/Makefile
config.status: creating havp/default.h
config.status: creating config.h
config.status: config.h is unchanged

Good - your configure finished. Start make now

jerry:/usr/local/src/havp-0.80# make
cd havp && make
make[1]: Entering directory `/usr/local/src/havp-0.80/havp'
g++ -O2 -I/usr/include -g -O2 -Wall -DUSECLAMLIB -c -o helper.o helper.cpp
g++ -O2 -I/usr/include -g -O2 -Wall -DUSECLAMLIB -c -o logfile.o logfile.cpp
g++ -O2 -I/usr/include -g -O2 -Wall -DUSECLAMLIB -c -o scannerhandler.o scannerhandler.cpp
g++ -O2 -I/usr/include -g -O2 -Wall -DUSECLAMLIB -c -o connectiontobrowser.o connectiontobrowser.cpp
g++ -O2 -I/usr/include -g -O2 -Wall -DUSECLAMLIB -c -o genericscanner.o genericscanner.cpp
g++ -O2 -I/usr/include -g -O2 -Wall -DUSECLAMLIB -c -o httphandler.o httphandler.cpp
g++ -O2 -I/usr/include -g -O2 -Wall -DUSECLAMLIB -c -o params.o params.cpp
g++ -O2 -I/usr/include -g -O2 -Wall -DUSECLAMLIB -c -o sockethandler.o sockethandler.cpp
g++ -O2 -I/usr/include -g -O2 -Wall -DUSECLAMLIB -c -o connectiontohttp.o connectiontohttp.cpp
g++ -O2 -I/usr/include -g -O2 -Wall -DUSECLAMLIB -c -o havp.o havp.cpp
g++ -O2 -I/usr/include -g -O2 -Wall -DUSECLAMLIB -c -o proxyhandler.o proxyhandler.cpp
g++ -O2 -I/usr/include -g -O2 -Wall -DUSECLAMLIB -c -o utils.o utils.cpp
g++ -O2 -I/usr/include -g -O2 -Wall -DUSECLAMLIB -c -o whitelist.o whitelist.cpp
g++ -O2 -I/usr/include -g -O2 -Wall -DUSECLAMLIB -c -o scanners/avgscanner.o scanners/avgscanner.cpp
g++ -O2 -I/usr/include -g -O2 -Wall -DUSECLAMLIB -c -o scanners/f-protscanner.o scanners/f-protscanner.cpp
g++ -O2 -I/usr/include -g -O2 -Wall -DUSECLAMLIB -c -o scanners/kasperskyscanner.o scanners/kasperskyscanner.cpp
g++ -O2 -I/usr/include -g -O2 -Wall -DUSECLAMLIB -c -o scanners/nod32scanner.o scanners/nod32scanner.cpp
g++ -O2 -I/usr/include -g -O2 -Wall -DUSECLAMLIB -c -o scanners/clamdscanner.o scanners/clamdscanner.cpp
g++ -O2 -I/usr/include -g -O2 -Wall -DUSECLAMLIB -c -o scanners/sophiescanner.o scanners/sophiescanner.cpp
g++ -O2 -I/usr/include -g -O2 -Wall -DUSECLAMLIB -c -o scanners/avastscanner.o scanners/avastscanner.cpp
g++ -O2 -I/usr/include -g -O2 -Wall -DUSECLAMLIB -c -o scanners/clamlibscanner.o scanners/clamlibscanner.cpp
g++ -O2 -I/usr/include -g -O2 -Wall -o havp helper.o logfile.o scannerhandler.o connectiontobrowser.o genericscanner.o httphandler.o params.o sockethandler.o connectiontohttp.o havp.o proxyhandler.o utils.o whitelist.o scanners/avgscanner.o scanners/f-protscanner.o scanners/kasperskyscanner.o scanners/nod32scanner.o scanners/clamdscanner.o scanners/sophiescanner.o scanners/avastscanner.o scanners/clamlibscanner.o -L/usr/lib -lz -lbz2 -lgmp -L/usr/lib -lcurl -lidn -lssl -lcrypto -ldl -lssl -lcrypto -ldl -lz -lpthread -lclamav
make[1]: Leaving directory `/usr/local/src/havp-0.80/havp'

jerry:/usr/local/src/havp-0.80# make install
cd havp && make install
make[1]: Entering directory `/usr/local/src/havp-0.80/havp'
../install-sh -d /usr/local//sbin
../install-sh -s -m 755 havp /usr/local//sbin/havp
../install-sh -d -m 755 /var/log/havp/
../install-sh -d -m 755 /var/tmp/havp/
../install-sh -d -m 755 /var/run/havp/
../install-sh -d /etc/init.d
../install-sh -m 755 ../etc/init.d/havp /etc/init.d/
../install-sh -m 644 ../etc/havp/havp.config /usr/local//etc/havp/havp.config.default
cp -r ../etc/havp/templates /usr/local//etc/havp
chmod -R a+rX /usr/local//etc/havp/templates

Remember to give correct permissions:
chown <havpuser> /var/tmp/havp (after mounting if needed)
chown <havpuser> /var/log/havp
chown <havpuser> /var/run/havp

make[1]: Leaving directory `/usr/local/src/havp-0.80/havp'

起動スクリプトをコピー。
jerry:/usr/local/src/havp-0.80# cp etc/init.d/havp /etc/init.d/

6)havp.confの設定
havp.confの設定を行うが、俺の場合、既にProxyServerとしてsquidが動いているので、squidとhavpの連携をさせる設定として説明するので了解願いたい。

Client ←→ HAVP ←→ SQUID ←→ Internet

簡単だが、このような感じの絵になるだろうか。

正常にインストールが終われば、/usr/local/etc/havp/havp.confが出来るのでエディットする。
jerry:~# vi /usr/local/etc/havp/havp.config

# You must remove this line for HAVP to start.
# This makes sure you have (hopefully) reviewed the configuration. :)
# Hint: You must enable some scanner! Find them in the end..
# これは、havpのコンフィグレーションロックなので、コメントする。
#REMOVETHISLINE deleteme

# ユーザとグループを設定する。
# Default:
USER havp
GROUP havp

# デーモンモードで起動。
# Default:
DAEMON true

# Default:
DISPLAYINITIALMESSAGES true

# pidファイルパス指定
# Default:
PIDFILE /var/run/havp/havp.pid

# Default:
SERVERNUMBER 8

# childプロセスのMAX数
# Default:
MAXSERVERS 100

# Accessログパス指定
# Default:
ACCESSLOG /var/log/havp/access.log

# Default:
LOG_OKS true

# エラーログパス指定
# Default:
ERRORLOG /var/log/havp/havp.log

# ログのファシリティレベル
# Default:
LOGLEVEL 0

# Default:
SCANTEMPFILE /var/tmp/havp/havp-XXXXXX

# Default:
TEMPDIR /var/tmp

# Default:
DBRELOAD 60

# 透過Proxyを作るか否か
# Default:
TRANSPARENT false
#TRANSPARENT true

# 既に動いているProxyServer(Squid等)のホスト名 OR IPアドレス&ポート番号
# Default: NONE
PARENTPROXY localhost
PARENTPORT 8080

# IPアドレスのフォワードの有無
# Default:
FORWARDED_IP false
#FORWARDED_IP true

# havpのLISTENポート
# Default:
PORT 3128

# Default:
FAILSCANERROR true

# Default:
SCANNERTIMEOUT 10

# Default:
RANGE false

#####
##### ClamAV Library Scanner (libclamav)
#####

# ClamAVライブラリを使う。
#ENABLECLAMLIB false
ENABLECLAMLIB true

# ClamAVのディレクトリ指定
CLAMDBDIR /var/lib/clamav

# clamdデーモンは使わない
ENABLECLAMD false

# clamdソケットパス指定
CLAMDSOCKET /tmp/clamd

以上の濃い青文字の如く編集すれば良い。


3.起動
1)起動する前に、fstabのmountオプションにmandパラメータを追加する
jerry:/usr/local/src/havp-0.80# vi /etc/fstab

ABEL=/ / ext3 defaults,mand 1 1
LABEL=/boot /boot ext3 defaults 1 2
LABEL=/usr/addhdd /usr/addhdd ext3 defaults 1 2
none /dev/pts devpts gid=5,mode=620 0 0
none /proc proc defaults 0 0
none /dev/shm tmpfs defaults 0 0
/dev/hda2 swap swap defaults 0 0
/dev/cdrom /mnt/cdrom udf,iso9660 noauto,owner,kudzu,ro 0 0
/dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0

以上の濃い青文字の如く編集する。

設定を反映するために、システムを再起動する。
jerry:/usr/local/src/havp-0.80# reboot

2)clamavの起動
clamavは、freshclamデーモンのみ常駐させて、clamavデーモンは起動しない。clamavライブラリのみhavpで使ってるので起動する必要はない。

3)squidをstopする
jerry:~# /etc/init.d/squid stop

4)起動スクリプトで起動
jerry:~# /etc/init.d/havp start

5)squidをstartする
jerry:~# /etc/init.d/squid start

6)番外: 単独で走らせる場合
jerry:~# /usr/local/sbin/havp -c < path to config >


4.プロセスの確認及びLISTEN状態
1)プロセス確認

jerry:~# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 13:26 ? 00:00:01 init [2]
root 2 1 0 13:26 ? 00:00:00 [ksoftirqd/0]
root 3 1 0 13:26 ? 00:00:03 [events/0]
root 4 3 0 13:26 ? 00:00:00 [khelper]
root 18 3 0 13:26 ? 00:00:00 [kblockd/0]
root 34 3 0 13:26 ? 00:00:00 [pdflush]
root 35 3 0 13:26 ? 00:00:00 [pdflush]
root 37 3 0 13:26 ? 00:00:00 [aio/0]
root 36 1 0 13:26 ? 00:00:05 [kswapd0]
root 179 1 0 13:26 ? 00:00:00 [kseriod]
root 283 1 0 13:27 ? 00:00:02 [kjournald]
root 753 1 0 13:28 ? 00:00:00 [khubd]
root 1273 1 0 13:28 ? 00:00:00 /sbin/syslogd
root 1276 1 0 13:28 ? 00:00:03 /sbin/klogd
clamav 1327 1 0 13:29 ? 00:00:00 /usr/bin/freshclam -d --quiet -p /var/run/clamav/fre
ntop 1340 1 0 13:29 ? 00:00:30 /usr/sbin/ntop -d -L -u ntop -P /var/lib/ntop --skip
root 1436 1 0 13:29 ? 00:00:00 /usr/lib/postfix/master
postfix 1443 1436 0 13:29 ? 00:00:00 qmgr -l -t fifo -u -c
root 1471 1 0 13:29 ? 00:00:00 /usr/sbin/cron
root 1477 1 0 13:29 tty1 00:00:01 -bash
root 1478 1 0 13:29 tty2 00:00:00 /sbin/getty 38400 tty2
root 1479 1 0 13:29 tty3 00:00:00 /sbin/getty 38400 tty3
postfix 2140 1436 0 15:09 ? 00:00:00 pickup -l -t fifo -u -c
havp 2148 1 0 15:13 ? 00:00:00 /usr/local/sbin/havp -c /usr/local/etc/havp/havp.conf
havp 2149 2148 0 15:13 ? 00:00:00 /usr/local/sbin/havp -c /usr/local/etc/havp/havp.conf
havp 2150 2149 0 15:13 ? 00:00:00 /usr/local/sbin/havp -c /usr/local/etc/havp/havp.conf
havp 2151 2148 0 15:13 ? 00:00:00 /usr/local/sbin/havp -c /usr/local/etc/havp/havp.conf
havp 2152 2151 0 15:13 ? 00:00:00 /usr/local/sbin/havp -c /usr/local/etc/havp/havp.conf
havp 2153 2148 0 15:13 ? 00:00:00 /usr/local/sbin/havp -c /usr/local/etc/havp/havp.conf
havp 2154 2153 0 15:13 ? 00:00:00 /usr/local/sbin/havp -c /usr/local/etc/havp/havp.conf
havp 2155 2148 0 15:13 ? 00:00:00 /usr/local/sbin/havp -c /usr/local/etc/havp/havp.conf
havp 2157 2155 0 15:13 ? 00:00:00 /usr/local/sbin/havp -c /usr/local/etc/havp/havp.conf
havp 2156 2148 0 15:13 ? 00:00:00 /usr/local/sbin/havp -c /usr/local/etc/havp/havp.conf
havp 2158 2156 0 15:13 ? 00:00:00 /usr/local/sbin/havp -c /usr/local/etc/havp/havp.conf
havp 2159 2148 0 15:13 ? 00:00:00 /usr/local/sbin/havp -c /usr/local/etc/havp/havp.conf
havp 2160 2159 0 15:13 ? 00:00:00 /usr/local/sbin/havp -c /usr/local/etc/havp/havp.conf
havp 2161 2148 0 15:13 ? 00:00:00 /usr/local/sbin/havp -c /usr/local/etc/havp/havp.conf
havp 2163 2148 0 15:13 ? 00:00:00 /usr/local/sbin/havp -c /usr/local/etc/havp/havp.conf
havp 2162 2161 0 15:13 ? 00:00:00 /usr/local/sbin/havp -c /usr/local/etc/havp/havp.conf
havp 2164 2163 0 15:13 ? 00:00:00 /usr/local/sbin/havp -c /usr/local/etc/havp/havp.conf
root 2261 1 0 15:31 ? 00:00:00 /usr/sbin/inetd
mity 2271 2270 0 15:32 pts/0 00:00:00 -bash
root 2278 2271 0 15:33 pts/0 00:00:00 -su
root 2304 1 0 15:53 ? 00:00:00 /usr/sbin/squid -D -sYC
proxy 2306 2304 1 15:53 ? 00:00:05 (squid) -D -sYC
proxy 2308 2306 0 15:53 ? 00:00:00 (unlinkd)
root 2315 2278 0 15:58 pts/0 00:00:00 ps -ef

2)LISTEN状態確認
jerry:~# lsof -i | grep LISTEN
ntop 1340 ntop 12u IPv6 3331 TCP *:3000 (LISTEN)
ntop 1340 ntop 13u IPv6 3334 TCP *:4242 (LISTEN)
master 1436 root 12u IPv4 3058 TCP *:smtp (LISTEN)
master 1436 root 13u IPv6 3059 TCP *:smtp (LISTEN)
inetd 2261 root 4u IPv4 13565 TCP *:ftp (LISTEN)
inetd 2261 root 5u IPv4 13566 TCP *:telnet (LISTEN)
havp 2561 havp 5u IPv4 15114 TCP *:3128 (LISTEN)
havp 2562 havp 5u IPv4 15114 TCP *:3128 (LISTEN)
havp 2564 havp 5u IPv4 15114 TCP *:3128 (LISTEN)
havp 2565 havp 5u IPv4 15114 TCP *:3128 (LISTEN)
havp 2568 havp 5u IPv4 15114 TCP *:3128 (LISTEN)
havp 2570 havp 5u IPv4 15114 TCP *:3128 (LISTEN)
havp 2572 havp 5u IPv4 15114 TCP *:3128 (LISTEN)
havp 2573 havp 5u IPv4 15114 TCP *:3128 (LISTEN)
havp 2576 havp 5u IPv4 15114 TCP *:3128 (LISTEN)
squid 2633 proxy 13u IPv4 15528 TCP *:webcache (LISTEN)

3)上手く起動したときのhavp.logの中身
jerry:~# tail /var/log/havp/havp.log
22/08/2007 17:05:54 === Starting HAVP Version: 0.80
22/08/2007 17:05:54 Change to user havp
22/08/2007 17:05:54 Change to group havp
22/08/2007 17:05:54 Use parent proxy: 192.168.0.9 8080
22/08/2007 17:05:54 --- Initializing ClamAV Library Scanner
22/08/2007 17:05:54 ClamAV: Using database directory: /var/lib/clamav/
22/08/2007 17:07:56 ClamAV: Loaded 148148 signatures (engine 0.90.1)
22/08/2007 17:07:56 ClamAV Library Scanner passed EICAR virus test (Eicar-Test-Signature)
22/08/2007 17:07:56 --- All scanners initialized
22/08/2007 17:07:56 Process ID: 2119

これでちゃんと動作していると思うが、実際にサンプルウィルスかなにかで挙動を確認してみる方が良いかもしれない。

注:もしかすると、起動時にClamAVのイニシャライズに時間がかかるかも知れない。

4)havpを起動させて、ClamAVを初期化した時コマンドが戻ってこない場合は

jerry:~# vi /etc/init.d/havp
省略
case "$1" in
start)
echo "Starting HAVP ..."
if [ ! -f $HAVP_BIN ]; then
echo "Error: $HAVP_BIN not found"
exit 5
fi
$HAVP_BIN -c $HAVP_CONFIG &
                ← ここに&を追加してデーモンとして常駐させ、コマンドを強制解放させる。
exit $?
;;
省略

havpを再起動する。
jerry:~# /etc/init.d/havp restart

5)実際にブラウザからテストしてみる
ブラウザのProxyには、havpが動いているマシンのIPアドレスと,ポート:3128を指定する。そして、 テストウィルス を使って動作を見てみる。
テストウィルスを使って実際にウィルスファイルをダウンロードしようとすると、以下の画面1にリダイレクトするようになっている。


  画面1

access.logを見てみる。ウィルスが見つかると以下のようなログが書き込まれる。
jerry:~# more /var/log/havp/access.log
24/08/2007 13:48:33 192.168.0.25 GET 200 http://www.xxxxxxxx.com/download/test_virus/eicar.com 371+68 VIRUS ClamAV: Eicar-Test-Signature
24/08/2007 13:48:40 192.168.0.25 GET 200 http://www.xxxxxxxx.com/download/test_vi rus/eicar.com 371+68 VIRUS ClamAV: Eicar-Test-Signature
24/08/2007 14:16:23 192.168.0.25 GET 200 http://www.xxxxxxxx.com/download/test_vi rus/eicar.com 371+68 VIRUS ClamAV: Eicar-Test-Signature
24/08/2007 14:24:28 192.168.0.25 GET 200 http://www.xxxxxxxx.com/download/test_vi rus/eicar.com 371+68 VIRUS ClamAV: Eicar-Test-Signature
24/08/2007 14:25:14 192.168.0.25 GET 200 http://www.xxxxxxxx.com/download/test_vi rus/eicar.com 371+68 VIRUS ClamAV: Eicar-Test-Signature


5.ログローティション
念のため、ログローティションスクリプトを作る。
jerry:/# vi /etc/logrotate.d/havp
/var/log/havp/havp.log /var/log/havp/access.log
{
   rotate 6
   size=100k
   missingok
   dairy
   sharedscripts
   postrotate
   /bin/kill -HUP `cat /var/run/havp/havp.pid 2>/dev/null` 2> /dev/null
   endscript
}

以上


 
 
 



Copyright 2007 Kozupon.com.