SSL/HTTPS対応の透過型プロキシを立てる(SSL Bump)
squid3で透過型プロキシをたてるとき、標準ではSSL/HTTPSの通信の中身を確認することは出来ない。しかし、いわゆる「SSL Bump」という、Squidの中で一度SSLをほどき、そしてsquidで処理をし終わった後に再度SSLをかけるような処理を採用することで、SSL/HTTPSのアクセスでもsquidでキャッシュをすることが出来る。
この方法は、じつは「中間者攻撃」と非常によく似ている方法なので注意が必要なのだが、squidを利用したキャッシュサーバーの構築では非常に優れている方法なので、今回はこちらを用いて透過型プロキシを構築していく。
透過型プロキシとする理由は、VPN接続時に自動的にこちらに接続されるように仕向けるため。
squid3をSSL/HTTPSに対応するようリビルド
Sourceファイルをダウンロード出来るようにaptを編集
標準でaptからインストールされるsquid3はHTTPS/SSLに対応していないので、sourceをダウンロードしオプションを追加してあげることで対応する。
まずはじめに、sourceをダウンロードできるようにリポジトリをaptに追加する。/etc/apt/sources.listに以下を追加して、apt-get update。
deb-src http://jp.archive.ubuntu.com/ubuntu/ xenial main restricted
build用のパッケージをいくつかインストール
Xenicalになっているの通りで、Ubuntu 16.04用。他のバージョンのかたは適宜書き直すこと。
その後、ビルドに必要なパッケージをインストールする。
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.12」というフォルダが出来る。インストールされるsquid3のバージョンによってはバージョン名は違うかも。
debian/rulesを編集。ここに「DEB_CONFIGURE_EXTRA_FLAGS」という形でずらずらとオプションが書いてあるので、以下2つのオプションを追加。
--with-openssl \
--enable-ssl \
--enable-ssl-crtd \
あとは、これをビルドしてdebパッケージにする。
./configure
debuild -us -uc -b
別にソースからやってもいいんだけど、debパッケージのほうがあとあと色々と楽なので、こんな手法を採用した次第。
ちなみに、結構時間がかかる。終了すると、「squid3-3.5.12」フォルダのひとつ上に以下のファイルが生成されているはずだ。
- squid3_3.5.12-1ubuntu7_all.deb
- squid_3.5.12-1ubuntu7_amd64.deb
- squid-cgi_3.5.12-1ubuntu7_amd64.deb
- squidclient_3.5.12-1ubuntu7_amd64.deb
- squid-common_3.5.12-1ubuntu7_all.deb
いらないパッケージもありそうだが、面倒なので全部インストール。どうせaptで入れたら全部入るわけだし。なお、途中で「squid-langpackがねえよ」といわれたので、こいつだけ個別にインストール。
apt-getinstallsquid-commondpkg-isquid*.deb
CA証明書の作成
以前の記事でCA証明書を作成しているので、これを流用。下記を参照のこと。このうち、「/etc/ipsec.d/cacert/cacert.pem」「/etc/ipsec.d/private/caprivatekey.pem」を用いる。
caprivatekey.pemは、以下のコマンドで作成することが可能。
opensslrsa-incaprivatekey.der-informder-outcaprivatekey.pem
SSL用のキャッシュディレクトリ作成
以下の要領で作成。
/usr/lib/squid3/ssl_crtd -c -s /var/lib/ssl_db
chown proxy:proxy -R /var/lib/ssl_db
squidの設定
/etc/squid/squid.confを開き、今回の構成にあうように設定をする。
acl all src all
acl localhost src 127.0.0.1/32
acl localnet src 10.0.0.0/8
acl localnet src 172.16.0.0/12
acl localnet src 192.168.0.0/16
acl localnet src fc00::/7
acl localnet src fe80::/10
acl SSL_ports port 443
acl Safe_ports port 80
acl CONNECT method CONNECT
http_access allow localnet
http_access allow localhost
http_port 3178 intercept
https_port 3179 intercept ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/ipsec.d/cacerts/cacert.pem key=/etc/ipsec.d/private/caprivatekey.pem
always_direct allow all
acl step1 at_step SslBump1
acl step2 at_step SslBump2
acl nobumpSites ssl::server_name [hostname]
ssl_bump peek step1
ssl_bump splice step2 nobumpSites
ssl_bump bump all
sslcrtd_program /usr/lib/squid3/ssl_crtd -s /var/lib/ssl_db -M 4MB
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
forwarded_for off
via off
cache_mem 256 MB
cache_dir ufs /var/spool/squid 51216256
maximum_object_size 65536 KB
refresh_pattern ^ftp: 144020% 10080
refresh_pattern ^gopher: 14400% 1440
refresh_pattern -i \.(gif|png|jpg|jpeg|ico)$ 1008090% 43200 ignore-expire ignore-no-cache ignore-no-store ignore-private
refresh_pattern -i \.(iso|avi|wav|mp3|mp4|mpeg|swf|flv|x-flv)$ 4320090% 432000 ignore-expire ignore-no-cache ignore-no-store ignore-private
refresh_pattern -i \.(deb|rpm|exe|zip|tar|tgz|ram|rar|bin|ppt|doc|tiff)$ 1008090% 43200 ignore-expire ignore-no-cache ignore-no-store ignore-private
refresh_pattern -i \.index.(html|htm)$ 040% 10080
refresh_pattern -i \.(html|htm|css|js)$ 144040% 40320
refresh_pattern . 040% 40320
acl shoutcast rep_header X-HTTP09-First-Line ^ICY.[0-9]
upgrade_http0.9 deny shoutcast
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
extension_methods REPORT MERGE MKACTIVITY CHECKOUT
hosts_file /etc/hosts
coredump_dir /var/spool/squid
access_log /var/log/squid/access.log squid
hierarchy_stoplist cgi-bin ?
iptablesの設定
今回、squidは80番ポート用(HTTP通信用)を3178ポートで、443ポート用(SSL通信用)を3179ポートで動かしているので、それぞれをiptablesを用いて転送するように設定。一部squidがエラーを吐き出したので、一番したの2行を追加している。
iptables -t nat -A PREROUTING -i ens3 -p tcp --dport 80 -j REDIRECT --to-port 3178
iptables -t nat -A PREROUTING -i ens3 -p tcp --dport 443 -j REDIRECT --to-port 3179
iptables -t filter -A INPUT -p tcp --dport 3178 -j ACCEPT #squidの"No forward-proxy ports configured"対策
iptables -t filter -A INPUT -p tcp --dport 3179 -j ACCEPT #squidの"No forward-proxy ports configured"対策
クライアント側での対応
クライアント側には特段あらたな設定を追加する必要はないが、squid3で使用したCA証明書がインストールされている必要がある。下記VPNの構築作業で使用したCA証明書を用いているので今回はとくに設定をしていないが、cacert.derのみ新たにインストールが必要な場合がある。iPhoneの場合は、設定の「一般」から証明書を信頼することを忘れずに。
squidを起動する
さて、これでsquidを起動する準備が整った。
systemctl start squid
systemctl status squid
きちんと動作していれば、/var/log/squid/access.logにアクセスログがずらずらと出てくるようになる。これでsquidを使ったキャッシュサーバーの構築が完了した。