Locked

CentOS_TIPS_018

squid - ICAP/c-icap連携URLフィルタ+アンチウイルス機能フォワードプロキシ構築メモ

  • 公式サイトURL

http://c-icap.sourceforge.net/

バージョン情報

ここでは、以下のバージョンについて記載しています。

  • CentOS6

$ cat /etc/redhat-release
CentOS release 6.8 (Final)

squid導入

RHEL/CentOS 6.8より、squid3.4系が提供されるようになりました。

# yum list squid*
...
利用可能なパッケージ
squid.x86_64                         7:3.1.23-16.el6                        base
squid34.x86_64                       7:3.4.14-9.el6                         base

旧来のsquid3.1系とインストール先が衝突するため、どちらか一方のみ使用可能です。
RHEL/CentOSにより提供されてきたsquid3.1系は、squid3.2系以降の機能バグ関連がバックポートされておらず、使用する機能によっては動作しませんでした。

  • 参考URL - [Squid 3 を使用して MS Sharepoint にアクセスできない]

https://access.redhat.com/ja/node/1532173

ICAP関連の一部機能もsquid3.1系では動作しないため、ここではsquid3.4系を使用します。

# yum install squid34
...
依存性を解決しました

================================================================================
 パッケージ       アーキテクチャ  バージョン                リポジトリー   容量
================================================================================
インストールしています:
 squid34          x86_64          7:3.4.14-9.el6            base          2.6 M

なお、更に新しいsquid3.5系以降を使用したい場合は、以下のようなサードパーティ提供リポジトリを使用するか、自前でパッケージを作成します。

  • 参考URL - 非公式squid3.5系リポジトリ

http://www1.ngtech.co.il/repo/centos/6/x86_64/

認証時のみ利用可/キャッシュ無しとして設定。

--- squid.conf.default
+++ squid.conf
@@ -1,3 +1,14 @@
+# Digest Auth
+auth_param digest program /usr/lib64/squid/digest_file_auth /etc/squid/users
+auth_param digest children 3 startup=0 idle=1
+auth_param digest realm private proxy server
+auth_param digest nonce_garbage_interval 5 minutes
+auth_param digest nonce_max_duration 30 minutes
+auth_param digest nonce_max_count 50
+auth_param digest check_nonce_count off
+auth_param digest post_workaround off
+acl Auth_OK proxy_auth REQUIRED
+
 #
 # Recommended minimum configuration:
 #
@@ -40,11 +51,12 @@
 # We strongly recommend the following be uncommented to protect innocent
 # web applications running on the proxy server who think the only
 # one who can access services on "localhost" is a local user
-#http_access deny to_localhost
+http_access deny to_localhost

 #
 # INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
 #
+http_access allow Auth_OK

 # Example rule allowing access from your local networks.
 # Adapt localnet in the ACL section to list your (internal) IP networks
@@ -60,6 +72,7 @@

 # Uncomment and adjust the following to add a disk cache directory.
 #cache_dir ufs /var/spool/squid 100 16 256
+cache deny all

 # Leave coredumps in the first cache dir
 coredump_dir /var/spool/squid

認証用ユーザファイル作成/サービス起動。
以下の例では確認用にアカウント「user」をパスワード「pass」として作成していますので、適宜、変更してください。

# touch /etc/squid/users
# chgrp squid /etc/squid/users
# chmod 0640 /etc/squid/users
# cat 'user:pass' > /etc/squid/users

# chkconfig squid on
# squid -k parse
# service squid start

動作確認。自ホストを「squid.example.jp」としていますので、適宜、変更してください。

  • 認証無し(アクセス拒否)

$ curl -x http://squid.example.jp:3128 http://www.yahoo.co.jp 2>/dev/null
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>エラー: キャッシュにアクセスを拒否されました。</title>
...
  • 認証有り(アクセス許可)

$ curl --proxy-digest -U user:pass -x http://squid.example.jp:3128 http://www.yahoo.co.jp 2>/dev/null
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta http-equiv="content-style-type" content="text/css">
<meta http-equiv="content-script-type" content="text/javascript">
<meta name="description" content="日本最大級のポータル...

clamd導入

clamdを既に導入済み/使用中の場合は、そのまま利用できると思います。

clamd(clamav/clamav-db)及びclamav-devel(c-icapビルドに使用)をインストール。

# yum --enablerepo=epel install clamd clamav-devel

clamdの設定は利用環境に応じて、適宜、行ってください。

以下はsyslog不使用/ソケットファイル経由でのみ利用するよう変更。

--- a/clamd.conf
+++ b/clamd.conf
@@ -41,7 +41,7 @@ LogTime yes

 # Use system logger (can work together with LogFile).
 # Default: no
-LogSyslog yes
+#LogSyslog yes

 # Specify the type of syslog messages - please refer to 'man syslog'
 # for facility names.
@@ -98,7 +98,7 @@ FixStaleSocket yes

 # TCP port address.
 # Default: no
-TCPSocket 3310
+#TCPSocket 3310

 # TCP address.
 # By default we bind to INADDR_ANY, probably not wise.
@@ -106,7 +106,7 @@ TCPSocket 3310
 # from the outside world. This option can be specified multiple
 # times if you want to listen on multiple IPs. IPv6 is now supported.
 # Default: no
-TCPAddr 127.0.0.1
+#TCPAddr 127.0.0.1

 # Maximum length the queue of pending connections may grow to.
 # Default: 200

clamd起動。

# chkconfig clamd on
# service clamd start

データベース更新。

# freshclam --quiet

# tail /var/log/clamav/freshclam.log
Downloading daily-21611.cdiff [100%]
Downloading daily-21612.cdiff [100%]
Downloading daily-21613.cdiff [100%]
Downloading daily-21614.cdiff [100%]
Downloading daily-21615.cdiff [100%]
Downloading daily-21616.cdiff [100%]
daily.cld updated (version: 21616, sigs: 183919, f-level: 63, builder: neo)
bytecode.cvd is up to date (version: 277, sigs: 47, f-level: 63, builder: neo)
Database updated (4402756 signatures) from db.jp.clamav.net (IP: 203.178.137.175)
Clamd successfully notified about the update.

動作確認。

$ wget -O /tmp/eicar.data https://secure.eicar.org/eicar.com

$ clamdscan /tmp/eicar.data
/tmp/eicar.data: Eicar-Test-Signature FOUND

----------- SCAN SUMMARY -----------
Infected files: 1
Time: 0.001 sec (0 m 0 s)

# tail /var/log/clamav/clamd.log
Sat May 28 14:54:49 2016 -> /tmp/eicar.data: Eicar-Test-Signature FOUND

URLフィルタ用DB作成

URLフィルタとしてはSquidGuardやDansGuardianを使用する方法もありますが、ここではc-icapモジュールを使用します。

  • 参考URL - SquidGuard/DansGuardian

http://www.squidguard.org/

http://dansguardian.org/

ブラックリストについては、上述のソフトで使用可能なものを流用できます。

  • 参考URL - URLブラックリスト

http://www.squidguard.org/blacklists.html

上記サイトのうち「Shalla's Blacklists」を使用します。

# mkdir /var/db/URL
# cd /var/db/URL
# wget http://www.shallalist.de/Downloads/shallalist.tar.gz
# tar zxf shallalist.tar.gz
# chgrp -R c-icap /var/db/URL
# rm shallalist.tar.gz

動作確認用に、カテゴリ「porn」のドメインリスト/カテゴリ「hacking」のURLリストのみ使用します。

# wc -l BL/porn/domains BL/hacking/urls
  835005 BL/porn/domains
     177 BL/hacking/urls
  835182 合計

c-icap導入

バージョン0.3.5のパッケージが作成/公開されていましたので、これを取得し、バージョン0.4.3用に修正/パッケージを作成します。

  • 参考URL

http://wiki.squid-cache.org/ConfigExamples/ContentAdaptation/C-ICAP

  • 参考URL - 非公式c-icap-0.3.5パッケージ

ftp://ftp.pbone.net/mirror/ftp.pramberger.at/systems/linux/contrib/rhel6/archive/SRPMS/c-icap-0.3.5-1.el6.pp.src.rpm

ftp://ftp.pbone.net/mirror/ftp.pramberger.at/systems/linux/contrib/rhel6/archive/SRPMS/c-icap-modules-0.3.2-1.el6.pp.src.rpm

  • 参考URL - 0.4.3用SPECファイル

https://github.com/nazx/rpmbuild

c-icapサーバ設定。

--- c-icap.conf.default
+++ c-icap.conf
@@ -140,6 +140,7 @@
 #      No value
 # Example:
 #      User wwwrun
+User c-icap

 # TAG: Group
 # Format: Group groupname
@@ -150,6 +151,7 @@
 #      No value
 # Example:
 #      Group nogroup
+Group c-icap

 # TAG: ServerAdmin
 # Format: ServerAdmin admin_mail
@@ -158,7 +160,7 @@
 #      about this server (logs, info service, etc)
 # Default:
 #      No value
-ServerAdmin you@your.address
+ServerAdmin c-icap@example.jp

 # TAG: ServerName
 # Format: ServerName aServerName
@@ -167,7 +169,7 @@
 #      server (logs, info service, etc)
 # Default:
 #      No value
-ServerName YourServerName
+ServerName example.jp

 # TAG: TmpDir
 # Format: TmpDir dir
@@ -227,7 +229,7 @@
 #      The location of modules
 # Default:
 #      ModulesDir /usr/local/c-icap-0.4.x/lib/c_icap
-ModulesDir /usr/local/c-icap-0.4.x/lib/c_icap
+ModulesDir /usr/lib64/c_icap/

 # TAG: ServicesDir
 # Format: ServicesDir dir
@@ -235,7 +237,7 @@
 #      The location of services
 # Default:
 #      ServicesDir /usr/local/c-icap-0.4.x/lib/c_icap
-ServicesDir /usr/local/c-icap-0.4.x/lib/c_icap
+ServicesDir /usr/lib64/c_icap/

 # TAG: TemplateDir
 # Format: TemplateDir dir
@@ -245,7 +247,7 @@
 # Default:
 #      No value
 # Example:
-TemplateDir /usr/local/c-icap-0.4.x/share/c_icap/templates/
+TemplateDir /usr/share/c_icap/templates/

 # TAG: TemplateDefaultLanguage
 # Format: TemplateDefaultLanguage lang
@@ -268,7 +270,7 @@
 #      It can be used more than once to use multiple magic files.
 # Default:
 #      LoadMagicFile /usr/local/c-icap-0.4.x/etc/c-icap.magic
-LoadMagicFile /usr/local/c-icap-0.4.x/etc/c-icap.magic
+LoadMagicFile /etc/c-icap/c-icap.magic

 # TAG: RemoteProxyUsers
 # Format: RemoteProxyUsers onoff
@@ -430,6 +432,11 @@
 #      acl WorkingHours time M,T,W,H,F/8:00-18:00
 #      acl FreeHour time Sunday,Saturday/8:00-23:59 M,T,W,H,F/18:01-23:59 M,T,W,H,F/0:00-7.59

+acl localhost src 127.0.0.1/255.255.255.255
+acl PERMIT_REQUESTS type REQMOD RESPMOD
+icap_access allow localhost PERMIT_REQUESTS
+icap_access deny all
+
 # TAG: icap_access
 # Format: icap_access allow|deny [!]acl1 ...
 # Description:
@@ -515,7 +522,7 @@
 #      information about the c-icap server.
 # Default:
 #      ServerLog /usr/local/c-icap-0.4.x/var/log/server.log
-ServerLog /usr/local/c-icap-0.4.x/var/log/server.log
+ServerLog /var/log/c-icap/server.log

 # TAG: AccessLog
 # Format: AccessLog LogFile [LogFormat] [[!]acl1] [[!]acl2] [...]
@@ -530,7 +537,7 @@
 #      AccessLog /usr/local/c-icap-0.4.x/var/log/access.log
 # Example:
 #      AccessLog /usr/local/c-icap-0.4.x/var/log/access.log MyFormat all
-AccessLog /usr/local/c-icap-0.4.x/var/log/access.log
+AccessLog /var/log/c-icap/access.log

 # TAG: Logger
 # Format: Logger LoggerName
@@ -755,3 +762,7 @@
 #      memcached.use_md5_keys on

 # End module: memcached
+
+#
+Include virus_scan.conf
+Include srv_url_check.conf

--- virus_scan.conf.default
+++ virus_scan.conf
@@ -41,9 +41,12 @@
 #      Service antivirus_module virus_scan.so
 #      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 virus_scan
+AccessLog /var/log/c-icap/vscan.log myVScanFmt VSCAN

 # Load the virus_scan service:
-Service antivirus_module virus_scan.so
+Service virus_scan virus_scan.so

 #Add an alias to srv_clamav for compatibility with old service name
 ServiceAlias srv_clamav virus_scan
@@ -135,6 +138,7 @@
 #      None set. The first loaded engine will be used.
 # Example:
 #      virus_scan.DefaultEngine clamav
+virus_scan.DefaultEngine clamd

 # The following directives are related with an experimental
 # mode which I call "viralator like" mode. The virus_scan
@@ -191,7 +195,7 @@
 #      virus_scan.VirScanFileTypes ARCHIVE EXECUTABLE

 # Enable on or more antivirus engines:
-#Include clamd_mod.conf
+Include clamd_mod.conf
 #Include clamav_mod.conf

 # End module: virus_scan

--- clamd_mod.conf.default
+++ clamd_mod.conf
@@ -24,6 +24,7 @@
 #      The path of the clamd socket to use
 # Default:
 #      clamd_mod.ClamdSocket /var/run/clamav/clamd.ctl
+clamd_mod.ClamdSocket /var/run/clamav/clamd.sock

 # TAG: clamd_mod.ClamdHost
 # Format: clamd_mod.ClamdHost host

--- srv_url_check.conf.default
+++ srv_url_check.conf
@@ -30,7 +30,10 @@
 # Example:
 #      Service url_check_module srv_url_check.so

-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
+AccessLog /var/log/c-icap/url_check.log myUrlCheck URLCHECK
+Service url_check srv_url_check.so

 # TAG: url_check.EarlyResponses
 # Format: url_check.EarlyResponses on|off
@@ -106,6 +109,8 @@
 # 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 porn domain hash:/var/db/URL/BL/porn/domains "Denied Domain"
+url_check.LookupTableDB hacking url hash:/var/db/URL/BL/hacking/urls "Denied URLs"

 # TAG: url_check.LoadSquidGuardDB
 # Format: url_check.LoadSquidGuardDB DBName SquidGuardDBPath [Description]
@@ -138,7 +143,8 @@
 #      url_check.Profile BlockPorn block porn
 #      url_check.Profile default block multisurbl{127.0.0.126}
 #      url_check.Profile default pass ALL
-url_check.Profile default pass ALL
+url_check.Profile default block porn
+url_check.Profile default block hacking

 # TAG: url_check.ProfileAccess
 # Format: url_check.ProfileAccess ProfileName [!]acl1 ...

サービス起動。

# chkconfig c-icap on
# service c-icap start

動作確認。

$ c-icap-client -s virus_scan
ICAP server:localhost, ip:127.0.0.1, port:1344

OPTIONS:
        Allow 204: Yes
        Preview: 1024
        Keep alive: Yes

ICAP HEADERS:
        ICAP/1.0 200 OK
        Methods: RESPMOD, REQMOD
        Service: C-ICAP/0.4.3 server - Antivirus service
        ISTag: CI0001-tNhhlI498I5INBhx+EL74wAA
        Transfer-Preview: *
        Options-TTL: 3600
        Date: Sat, 28 May 2016 04:52:43 GMT
        Preview: 1024
        Allow: 204
        Encapsulated: null-body=0


$ c-icap-client -s url_check
ICAP server:localhost, ip:127.0.0.1, port:1344

OPTIONS:
        Allow 204: Yes
        Preview: 0
        Keep alive: Yes

ICAP HEADERS:
        ICAP/1.0 200 OK
        Methods: REQMOD
        Service: C-ICAP/0.4.3 server - Url_Check demo service
        ISTag: CI0001-XXXXXXXXX
        Transfer-Preview: *
        Options-TTL: 3600
        Date: Sat, 28 May 2016 04:49:55 GMT
        Preview: 0
        Allow: 204, 206
        X-Include: X-Client-IP, X-Server-IP, X-Authenticated-User, X-Authenticated-Groups
        Encapsulated: null-body=0

squid/ICAP連携

squid設定追加。

--- squid.conf.before
+++ squid.conf.after
@@ -84,3 +84,19 @@
 refresh_pattern ^gopher:       1440    0%      1440
 refresh_pattern -i (/cgi-bin/|\?) 0    0%      0
 refresh_pattern .              0       20%     4320
+
+# ICAP Settings
+icap_enable on
+icap_send_client_username on
+icap_send_client_ip on
+icap_client_username_encode on
+icap_client_username_header X-Authenticated-User
+
+icap_service svc_url_req reqmod_precache routing=off bypass=off icap://localhost:1344/url_check
+icap_service svc_avi_req reqmod_precache routing=off bypass=off icap://localhost:1344/virus_scan
+adaptation_service_chain srvReq svc_avi_req svc_url_req
+adaptation_access srvReq allow all
+
+icap_service svc_avi_resp respmod_precache routing=off bypass=off icap://localhost:1344/virus_scan
+adaptation_access svc_avi_resp allow all
+

設定内容チェック/サービス適用。

# squid -k parse
# squid -k reconfigure

動作確認。

  • アンチウイルス(Eicarを使用)

アップロード/リクエストの宛先は、自身で管理しているサーバ宛てにしてください。

$ curl -F "file=@/tmp/eicar.data;filename=eicar" --proxy-digest -U user:pass -x http://squid.example.jp:3128 http://yoursite.example.jp 2>/dev/null
<html>
 <head>
   <title>VIRUS FOUND</title>
</head>

<body>
<h1>VIRUS FOUND</h1>


You tried to upload/download a file that contains the virus:
   <b> Eicar-Test-Signature </b>
...

$ curl --proxy-digest -U user:pass -x http://squid.example.jp:3128 http://www.eicar.org/download/eicar.com 2>/dev/null
<html>
 <head>
   <title>VIRUS FOUND</title>
</head>

<body>
<h1>VIRUS FOUND</h1>


You tried to upload/download a file that contains the virus:
   <b> Eicar-Test-Signature </b>
<br>
The Http location is:
<b>  http://www.eicar.org/download/eicar.com </b>
...
  • URLフィルタ(ドメイン)

$ curl --proxy-digest -U user:pass -x http://squid.example.jp:3128 http://www.sex.com 2>/dev/null
<H1> Access denied </H1>

You are trying to access the URL:
<pre>
  http://www.sex.com/
</pre>
<br>
The Http host is:
<pre>
  www.sex.com
</pre>
Matched URL categories:
<pre>
porn
</pre>
The blocked category:
<pre>
porn (Denied Domain)
...
  • URLフィルタ(URL)

$ curl --proxy-digest -U user:pass -x http://squid.example.jp:3128 http://code.google.com/p/pyrit/ 2>/dev/null
<H1> Access denied </H1>

You are trying to access the URL:
<pre>
  http://code.google.com/p/pyrit/
</pre>
<br>
The Http host is:
<pre>
  code.google.com
</pre>
Matched URL categories:
<pre>
hacking
</pre>
The blocked category:
<pre>
hacking (Denied URLs)
...

squid/ssl_bump設定

ここまでの設定では、httpsによるフィルタは行われません。
httpsによるフィルタを行うためには、squidにssl-bumpの設定を追加する必要があります。

  • 公式サイトURL - 汎用

http://wiki.squid-cache.org/Features/SslBump

  • 参考URL - squid3.5

http://marek.helion.pl/install/squid.html

プライベートCA作成。

# mkdir /etc/squid/cert
# cd /etc/squid/cert
# openssl req -new -newkey rsa:2048 -sha256 -days 3650 -subj '/C=US/O=Example./CN=squid.example.jp' -nodes -x509 -keyout privCA.pem -out privCA.pem
# chgrp squid privCA.pem

クライアント用CA証明書作成。

# openssl x509 -in privCA.pem -outform DER -out privCA.der

作成した「privCA.der」を、クライアントブラウザにインポートします。

squid設定変更。

--- squid.conf.before
+++ squid.conf.after
@@ -68,7 +68,9 @@
 http_access deny all

 # Squid normally listens to port 3128
-http_port 3128
+http_port 3128 ssl-bump cert=/etc/squid/cert/privCA.pem
+ssl_bump server-first all
+sslproxy_options NO_SSLv2,NO_SSLv3,SINGLE_DH_USE

 # Uncomment and adjust the following to add a disk cache directory.
 #cache_dir ufs /var/spool/squid 100 16 256

設定内容チェック/サービス適用。

# squid -k parse
# squid -k reconfigure

動作確認。

$ curl -k --proxy-digest -U user:pass -x http://squid.example.jp:3128 https://secure.eicar.org/eicar.com
<html>
 <head>
   <title>VIRUS FOUND</title>
</head>

<body>
<h1>VIRUS FOUND</h1>


You tried to upload/download a file that contains the virus:
   <b> Eicar-Test-Signature </b>
<br>
The Http location is:
<b>  https://secure.eicar.org/eicar.com </b>
...

Sophos Anti-Virus for Linux/savdiのICAPサーバを使用

Sophos Anti-Virus for Linux/savdiのインストールはこちら

ICAP設定/動作確認。

$ c-icap-client -s sophos -p 4020
ICAP server:localhost, ip:127.0.0.1, port:4020

OPTIONS:
        Allow 204: Yes
        Preview: -1
        Keep alive: Yes

ICAP HEADERS:
        ICAP/1.0 200 OK
        ISTag: "1-02-3-64-0-5-28-235-A60D58C6"
        Service: Sophos Anti-Virus SAVDI/ICAP
        Date: 土, 18  6月 2016 05:26:56 GMT
        Allow: 204
        Methods: RESPMOD
        Transfer-Complete: *
        Options-TTL: 3500
        X-EngineVersion: 3.64.0
        X-VirusDataVersion: 5.28
        X-VirusDataFiles: 235
        Encapsulated: null-body=0

squid.confに以下の設定を追加します。

icap_service svc_sav_res respmod_precache routing=off bypass=off icap://localhost:4020/sophos
adaptation_access svc_sav_res allow all

RESPMODメソッドにしか対応していない(外部への送信時にはスキャンされない)ため、リソースに余裕があるようならclamdと併用しても良いかもしれません。
その場合はadaptation_service_chainによる連携設定を行います。

icap_service svc_avi_res respmod_precache routing=off bypass=off icap://localhost:1344/virus_scan
icap_service svc_sav_res respmod_precache routing=off bypass=off icap://localhost:4020/sophos
adaptation_service_chain srvRes svc_avi_res svc_sav_res 
adaptation_access srvRes allow all

なお、savdidはc-icapと異なり、ウイルス検知時にメッセージを出力しません。
HTTPステータス「403」でエラーになるのみなので、ウイルス検知によるものか判断するためカスタムエラーページを用意/出力すると良いかもしれません。
squid機能によるカスタムエラーを表示させる場合、squid.confに以下のような設定を追加します。

acl http_status_403 http_status 403
acl virus_found rep_header X-Blocked -i \Virus found during virus scan\.
http_reply_access deny http_status_403 virus_found
deny_info ERR_VIRUS_FOUND virus_found

上述の設定、標準の場合カスタムエラーページとして/usr/share/squid/errors/ja/ERR_VIRUS_FOUNDを用意します。

設定内容チェック/サービス適用。

# squid -k parse
# squid -k reconfigure