じゅのぶろ

社内SEが自宅でSOC/CSIRTするために色々頑張っていきたいブログ 画像が見れない場合はjavascriptを有効にするかデスクトップからご覧下さい。

Squid 4.7 ssl bumpの設定

HTTPSの暗号化通信を可視化(復号)するため
Squid 4.7にssl bumpをインストールしたので作業メモ

ssl bumpの設定

予めconfigure時に「--enable-ssl-crtd --with-openssl」を指定する必要があります。
設定されてないからは以前書いた記事を参考にしてみてください。

このあたりを参考にした。 https://wiki.squid-cache.org/Features/DynamicSslCert

root@kali:/usr/local/squid# mkdir -p /etc/squid/ssl_cert
root@kali:/usr/local/squid# chmod 700 /etc/squid/ssl_cert
root@kali:/usr/local/squid# cd /etc/squid/ssl_cert
root@kali:/etc/squid/ssl_cert# openssl req -x509 -newkey rsa:4096 -sha256 -nodes -keyout server.key -out server.crt -subj "/CN=*サーバのIPアドレス*" -days 3650
root@kali:/etc/squid/ssl_cert# openssl pkcs12 -export -inkey server.key -in server.crt -out server.p12

ここで作成したserver.p12をMacでKeyChainにインポートして常に信頼する設定にした。
iPhoneへの証明書のインストールはMacからAirDrop経由で行った(Windowsユーザはメールの添付等を利用すればよい)。

続いてsquid.confの設定

http_port 3128

#以下に書き換え

http_port 3128 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/squid/ssl_cert/server.crt key=/etc/squid/ssl_cert/server.key 

設定後squidを再起動するとエラーが出る。

2019/07/06 12:49:58| WARNING: /usr/local/squid/libexec/security_file_certgen -s /usr/local/squid/var/cache/squid/ssl_db -M 4MB #Hlpr1 exited
2019/07/06 12:49:58| Too few /usr/local/squid/libexec/security_file_certgen -s /usr/local/squid/var/cache/squid/ssl_db -M 4MB processes are running (need 1/32)
2019/07/06 12:49:58| Closing HTTP(S) port [::]:3128
2019/07/06 12:49:58| storeDirWriteCleanLogs: Starting...
2019/07/06 12:49:58|   Finished.  Wrote 0 entries.
2019/07/06 12:49:58|   Took 0.00 seconds (  0.00 entries/sec).
2019/07/06 12:49:58| FATAL: The /usr/local/squid/libexec/security_file_certgen -s /usr/local/squid/var/cache/squid/ssl_db -M 4MB helpers are crashing too rapidly, need help!
2019/07/06 12:49:58| Squid Cache (Version 4.7): Terminated abnormally.
2019/07/06 12:49:58| Removing PID file (/usr/local/squid/var/run/squid.pid)

FATALの行のコマンドを手動で実行してみた。

/usr/local/squid/libexec/security_file_certgen -s /usr/local/squid/var/cache/squid/ssl_db -M 4MB
/usr/local/squid/libexec/security_file_certgen: Uninitialized SSL certificate database directory: /usr/local/squid/var/cache/squid/ssl_db. To initialize, run "security_file_certgen -c -s /usr/local/squid/var/cache/squid/ssl_db".

先に-cオプションつけて実行しろと言われた。

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

これで起動するようになった。

ssl bumpのアクション

以下リンクをみると、どうやら5種類あるようである。 Features/SslPeekAndSplice - Squid Web Proxy Wiki peek, splice, stare, bump, terminateだが、以下の表がありましたが、実際にやってみました。 f:id:jnox:20190706135530p:plain

アクション ssl復号 証明書情報
bump
stare
peek
splice
terminate

※terminateは接続遮断用のようです。

# bump
"2019/07/06 13:12:08.237" 127.0.0.1 120 - 0 443 - "CONNECT www.google.com:443 HTTP/1.1" 200 "-" "curl/7.64.0" NONE:HIER_NONE "-" "-"
"2019/07/06 13:12:08.436" 127.0.0.1 78 172.217.25.100 13562 443 text/html "GET https://www.google.com/ HTTP/1.1" 200 "-" "curl/7.64.0" TCP_MISS:HIER_DIRECT  "-" "-"

# stare 
"2019/07/06 13:15:28.701" 127.0.0.1 120 172.217.25.100 0 443 - "CONNECT www.google.com:443 HTTP/1.1" 200 "-" "curl/7.64.0" NONE:HIER_DIRECT "/C=US/ST=California/L=Mountain View/O=Google LLC/CN=www.google.com" "/C=US/O=Google Trust Services/CN=Google Internet Authority G3"
"2019/07/06 13:15:28.828" 127.0.0.1 78 172.217.25.100 13573 443 text/html "GET https://www.google.com/ HTTP/1.1" 200 "-" "curl/7.64.0" TCP_MISS:HIER_DIRECT "/C=US/ST=California/L=Mountain View/O=Google LLC/CN=www.google.com" "/C=US/O=Google Trust Services/CN=Google Internet Authority G3"

# peek
"2019/07/06 13:18:28.284" 127.0.0.1 120 172.217.26.4 0 443 - "CONNECT www.google.com:443 HTTP/1.1" 200 "-" "curl/7.64.0" NONE:HIER_DIRECT "/C=US/ST=California/L=Mountain View/O=Google LLC/CN=www.google.com" "/C=US/O=Google Trust Services/CN=Google Internet Authority G3"
"2019/07/06 13:18:28.417" 127.0.0.1 78 172.217.26.4 13560 443 text/html "GET https://www.google.com/ HTTP/1.1" 200 "-" "curl/7.64.0" TCP_MISS:HIER_DIRECT "/C=US/ST=California/L=Mountain View/O=Google LLC/CN=www.google.com" "/C=US/O=Google Trust Services/CN=Google Internet Authority G3"

#splice
"2019/07/06 13:20:19.527" 127.0.0.1 1003 172.217.26.36 16529 443 - "CONNECT www.google.com:443 HTTP/1.1" 200 "-" "curl/7.64.0" TCP_TUNNEL:HIER_DIRECT "-" "-"

#terminate
"2019/07/06 13:20:32.914" 127.0.0.1 120 - 0 443 - "CONNECT www.google.com:443 HTTP/1.1" 0 "-" "curl/7.64.0" "NONE_ABORTED:HIER_NONE" "-" "-"

細かく設定するとハンドシェイクのどのタイミングでどのアクションを使うという設定もできるようでした。
例えば特定の条件にマッチしたらterminateで遮断であったりspliceで復号をやめる等できそうですね。 私はロギングしたいだけなので全てのタイミングでstareを使うことにした。
squid.confに以下を設定した。

http_port 3128 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/squid/ssl_cert/myCA.pem
ssl_bump stare all