SSL/HTTPS対応の透過型プロキシを立てる(SSL Bump)

2018年7月8日プロキシLinux, SSL, VPN, squid, プロキシ

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-get install squid-common
dpkg -i squid*.deb

CA証明書の作成

以前の記事でCA証明書を作成しているので、これを流用。下記を参照のこと。このうち、「/etc/ipsec.d/cacert/cacert.pem」「/etc/ipsec.d/private/caprivatekey.pem」を用いる。

caprivatekey.pemは、以下のコマンドで作成することが可能。

openssl rsa -in caprivatekey.der -inform der -out caprivatekey.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 512 16 256

maximum_object_size 65536 KB

refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i \.(gif|png|jpg|jpeg|ico)$ 10080 90% 43200 ignore-expire ignore-no-cache ignore-no-store ignore-private
refresh_pattern -i \.(iso|avi|wav|mp3|mp4|mpeg|swf|flv|x-flv)$ 43200 90% 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)$ 10080 90% 43200 ignore-expire ignore-no-cache ignore-no-store ignore-private
refresh_pattern -i \.index.(html|htm)$ 0 40% 10080
refresh_pattern -i \.(html|htm|css|js)$ 1440 40% 40320
refresh_pattern . 0 40% 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の場合は、設定の「一般」から証明書を信頼することを忘れずに。

さくらVPS上のUbuntuにstrongswanでIKEv2 VPNサーバー(証明書認証)を構築する
普段はUbuntu上に構成したStrongswanを用いているのだが、さくらのVPSで構築したOpenVPNサーバーが意外と良かったので、今回はstrongswanでIPSecなV

squidを起動する

さて、これでsquidを起動する準備が整った。

systemctl start squid
systemctl status squid

きちんと動作していれば、/var/log/squid/access.logにアクセスログがずらずらと出てくるようになる。これでsquidを使ったキャッシュサーバーの構築が完了した。

執筆者紹介

Thir

最新のガジェットを購入してはレビューする、を繰り返しています。このブログでは、ガジェットの紹介のほか、各種サーバーやスマートホームの構築などを提供しています。最近はYouTubeでもレビュー動画やVlogをあげています。(プロフィール