背景
数年前までは、通信は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に対応していないようなので、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
コメント多すぎるので、こちらに習って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
SSL/HTTPS対応の透過型プロキシを立てる(SSL Bump) | web net FORCE
TLS1.2が使えない環境のためのProxy (squid)設定
5分で作るPROXYサーバー
Ubuntuでsquidを使って個人プロキシサーバーを作る