0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Squidプロキシサーバ(SSL Bump)を利用したURLレベルのアクセスフィルタリング(AlmaLinux 9.4)

Posted at

squidを利用したssl終端/中継型(SSL Bump)のプロキシサーバを構築して動作検証します。

image.png

目次

環境
1.ネットワークセキュリティ設定
2.Squidインストール
3.自己署名証明書の作成
4.証明書キャッシュ作成
5.squid.conf設定
 5.1 access.logの時刻可読化
 5.2 localネットワーク設定のコメントアウト
 5.3 ポート設定およびSSL Bump設定
 5.4 ACL設定
 5.5 squid.service再起動
6.クライアントのプロキシ接続設定
 6.1 証明書インストール
 6.2 IEプロキシ設定
 6.3 winhttpプロキシ設定
7.Webアクセス確認
参考

環境

プロキシサーバ
OS:AlmaLinux 9.4
Proxy:squid-5.5-19.el9_6.1.x86_64

クライアント
OS:Windows Server 2022 Standard

1.ネットワークセキュリティ設定

今回は検証環境のため、ファイアウォール設定やSELinux設定を停止しておきます。

本番環境などについてはプロジェクトの方針に従って厳に設定してください。

settings
### 設定して再起動 ###
# systemctl disable firewalld
# grubby --update-kernel ALL --args selinux=0
# shutdown -r now


### 再起動後の確認 ###
# systemctl status firewalld
○ firewalld.service - firewalld - dynamic firewall daemon
     Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; preset: enabled)
     Active: inactive (dead)

# getenforce
Disabled

2.Squidインストール

Squidをインストールして起動します。

settings
# dnf -y install squid
(中略)
完了しました!

# systemctl enable squid
# systemctl start squid
# systemctl status squid

3.自己署名証明書の作成

オレオレ証明書を発行します。

cert_make
# mkdir /etc/squid/ssl_cert
# cd /etc/squid/ssl_cert

# openssl genrsa -out PrxCA.key 4096
# openssl req -new -x509 -days 3650 -key PrxCA.key -out PrxCA.pem \
  -subj "/C=JP/ST=Tokyo/L=Chiyoda/O=MyOffice/OU=MyDepartment/CN=MyProxy"
# openssl x509 -in PrxCA.pem -outform DER -out PrxCA.cer
ファイル 役割 配置先 形式
PrxCA.key 秘密鍵 プロキシサーバ RSA公開鍵暗号方式
PrxCA.pem 証明書、秘密鍵を含む プロキシサーバ X509形式
PrxCA.cer 証明書、公開鍵を含む クライアント DER形式

4.証明書キャッシュ作成

SquidがSSL Bumpを利用して中間者となる際に、Squidが動的に作成するクライアント向けの偽装サーバ証明書のキャッシュを作成します。

store_make
# /usr/lib64/squid/security_file_certgen -c -s /var/lib/ssl_db -M 20MB
# chown -R squid:squid /var/lib/ssl_db

偽装サーバ証明書を作成する理由としては、 「プロキシサーバから返却されたWebページ内容とサーバ証明書について、クライアント側で正しいと認識させるため」 です。

そのためにはWebページ単位で偽造サーバ証明書をSquidが作成しなければならず(動的作成)、都度作成の負荷を低減するためにキャッシュを作成しておきます。

実際の画面からも、「自己署名証明書の下位にWebサーバ証明書がある」ということになっています。
(本来はルートCA機関の証明書の下位に個別Webサーバ証明書が存在する)

①プロキシ無しの場合
image.png

②SSL Bumpプロキシ経由の場合
image.png

5.squid.conf設定

Squidの設定を実施します。事前にバックアップを取得することを推奨します。

backup
# cp -p /etc/squid/squid.conf /etc/squid/squid.conf_org
# ll /etc/squid/squid.conf*

5.1 access.logの時刻可読化

デフォルトのログ設定の場合、時刻表記がUNIX時刻となっているので、時刻フォーマットを設定して読めるようにします。
以下の内容をsquid.conf内に追記します。

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

access.logは以下のように変わります。

before
1762905331.621 69 192.168.142.51 NONE_NONE/200 0 CONNECT www.google.com:443 - HIER_DIRECT/142.251.42.196 -

after
2025/11/12 09:00:54.768 77 192.168.142.51 NONE_NONE/200 0 CONNECT www.google.com:443 - HIER_DIRECT/142.251.42.132 -


5.2 localネットワーク設定のコメントアウト

localネットワーク関連のデフォルト設定(アクセス許可設定)をコメントアウトしておきます。

configure
# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
http_access allow localnet
http_access allow localhost

↓

# http_access allow localnet
# http_access allow localhost

5.3 ポート設定およびSSL Bump設定

SSL Bumpに関する設定を実施します。
合わせてデフォルトのプロキシ受付ポート(3128)から別ポート(8088)に設定しておきます。

configure
# Squid normally listens to port 3128
http_port 3128

↓

# Squid normally listens to port 3128
# http_port 3128

http_port 8088 ssl-bump \
    cert=/etc/squid/ssl_cert/PrxCA.pem \
    key=/etc/squid/ssl_cert/PrxCA.key \
    generate-host-certificates=on dynamic_cert_mem_cache_size=20MB

sslcrtd_program /usr/lib64/squid/security_file_certgen -s /var/lib/ssl_db -M 20MB
sslcrtd_children 10

acl step1 at_step SslBump1
ssl_bump peek step1
ssl_bump bump all

下部3行についてを解説します。

acl step1 at_step SslBump1
SSL Bumpのstep1(SslBump1)について、step1というACL名を付与します。
(SSL Bumpはstep1~step3の3段階のステップがあります)

ssl_bump peek step1
step1について、peek処理を行います。
(Step1:ClientHelloの受信時、peek:TLSハンドシェイク内のSNIを見る)

ssl_bump bump all
その他のステップ(step2と3)について、bump処理を行います。
(Step2:Webサーバ接続時およびStep3:Webサーバ証明確認時に、bump:プロキシサーバとWebサーバ間でのTLSセッションを作成する)

peek/bump以外にも、splice:中継するだけ、terminate:接続終了などの処理があります。


5.4 ACL設定

URLフィルタリング処理を行います。
SSL Bump利用の醍醐味といえる、URL(URI)フィルタリングを実施します。

なお、今回は以下の許可/拒否URLをターゲットに設定をします。

■許可URL
https://ja.wikipedia.org/wiki/100

■不許可
許可URL以外、例として下記
https://ja.wikipedia.org
https://ja.wikipedia.org/wiki/1000
https://ja.wikipedia.org/wiki/10000

configure
### port
acl port_web port 80
acl port_web port 443

### method
acl CONNECT method CONNECT
acl GET method GET

### url
acl wikipedia url_regex ^https:\/\/ja\.wikipedia\.org\/wiki\/100$

### http_access
http_access allow CONNECT
http_access allow wikipedia port_web GET
http_access deny all

methodに関する記述について解説します。

クライアント/プロキシ/Webサーバ間では利用されるmethodが異なります。
[クライアント] - CONNECT -> [プロキシ] - GET -> [Webサーバ]

また、Squid/SSL Bumpにおいては各methodで以下を認識します。
・CONNECT:SNI(FQDN)・・・ja.wikipedia.org
・GET:URL(URI)・・・https://ja.wikipedia.org/wiki/100

もしmethodを意識しないでhttp_accessを記述してしまうと、CONNECTおよびGETの両methodに対して評価が走ります。 結果、URL形式でフィルタリングを掛けた場合、最初に発生する通信であるCONNECT methodはSNI認識だけをするため、CONNECT通信が遮断されます。

よって、CONNECT通信については全許可をするか、SNI(FQDN)形式でのhttp_access許可を与えておくことを推奨します。


5.5 squid.service再起動

サービス再起動を実施します。

restart
# systemctl restart squid

http_access修正については、以下のコマンドで文法チェックおよび即時反映が可能です。

squid -k parse
squid -k reconfigure

また、念のためポート開放ができているかを確認します。

check
# ss -ltn
# ss -lt

ここまででプロキシサーバ側の準備が完了しました。

6.クライアントのプロキシ接続設定

クライアント側の設定をごく簡単に記載します。

6.1 証明書インストール

証明書ファイル(PrxCA.cer)をダブルクリックし、インストールウィザードに従ってインストールしてください。
証明書ストアの選択では、 「信頼されたルート証明機関」 を選択するようしてください。

6.2 IEプロキシ設定

Windows設定メニューを開き、以下の通り遷移します。
「ネットワークとインターネット」
ー「プロキシ」
ー「手動プロキシセットアップ」

プロキシサーバを使う:オン
アドレス:プロキシサーバのIPアドレス
ポート:プロキシサーバのプロキシポート
→「保存」

6.3 winhttpプロキシ設定

ブラウザ以外のアプリケーション/システム系が利用するプロキシ設定になります。

コマンドプロンプトまたはPowershellを管理者権限で起動します。
以下のコマンドを打鍵してwinhttpプロキシ設定を行います。

> netsh winhttp set proxy [IPアドレス]:[ポート]

以下のコマンドで設定内容確認ができます。

> netsh winhttp show proxy

7.Webアクセス確認

クライアントからWebアクセス確認をします。

■許可URL
https://ja.wikipedia.org/wiki/100

■不許可
許可URL以外、例として下記
https://ja.wikipedia.org
https://ja.wikipedia.org/wiki/1000

7.1 許可URLアクセス確認

表示は崩れていますが、アクセス自体は成功しました。
image.png

アクセスログからもCONNECT/GET methodそれぞれが200 OKとなっていることが確認できました。

log
2025/11/13 00:32:11.631    153 192.168.142.51 NONE_NONE/200 0 CONNECT ja.wikipedia.org:443 - HIER_DIRECT/103.102.166.224 -
2025/11/13 00:32:11.895    263 192.168.142.51 TCP_MISS/200 54299 GET https://ja.wikipedia.org/wiki/100 - HIER_DIRECT/103.102.166.224 text/html

Webサーバ証明書について、プロキシサーバの自己署名証明の配下にwikipediaのサーバ証明書がネストされていることが確認されました。
image.png

7.2 不許可URLアクセス確認

https://ja.wikipedia.org について、アクセスNG/想定値となることが確認できました。

image.png

https://ja.wikipedia.org/wiki/1000 について、アクセスNG/想定値となることが確認できました。

image.png

なお、両ページともにWebサーバ証明書については取得できている状態でした。
image.png

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?