icap連携をしてみる

サーバー運用がかなり厳しいので寄付をしてくれる人がいたらこちら
メインPCもボロボロになってきたので、ついにほしいものリスト公開

というわけで、ICAPなるものをSquid+c-icap+ほにゃららでやってみようと思います。
手始めにSquid+ICAP+Squidclamavというお決まりな奴を。
Squidは3.5.xを使用し、clamavは0.98.7をつかいます。ICAPは最新が0.3.5です。

ICAPのインストール

とりあえず、ソースを拾ってインストールする方法で
設定方法はうちのRPMを基にやるます。
Squidclamavとclamavとsquidとc-icapの基本的な設定は省いてますので、各自の環境に合わせて修正してください。

# cd /usr/local/src
# mkdir c-icap
# cd c-icap
# wget http://sourceforge.net/projects/c-icap/files/c-icap/0.3.x/c_icap-0.3.5.tar.gz
# tar zxvf c_icap-0.3.5.tar.gz
# cd c_icap-0.3.5
# ./configure && make && make install

簡単ですね!

設定

まずはsquid.confの設定をします

logformat icap_squid [%tl] %icap::tr %>a %icap::to/%03icap::Hs %icap::<st %icap::rm %icap::ru %un -/%icap::<A -
icap_log stdio:/var/log/squid/icap.log icap_squid
icap_enable on
icap_send_client_ip on
icap_send_client_username on
icap_client_username_header X-Authenticated-User
### ここまでは共通 ###
icap_service service_req reqmod_precache bypass=1 icap://127.0.0.1:1344/squidclamav
adaptation_access service_req allow all
icap_service service_resp respmod_precache bypass=1 icap://127.0.0.1:1344/squidclamav
adaptation_access service_resp allow all

次にicap側の設定ですが、基本弄る所はあまりないので、適宜修正した後に
コンフィグ(/etc/c-icap/c-icap.conf)の最下部に以下を追記します。

# squidclamav
Service squidclamav squidclamav.so

メモ

squid.confのicap_serviceのURL?に記載するicap://127.0.0.1:1344/squidclamavとicap.confのService squidclamavの
squidclamavは一致させておかないとだめ。
なので、別にicap_service ... icap://127.0.0.1:1344/virus_check と Service virus_check squidclamav.so でもOKなはず。

あとはSquidとc-icapをそれぞれ立ち上げると使えるようになるので、テストします。

# telnet localhost 8080
Connected to localhost.
Escape character is '^]'.
GET http://www.eicar.org/download/eicar.com HTTP/1.0
 
HTTP/1.1 301 Moved Permanently
Date: Tue, 03 Dec 2013 07:37:32 GMT
Location: http://example.com/cgi-bin/clwarn.cgi?url=http://www.eicar.org/download/eicar.com&source=::1&user=-&virus=stream: Eicar-Test-Signature FOUND
Server: C-ICAP
Content-Type: text/html
Content-Language: en
Via: ICAP/1.0 example.com (C-ICAP/0.3.2 SquidClamav/Antivirus service )
X-Cache: MISS from example.com
X-Cache-Lookup: MISS from example.com:8080
Connection: close
 
Connection closed by foreign host.

各ログにはこんな風にのってきます

clamav:
日付 -> instream(local): Eicar-Test-Signature(44d88612fea8a8f36de82e1278abb02f:68) FOUND
 
squid(icap):
[日付] 0 :: ICAP_OPT/200 353 OPTIONS icap://127.0.0.1:1344/squidclamav - -/127.0.0.1 -
[日付] 18 ::1 ICAP_MOD/200 492 RESPMOD icap://127.0.0.1:1344/squidclamav - -/127.0.0.1 -
 
squid(accesslog):
日付    660 ::1 TCP_MISS/301 465 GET http://www.eicar.org/download/eicar.com - HIER_DIRECT/188.40.238.250 text/html
 
c-icap(accesslog):
日付, ::ffff:127.0.0.1 ::ffff:127.0.0.1 OPTIONS squidclamav 200
日付, ::ffff:127.0.0.1 ::ffff:127.0.0.1 RESPMOD squidclamav 200

次に、c-icapで配布してるc-icap-modulesを試してみます。

インストール

# cd /usr/local/src
# mkdir c-icap-modules
# cd c-icap-modules
# wget http://sourceforge.net/projects/c-icap/files/c-icap-modules/0.3.x/c_icap_modules-0.3.2.tar.gz
# tar zxvf c_icap_modules-0.3.2.tar.gz
# cd c_icap_modules-0.3.2
# ./configure --enable-shared  \
--with-c-icap \
--with-zlib \
--with-clamav \
--with-bdb
# make && make install

インストール後、以下のファイルを修正

squid.conf

#icap_service service_req reqmod_precache bypass=1 icap://127.0.0.1:1344/squidclamav
#adaptation_access service_req allow all
#icap_service service_resp respmod_precache bypass=1 icap://127.0.0.1:1344/squidclamav
#adaptation_access service_resp allow all
icap_service virus_check_resp respmod_precache bypass=1 icap://127.0.0.1:1344/antivirus_module
icap_service url_check_req reqmod_precache bypass=0 icap://127.0.0.1:1344/url_check_module
adaptation_access url_check_req allow all
adaptation_access virus_check_resp allow all

c-icap.conf

# squidclamav
#Service squidclamav squidclamav.so
Include virus_scan.conf
Include srv_url_check.conf

srv_url_check.conf

... snip ...
 Service url_check_module srv_url_check.so
 
LogFormat myUrlCheck "%tl, %>a %im %is %huo  [MatchedCat: %{url_check:matched_cat}Sa] [Action4cat: %{url_check:action_cat}Sa] [Action: %{url_check:action}Sa]"
acl URLCHECK service url_check_module
AccessLog /var/log/c-icap/url_check.log myUrlCheck URLCHECK
... snip ...
 # Example:
 #      url_check.LookupTableDB  denyhosts host hash:/usr/local/c-icap/etc/denyhosts.txt "Denied Hosts"
 #      url_check.LookupTableDB multisurbl domain dnsbl:multi.surbl.org
url_check.LookupTableDB denyhosts host hash:/usr/local/db/denyhosts.txt "Domains test"
# denyhosts.txt にはexample.comとかホスト名入れる。
... snip ...
 # Example:
 #      url_check.LoadSquidGuardDB porn /usr/local/blacklists-toulouse/porn/ "SquidGuard Porn Sites"
url_check.LoadSquidGuardDB porn /usr/local/db/blacklists/porn/ "SquidGuard Porn site"
# SquidGuard形式のDBがあればそれを指定して、無ければコメントアウトしておく
... snip ...
 #      url_check.Profile default pass ALL
url_check.Profile default block denyhosts porn
 url_check.Profile default pass ALL
... snip ...

virus_scan.conf

... snip ...
ServiceAlias  avscan virus_scan?allow204=on&sizelimit=off&mode=simple
 
LogFormat myVScanFmt "%tl, %>a %is %Ib %Ob %huo [Action: %{virus_scan:action}Sa] [Virus: %{virus_scan:virus}Sa]"
acl VSCAN service antivirus_module
AccessLog /var/log/c-icap/virus_scan.log myVScanFmt VSCAN
 
... snip ...
virus_scan.DefaultEngine clamd
 
... snip ...
# Enable on or more antivirus engines:
Include clamd_mod.conf

clamd_mod.confはclamavのソケットを指定するくらいなので、割愛

動作テスト

設定を変更したらsquidとc-icapを再起動して、さっきと同じようにtelnetで確認

virusのテスト

# telnet localhost 8080
Connected to localhost.
Escape character is '^]'.
GET http://www.eicar.org/download/eicar.com HTTP/1.0
 
HTTP/1.1 403 Forbidden
Date: Tue, 03 Dec 2013 07:58:07 GMT
Server: C-ICAP
Content-Type: text/html
Content-Language: ja
Via: ICAP/1.0 example.com (C-ICAP/0.3.2 Antivirus service )
X-Cache: MISS from example.com
X-Cache-Lookup: MISS from example.com:8080
Connection: close
 
<html>
 <head>
   <title>ウィルス検知</title>
</head>
 
<body>
<h1>ウィルスが見つかりました</h1>
 
あなたがアップロードまたはダウンロードしようとしたファイルには以下のウィルスが含まれています:
   <b> Eicar-Test-Signature </b>
<br>
HTTPロケーション:
<b>  http://www.eicar.org/download/eicar.com </b>
 
<p>
詳細についてはシステム管理者にお問い合わせください。
 
<hr>
<p>
This message generated by C-ICAP service: <b> antivirus_module </b>
<br>Antivirus engine: <b> clamd-0980/18192 </b>
 
</p>
 
</body>
</html>
Connection closed by foreign host.

denyhosts.txtのテスト

# telnet localhost 8080
Connected to localhost.
Escape character is '^]'.
GET http://example.com/ HTTP/1.0
 
HTTP/1.1 403 Forbidden
Date: Tue, 03 Dec 2013 08:01:17 GMT
Server: C-ICAP
Content-Type: text/html
Content-Language: ja
X-Cache: MISS from example.com
X-Cache-Lookup: NONE from example.com:8080
Connection: close
 
<H1> Access denied </H1>
 
あなたがアクセスをしたURL:
<pre>
  http://example.com/
</pre>
<br>
HTTPホスト:
<pre>
  -
</pre>
一致したURLカテゴリ:
<pre>
denyhosts
</pre>
ブロックされたカテゴリ:
<pre>
denyhosts (Domains test)
</pre>
はシステムのポリシーでアクセスが制限されました。
<p>
The page generated by the C-ICAP service url_check_module
</p>
 
<!--
              ==            =        ==         =          _===
           =               =      =           = =         =   =
         =       =====    =     =           =   =        ===
         =               =      =          =====        =
          ==            =        ==       =   =        =
-->
Connection closed by foreign host.

squidGurad形式のドメインテスト

# telnet localhost 8080
Connected to localhost.
Escape character is '^]'.
GET http://www.sex.com/ HTTP/1.0
 
HTTP/1.1 403 Forbidden
Date: Tue, 03 Dec 2013 08:04:02 GMT
Server: C-ICAP
Content-Type: text/html
Content-Language: ja
X-Cache: MISS from example.com
X-Cache-Lookup: NONE from example.com:8080
Connection: close
 
<H1> Access denied </H1>
 
あなたがアクセスをしたURL:
<pre>
  http://www.sex.com/
</pre>
<br>
HTTPホスト:
<pre>
  -
</pre>
一致したURLカテゴリ:
<pre>
porn/domains
</pre>
ブロックされたカテゴリ:
<pre>
porn (SquidGuard porn site)
</pre>
はシステムのポリシーでアクセスが制限されました。
<p>
The page generated by the C-ICAP service url_check_module
</p>
 
<!--
              ==            =        ==         =          _===
           =               =      =           = =         =   =
         =       =====    =     =           =   =        ===
         =               =      =          =====        =
          ==            =        ==       =   =        =
-->
Connection closed by foreign host.

とまぁこんな感じで制限がされればOKってことですね。
SquidのログにはNONE/403でログが載ってきて
virus_scan.logやurl_check.logにはこんな感じで載ってきます。

virus_scan:
日付, ::1 200 68 606 http://www.eicar.org/download/eicar.com [Action: blocked] [Virus: Eicar-Test-Signature]
 
url_check
日付, ::1 REQMOD 204 http://www.eicar.org/download/eicar.com  [MatchedCat: ALL] [Action4cat: ALL] [Action: ALLOWED]
日付, ::1 REQMOD 200 http://example.com/  [MatchedCat: denyhosts] [Action4cat: denyhosts] [Action: BLOCKED]
日付, ::1 REQMOD 200 http://www.sex.com/  [MatchedCat: porn/domains] [Action4cat: porn] [Action: BLOCKED]

virus_scan.logにexample.comとかが乗ってこないのはurlチェックが先に働いてそこでBlockされているからなのですよ。

コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 行と段落は自動的に折り返されます。
CAPTCHA
また変更しました
Fill in the blank.