squidGuardを使ったコンテンツフィルタリング

Webのコンテンツフィルタリングというのは、面倒な処理になる場合がある。企業では非常に問題性の高いWebサイトだけをブロックする必要がある一方で、学校ではもっと徹底的なやり方に従うことが法律で要求されることもある。だが、どんなフィルタリングが必要になるにせよ、squidsquidGuardというオープンソースのソフトウェアとブラックリストさえあれば解決策を講じることができる。

The squidサーバは、WebブラウザとWebサイトの中間的な役割を果たす。squidは、プロキシとしてWebブラウザからURL要求を受け取り、このブラウザの代わりにWebブラウザへの接続とコンテンツのダウンロードを行い、そのコンテンツをWebブラウザに提供するのだ。また、近いうちに同じURLが要求された場合に別のブラウザにすばやく提供できるように、このコンテンツをハードディスクに保存する。一般的には、この処理によって、インターネット接続の利用効率が向上するとともにWebブラウザの応答時間が短縮される。

通常のハードウェア設定では、プロキシサーバ上の物理的なネットワークカードを2枚使用するようになっている。1枚は内部ネットワークへの接続用で、squidがデフォルトのポート3128で送られてくるHTTP要求を監視する。もう1枚はインターネット接続用で、squidはこちらからコンテンツのダウンロードを行う。

squidは、ほとんどのLinuxディストリビューションに標準パッケージとして入っている。私の場合は、ごく普通の手順でsquidをRed Hat Linuxで実行することができた。RPMをインストールし、設定ファイル/etc/squid/squid.confで下記のオプションを設定するだけである。

visible_hostname your-server-name
acl our_networks src 192.168.0.0/16
http_access allow our_networks
http_access deny all

visible_hostnameは、squidに対してサーバ名を指定する。aclhttp_accessルールで使用されるアクセスコントロールリスト(ACL)であり、内部クライアントによるsquidへの接続を許可している。セキュリティ上の理由から、ネットワーク外部のユーザがsquidを利用できないようにしておく必要がある。これは、設定の一番下に拒否(deny)ルールを追加することで実現される。

ブラウザへの指示

大半のWebブラウザは、プロキシサーバと通信していることがわかっているときには少し異なった動きをする。そこで、Firefox 2.0であれば、次のようにしてプロキシの設定を行う。「Tools」->「Options」(Macの場合は「Firefox」->「Preferences」)を選択し、「Advanced」セクションの「Network」タブの中で入力してから、「Connection」の下の「Settings」ボタンをクリックする。

Firefoxのプロキシ設定

この設定が終わるとすぐに、Webブラウザは、出した要求に対する応答をsquidから得るようになっているはずだ。

squidを使用するもう1つの方法は、透過的プロキシモードを用いることだ。透過的プロキシは、各ブラウザの設定内容に関係なく、強制的にWebトラフィックをプロキシに通すために使われることが多い。そのためには、外に出て行くHTTP要求を奪い取るネットワーク上のいくつかのトリックと、squidに対する追加調整が必要である。squidを透過的プロキシとして設定するにあたっては、他にも役に立つガイドがあるのでそちらを参照していただきたい。

リダイレクタ

追加の設定をしない限り、squidは、各URL要求に忠実に従い、該当するコンテンツを取得して返すだけである。コンテンツのフィルタリングを行うには、squidにリダイレクタという機能を持たせる。リダイレクタというのは、squidから呼ばれる別のプログラムであり、URLを調べたうえでsquidに対し、通常どおりに処理を進めるように指示するか、URLの書き換えを指示して別のコンテンツを返させるかのどちらかを行う。ほとんどの場合、リダイレクタは、禁止されたURLを書き換え、要求されたURLが適切でない理由を説明するカスタム・エラーページのURLを返す。

squirmsquidGuardなど、いくつかのリダイレクタがサードパーティによって用意されている。squirmもsquidGuardもC言語で書かれたプログラムであり、ソースからコンパイルする必要がある。squirmは正規表現で記述されたルールを利用して動作するが、squidGuardはドメインおよびURLのデータベースを利用して判断を行う。リダイレクタについては一切パフォーマンステストを実施していないが、squidGuardはスケーリングの点でもブラックリストの増加サイズの点でも定評がある。私が試した限り、squidGuardは1,000ユーザまでのネットワークでは申し分のない動作を見せていた。

squidGuard 1.2.0のインストール

squidGuardのリダイレクタのインストールは、お馴染みの「configure、make、make install」の手順で行う。システムにインストールされていない可能性のある必須コンポーネントとして、Berkeley DBライブラリ(現在はOracleが所有)がある。squidGuardは、このライブラリを使ってドメインやURLをブラックリストに追加する。

squidGuardのソースを使ってmake installを実行したあとで、一部のディレクトリが作られていないことに気付いた。そこで、以下のディレクトリは自分で作成することになった。

/usr/local/squidGuard/log/ -- for log files
/usr/local/squidGuard/db/ -- for blacklist files

続いて、サンプルの設定ファイルを/usr/local/squidGuard/squidGuard.confという名前でコピーする。ここで、簡単にsquidGuardの設定を振り返っておこう。

まず、squidに対してsquidGuardの存在を知らせるために、以下のオプションを/etc/squid.confに追加する。

redirect_program /usr/local/bin/squidGuard -c /usr/local/squidGuard/squidGuard.conf
redirect_children 8
redirector_bypass on

redirect_programオプションは、リダイレクタのバイナリと設定ファイルを指定している。また、redirect_childrenオプションは、起動するリダイレクタのプロセス数を指定している。redirector_bypassオプションには、何らかの理由でリダイレクタが利用できなくなった場合に無視するかどうかを指定する。このオプションを設定しなかった場合にsquidGuardがクラッシュまたは過負荷状態になると、squidは致命的エラーによって終了し、おそらくはWebアクセスもすべて終了することになる。