Squidをソースから導入してSSL Bumpを設定する

サーバOS: Ubuntu 18.04 Server
クライアントOS: Windows 10 Pro version 1903
Squid 4.9

まずはソースコードを取得するところから始める。

$ wget -c http://www.squid-cache.org/Versions/v4/squid-4.9.tar.bz2
$ wget -c http://www.squid-cache.org/Versions/v4/squid-4.9.tar.bz2.asc
$ gpg --recv-keys B06884EDB779C89B044E64E3CD6DBF8EF3B17D3E
$ gpg --verify squid-4.9.tar.bz2.asc
(snip)
gpg: Good signature from "Amos Jeffries (Squid Signing Key) <squid3@treenet.co.nz>" [unknown]

libssl-dev パッケージが不足していると configure: error: library 'crypto' is required for OpenSSL というエラーメッセージが突き付けられるから予めの導入を要する。

$ sudo apt install libssl-dev
$ sudo useradd -s /bin/false squid
$ tar jxvf squid-4.9.tar.bz2
$ cd squid-4.9/
$ ./configure --prefix=/usr/local/squid --enable-ssl-crtd --with-openssl --with-default-user=squid
$ make all
$ sudo make install

次いで自己署名証明書を生成する。これはルート証明書として取り扱うことになる。証明書のセキュリティが侵害されるとMITM攻撃に晒される恐れがあるというから十分に注意を払わねばならない。

$ cd /usr/local/squid/etc/
$ sudo openssl req -new -newkey rsa:2048 -sha256 -days 3650 -nodes -x509 -extensions v3_ca -keyout myCA.pem -out myCA.pem
$ sudo openssl x509 -in myCA.pem -outform DER -out myCA.der

作成した自己署名証明書をクライアントの端末へコピーしてインストールする。

証明書を右クリックしてコンテキストメニューから「証明書のインストール」を選択
「証明書をすべて次のストアに配置する」を選択して「参照」
「信頼されたルート証明期間」を選択して「OK」を押下す
「次へ」をクリック
「完了」をクリック
インストールを許すなら「はい」をクリック

実際に証明書がインストールされたか否かを詳らかにするため inetcpl.cpl を実行してインターネットのプロパティを開く。

「コンテンツ」タブを開いて「証明書」ボタンをクリック
インストールされたことを確認

squidサーバの設定へ戻り、証明書の所有者とパーミッションを変更してsquidユーザだけが読み取れるようにしておく。

$ sudo chown squid:squid myCA.pem
$ sudo chmod 400 myCA.pem
$ ls -l myCA.pem
-r-------- 1 squid squid 3095 Nov 24 00:05 myCA.pem

設定ファイル squid.conf の編集に移る。動的に生成された証明書をキャッシュできるメモリやディスクの容量を指定する箇所があるけれども、どの程度が適当かとんと検討がつかぬから思い切って公式サイトの手引きの4倍をセットした。

あと sslcrtd_program の項目に ssl_crtd コマンドを指定しているサイトが其処此処に見られたけれども、此れがどうしても見当たらなくてこまった。リリースノートを過去へ遡ってゆくとバージョン4.0.5からは名称が security_file_certgen へと移り変わった模様である。

$ sudo vi /usr/local/squid/etc/squid.conf
#http_port 3128
http_port 3128 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=16MB cert=/usr/local/squid/etc/myCA.pem
sslcrtd_program /usr/local/squid/libexec/security_file_certgen -s /usr/local/squid/var/cache/squid/ssl_db -M 16MB
sslcrtd_children 20
sslproxy_cert_error deny all
ssl_bump stare all

動的に生成される証明書をキャッシュしておくディレクトリを用意する為に次のコマンドを実施する。

$ sudo /usr/local/squid/libexec/security_file_certgen -c -s /usr/local/squid/var/cache/squid/ssl_db -M 16MB
Initialization SSL db...
Done

これで一通りの下拵へは済んだから愈々Squidを起動するとパーミッションにまつわるエラーメッセージでまったく起動できない。/usr/local/squid/var/ 以下の所有者を一斉に squid へと差し替えて事なきを得た。

$ sudo /usr/local/squid/sbin/squid
WARNING: Cannot write log file: /usr/local/squid/var/logs/cache.log
/usr/local/squid/var/logs/cache.log: Permission denied
         messages will be sent to 'stderr'.

$ sudo chown -R squid:squid /usr/local/squid/var/
$ sudo /usr/local/squid/sbin/squid

あとはクライアント端末のProxy設定をよしなに整えてやれば終いである。

ログを流しながらGoogle Chromeで多数のサイトを閲覧したけれどもちっともキャッシュにヒットせずTCP_MISSばかり発生するから此は如何にと思っていたらどうも先んじてGoogle ChromeのキャッシュにヒットするせいでSquidの出番がなかった模様である。

Google Chromeの起動オプションに --disk-cache-size=1 を指定して実質的にキャッシュを無効にしてから改めて試験を実施するとキャッシュにヒットした証のTCP_MEM_HITが現れるようになった。

–disk-cache-sizeを指定する。0は際限なくキャッシュするようであるから1とした
TCP_MEM_HITがたくさん見られて喜ばしいログ

参考:
Dynamic SSL Certificate Generation
Compiling Squid