HAVP (HTTP Anti Virus Proxy) を利用してWebアクセスにもアンチウィルス

多分、自分が見落としていただけなのだと思うのだけど、 Web アクセス時のアンチウィルスを実現するためのものとして、 HAVP というのがあるのに気がついた。

Short Description

HAVP (HTTP Antivirus Proxy) is a HTTP proxy with an antivirus scanner. It supports the free ClamAV , but also commercial solutions e.g. Kaspersky, Sophos and F-Prot.

[From HAVP – HTTP Anti Virus Proxy – The Free HTTP Anti Virus Proxy]

プロキシとして機能して、ウィルスチェックについては ClamAV などを呼び出して実行するというもの、だそうで。

「子供たちにネット使わせるには、Web アクセスのタイミングでもウィルスチェックしたほうがいいんだろうなぁ…。」と漠然と考えていたんですが、どう実現させるかというとこまでは至っていなかったので、コレは渡りに船とばかりに試してみた次第。

インストールは、コマンド一発!

インストールはそんなに難しいものではなくて、 Debian の場合( jessie 以降)であればコマンドラインから "aptitude install havp" 一発で関連パッケージまで含めてインストール完了。

root@vhost01:~# aptitude install havp
以下の新規パッケージがインストールされます:
clamav{a} clamav-base{a} clamav-freshclam{a} havp libclamav7{a}
更新: 0 個、新規インストール: 5 個、削除: 0 個、保留: 0 個。
アーカイブの 2,100 kB を取得する必要があります。展開後に 4,666 kB のディスク領域が新たに消費されます。
先に進みますか? [Y/n/?]
取得: 1 http://debian-mirror.sakura.ne.jp/debian sid/main amd64 libclamav7 amd64 0.99.3~beta1+dfsg-4 [936 kB]
取得: 2 http://debian-mirror.sakura.ne.jp/debian stable/main amd64 havp amd64 0.92a-4+b2 [135 kB]
取得: 3 http://debian-mirror.sakura.ne.jp/debian sid/main amd64 clamav-base all 0.99.3~beta1+dfsg-4 [303 kB]
取得: 4 http://debian-mirror.sakura.ne.jp/debian sid/main amd64 clamav-freshclam amd64 0.99.3~beta1+dfsg-4 [362 kB]
取得: 5 http://debian-mirror.sakura.ne.jp/debian sid/main amd64 clamav amd64 0.99.3~beta1+dfsg-4 [364 kB]
2,100 kB を 0秒 秒で取得しました (3,778 kB/s)
パッケージを事前設定しています ...
以前に未選択のパッケージ libclamav7:amd64 を選択しています。
(データベースを読み込んでいます ... 現在 381379 個のファイルとディレクトリがインストールされています。)
.../libclamav7_0.99.3~beta1+dfsg-4_amd64.deb を展開する準備をしています ...
libclamav7:amd64 (0.99.3~beta1+dfsg-4) を展開しています...
.../havp_0.92a-4+b2_amd64.deb を展開する準備をしています ...
havp (0.92a-4+b2) を展開しています...
以前に未選択のパッケージ clamav-base を選択しています。
.../clamav-base_0.99.3~beta1+dfsg-4_all.deb を展開する準備をしています ...
clamav-base (0.99.3~beta1+dfsg-4) を展開しています...
以前に未選択のパッケージ clamav-freshclam を選択しています。
.../clamav-freshclam_0.99.3~beta1+dfsg-4_amd64.deb を展開する準備をしています ...
clamav-freshclam (0.99.3~beta1+dfsg-4) を展開しています...
以前に未選択のパッケージ clamav を選択しています。
.../clamav_0.99.3~beta1+dfsg-4_amd64.deb を展開する準備をしています ...
clamav (0.99.3~beta1+dfsg-4) を展開しています...
clamav-base (0.99.3~beta1+dfsg-4) を設定しています ...
libclamav7:amd64 (0.99.3~beta1+dfsg-4) を設定しています ...
libc-bin (2.25-6) のトリガを処理しています ...
havp (0.92a-4+b2) を設定しています ...
グループ `havp' (グループ ID 138) を追加しています...
完了。
There is already /var/lib/havp/havp.loop, maybe from an earlier or custom installation, not building loopback-device
Job for havp.service failed because the control process exited with error code.
See "systemctl status havp.service" and "journalctl -xe" for details.
invoke-rc.d: initscript havp, action "start" failed.
● havp.service - LSB: HAVP virus-scanning HTTP proxy
Loaded: loaded (/etc/init.d/havp; generated; vendor preset: enabled)
Active: failed (Result: exit-code) since Wed 2018-01-03 15:49:19 JST; 14ms ago
Docs: man:systemd-sysv-generator(8)
Process: 26029 ExecStart=/etc/init.d/havp start (code=exited, status=1/FAILURE)

1月 03 15:49:19 vhost01 systemd[1]: Starting LSB: HAVP virus-scanning HTTP proxy...
1月 03 15:49:19 vhost01 havp[26029]: Cleaning up /var/spool/havp... done
1月 03 15:49:19 vhost01 havp[26029]: Starting havp: Starting HAVP Version: 0.92
1月 03 15:49:19 vhost01 havp[26029]: LibClamAV Error: cli_loaddbdir(): No supported database files found in /var/lib/clamav
1月 03 15:49:19 vhost01 havp[26029]: One or more scanners failed to initialize!
1月 03 15:49:19 vhost01 havp[26029]: Check errorlog for errors.
1月 03 15:49:19 vhost01 havp[26029]: Exiting..
1月 03 15:49:19 vhost01 systemd[1]: havp.service: Control process exited, code=exited status=1
1月 03 15:49:19 vhost01 systemd[1]: havp.service: Failed with result 'exit-code'.
1月 03 15:49:19 vhost01 systemd[1]: Failed to start LSB: HAVP virus-scanning HTTP proxy.
E: Error starting service (could be due to port 8080 already in use), ignoring...
systemd (236-2) のトリガを処理しています ...
man-db (2.7.6.1-4) のトリガを処理しています ...
clamav-freshclam (0.99.3~beta1+dfsg-4) を設定しています ...
Created symlink /etc/systemd/system/multi-user.target.wants/clamav-freshclam.service → /lib/systemd/system/clamav-freshclam.service.
clamav (0.99.3~beta1+dfsg-4) を設定しています ...
systemd (236-2) のトリガを処理しています ...

と、インストール時に表示されるメッセージ、 havp のインストール後の起動のところで、エラーが出ている。


これは、 havp インストールの時点で ClamAV がウィルスチェックに使うパターンデータのダウンロードが完了していない場合に発生するものなので、 havp と一緒にインストールされる clamav-freshclam パッケージ中の freshclam コマンドによるパターンファイルのダウンロードの完了を待つか、デーモンモードで動作している freshclam コマンドを一度停止した後に、手動で freshclam コマンドを実行してパターンファイルをダウンロードする必要があります。

/var/log/clamav/freshclam.log をチェックして、パターンファイルのダウンロードが完了しているのを確認したら、

root@vhost01:~# tail /var/log/clamav/freshclam.log
Wed Jan 3 15:49:56 2018 -> --------------------------------------
Wed Jan 3 16:49:56 2018 -> Received signal: wake up
Wed Jan 3 16:49:56 2018 -> ClamAV update process started at Wed Jan 3 16:49:56 2018
Wed Jan 3 16:49:57 2018 -> WARNING: Your ClamAV installation is OUTDATED!
Wed Jan 3 16:49:57 2018 -> WARNING: Local version: 0.99.3-beta1 Recommended version: 0.99.2
Wed Jan 3 16:49:57 2018 -> DON'T PANIC! Read http://www.clamav.net/documents/upgrading-clamav
Wed Jan 3 16:49:57 2018 -> main.cvd is up to date (version: 58, sigs: 4566249, f-level: 60, builder: sigmgr)
Wed Jan 3 16:49:57 2018 -> daily.cvd is up to date (version: 24187, sigs: 1816778, f-level: 63, builder: neo)
Wed Jan 3 16:49:57 2018 -> bytecode.cvd is up to date (version: 319, sigs: 75, f-level: 63, builder: neo)
Wed Jan 3 16:49:57 2018 -> --------------------------------------

改めて、havp を起動します。
"systemctl start havp" を実行して、特にメッセージが表示されなかったら、 "systemctl status havp" で状態を確認して正しく起動しているのを確認しましょう。

root@vhost01:~# systemctl start havp
root@vhost01:~# systemctl status havp
● havp.service - LSB: HAVP virus-scanning HTTP proxy
Loaded: loaded (/etc/init.d/havp; generated; vendor preset: enabled)
Active: active (running) since Wed 2018-01-03 17:15:20 JST; 7s ago
Docs: man:systemd-sysv-generator(8)
Process: 911 ExecStart=/etc/init.d/havp start (code=exited, status=0/SUCCESS)
Tasks: 17 (limit: 4915)
CGroup: /system.slice/havp.service
├─920 /usr/sbin/havp
├─921 /usr/sbin/havp
├─922 /usr/sbin/havp
├─923 /usr/sbin/havp
├─924 /usr/sbin/havp
├─925 /usr/sbin/havp
├─926 /usr/sbin/havp
├─927 /usr/sbin/havp
├─928 /usr/sbin/havp
├─929 /usr/sbin/havp
├─930 /usr/sbin/havp
├─931 /usr/sbin/havp
├─932 /usr/sbin/havp
├─934 /usr/sbin/havp
├─935 /usr/sbin/havp
├─936 /usr/sbin/havp
└─937 /usr/sbin/havp

1月 03 17:15:09 vhost01 systemd[1]: Starting LSB: HAVP virus-scanning HTTP proxy...
1月 03 17:15:09 vhost01 havp[911]: Cleaning up /var/spool/havp... done
1月 03 17:15:09 vhost01 havp[911]: Starting havp: Starting HAVP Version: 0.92
1月 03 17:15:20 vhost01 havp[911]: havp.
1月 03 17:15:20 vhost01 systemd[1]: Started LSB: HAVP virus-scanning HTTP proxy.

havp のパッケージ付属の設定で起動した場合 、 TCP/8080 で待ち受けしています。もし他に TCP/8080 を使うデーモンが起動している場合は、havp のポートの設定を変えるか、先行で TCP/8080 を使っているデーモンの方の設定を変えることになります。

root@vhost01:~# lsof -i:8080
COMMAND PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
havp    920 havp    3u  IPv4 30240313      0t0  TCP *:http-alt (LISTEN)
havp    921 havp    3u  IPv4 30240313      0t0  TCP *:http-alt (LISTEN)
havp    922 havp    3u  IPv4 30240313      0t0  TCP *:http-alt (LISTEN)
havp    925 havp    3u  IPv4 30240313      0t0  TCP *:http-alt (LISTEN)
havp    927 havp    3u  IPv4 30240313      0t0  TCP *:http-alt (LISTEN)
havp    929 havp    3u  IPv4 30240313      0t0  TCP *:http-alt (LISTEN)
havp    930 havp    3u  IPv4 30240313      0t0  TCP *:http-alt (LISTEN)
havp    932 havp    3u  IPv4 30240313      0t0  TCP *:http-alt (LISTEN)
havp    935 havp    3u  IPv4 30240313      0t0  TCP *:http-alt (LISTEN)

とりあえず、起動までは完了。

動作確認をしてみる

さて、動作確認ですけど、もちろん Web ブラウザでやってもいいわけですが、先のエントリーでプロキシ経由でも使えることを書いたので、ここでは curl コマンドを使ってみます。

curl でプロキシ経由のアクセスをさせるためには、 "--proxy" オプションを使ってプロキシサーバとそのポートを指定します。
HEAD メソッドを使って havp 経由で eicar.com にアクセスするため、"--proxy 127.0.0.1:8080" を付けて実行してた結果が、以下の内容。

root@vhost01:~# curl -vIL --proxy 127.0.0.1:8080 http://www.eicar.org/
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> HEAD http://www.eicar.org/ HTTP/1.1
> Host: www.eicar.org
> User-Agent: curl/7.57.0
> Accept: */*
> Proxy-Connection: Keep-Alive
>
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< Date: Wed, 03 Jan 2018 09:22:41 GMT
Date: Wed, 03 Jan 2018 09:22:41 GMT
< Server: Apache/2.4.10 (Debian)
Server: Apache/2.4.10 (Debian)
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Pragma: no-cache
Pragma: no-cache
< Cache-Control: must-revalidate, proxy-revalidate, private
Cache-Control: must-revalidate, proxy-revalidate, private
< Content-MD5: 90f39b14198e03c6699e326192bd57fa
Content-MD5: 90f39b14198e03c6699e326192bd57fa
< Set-Cookie: PHPSESSID=han93gj8so9tnsp91u3okh7rl7; path=/
Set-Cookie: PHPSESSID=han93gj8so9tnsp91u3okh7rl7; path=/
< Last-Modified: Wed, 27 Sep 2017 15:50:45 GMT
Last-Modified: Wed, 27 Sep 2017 15:50:45 GMT
< ETag: "90f39b14198e03c6699e326192bd57fa56"
ETag: "90f39b14198e03c6699e326192bd57fa56"
< Content-Length: 13059
Content-Length: 13059
< Content-Type: text/html; charset=utf-8
Content-Type: text/html; charset=utf-8
* HTTP/1.1 proxy connection set close!
< Proxy-Connection: close
Proxy-Connection: close

<
* Closing connection 0

リクエストヘッダとレスポンスヘッダだけでは、ちゃんと処理されたのかが判らないので、 /var/log/havp/access.log を参照。

03/01/2018 18:22:42 127.0.0.1 HEAD 200 http://www.eicar.org/ 480+0 OK

ちゃんとありましたね。
では、実際にテストウィルスをダウンロードしてみましょう。HEAD メソッドだとファイルの存在チェックにしかなりませんし、転送先まで追いかける必要もないので、ヘッダのやり取りを見るための "-v" オプションと "--proxy" オプションを付けて実行します。

root@vhost01:~# curl -v --proxy 127.0.0.1:8080 http://www.eicar.org/download/eicar_com.txt
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> GET http://www.eicar.org/download/eicar_com.txt HTTP/1.1
> Host: www.eicar.org
> User-Agent: curl/7.57.0
> Accept: */*
> Proxy-Connection: Keep-Alive
>
* HTTP 1.0, assume close after body
< HTTP/1.0 403 Virus found by HAVP
< Content-Type: text/html
< Proxy-Connection: close
< Connection: close
<
<html><head><title>HAVP - Access Denied</title><style type="text/css"><!--.style1 { color: #00FFFF; font-weight: bold;}--></style></head><body bgcolor=#FFFFFF><table width=700 height=540 border=0 align="center" cellpadding=2 cellspacing=0><tr bgcolor="#FF6600"> <td height=100 colspan=2 align=center> <font face=arial,helvetica size=6><strong>HAVP - Access Denied </strong></font></td></tr><tr> <td align=center valign=bottom width=150 bgcolor=#000066>  </td> <td width=550 bgcolor=#FFFFFF align=center valign=center> <font face=arial,helvetica color=black size=4> <br> Access to the page has been denied <br> <br> because the following virus was detected <br> <br> <br> <font color=red> <b>ClamAV: Eicar-Test-Signature</b> </font></font> <br> <br> <br> </td></tr><tr> <td align=center valign=middle bgcolor=#000066><span class="style1"><font face=arial,helvetica size=2 >Your Company Here </font></span> </td> <td bgcolor=#FFFFFF align=center valign=middle><font fac* Closing connection 0
e=arial,helvetica size=2> Powered by <a href="http://www.server-side.de" target="_blank">HAVP</a> </font> </td></tr></table></body></html>

レスポンスの部分に "HTTP/1.0 403 Virus found by HAVP" というメッセージが出ていて、アクセスが拒否されたことがわかります。また実際のコンテンツも、 havp を出力したものになっていますね。
アクセスログも、ちゃんとこの通り。

03/01/2018 18:33:42 127.0.0.1 GET 200 http://www.eicar.org/download/eicar_com.txt 285+68 VIRUS ClamAV: Eicar-Test-Signature

とりあえず、動作して使えるようになったので、 Web ブラウザ側のプロキシ設定で havp を指定してあげれば、 Web アクセスの際のウィルスブロッキングが出来るようになります。
ZIP形式の圧縮ファイルであっても、ちゃんとスキャンしてくれます。

root@vhost01:/etc/havp# curl -v --proxy 127.0.0.1:8080 http://www.eicar.org/download/eicarcom2.zip
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> GET http://www.eicar.org/download/eicarcom2.zip HTTP/1.1
> Host: www.eicar.org
> User-Agent: curl/7.57.0
> Accept: */*
> Proxy-Connection: Keep-Alive
>
* HTTP 1.0, assume close after body
< HTTP/1.0 403 Virus found by HAVP
< Content-Type: text/html
< Proxy-Connection: close
< Connection: close
<
<html><head><title>HAVP - Access Denied</title><style type="text/css"><!--.style1 { color: #00FFFF; font-weight: bold;}--></style></head><body bgcolor=#FFFFFF><table width=700 height=540 border=0 align="center" cellpadding=2 cellspacing=0><tr bgcolor="#FF6600"> <td height=100 colspan=2 align=center> <font face=arial,helvetica size=6><strong>HAVP - Access Denied </strong></font></td></tr><tr> <td align=center valign=bottom width=150 bgcolor=#000066>  </td> <td width=550 bgcolor=#FFFFFF align=center valign=center> <font face=arial,helvetica color=black size=4> <br> Access to the page has been denied <br> <br> because the following virus was detected <br> <br> <br> <font color=red> <b>ClamAV: Eicar-Test-Signature</b> </font></font> <br> <br> <br> </td></tr><tr> <td align=center valign=middle bgcolor=#000066><span class="style1"><font face=arial,helvetica size=2 >Your Company Here </font></span> </td> <td bgcolor=#FFFFFF align=center valign=middle><font fac* Closing connection 0
e=arial,helvetica size=2> Powered by <a href="http://www.server-side.de" target="_blank">HAVP</a> </font> </td></tr></table></body></html>

課題もあります

実際動かしてみた感じでは、いくつか対応考えないといけないことがチラホラ。
気になったのは

  • havp 単体の機能として、ユーザ認証機能がない → squid を認証付きプロキシとして使っていて、利用者名でアクセス先の制御をやっているような環境では、単純に置き換えることが出来ない。

ということなんですが、設定の中に上位プロキシを指定するためのパラメータが存在しているので、それを使うことでクライアント → squid → havp の順番にリクエストが流れていくように構成を組めば解決出来そうなので、そんなに大きな問題には奈良なさそうです。

あとは、 HTTPS アクセス時のアンチウィルスですけど、コレばっかりは暗号化された通信を解いてスキャンさせないといけないですし、 havp 自身はそこまでの機能は持ってないので OSS だけで固めた構成で実現するのは難しいだろうなぁ。ま、この辺はクライアント自身にインストールされたアンチウィルスソフトや Web ブラウザ自体のセーフブラウジング機能に頑張ってもらう、って感じになるんでしょうね。

ということで、基本的な動作確認まで終わったわけですが、我が家の環境下で havp を常用するためには、既存の Squid などにも手を入れなくてはいけなので、そのあたりの話は、別のエントリーにて。

トラックバック(1)

ということで、前エントリーからの続き。 我が家のネットワーク環境については、さらにちょっと前のエントリーで既出なわけですが 概略としては上の図の通りで、 ... 続きを読む

コメントする