子供にPCを開放し、Web閲覧できるようにしたときに問題になるのが
有害サイトの閲覧。最近では、ウィルスチェックツールなどのオプション機能
や各種ブラウザの機能(Chromeのセーフティーサーチ)、コンテンツ運営側による
フィルタリング(YouTube,Yahooなど)があるので、それらである程度は
ガードできる。
しかし設定がバラバラなのと、「有害でないが、なるべくアクセスしてほしくないサイト」などが発生したときに、個別で対応することを考えると、上記だけでは無理。
ウィルスチェックツールによるフィルタリングは、PCの負荷を上げるのと、
有償なので却下。とりあえずは、普段使用するChromeのセーフサーチ、Youtubeの
閲覧規制ONと、web閲覧を以下のSquid
を使ってプロキシを経由させて、
サーバー側でフィルタリングする運用を始めることにした。
本家のURL
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する。
(個人利用であれば、少なくとも無償)
適当な場所に展開する
> 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
domains、urlsファイルはどちらも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