squid3+squidGuardによるWeb閲覧規制

子供にPCを開放し、Web閲覧できるようにしたときに問題になるのが
有害サイトの閲覧。最近では、ウィルスチェックツールなどのオプション機能
や各種ブラウザの機能(Chromeのセーフティーサーチ)、コンテンツ運営側による
フィルタリング(YouTube,Yahooなど)があるので、それらである程度は
ガードできる。

しかし設定がバラバラなのと、「有害でないが、なるべくアクセスしてほしくないサイト」などが発生したときに、個別で対応することを考えると、上記だけでは無理。

ウィルスチェックツールによるフィルタリングは、PCの負荷を上げるのと、
有償なので却下。とりあえずは、普段使用するChromeのセーフサーチ、Youtubeの
閲覧規制ONと、web閲覧を以下のSquidを使ってプロキシを経由させて、
サーバー側でフィルタリングする運用を始めることにした。

本家のURL

Squid
Squid Guard

Squidは、老舗のプロキシサーバーで、Linuxではほぼ標準でインストールだけはされている
はずである。(デフォルトでは起動してない)

Squid Guardは、Squidのサードパーティープラグインのようなもので、Squidと連動して動作する。
Squid Guardで、フィルタリング対象のドメインやURLを構築時に作成したDBで引き当てて、該当する場合はSquidサーバーに、結果を返す仕組みになっていると思われる。

インストール

Squidがインストールされてない場合は、以下でインストールする

> sudo apt-get install squid3

Squid Guardも合わせてインストールする

> sudo apt-get install squidguard

忘れないうちに、squidのランレベルの変更を行うLevel3から起動するようにする。
sysv-rc-configを起動し、squid3のレベル3~5までをONする。
(変更はspace、終了はQボタン)

> sudo sysv-rc-config

Squidの設定

アクセス制御

初期状態では、サーバーの端末からしかアクセスできないので、ローカルネットワーク全体
からアクセスできるようにする。localhostは識別子の任意の名称。
別名を付けて個別に設定することも可能だが、最小限の修正にとどめるため、
localhostの定義に便乗する。

#
# Recommended minimum configuration:
#
acl localhost src 192.168.1.0/24 #add

ポート設定

デフォルトは3128番になる。変更したい場合はユニーク番号を指定する。

# Squid normally listens to port 3128
http_port 3128

キャッシュディレクトリ、使用メモリの設定

"500"を指定して、500MBまでキャッシングできるようにする。

cache_dir ufs /var/spool/squid3 500 16 256
cache_mem 64 MB

squidが生成するページに出るホスト名

とりあえず有効にして、適当な名称を付けておく。

visible_hostname hoge.com

接続先への情報通知

以下はなくても動作上問題ない設定。
プロキシ経由になるため、セキュリティ向上の設定のひとつになる。
ひょっとすると、設定することによってWebサービスが受けれなくなる
コンテンツがあるかもしれない?

  • 相手のWebサーバにIPアドレスを知らせない
forwarded_for off
  • クライアントおよびプロキシ情報を隠蔽する
#  TAG: header_access
#       Since squid-3.0 replace with request_header_access or reply_header_access
#       depending on whether you wish to match client requests or server replies.
#Default:
# none
header_access X-Forwarded-For deny all
header_access Via deny all
header_access Cache-Control deny all

ログフォーマットの設定

後々アクセスログの解析を行う予定なので、必要最小限のログフォーマット
に変更する。logformatで識別子とフォーマットを指定して、access_logでログの出力先と識別子を指定する。

# access_log /var/log/squid3/access.log squid

logformat combined %>a %03>Hs %rm %mt %ru
access_log /var/log/squid3/access.log combined

上記のフォーマットだと、

# [client IP] [http status] [method] [mime] [URL]
192.168.1.20 200 GET text/html http://hoge.com/hoge.html
192.168.1.33 200 POST application/json http://app.hoge.com/request
:

のように出力される。

最後にsquid3用の設定ファイルに以下を追加し、squidとsquidGuardを連携させる。

url_rewrite_program /usr/bin/squidGuard -c /etc/squid/squidGuard.conf

ブラックリストの入手

まず、ブラックリストを入手する。
海外の以下のサイトで、有害サイトのブラックリストを作成しているしているので、ありがたくDLする。
(個人利用であれば、少なくとも無償)

Shalla Secure Services KG

適当な場所に展開する

> wget http://www.shallalist.de/Downloads/shallalist.tar.gz
> tar xvfz shallalist.tar.gz

カテゴリごとにサブフォルダが分かれているので、優先度の高そうなものだけを
以下にコピーする。なおコピー先の/var/lib/squidguard/dbは後述するSquidGuardが使用する
データベース用のデータ置き場になる。

> sudo cp -R aggressive drugs gamble porn spyware violence /var/lib/squidguard/db

ほかにも個別に設定したいブラックリストも今後追記すると思われるので、
同じようなフォルダ構成を作成する。good(ホワイトリスト)、bad(ブラックリスト)フォルダに
それぞれurls、domainsファイルを作成しておく。

> cd /var/lib/squidguard
> sudo mkdir -p db/local/good
> sudo mkdir -p db/local/bad
> sudo touch db/local/good/domains
> sudo touch db/local/good/urls
> sudo touch db/local/bad/domains
> sudo touch db/local/bad/urls

domainsurlsファイルはどちらも1行=1定義で列挙すればよい。
空ファイルは後述するDB作成時にエラーになるので、適当にダミーでも入れておく。

SquidGuardの設定

SquidGuardをインストールすると、以下の場所に設定ファイルが作成される。

/etc/squid/squidGuard.conf

dbhomeは、ブラックリストのルートフォルダ、logdirは、SquidGuardのログ出力先
を指定する。特に変更する必要性はない。

#
# CONFIG FILE FOR SQUIDGUARD
#
# Caution: do NOT use comments inside { }
#

dbhome /var/lib/squidguard/db
logdir /var/log/squid

time workhoursは、指定した時間帯だけ、フィルタリングが実行されるようになる。
常に稼動させる場合は、コメントアウトまたは削除しておく。

#
# TIME RULES:
# abbrev for weekdays:
# s = sun, m = mon, t =tue, w = wed, h = thu, f = fri, a = sat

#time workhours {
#        weekly mtwhf 08:00 - 16:30
#        date *-*-01  08:00 - 16:30
#}

制限するIPアドレスを指定する。たとえば、大人と子供用のIPアドレス
が明確化されているなら、グループ分けして、後述するフィルタ処理で指定する。

# 大人用
src adult_users {
  ip 192.168.1.30-192.168.1.60
}
# 子供用
src child_users {
  ip 192.168.1.61-192.168.1.62
}

特にそういうグループがないなら、ネットワーク全体を範囲とする

# ALL
src localhosts {
        ip  192.168.1.0/24
}

ブラックリストの個別の設定をおこなう。domainsとurlsファイルまでのパスを、
先に定義したdbhomeからの相対パスで記載する。

dest drugs {
        domainlist      drugs/domains
        urllist         drugs/urls
}
dest gamble {
        domainlist      gamble/domains
        urllist         gamble/urls
}
dest porn {
        domainlist      porn/domains
        urllist         porn/urls
}
dest spyware {
        domainlist      spyware/domains
        urllist         spyware/urls
}
dest violence {
        domainlist      violence/domains
        urllist         violence/urls
}
dest good {
        domainlist      local/good/domains
        urllist         local/good/urls
}
dest bad {
        domainlist      local/bad/domains
        urllist         local/bad/urls
}

アクセス制限を定義する。IPグループごとに個別にリストを定義する。
adult_usersの場合、goodは閲覧OKで、spywareは閲覧不可になる。


acl {
        adult_users {
                pass good !spyware all
        }

        child_users {
                pass good !bad !drugs !gamble !porn !spyware !violence all
        }

        default {
                pass  none
                redirect http://no-definision-ip/proxy/error.html
        }
}

ブラックリストDBの作成

以下のコマンドでDBを作成する。

> sudo /usr/bin/squidGuard -C all

いつまで経っても処理が戻らない場合は、エラーが発生している可能性が高い。
ログの内容を確認する。設定ファイルの不備などを修正して再度作成する。

> cat  /var/log/squid/squidGuard.log

:
2017-01-30 20:56:25 [13301] urllist empty, removed from memory
2017-01-30 20:56:25 [13301] /usr/bin/squidGuard: ACL destination local is not defined in configfile /etc/squid/squidGuard.conf
2017-01-30 20:56:25 [13301] Going into emergency mode

上記コマンドが成功すると、各定義のフォルダ内(porn, gambleなど)の直下に==*.db==ファイルが
作成される。今後、定義を更新したい場合は、urlsやdomainsファイルを編集して、以下のコマンドを実行して
DBを更新し、squidを再起動する。

> sudo /usr/bin/squidGuard -C /var/lib/squidguard/local/bad/domains
> sudo /usr/bin/squidGuard -C /var/lib/squidguard/local/bad/urls

DBを作成したら、PermissionをUbuntuの場合は、proxyに変更しておく。

> cd /var/lib/squidguard/db
> sudo chown -R proxy. *

Squidの起動

> sudo service squid3 restart

とりあえず正常に起動したかどうかは、ログで確認する

> sudo cat /var/log/squid3/cache.log

ブラウザのプロキシ設定

設定する内容は以下とした場合、

項目
プロキシURL 192.168.1.10
ポート番号 3128

wgetコマンドにproxy設定を引数オプションで追加して、アクセスして
ログ出力およびフィルタリングが効いているか確認する。

> wget -e HTTP_PROXY=192.168.1.10:3128 http://www.yahoo.co.jp