Squidを使ってHTTPSのWebサイトへの通信を復号してみよう

:::note warn
この記事で紹介する設定は動作確認を目的とし、検証用のローカルネットワークで使用することを前提とするものです。本番環境でSquidを運用する場合は、セキュアな設定になるよう公式ドキュメント等をご確認ください。
:::

# 環境

Ubuntu 24.04 LTS (WSL)

# ひとまずSquidを動かしてみる

```
~$ sudo apt update
~$ apt search ^squid
...
squid/noble 6.6-1ubuntu5 amd64
  Full featured Web Proxy cache (HTTP proxy GnuTLS flavour)
...
squid-openssl/noble 6.6-1ubuntu5 amd64
  Full featured Web Proxy cache (HTTP proxy OpenSSL flavour)
```
`squid` の方はインストールしてもSSL復号には対応できないため、`squid-openssl` を入れます。
```
~$ sudo apt install squid-openssl
```
```
~$ squid -v
Squid Cache: Version 6.6
Service Name: squid
Ubuntu linux
...
```
systemdでSquidのステータスを確認します。問題なくインストールできている場合は `active (running)` となります。
```
~$ sudo systemctl status squid
● squid.service - Squid Web Proxy Server
     Loaded: loaded (/usr/lib/systemd/system/squid.service; enabled; preset: enabled)
     Active: active (running) since Fri 2024-06-28 22:36:42 JST; 14min ago
...
```

## ポート開放

```
~$ sudo ufw status
sudo: ufw: command not found
```
ufwがデフォルトでは入っていなかったためインストールします。
```
~$ sudo apt install ufw
```
ufwを有効にしてSquidのデフォルトのポート8080を開放します。
```
~$ sudo ufw status
Status: inactive
~$ sudo ufw enable
~$ sudo ufw allow 8080
~$ sudo ufw reload
~$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
8080                       ALLOW       Anywhere
8080 (v6)                  ALLOW       Anywhere (v6)
```

## 動作に必要な最低限の設定を行う

設定ファイルのバックアップを取り、パーミッションを書き込み不可に変更します。
```
~$ sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.default
~$ sudo chmod a-w /etc/squid/squid.conf.default
~$ ll /etc/squid/squid.conf.default
-r--r--r-- 1 root root 351158 Jun 29 10:15 /etc/squid/squid.conf.default
```

最低限の設定を入れます。（元々あった記載はすべて削除します）
```
~$ sudo vim /etc/squid/squid.conf
```
```conf:squid.conf
# ポートを指定
http_port 8080
# すべての通信を許可する
http_access allow all
# キャッシュしない
cache deny all
# 日時を読みやすいフォーマットに変更
logformat localtime %{%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 localtime
```
設定を反映させるためにSquidを再起動します。
```
~$ sudo systemctl restart squid
```

:::note
logformatについてはこちらの記事もどうぞ
:::

https://qiita.com/yocaji/items/f452802dedf3c4bc18c5

## HTTPのWebサイトへの通信を見てみる

適当なPCにプロキシを設定します。

:::note
WSLが入っているのと同じマシンであればlocalhostでOKです
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160235/f2ebc24f-2d21-1d11-52ce-aebec44e9359.png)

Squidのログを表示しておきます。
```
~$ sudo tail -f /var/log/squid/access.log
```

:::note
ログ表示を止めるときは `Ctrl+c`
:::

プロキシを設定したPCでHTTPのWebサイトにアクセスします。
例）[環境省_日光湯元ビジターセンター_奥日光の自然](http://nikkoyumoto-vc.com/nature/)
```
2024-06-30 15:54:46.239     69 ::1 TCP_MISS/200 5751 GET http://nikkoyumoto-vc.com/nature/ - HIER_DIRECT/157.112.189.57 text/html
```
アクセスしたWebサイトへのリクエストがログに表示されたら成功です。

:::note
`TCP_MISS` の `MISS` というのはキャッシュが存在しなかったことを示すコードであるため、問題ありません。
[Squid Log Files | Squid Web Cache wiki](https://wiki.squid-cache.org/SquidFaq/SquidLogs)
:::

## HTTPSのWebサイトへの通信を見てみる

HTTPSのWebサイトにアクセスします。
例）[尾瀬の見どころ | 尾瀬保護財団](https://oze-fnd.or.jp/oza/a-sp/)

```
2024-06-30 15:55:54.412   7021 ::1 TCP_TUNNEL/200 32381 CONNECT oze-fnd.or.jp:443 - HIER_DIRECT/194.91.3.126 -
```
HTTPSの場合、プロキシサーバーからはCONNECTの通信しか見えず、アクセス先のドメインしか分かりません。通常、HTTPSでは第三者（プロキシサーバー）が通信を覗き見ることはできないことが分かります。

# HTTPSのWebサイトへの通信を復号できるようにする

SSL Bumpを利用してHTTPSの通信も見えるようにします。

## 鍵と証明書のペアを生成する
```
~$ cd /etc/squid/
```
```
/etc/squid$ sudo openssl req -new -newkey rsa:2048 -days 3653 -nodes -x509 -keyout bump.key -out bumpCA.crt
---
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:Squid Private CA
Email Address []:
```

## DHパラメーターのファイルを生成する

```
/etc/squid$ sudo openssl dhparam -outform PEM -out bump_dhparam.pem 2048
```
```
/etc/squid$ cd
```

## 生成したファイルのパーミッションを変更する

```
~$ ll /etc/squid
total 376
drwxr-xr-x  3 root root   4096 Jun 30 15:15 ./
drwxr-xr-x 90 root root   4096 Jun 30 13:01 ../
-rw-------  1 root root   1704 Jun 30 15:14 bump.key
-rw-r--r--  1 root root   1306 Jun 30 15:15 bumpCA.crt
-rw-r--r--  1 root root    424 Jun 30 15:15 bump_dhparam.pem
drwxr-xr-x  2 root root   4096 Jun 28 22:36 conf.d/
-rw-r--r--  1 root root   1791 Apr  1 17:03 errorpage.css
-rw-r--r--  1 root root    659 Jun 30 14:30 squid.conf
-r--r--r--  1 root root 351158 Jun 29 10:15 squid.conf.default
```
```
/etc/squid$ sudo chown proxy:proxy /etc/squid/bump*
/etc/squid$ sudo chmod 400 /etc/squid/bump*
```
```
~$ ll /etc/squid
total 376
drwxr-xr-x  3 root  root    4096 Jun 30 15:15 ./
drwxr-xr-x 90 root  root    4096 Jun 30 13:01 ../
-r--------  1 proxy proxy   1704 Jun 30 15:14 bump.key
-r--------  1 proxy proxy   1306 Jun 30 15:15 bumpCA.crt
-r--------  1 proxy proxy    424 Jun 30 15:15 bump_dhparam.pem
drwxr-xr-x  2 root  root    4096 Jun 28 22:36 conf.d/
-rw-r--r--  1 root  root    1791 Apr  1 17:03 errorpage.css
-rw-r--r--  1 root  root     659 Jun 30 14:30 squid.conf
-r--r--r--  1 root  root  351158 Jun 29 10:15 squid.conf.default
```

## 証明書DBを用意する

```
~$ sudo mkdir /var/lib/squid
~$ sudo /usr/lib/squid/security_file_certgen -c -s /var/lib/squid/ssl_db -M 16MB
Initialization SSL db...
Done
/etc/squid$ sudo chown -R proxy:proxy /var/lib/squid
```
```
~$ ll /var/lib/squid
total 12
drwxr-xr-x  3 proxy proxy 4096 Jun 30 15:21 ./
drwxr-xr-x 34 root  root  4096 Jun 30 11:18 ../
drwxr-xr-x  3 proxy proxy 4096 Jun 30 15:21 ssl_db
```

## squid.confに設定を追加する

```
~$ sudo vim /etc/squid/squid.conf
```
```conf:squid.conf
# SSL Bumpのオプションを追加
http_port 8080 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=16MB tls-cert=/etc/squid/bumpCA.crt tls-key=/etc/squid/bump.key cipher=HIGH:MEDIUM:!LOW:!RC4:!SEED:!IDEA:!3DES:!MD5:!EXP:!PSK:!DSS options=NO_TLSv1,NO_SSLv3,SINGLE_DH_USE,SINGLE_ECDH_USE tls-dh=prime256v1:/etc/squid/bump_dhparam.pem
# 証明書生成設定
sslcrtd_program /usr/lib/squid/security_file_certgen -s /var/lib/squid/ssl_db -M 16MB
# 証明書の検証エラーでも許可する
sslproxy_cert_error allow all
# すべての通信をデコード対象とする
ssl_bump stare all

http_access allow all
cache deny all
logformat localtime %{%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 localtime
```
設定を反映させるためにSquidを再起動します。
```
~$ sudo systemctl restart squid
```

## クライアントPCに証明書をインポートする

プロキシを設定するPCに証明書を配置し、インポートします。
```
$ sudo cp /etc/squid/bumpCA.crt /mnt/c/Users/Yocaji/Desktop/
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160235/405609b4-c024-5a16-e9f9-06e0ec8148fd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160235/8f578dd4-d70e-d2b6-6cc9-86d30d51fac0.png)

## HTTPSのWebサイトにアクセスする

Squidのログを表示しておきます。
```
$ sudo tail -f /var/log/squid/access.log | grep oze
```
HTTPSのWebサイトにアクセスし、CONNECTだけでなくGETリクエストのログも表示されたら成功です。
```
2024-06-30 15:41:09.926     43 ::1 NONE_NONE/200 0 CONNECT oze-fnd.or.jp:443 - HIER_DIRECT/194.91.3.126 -
2024-06-30 15:41:10.626    699 ::1 TCP_MISS/200 27728 GET https://oze-fnd.or.jp/oza/a-sp/ - HIER_DIRECT/194.91.3.126 text/html
```
この時、ブラウザで証明書を確認すると本来のアクセス先の証明書ではなくSquidの証明書となっていることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160235/dfa86803-b4e5-de84-21c1-43cd5c889c6c.png)


# 参考サイト

- [How to install a Squid server | Ubuntu](https://ubuntu.com/server/docs/how-to-install-a-squid-server)
- [Squid サービスでの SSL Bump の設定](https://support.kaspersky.com/KWTS/6.0/ja-JP/166244.htm)
- [技術メモメモ: SquidのSSL Bumpを使ってHTTPS (SSL) 通信を可視化する](https://tech-mmmm.blogspot.com/2021/09/squidssl-bumphttps-ssl.html)