HTTPS対応のプロキシサーバー構築

# 背景
数年前までは、通信はHTTPばかりばかりだったので、プロキシサーバーを経由してアクセス元を隠蔽することは簡単だった。しかし、ここ数年でHTTPSが増えたことで、サーバー・クライアント間がセキュアに繋がり、隠蔽された通信が行われるようになったため、プロキシサーバーが一度中間にたってクライアントにわたすという手順が踏めなくなった。
とはいえ、アクセス元を隠蔽したいという需要は減っていない。ゆえに、HTTPSでもプロキシサーバーが通信を仲介できるような仕組みを構築する。

# 注意点
本手法は、本来サーバー・クライアント間でセキュア通信するはずのHTTPSプロトコルを、プロキシサーバーが一度デクリプションして読み取れる状態にすることから、サーバー・クライアント間の通信の機密性と完全性を侵害します。
利用の前に、クライアントに危険性をしっかり説明して、合意を得てください。さもなければ法的な問題が生じる可能性があります。

# 環境
Amazon EC2
Ubuntu Server 18.04 LTS

# squidのビルド
CentOS7だとsquidをインストールした際にSSL_BUMPが有効になっているらしいが、Ubuntuだとなってないようなので、ソースコードからビルドする。

`/etc/apt/sources.list`に以下を追加して、

```
deb-src http://jp.archive.ubuntu.com/ubuntu/ bionic main restricted
```

`sudo apt-get update`を実行する。

その後、依存関係をインストールする。

```
sudo apt install devscripts build-essential fakeroot libssl-dev libldap2-dev libpam0g-dev libdb-dev cdbs libsasl2-dev debhelper libcppunit-dev libkrb5-dev comerr-dev libcap2-dev libecap3-dev
```

以下でソースコードを取得する。

```
apt-get source squid3
```

以下の設定ファイルを開いて、ビルドパラメータを追加。
squid3-3.5.27/debian/rules

```
--with-openssl \
--enable-ssl \
--enable-ssl-crtd \
```

ビルド実行

```
./configure
debuild -us -uc -b
```

```
dpkg-checkbuilddeps: error: Unmet build dependencies: libexpat1-dev libxml2-dev pkg-config libnetfilter-conntrack-dev nettle-dev libgnutls28-dev dh-apparmor
```

エラーで落ちるので、以下を実行

```
sudo apt-get install libexpat1-dev libxml2-dev pkg-config libnetfilter-conntrack-dev nettle-dev libgnutls28-dev dh-apparmor
```

再度ビルド実行

```
debuild -us -uc -b
```

[squid3.5.27はopensslのv1.1に対応していない](http://squid-web-proxy-cache.1019090.n4.nabble.com/Build-errors-with-Squid-3-5-24-under-Debian-td4681637.html)ようなので、v1.0をインストールする。

```
sudo apt-get purge libssl-dev
sudo apt-get install libssl1.0-dev
```

再度ビルド実行

```
debuild -us -uc -b
```

一つ上のディレクトリにdebファイルができているので、インストールする。

```
sudo dpkg -i squid*.deb
```

依存関係が足りていないので、以下のコマンドでインストール

```
apt --fix-broken install
```

再度インストール

```
sudo dpkg -i squid*.deb
```

やっとインストール完了

# CA証明書の作成
適当なディレクトリを作成して、以下を実行。

```
openssl req -new -newkey rsa:2048 -sha256 -days 365 -nodes -x509 -extensions v3_ca -keyout myCA.pem  -out myCA.pem
```

# キャッシュディレクトリの作成
以下のコマンドで、キャッシュディレクトリを作成する。

```
sudo /usr/lib/squid3/ssl_crtd -c -s /var/lib/ssl_db
sudo chown proxy:proxy -R /var/lib/ssl_db
```

# squidの設定
以下の設定ファイルを書き換える。

/etc/squid/squid.conf

コメント多すぎるので、[こちら](https://qiita.com/setouchi/items/e0d1a55f532dec15119e)に習ってviのコマンドでコメント消す。

```
:%s/^#.*$//g
:g/^$/d
```

以下をコメントアウト

```
http_access deny all
http_port 3128
```

末尾に以下を追記。`cert=`の部分は、CA証明書を作成した箇所を指定して、`YOUR_IP_ADDRESS`と書いた部分は、アクセスを許可するIPアドレスを指定する。

```
visible_hostname proxy.server
http_port 10080 ssl-bump \
  cert=/home/ubuntu/key/myCA.pem \
  generate-host-certificates=on dynamic_cert_mem_cache_size=4MB
acl myacl src YOUR_IP_ADDRESS/24
http_access allow myacl
http_access deny all
forwarded_for off
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all
reply_header_access X-Forwarded-For deny all
reply_header_access Via deny all
reply_header_access Cache-Control deny all
acl step1 at_step SslBump1
ssl_bump peek step1
ssl_bump bump all
```

# squidの起動

キャッシュを削除し、

```
sudo squid -z
```

以下のコマンドでsquidを起動

```
sudo systemctl start squid
```

ステータス確認

```
sudo systemctl status squid
```

# EC2のネットワーク設定
ここまでの状態でプロキシサーバーが起動するので、EC2のコンソールから10080ポートを開ける。

# クライアント側の設定
EC2インスタンスに割り当てられているIPアドレスを確認して、PCのプロキシ設定から、プロキシサーバーの10080ポートを指定する。

# 証明書のインストール
CA証明書の作成にて作成した証明書を、プロキシを利用するPC上でインストールし、常に信頼するようにする。
これをしないと全httpsサイトで警告が出るようになる。

# 参考
[squid-cache wiki](https://wiki.squid-cache.org/Features/SslPeekAndSplice)
[SSL/HTTPS対応の透過型プロキシを立てる（SSL Bump） | web net FORCE](https://webnetforce.net/squid-ssl-bump/)
[TLS1.2が使えない環境のためのProxy (squid)設定](http://kikumoto.hatenablog.com/entry/2016/06/04/124922)
[5分で作るPROXYサーバー](https://qiita.com/pcnikki/items/404329f9ad9cb6e235d4)
[Ubuntuでsquidを使って個人プロキシサーバーを作る](https://qiita.com/setouchi/items/e0d1a55f532dec15119e)