「見せない優しさ」が、会社と社員を守る。
こんにちは!「LINUX工房」管理人の「リナックス先生」です。
前回は、アクセスログの解析と可視化について学びました。
これで「誰がサボっているか」は分かるようになりましたが、監視しているだけでは根本解決になりません。
やはり、業務に不要なサイトや、セキュリティリスクのあるサイトには「最初から繋がせない」のが一番です。
先生、相談です。
先日のログ解析の結果、業務中に「転職サイト」と「動画サイト」ばかり見ている社員がいることが発覚しました…。
あと、誤って「怪しいリンク」を踏んでしまいそうになる新入社員もいて。
特定のジャンルのサイトだけ、バシッと閲覧禁止にできませんか?
もちろんできるわ。
それを「URLフィルタリング」と呼ぶの。
Squid標準の機能だけでも、「ブラックリスト(特定のサイトを拒否)」や「ホワイトリスト(特定のサイトだけ許可)」といった柔軟な運用が可能よ。
数万件のリストも高速に処理できる構成を作りましょう!
本記事では、Squidを使ったWebフィルタリングの実装方法をゼロから解説します。
設定ファイル(squid.conf)を汚さずにリストを管理する「外部ファイル化」のテクニックや、ブロック画面のカスタマイズまで、実務ですぐに使えるノウハウ満載です。
🦑 Squid完全攻略講座(バックナンバー)
- 【第1回】プロキシサーバーとは?仕組みの完全図解とインストール
- 【第2回】アクセス制御の基礎(ACL)とポート設定
- 【第3回】「誰?」を識別する認証プロキシ(Basic/Digest)の構築
- 【第4回】暗号化通信の制御!HTTPSとSSL接続の仕組み
- 【第5回】爆速化!キャッシュ機能のチューニングとメモリ管理
- 【第6回】アクセスログ解析とモニタリングの極意
- 【第7回】鉄壁の守り!フィルタリング(ブラックリスト/ホワイトリスト)
- 【第8回】トラブルシューティングと冗長化構成(PACファイル)
第1章:ブラックリスト vs ホワイトリスト(戦略を決める)
フィルタリングを導入する前に、組織としての「ポリシー(方針)」を決める必要があります。
大きく分けて2つのアプローチがあります。
1. ブラックリスト方式(性善説)
「原則として全てのアクセスを許可し、危険・不要なサイトだけをブロックする」方式です。
- メリット: ユーザーの利便性が高い。管理者のメンテナンス負担が少ない(基本は何でも見れるため)。
- デメリット: 新しい有害サイト(未知の脅威)には無力。
- 適用例: 一般的なオフィス、学校、カフェのWi-Fiなど。
2. ホワイトリスト方式(性悪説)
「原則として全てのアクセスを禁止し、業務に必要なサイトだけを許可する」方式です。
- メリット: セキュリティ強度が最強。未知のウイルスサイトも踏みようがない。
- デメリット: 利便性が最悪。「あのサイトが見れない」という申請対応で管理者が忙殺される。
- 適用例: 銀行の基幹システム端末、工場の制御用PC、個人情報を扱う専用端末。
今回は、両方のパターンの構築方法を紹介しますが、一般的な企業であれば「ブラックリスト方式」から始めるのが無難です。
第2章:【基本テクニック】ACLの外部ファイル化
第2回で学んだACL設定では、squid.conf に直接ドメインを書いていました。
acl bad_sites dstdomain .youtube.com .facebook.com .twitter.com ...
しかし、ブロックしたいサイトが100個、1000個と増えたらどうなるでしょうか?
設定ファイルが文字だらけになり、管理不能になります。
Squidでは、ACLの値を「外部のテキストファイル」から読み込むことができます。
これが実務での鉄則です。
書式
acl [ACL名] [タイプ] "ファイルパス"
パスをダブルクォーテーション " " で囲むのがポイントです。
第3章:【実践】ブラックリスト方式の構築
それでは、特定のサイト(SNS、ギャンブル、アダルトなど)をブロックする設定を作ってみましょう。
ステップ1:リストファイルの作成
まず、リストを保存するディレクトリを決めます。/etc/squid/lists/ などを作るのが良いでしょう。
sudo mkdir /etc/squid/lists sudo nano /etc/squid/lists/blacklist_domain.txt
テキストファイルの中に、ブロックしたいドメインを1行ずつ記述します。
先頭にドット . を付けると、サブドメイン(例:www.yahoo.co.jp, news.yahoo.co.jp)も全て含まれます。
blacklist_domain.txt の中身例:
.youtube.com .nicovideo.jp .facebook.com .instagram.com .twitter.com .x.com .2ch.net .5ch.net
ステップ2:squid.confの設定
sudo nano /etc/squid/squid.conf を開き、以下のように追記します。
※ ACL定義はファイルの上部、http_accessは適切な位置(allow allなどの前)に書いてください。
# --- ブラックリスト設定 開始 --- # 1. 外部ファイルを読み込んでACLを定義 acl blacklist_domain dstdomain "/etc/squid/lists/blacklist_domain.txt" # 2. ブロック適用(deny) # 一致したドメインは拒否する http_access deny blacklist_domain # --- ブラックリスト設定 終了 ---
ステップ3:反映確認
sudo systemctl reload squid
これで、リストに書かれたサイトにアクセスしようとすると「Access Denied」と表示されるはずです。
第4章:【高度】正規表現によるブロック(url_regex)
ドメイン指定だけでは防げないケースがあります。
例えば、「ドメインは無害だが、URLの中に特定のキーワード(game, adult, virus)が含まれている場合」などです。
これには url_regex(正規表現ACL)を使います。
ステップ1:キーワードリストの作成
sudo nano /etc/squid/lists/blacklist_keyword.txt
中身の例:
keyword_poker keyword_casino xxx_movie adult
ステップ2:squid.confの設定
# -i オプションは大文字小文字を区別しない(Adultもadultもブロック) acl blacklist_keyword url_regex -i "/etc/squid/lists/blacklist_keyword.txt" http_access deny blacklist_keyword
⚠️ 正規表現の注意点
正規表現(regex)は、CPU負荷が高い処理です。
数万行のキーワードリストを登録すると、Squidの動作が目に見えて重くなる可能性があります。
可能な限り dstdomain(ドメイン指定)を優先し、url_regex はどうしても必要なキーワードのみに絞るのが、高速化のコツです。
第5章:【実践】ホワイトリスト方式の構築
次は、「許可したサイト以外は全て遮断する」厳格な設定です。
専用端末やサーバー用プロキシなどで使われます。
ステップ1:許可リストの作成
sudo nano /etc/squid/lists/whitelist_domain.txt
中身の例(業務で必要なサイト):
.google.com .google.co.jp .microsoft.com .windowsupdate.com .office.com .salesforce.com .slack.com
特に Windows Update やウイルス対策ソフトの更新には多数のドメインが必要になるため、漏れがないように注意が必要です。
ステップ2:squid.confの設定
ホワイトリスト方式の場合、ロジックが重要です。
「許可リストにマッチしたら通す」→「それ以外は全て拒否」という順番で書きます。
# --- ホワイトリスト設定 開始 --- # 1. 許可リスト定義 acl whitelist_domain dstdomain "/etc/squid/lists/whitelist_domain.txt" # 2. 許可適用 http_access allow whitelist_domain # 3. その他すべて拒否(※これが最後の砦) # squid.confのデフォルトで最後に "http_access deny all" がある場合は不要ですが、 # 明示的に書く場合はここに書く。 http_access deny all # --- ホワイトリスト設定 終了 ---
第6章:ブロック画面(エラーページ)のカスタマイズ
デフォルトのブロック画面は、英語で無機質な「ERROR: The requested URL could not be retrieved」という画面です。
これだと社員が「ネットが壊れた?」と勘違いして問い合わせてくるかもしれません。
日本語で「ポリシーによりブロックされました」と表示してあげましょう。
1. 日本語エラーページの有効化
squid.conf に以下の設定を追加します。
error_directory /usr/share/squid/errors/ja
これだけで、エラー画面が日本語化されます。
2. 文言の変更
さらに親切にするために、HTMLファイルを直接編集します。
アクセス拒否時の画面ファイルは ERR_ACCESS_DENIED です。
sudo nano /usr/share/squid/errors/ja/ERR_ACCESS_DENIED
HTMLの知識があれば自由に書き換えられます。
会社のロゴを入れたり、「解除申請はこちら(リンク)」などを追記すると、情シスっぽい運用になります。
💡 HTTPSブロック時の注意
HTTPSサイト(SSL)をブロックした場合、エラー画面(HTML)が表示されず、ブラウザ標準の「接続がリセットされました」等のエラーになることがあります。
これは、エラー画面を表示するためにはSSL接続を確立する必要があるためです。
第4回の「SSLバンピング」を導入していれば、HTTPSでもカスタムエラー画面を表示することが可能になります。
第7章:トラブルシューティング Q&A
Q1. ホワイトリスト運用で、サイトのデザインが崩れる
A. CDN(コンテンツ配信ネットワーク)のドメインが許可されていません。
最近のWebサイトは、画像やCSSを別ドメイン(例:yimg.jp, cloudfront.net, googleapis.com)から読み込んでいます。
Chromeの「開発者ツール(F12)」→「Network」タブを見て、赤字(ブロック)になっているドメインを特定し、ホワイトリストに追加していく地道な作業が必要です。
Q2. 設定ファイルを変えたのに反映されない
A. squid -k reconfigure を使いましょう。
リストの中身(テキストファイル)を書き換えた場合も、Squidに再読み込みさせる必要があります。sudo systemctl reload squid または sudo squid -k reconfigure を実行してください。
Q3. “SquidGuard” というツールは必要?
A. 今回の範囲なら不要です。
昔はSquidのフィルタリング機能が貧弱だったため、SquidGuardという外部プラグインを使うのが定番でした。
しかし現在のSquidは十分高機能なので、数千行レベルのリストなら標準機能だけで問題なく処理できます。
「数百万件のURLデータベースを使って、カテゴリ単位(ギャンブル、暴力など)でフィルタしたい」というレベルなら、商用のフィルタリングソフトやSquidGuardの導入を検討してください。
まとめ:リスト管理は運用の要
お疲れ様でした!
これであなたのプロキシサーバーは、有害なサイトから組織を守る「鉄壁の盾」を手に入れました。
今回の重要ポイント:
- リストは「外部テキストファイル」で管理し、squid.confを汚さない。
- ブラックリスト(性善説)とホワイトリスト(性悪説)を使い分ける。
- 正規表現(url_regex)は強力だが重いので、ここぞという時だけ使う。
- エラー画面を日本語化して、ユーザーの混乱を防ぐ。
これでSquidの主要な機能はほぼ網羅しました。
しかし、長く運用していると「急にSquidが落ちた!」「設定ミスで起動しない!」といったトラブルに必ず遭遇します。
次回、いよいよ最終回。
「トラブルシューティングと冗長化構成(PACファイル)」です。
よくあるエラー事例とその解決策、そしてプロキシサーバーがダウンしてもネットを止めないための「冗長化(PACファイル)」の技術について解説します。
最後まで走り抜けましょう!
▼ エンジニアとしてのキャリアを加速させる ▼
フィルタリング実験
「VPS」で自分専用環境
サーバー知識を年収に
「ITエンジニア転職」


コメント