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
2018.8.15 時点で、アクセス不能 → 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パッケージ
- 参考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