【Squid講座 第2回】鉄壁の守り!ACL(アクセス制御)の極意とポート変更によるセキュリティ強化

「誰でも通す」のは、泥棒に鍵を渡すのと同じ。

こんにちは!「LINUX工房」管理人の「リナックス先生」です。
前回は、Squidをインストールして、とりあえずインターネットに繋がるところまで確認しましたね。

しかし、今の状態は「鍵のかかっていない玄関」と同じです。
もし誰かにIPアドレスを知られたら、勝手にあなたのサーバーを踏み台にして、悪さをされてしまう危険性があります。

コウ君

先生、それは怖いです!
それに、会社で導入するなら「仕事に関係ないYouTubeは見ちゃダメ」とか、「経理部の人しか会計システムには繋げない」みたいな設定もしたいです。
Squidならそういう細かい制御もできるんですよね?

リナックス先生

もちろんよ、コウ君。
それを行うのが「ACL(アクセスコントロールリスト)」という機能。
Squidの設定ファイルは、このACLの塊と言ってもいいわ。
今回は、プロキシ管理者の必須スキルである「許可と拒否のルール作り」をマスターしましょう!

本記事では、Squidの設定ファイル squid.conf の読み方を理解し、IPアドレス制限、特定サイトのブロック、そしてポート番号の変更といった、実務で必須のセキュリティ設定をハンズオン形式で学びます。

🦑 Squid完全攻略講座(バックナンバー)

  • 【第1回】プロキシサーバーとは?仕組みの完全図解とインストール
  • 【第2回】アクセス制御の基礎(ACL)とポート設定
  • 【第3回】「誰?」を識別する認証プロキシ(Basic/Digest)の構築
  • 【第4回】暗号化通信の制御!HTTPSとSSL接続の仕組み
  • 【第5回】爆速化!キャッシュ機能のチューニングとメモリ管理
  • 【第6回】アクセスログ解析とモニタリングの極意
  • 【第7回】鉄壁の守り!フィルタリング(ブラックリスト/ホワイトリスト)
  • 【第8回】トラブルシューティングと冗長化構成(PACファイル)

第1章:Squidの心臓部「squid.conf」の構造

Squidの挙動は、すべて /etc/squid/squid.conf という一つのテキストファイルで制御されています。
まずはこのファイルを開いて、中身を見てみましょう。

1. 編集前の鉄則:バックアップ

設定ファイルをいじる前の「お約束」です。
失敗しても初期状態に戻せるよう、必ずバックアップを取りましょう。

sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.bak

2. コメント行の除去(見やすくする)

デフォルトの squid.conf は、親切すぎてコメント(# で始まる説明文)が大量に書かれており、非常に読みづらいです。
学習のために、コメントを除外した「有効な設定行」だけを表示してみましょう。

grep -v "^#" /etc/squid/squid.conf | grep -v "^$"

すると、意外と短いことがわかります。
重要なのは、主に以下の2種類の行です。

  1. acl ... : 定義(グループ分け)をする行
  2. http_access ... : 許可/拒否のルールを適用する行

第2章:ACLとhttp_accessの「黄金ルール」

Squidのアクセス制御は、「定義(ACL)」して「適用(Access)」する、という2ステップで行われます。
これを理解していないと、設定は書けません。

ステップ1:ACL(定義)

まず、「制御したい対象」に名前を付けます。
「社員PC」「経理部」「YouTube」といったグループを作るイメージです。

書式: acl [名前] [タイプ] [値]

# 例:社内LAN(192.168.1.0/24)を "lan_users" と名付ける
acl lan_users src 192.168.1.0/24

ステップ2:http_access(適用)

次に、定義したグループに対して「許可(allow)」するか「拒否(deny)」するかを決めます。

書式: http_access [allow|deny] [名前]

# 例:lan_users からのアクセスを許可する
http_access allow lan_users

【超重要】ルールは「上から順」に評価される

ここが今回最大のポイントです。
http_access は、上から順番にチェックされ、最初にマッチしたルールで確定します。

  1. 1行目で「許可」されたら → 即通過(2行目以降は見ない)。
  2. 1行目で「拒否」されたら → 即ブロック(2行目以降は見ない)。
  3. 最後までどのルールにもマッチしなかったら → デフォルトの挙動(通常は拒否)になる。

つまり、「拒否ルール」は「許可ルール」よりも上に書かないと意味がありません。
「全員通してよし!」と言った後に「あ、田中君はダメ」と言っても遅いのです。


第3章:よく使うACLタイプ一覧

制御に使える条件(タイプ)はたくさんあります。
代表的なものを覚えておきましょう。

タイプ 意味 設定例
src 送信元IPアドレス
(Source)
acl my_pc src 192.168.1.5
(特定のPCを指定)
dstdomain 宛先ドメイン
(Destination Domain)
acl bad_site dstdomain .yahoo.co.jp
(Yahoo全体を指定)
dst 宛先IPアドレス acl bad_ip dst 203.0.113.10
port 宛先ポート番号 acl ssh_port port 22
method HTTPメソッド acl connect_method method CONNECT
(HTTPS接続など)
time 時間帯 acl work_time time M T W H F 09:00-18:00
(平日9時〜18時)

第4章:実践!アクセス制御シナリオ

では、具体的なシナリオに沿って設定を書いてみましょう。
sudo nano /etc/squid/squid.conf でファイルを開き、編集してください。

シナリオA:特定のPC(社長)だけYouTube禁止

IPアドレス 192.168.1.50(社長)は、.youtube.com へのアクセスを禁止しますが、それ以外は許可します。

設定の記述場所:
デフォルトで書かれている http_access allow localhost などの後、http_access deny all の前あたりに追記します。

# --- ここから追記 ---

# 1. 定義 (ACL)
acl boss_pc src 192.168.1.50
acl youtube dstdomain .youtube.com

# 2. 適用 (http_access) ※拒否を先に書く!
# 社長 かつ YouTube なら拒否
http_access deny boss_pc youtube

# それ以外の社内LANは許可
acl lan_net src 192.168.1.0/24
http_access allow lan_net

# --- ここまで ---

設定を変更したら、必ず構文チェックと再起動を行います。

# 構文チェック(エラーが出なければOK)
squid -k parse

# 再起動
sudo systemctl restart squid

シナリオB:勤務時間外のみネット接続を許可

「平日9:00〜17:00はアクセス禁止」という厳しいルールを作ってみましょう。

# 時間の定義 (M=月, T=火, W=水, H=木, F=金)
acl work_hours time M T W H F 09:00-17:00

# 勤務時間中は拒否
http_access deny work_hours

# それ以外は許可
http_access allow lan_net

第5章:セキュリティ強化!ポート番号の変更

Squidのデフォルトポート 3128 は、攻撃者にも周知の事実です。
このまま公開していると、「オープンプロキシ探索ツール」の標的になりやすいです。
ポートを 808010080 などに変更して、少しでもリスクを下げましょう。

今回は 8080 に変更してみます。
しかし、ただ設定を変えるだけでは起動しません(ここが罠です!)。

手順1:squid.confの変更

以下の行を探して書き換えます。

# http_port 3128
http_port 8080

手順2:ファイアウォールの変更

新しいポート(8080)を開け、古いポート(3128)を閉じます。

sudo firewall-cmd --add-port=8080/tcp --permanent
sudo firewall-cmd --remove-service=squid --permanent
sudo firewall-cmd --reload

手順3:【最重要】SELinuxの設定変更

AlmaLinuxなどのRHEL系OSでは、SELinuxが「Squidは3128以外使っちゃダメ!」と監視しています。
この許可を与えないと、Squidは起動エラーになります。

まず、管理ツールを入れます(入っていない場合)。

sudo dnf install policycoreutils-python-utils -y

次に、Squidが使えるポート一覧を確認します。

sudo semanage port -l | grep squid_port_t
# squid_port_t  tcp  3128, 3401, 4827

ここに 8080 を追加します。

sudo semanage port -a -t squid_port_t -p tcp 8080

これで準備完了です。Squidを再起動しましょう。

sudo systemctl restart squid

クライアント(ブラウザ)側のプロキシ設定も、ポート 8080 に変更するのを忘れずに!


第6章:トラブルシューティング「ブロックできない?」

Q1. 設定したのにYouTubeが見れてしまう

A. ルールの順番を確認してください。
http_access deny ... の記述が、http_access allow allhttp_access allow lan_net よりもに書いてありませんか?
Squidは最初にマッチしたルールを採用します。拒否ルールは必ず許可ルールより上に書いてください。

Q2. 設定を変更したのに反映されない

A. 再起動(またはリロード)を忘れずに。
設定ファイルを書き換えただけでは反映されません。
sudo systemctl reload squid を実行してください。これなら通信を切断せずに設定だけ読み直せます。

Q3. HTTPSサイト(SSL)でドメインブロックが効かない

A. HTTPSの仕様上の限界です(次回解説)。
通常のプロキシ設定では、HTTPS通信の中身(URLのパスなど)は見えません。
ただし、dstdomain によるドメイン単位のブロックは、SSL接続時の「CONNECTメソッド」の宛先を見ることで、ある程度は機能します。
より厳密に行うには「SSLバンピング」が必要になりますが、これは第4回で詳しく解説します。


まとめ:ACLを制する者はSquidを制す

お疲れ様でした!
今回はSquidの要である「アクセス制御」をマスターしました。

今回の重要ポイント:

  • ACLで「定義」し、http_accessで「適用」する。
  • ルールは「上から順」に評価され、マッチしたら即確定する。
  • 拒否ルールは許可ルールより上に書くのが鉄則。
  • ポート変更時はSELinuxの設定も忘れずに。

これで、「特定の人は通す」「特定のサイトはブロックする」という基本運用ができるようになりました。
しかし、IPアドレス制限だけでは不十分な場合があります。
社員が勝手にIPを変えたり、社外からアクセスしたい場合はどうすればいいでしょう?

次回、第3回は「『誰?』を識別する認証プロキシ(Basic/Digest)の構築」です。
ユーザー名とパスワードを知っている人だけが使える、よりセキュアなプロキシ環境を構築します。
お楽しみに!

▼ エンジニアとしてのキャリアを加速させる ▼

プロキシ構築を実践
「VPS」で自分専用環境

おすすめVPSを見る

サーバー知識を年収に
「ITエンジニア転職」

転職エージェントを見る

コメント