SquidでWebアクセスをフィルタリングする

インフラサーバ

今回はSquidでフィルタリング設定を実施します。

Squidのインストールから始める場合は以下からどうぞ。

フィルタリング方式について

プロキシサーバの機能の一つとして、Webアクセスを制御するフィルタリング機能があります。

フィルタリングの方式としては主にホワイトリスト方式とブラックリスト方式の2つがあります。

ホワイトリスト方式

原則としてすべてのWebアクセスを拒否し、ホワイトリストと呼ばれるリストに記載されている宛先に対してのみアクセスを許可する方式です。

ブラックリスト方式

原則としてすべてのWebアクセスを許可し、ブラックリストと呼ばれるリストに記載されている宛先に対してのみアクセスを拒否する方式です。

ブラックリスト方式では、ブラック除外リストと呼ばれるリストを利用することがあります。
ブラックリストに記載されていてもブラック除外リストに記載されている場合はアクセスが許可されます。

フィルタリング設定を実施する

作業環境

  • CentOS 8.0.1905
  • Squid 4.4

ホワイトリスト方式のフィルタリング

ホワイトリスト方式でのフィルタリングを設定します。
今回は例としてドメイン google.co.jp のみアクセス可能になるよう設定してみます。

設定は設定ファイル /etc/squid/squid.conf で実施します。
アクセス制御設定は http_access で設定します。書式は以下の通りです。

http_access "allow/deny" "対象"

http_access の仕様としては以下のようになっています。

  • コンフィグ上で上の行から順に評価される
  • 最初に条件に合致した http_access 設定のアクション(allow/deny)が実行され、
    以降の行の http_access 設定は評価されない
…
http_access deny all ←★すべてのWebアクセスがこの行の条件に合致し、アクセス拒否される
http_access allow ○○ ←★この行の設定が評価されることはない
…

以上の仕様を踏まえて、ドメイン google.co.jp のみアクセス可能になるようにするためには以下の順で設定を記載すればOKです。

  1. ドメイン google.co.jp へのアクセスを許可する
  2. すべてのアクセスを拒否する

それでは実際に設定していきます。

すべてのアクセスを拒否する

設定の効果が分かりやすいようにまずはすべてのアクセスを拒否する設定をします。
squid.conf について、以下のようにフィルタリング設定の部分を編集します。

cat /etc/squid/squid.conf
#フィルタリング設定ここから----------------------------

http_access deny all  #すべてのアクセスを拒否

#フィルタリング設定ここまで----------------------------

http_port 8080

coredump_dir /var/spool/squid

refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320

logformat timefm %{%Y/%m/%d %H:%M:%S}tl %ts.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %[un %Sh/%<a %mt
access_log /var/log/squid/access.log timefm

この状態で一度動作確認をしてみます。設定の反映のため squid をリロードします。

systemctl reload squid

適当なサイトにアクセスしてみます。

http:// のサイトにアクセスしようとした場合は以下の画面となります。

https:// のサイトにアクセスしようとした場合は以下の画面となります。

すべてのアクセスが拒否されるようになったことが確認できました。

特定のドメインへのアクセスを許可する

次に、特定のドメイン google.co.jp へのアクセスを許可する設定をします。
squid.conf について、以下のようにフィルタリング設定の部分を編集します。

cat /etc/squid/squid.conf
#フィルタリング設定ここから----------------------------
acl google dstdomain .google.co.jp  #アクセスリストの定義

http_access allow google  #googleドメイン宛のアクセスを許可
http_access deny all  #すべてのアクセスを拒否

#フィルタリング設定ここまで----------------------------

http_port 8080

coredump_dir /var/spool/squid

refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320

logformat timefm %{%Y/%m/%d %H:%M:%S}tl %ts.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %[un %Sh/%<a %mt
access_log /var/log/squid/access.log timefm

フィルタリング設定の部分に2行追加しています。

acl google dstdomain .google.co.jp

上の行については、google という識別名の dstdomain 型の acl を定義しています。
destdomain 型は宛先のドメインを定義します。ここでは宛先ドメインとして .google.co.jp を指定しています。

頭に「.」を付けているのは、サブドメインも含めるという意味です。
aaa.bbb.ccc に対するサブドメインとは、xxx.aaa.bbb.ccc のようなドメインのことです。

追加したもう1行は以下です。

http_access allow google

上の行については、acl である google を許可しています。つまり、宛先ドメインが .google.co.jp の場合はアクセスを許可するということです。注意点としては http_access deny all よりも上の行に記載してください。

それでは動作確認をしてみます。 設定の反映のため squid をリロードします。

systemctl reload squid

google.co.jp のページにアクセスできるようになりました。

また、google.co.jp 以外のサイトにはアクセスできないことが確認できると思います。

ホワイトリストファイルを作成する

上の例では、google.co.jp へのみアクセスを許可する設定を行いました。
実際の運用では、より多くのドメインについて設定を行うことになると思います。
その場合、squid.conf には以下のように acl 設定が並ぶことになります。

acl whitelist dstdomain "ドメイン1"
acl whitelist dstdomain "ドメイン2"
acl whitelist dstdomain "ドメイン3"
acl whitelist dstdomain "ドメイン4"
acl whitelist dstdomain "ドメイン5"

http_access allow whitelist
http_access deny all 

(略)

対象ドメインが多い場合、squid.conf の内容が長くなってしまい設定ファイルの可読性が低くなってしまいます。
このような場合は、ドメインリストを別ファイルに記載しておいて squid.conf の acl 設定の中で別ファイルを参照させるようにすることで squid.conf の内容をすっきりさせることができます。

それではホワイトリストファイルを作成してみます。
ファイルの格納先は /etc/squid とするのが一般的なようです。
ここでは例として google と yahoo と当ブログのドメインをリストに記載しました。

cat /etc/squid/whitelist
.google.co.jp
.yahoo.co.jp
.nwengblog.com

このホワイトリストファイルを使用して squid.conf で設定します。

cat /etc/squid/squid.conf
#フィルタリング設定ここから----------------------------

acl whitelist dstdomain "/etc/squid/whitelist"  #ホワイトリストファイルを参照

http_access allow whitelist  #whitelist内ドメインへのアクセスを許可
http_access deny all  #すべてのアクセスを拒否

#フィルタリング設定ここまで----------------------------

http_port 8080

coredump_dir /var/spool/squid

refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320

logformat timefm %{%Y/%m/%d %H:%M:%S}tl %ts.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %[un %Sh/%<a %mt
access_log /var/log/squid/access.log timefm

上のフィルタリング設定の部分は以下の内容と同じ意味になります。

cat /etc/squid/squid.conf
#フィルタリング設定ここから----------------------------

acl whitelist dstdomain .google.co.jp
acl whitelist dstdomain .yahoo.co.jp
acl whitelist dstdomain .nwengbolg.com

http_access allow whitelist  #whitelist内ドメインへのアクセスを許可
http_access deny all  #すべてのアクセスを拒否

#フィルタリング設定ここまで----------------------------

(略)

ブラックリスト方式のフィルタリング

ブラックリスト方式のフィルタリング設定の考え方はホワイトリスト方式と同様です。

ブラックリスト方式の場合 squid.conf 内での http_access 設定の記載は以下のようになります。

  1. ブラック除外リスト内のドメインへのアクセスを許可する(必要に応じて設定)
  2. ブラックリスト内のドメインへのアクセスを拒否する
  3. すべてのアクセスを許可する

ブラック除外リストとブラックリストについては、ホワイトリストと同様にそれぞれ squid.conf とは別のファイルに記載して、squid.conf から読み込むようにすると良いでしょう。

以上です。

―――――――――――――

タイトルとURLをコピーしました