Debian Lenny にsquidGuardを導入

■私のはてなダイヤリーは「はてブ」のブックマーク問題に対応しています。
 ※オプトアウト版ではなく、ブックマーク自体を出来ないようにした。

 はてなブログベータは同問題に対応する方法がありませんので、私のページも「bookmark_button.js」が埋め込まれています。
 また、未対応の別のページにも対応するには、squidGuardを使います。
 補足すると、w3mで見ている分には、JavaScriptを実行しないので、下位プロキシ用です。。。

 ちなみに。以下のように「はてなサービス」を使っている方には告知されています。
 あくまで、外部からはてブと連携している場合の問題です。

 はてなサイト内での行動情報の収集は利用者に告知されている
 http://d.hatena.ne.jp/mame-tanuki/20120311/privacypolicy

 とはいえ、ここまで話が大きくなったものを言い分けしても仕方が無いので、
 ユーザ(?)が出来る対応策を提示します。

 なお、ブラウザの拡張機能の「はてブ」はFWのブロックログに引っかからないので、同jsを読み込んでいません。
 また、今後読み込む場合でも、以下の設定でsquidGuardでブロックされます。
 よって、私は今のところ、移行までは考えていません。

 移行を考えている方は「はてな」の用意している日記のエクスポート以外に私のページのスクリプトがあります。
 ※はてなベータは上述した通り、「bookmark_button.js」が埋め込まれていますので、
  対策を行うか、行動予測の規約に同意した上で閲覧して下さい。

 はてなダイヤリーのテキストモードバックアップ
 http://labunix.hateblo.jp/entry/2012/03/03/224721

■squidのブラックリストについて
 ※以下はWindows版Squidにおいて参考になった。

 参考:squid で特定のサイトをアクセス拒否する
 http://futuremix.org/2005/07/squid-access-deny

 参考:SquidによるProxyサーバの構築
 http://www2k.biglobe.ne.jp/~kuma/kuma_p/memo/linux_proxy/

 参考:squidGuard
 http://www.squidguard.org/blacklists.html

 参考:コンテンツフィルタとの連携
 http://www.server-world.info/query?os=Debian_5.0&p=squid&f=3

■今回は「DebianEdu」の公式ページをベースに行った。

 参考:DebianEduHowToSquidGuard
 http://wiki.debian.org/DebianEdu/HowTo/SquidGuard

■debian Lennyにsquidguardを導入

$ sudo apt-get install -y squidguard

■DBの場所とログ出力先を確認

$ grep var /etc/squid/squidGuard.conf
dbhome /var/lib/squidguard/db
logdir /var/log/squid

■ブラックリストファイルを準備

$ wget http://squidguard.mesd.k12.or.us/blacklists.tgz
$ sudo cp blacklists.tgz /var/lib/squidguard/db/
$ su root
# cd /var/lib/squidguard/db
# tar zxvf blacklists.tgz
# mv blacklists/* .
# rmdir blacklists

■上記を設定ファイルに反映
 ※後述の「おまけ」参照

# cp -pi /etc/squid/squidGuard.conf /etc/squid/squidGuard.conf.org
# vim /etc/squid/squidGuard.conf
$ diff /etc/squid/squidGuard.conf /etc/squid/squidGuard.conf.org
55,126d54
< dest ads {
<         domainlist      ads/domains
<         urllist         ads/urls
< }
<
< dest aggressive {
<         domainlist      aggressive/domains
<         urllist         aggressive/urls
< }
<
< dest audio-video {
<         domainlist      audio-video/domains
<         urllist         audio-video/urls
< }
< dest drugs {
<         domainlist      drugs/domains
<         urllist         drugs/urls
< }
<
< dest gambling {
<         domainlist      gambling/domains
<         urllist         gambling/urls
< }
<
<
< dest hacking {
<         domainlist      hacking/domains
<         urllist         hacking/urls
< }
<
< dest mail {
<         domainlist      mail/domains
< }
<
< dest porn {
<         domainlist      porn/domains
<         urllist         porn/urls
< }
<
< dest proxy {
<         domainlist      proxy/domains
<         urllist         proxy/urls
< }
<
< dest redirector {
<         domainlist      redirector/domains
<         urllist         redirector/urls
< }
<
< dest spyware {
<         domainlist      spyware/domains
<         urllist         spyware/urls
< }
<
< dest suspect {
<         domainlist      suspect/domains
<         urllist         suspect/urls
< }
<
<
< dest violence {
<         domainlist      violence/domains
<         urllist         violence/urls
< }
<
< dest warez{
<         domainlist      warez/domains
<         urllist         warez/urls
< }
<
<
<
151,152c79
<               pass !ads !aggressive !audio-video !drugs !gambling !hacking !mail !porn !proxy
 !redirector !spyware !suspect !violence !warez all
< #             pass     local none
---
>               pass     local none
155,156d81
< #             redirect http://www.labunix.net/block.html

■オーナー、アクセス権限の設定

# chown proxy:proxy -R /var/lib/squidguard/db/*
# find /var/lib/squidguard/db -type f | xargs chmod 644
# find /var/lib/squidguard/db -type d | xargs chmod 755
# exit

■squidGuardコマンドで設定を反映、「.db」ファイルを作成する

$ whereis -b squidGuard
squidGuard: /usr/bin/squidGuard

$ sudo /usr/bin/squidGuard --help
/usr/bin/squidGuard: invalid option -- -
Usage: squidGuard [-u] [-C block] [-t time] [-c file] [-v] [-d]
Options:
  -v          : show version number
  -d          : all errors to stderr
  -c file     : load alternate configfile
  -t time     : specify staruptime on format: yyyy-mm-ddTHH:MM:SS
  -u          : update .db files from .diff files
  -C file|all : create new .db files from urls/domain files
                specified in "file".

$ sudo -u proxy /usr/bin/squidGuard -d -C all

■squidのチェックをしましたが、「redirect_program」がありません。
 ※現状、正常に稼動していること、バージョンを確認

$ sudo grep redirect_program /etc/squid/squid.conf
$ sudo -u proxy /usr/sbin/squid -k check
$ /usr/sbin/squid -v | head -1
Squid Cache: Version 2.7.STABLE3

■「# ACCESS CONTROLS」の手前に挿入します。

 参考:SQUID 2.7.STABLE3
 http://www.spinics.net/lists/squid/msg45050.html

$ sudo cp -pi /etc/squid/squid.conf /etc/squid/squid.conf.20120311
$ sudo -u proxy vim /etc/squid/squid.conf
$ sudo diff /etc/squid/squid.conf /etc/squid/squid.conf.20120311
327,329d326
< redirect_program /usr/bin/squidGuard -c /etc/squid/squidGuard.conf
< redirect_children 8
< redirector_bypass on

■ブロック時のページを作成します。
 ※Webサーバが稼動している必要がある

$ su root -c 'echo \
  "<html><head><title>Black</title></head><body><h1>Black</h1></body></html>" \
   > /var/www/block.html'

■squidの再設定
 ※PIDがずれるようになった。これは「squidGuard.conf」と正しく連携される事で解消する。

$ sudo -u proxy /usr/sbin/squid -k reconfigure
$ sudo -u proxy /usr/sbin/squid -k check
squid: ERROR: Could not send signal 0 to process 15078: (3) No such process
$ ps -ef | grep squid | awk '{print $2}'
15170

■テスト

# echo "http://www.rotten.com / - - GET" | squidGuard -d 2>&1 | tail -5
2012-03-11 19:58:59 [15381] squidGuard 1.2.0 started (1331463539.020)
2012-03-11 19:58:59 [15381] recalculating alarm in 14461 seconds
2012-03-11 19:58:59 [15381] squidGuard ready for requests (1331463539.035)
/var/www/block.html /- - -
2012-03-11 19:58:59 [15381] squidGuard stopped (1331463539.037)

■.dbファイル

$ sudo ls -l /var/lib/squidguard/db/*/*.db | awk '{print $3":"$4" "$8}'
proxy:proxy /var/lib/squidguard/db/ads/domains.db
proxy:proxy /var/lib/squidguard/db/ads/urls.db
proxy:proxy /var/lib/squidguard/db/aggressive/domains.db
proxy:proxy /var/lib/squidguard/db/aggressive/urls.db
proxy:proxy /var/lib/squidguard/db/audio-video/domains.db
proxy:proxy /var/lib/squidguard/db/audio-video/urls.db
proxy:proxy /var/lib/squidguard/db/drugs/domains.db
proxy:proxy /var/lib/squidguard/db/drugs/urls.db
proxy:proxy /var/lib/squidguard/db/gambling/domains.db
proxy:proxy /var/lib/squidguard/db/gambling/urls.db
proxy:proxy /var/lib/squidguard/db/hacking/domains.db
proxy:proxy /var/lib/squidguard/db/hacking/urls.db
proxy:proxy /var/lib/squidguard/db/mail/domains.db
proxy:proxy /var/lib/squidguard/db/porn/domains.db
proxy:proxy /var/lib/squidguard/db/porn/urls.db
proxy:proxy /var/lib/squidguard/db/proxy/domains.db
proxy:proxy /var/lib/squidguard/db/proxy/urls.db
proxy:proxy /var/lib/squidguard/db/redirector/domains.db
proxy:proxy /var/lib/squidguard/db/redirector/urls.db
proxy:proxy /var/lib/squidguard/db/spyware/domains.db
proxy:proxy /var/lib/squidguard/db/spyware/urls.db
proxy:proxy /var/lib/squidguard/db/suspect/domains.db
proxy:proxy /var/lib/squidguard/db/suspect/urls.db
proxy:proxy /var/lib/squidguard/db/violence/domains.db
proxy:proxy /var/lib/squidguard/db/violence/urls.db
proxy:proxy /var/lib/squidguard/db/warez/domains.db
proxy:proxy /var/lib/squidguard/db/warez/urls.db

■再設定

# sudo -u proxy squidGuard -d -C all 2>&1 | tail -3
2012-03-11 20:01:06 [15483] squidGuard 1.2.0 started (1331463654.542)
2012-03-11 20:01:06 [15483] db update done
2012-03-11 20:01:06 [15483] squidGuard stopped (1331463666.025)

■initスクリプトを使い、squidとsquidGuardが連携する事で、
 PIDがきちんと認識されるようになった。

# squid -k reconfigure
squid: ERROR: Could not send signal 1 to process 15292: (3) No such process

# /etc/init.d/squid restart
# squid -k reconfigure
# squid -k check

■稼動チェック

# ps -ef | grep squid | cut -c 48-
 /usr/sbin/squid -D -YC
 (squid) -D -YC
 (squidGuard) -c /etc/squid/squidGuard.conf
 (squidGuard) -c /etc/squid/squidGuard.conf
 (squidGuard) -c /etc/squid/squidGuard.conf
 (squidGuard) -c /etc/squid/squidGuard.conf
 (squidGuard) -c /etc/squid/squidGuard.conf
 (squidGuard) -c /etc/squid/squidGuard.conf
 (squidGuard) -c /etc/squid/squidGuard.conf
 (squidGuard) -c /etc/squid/squidGuard.conf
 grep squid

■アクセスチェック
 ※Blackでは無く、Blockだろうという突っ込みは置いといて。。。

$ w3m -dump -o use_proxy=http://192.168.188.188:3128 http://www.rotten.com
Black

■ヘッダの応答が変わる。

$ w3m -dump_head -no-proxy http://www.rotten.com
HTTP/1.1 200 OK
Date: Sun, 11 Mar 2012 11:49:14 GMT
Server: Apache/2.2.20 (Unix)
Last-Modified: Thu, 07 Jul 2011 08:31:09 GMT
ETag: "2750d-7a5e-4a77689ef8d40"
Accept-Ranges: bytes
Content-Length: 31326
Connection: close
Content-Type: text/html

$ w3m -dump_head -o use_proxy=http://192.168.188.188:3128 http://www.rotten.com
HTTP/1.0 200 OK
Date: Sun, 11 Mar 2012 11:50:08 GMT
Last-Modified: Sun, 11 Mar 2012 11:50:08 GMT
Accept-Ranges: bytes
Expires: Sat, 10 Mar 2012 11:50:08 GMT
Pragma: no-cache
Vary: Accept-Encoding
Content-Type: text/html
Content-Encoding: gzip
Cache-Control: private
Content-Length: 26
X-Cache: MISS from xxx-debian-lenny
X-Cache-Lookup: MISS from xxx-debian-lenny:3128
Via: 1.1 xxx-debian-lenny:3128 (squid/2.7.STABLE3)
Connection: close

$ w3m -dump_head -o use_proxy=http://192.168.188.188:3128 http://www.labunix.net/block.html
HTTP/1.0 200 OK
Date: Sun, 11 Mar 2012 11:51:35 GMT
Last-Modified: Sun, 11 Mar 2012 11:51:35 GMT
Accept-Ranges: bytes
Expires: Sat, 10 Mar 2012 11:51:35 GMT
Pragma: no-cache
Vary: Accept-Encoding
Content-Type: text/html
Content-Encoding: gzip
Cache-Control: private
Content-Length: 26
X-Cache: MISS from xxx-debian-lenny
X-Cache-Lookup: MISS from xxx-debian-lenny:3128
Via: 1.1 xxx-debian-lenny:3128 (squid/2.7.STABLE3)
Connection: close

■プロキシの設定

$ cat /etc/apt/apt.conf
Acquire::http::Proxy "http://192.168.188.188:3128/";

$ cat /etc/profile | tail -4
export http_proxy=http://192.168.188.188:3128
export ftp_proxy=http://192.168.188.188:3128
export HTTP_PROXY=http://192.168.188.188:3128
export FTP_PROXY=http://192.168.188.188:3128

■おまけ
 以下のスクリプトを使うと、
 個人用の「personal」ディレクトリを作成、「domains/urls」でカスタマイズする事が出来る。

★destルール生成スクリプト

# echo * | for DIR in `xargs`;do \
    echo -e "dest ${DIR} {\n\tdomainlist\t${DIR}/domains\n\turllist\t\t${DIR}/urls\n}\n"; \
  done
dest ads {
        domainlist      ads/domains
        urllist         ads/urls
}

dest aggressive {
        domainlist      aggressive/domains
        urllist         aggressive/urls
}

dest audio-video {
        domainlist      audio-video/domains
        urllist         audio-video/urls
}

dest drugs {
        domainlist      drugs/domains
        urllist         drugs/urls
}

dest gambling {
        domainlist      gambling/domains
        urllist         gambling/urls
}

dest hacking {
        domainlist      hacking/domains
        urllist         hacking/urls
}

dest mail {
        domainlist      mail/domains
        urllist         mail/urls
}

dest porn {
        domainlist      porn/domains
        urllist         porn/urls
}

dest proxy {
        domainlist      proxy/domains
        urllist         proxy/urls
}

dest redirector {
        domainlist      redirector/domains
        urllist         redirector/urls
}

dest spyware {
        domainlist      spyware/domains
        urllist         spyware/urls
}

dest suspect {
        domainlist      suspect/domains
        urllist         suspect/urls
}

★passルール生成スクリプト

# echo -ne "\tpass ";echo * | for DIR in `xargs`;do echo -ne '!'"${DIR} ";done;echo "all"
        pass !ads !aggressive !audio-video !drugs !gambling !hacking !mail !porn
 !proxy !redirector !spyware !suspect !violence !warez all

★DebianEduのページの「Automatic Updates」は「TARGET」行を以下に変更する。

TARGET=/var/lib/squidguard/db

★問題になっているはてブのブラックリストの例
 ※正しく設定すると、直接アクセスしても「black」と出ます。

# grep hatena personal/*
personal/domains:b.st-hatena.com
personal/urls:b.st-hatena.com/js/bookmark_button.js