2021年9月11日土曜日

SquidのSSL Bumpを使ってHTTPS (SSL) 通信を可視化する

近年はセキュリティの観点から、Web通信はHTTPではなくHTTPS (HTTP over SSL/TLS) が利用されることが多い。HTTPSはブラウザとWebサーバ間の通信が暗号化されるため、当然ではあるが、通信の詳細な情報を第三者が確認することはできない

しかし、近年はフィッシング詐欺などの悪意のあるサイトであっても、SSLサーバ証明書を導入しHTTPS通信とすることで、一見問題がないようなサイトと偽装することも多くなっている。そのような危険な通信を可視化することためには、一度HTTPSの通信を復号し、セキュリティチェックを実施したうえで、再度暗号化することが定番の手法となっている。

復号した通信であれば、通信ログをSIEMなどのログ管理・分析ツールに連携したり、サンドボックスなどで通信先サイトへアクセスした際の振る舞い検知などが実施でき、セキュリティの強化が可能となる。
※ただし、復号化と暗号化処理が増えることから、専用のネットワーク機器ではない場合はスループットが極端に落ちるため、導入時は注意すること。

プロキシサーバとして昔から利用されるOSS製品である「Squid」においても、「SSL Bump」と呼ばれる機能にて実装が可能である。

本記事では、SquidのSSL Bumpを有効化し、HTTPS (SSL) 通信を可視化する手順を記載する。

環境

  • OS : CentOS 8.2
  • Squid : Squid 4.4

手順

1. SSL Bump用の秘密鍵とサーバ証明書の作成

SSL Bumpでは、Squidが都度SSL証明書を発行することで、クライアントのSSL通信をSquidで終端する。このクライアント⇔Squid間で実施するSSL通信の鍵交換の際に使用する鍵情報となる「Diffie-Hellmanパラメータ (DHパラメータ)」を事前に作成する。

DHパラメータはopensslコマンドにて生成でき、処理に数分を要する。ファイル名はbump_dhparam.pemとして作成する。

# cd /etc/squid/
# openssl dhparam -outform PEM -out bump_dhparam.pem 2048
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
.........................................

~(以下略)~

次に、SSL通信の際に使用するSSLサーバ証明書の秘密鍵と公開鍵のペアを作成する。秘密鍵のファイル名はbump.key、公開鍵のファイル名はbump.crtとし、opensslコマンドで作成を行う。

# cd /etc/squid/
# openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 -keyout bump.key -out bump.crt
Generating a RSA private key
.............................................+++++
....+++++
writing new private key to 'bump.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP ←★JPを指定
State or Province Name (full name) []:Tokyo ←★任意で指定
Locality Name (eg, city) [Default City]: ←★そのままエンター
Organization Name (eg, company) [Default Company Ltd]: ←★そのままエンター
Organizational Unit Name (eg, section) []: ←★そのままエンター
Common Name (eg, your name or your server's hostname) []:Squid Private CA ←★任意。今回は「Squid Private CA」とした
Email Address []: ←★そのままエンター

2. SSL証明書保管用DBの作成

前述した通りSSL Bumpでは、SquidがクライアントとSSL通信するため、都度SSLサーバ証明書を発行する。作成した証明書情報を補完するためのDBを作成する。

# mkdir -p /var/lib/squid
# rm -rf /var/lib/squid/ssl_db

# /usr/lib64/squid/security_file_certgen -c -s /var/lib/squid/ssl_db -M 20MB
Initialization SSL db...
Done

# chown -R squid:squid /var/lib/squid
# ls -l /var/lib/squid/
合計 0
drwxr-xr-x 3 squid squid 48  7月 29 19:54 ssl_db

3. squid.confに設定追加 (追加内容の説明)

SSL Bumpを有効化するためsquid.confに設定を追加する。設定箇所自体は多くないものの見慣れない設定が多いため、以下に簡単な説明を記載していく。

ただし、細かい設定内容は未調査となるため、必要に応じて、Squidの公式サイトを参照するようお願いしたい。

sslcrtd_programsslproxy_cert_error及びssl_bump

SSL Bump特有の以下設定を追加する。

sslcrtd_program /usr/lib64/squid/security_file_certgen -s /var/lib/squid/ssl_db -M 20MB
sslproxy_cert_error allow all
acl step1 at_step SslBump1
ssl_bump peek step1
ssl_bump bump all

設定内容は以下の通りとはなるが、詳細は以下を確認いただきたい。

設定値 説明
sslcrtd_program 証明書作成のコマンドを指定。-sオプションでSSL保管先のDBを指定する。-MオプションでDBに保管するSSL証明書の最大サイズを指定する。
sslproxy_cert_error allow all 証明書の検証にてエラーがあってもすべて許可する。
acl step1 at_step SslBump1
ssl_bump peek step1
ssl_bump bump all
SSL Bumpのアクションをstep1についてpeekとし、それ以外のstep2、step3についてはbumpに設定する。詳細は公式サイトを参照すること。

http_port

通常のhttp_portはSquidの待ち受けポート番号を指定するのみだが、SSL Bumpの場合は以下のように多数の設定を行う。

http_port 8080 tcpkeepalive=60,30,3 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=20MB tls-cert=/etc/squid/bump.crt tls-key=/etc/squid/bump.key cipher=HIGH:MEDIUM:!LOW:!RC4:!SEED:!IDEA:!3DES:!MD5:!EXP:!PSK:!DSS options=NO_TLSv1,NO_SSLv3,SINGLE_DH_USE,SINGLE_ECDH_USE tls-dh=prime256v1:/etc/squid/bump_dhparam.pem

各設定値の説明を以下に記載する。詳細は以下公式サイトを確認いただきたい。

設定値 説明
http_port 8080 Squidの待ち受けポートを8080番に設定。
tcpkeepalive=60,30,3 通信がアイドルとなった際のキープアライブの設定。左から順に、アイドルとみなす経過時間(秒)、アイドル中の監視間隔(秒)、タイムアウトとみなす回数(秒)となる。今回の設定の場合は、60秒経過後から30秒 x 3回通信が確認できなかった場合、通信の切断を行う。
ssl-bump SSL Bumpを使用する。これによりクライアントから受信したHTTPS通信が一度復号化される。
generate-host-certificates=on SSLサーバー証明書を動的に作成する。
dynamic_cert_mem_cache_size=20MB 証明書作成時に使用するキャッシュのサイズ。デフォルト4MB。
tls-cert=/etc/squid/bump.crt SSLサーバ証明書のパスを指定。
tls-key=/etc/squid/bump.key SSLサーバ証明書の秘密鍵のパスを指定。
cipher=HIGH:MEDIUM:!LOW:!RC4:!SEED:!IDEA:!3DES:!MD5:!EXP:!PSK:!DSS 暗号化スイートの設定。
options=NO_TLSv1,NO_SSLv3,SINGLE_DH_USE,SINGLE_ECDH_USE オプションの設定。TLSv1禁止、SSLv3禁止、一時的なDHキーの使用をするためオプションを記載。
tls-dh=prime256v1:/etc/squid/bump_dhparam.pem 先ほど作成したDHパラメータファイルを指定。

4. squid.confに設定追加 (実際の設定内容)

最終的にsquid.confは以下の通りとなった。

# ACLs
acl localnet src 192.168.33.0/24
acl localnet src 192.168.11.0/24

acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT

# SSL Bump
sslcrtd_program /usr/lib64/squid/security_file_certgen -s /var/lib/squid/ssl_db -M 20MB
sslproxy_cert_error allow all
acl step1 at_step SslBump1
ssl_bump peek step1
ssl_bump bump all

# Access rules
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports

http_access allow localhost manager
http_access deny manager

http_access allow localnet
http_access allow localhost
http_access deny all

# Squid Access Pport
http_port 8080 tcpkeepalive=60,30,3 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=20MB tls-cert=/etc/squid/bump.crt tls-key=/etc/squid/bump.key cipher=HIGH:MEDIUM:!LOW:!RC4:!SEED:!IDEA:!3DES:!MD5:!EXP:!PSK:!DSS options=NO_TLSv1,NO_SSLv3,SINGLE_DH_USE,SINGLE_ECDH_USE tls-dh=prime256v1:/etc/squid/bump_dhparam.pem

# Cache directory
cache_dir ufs /var/spool/squid 100 16 256

# Core dump directory
coredump_dir /var/spool/squid

# Cache settings
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320

上記を反映させるため、Squidを再起動する。

# systemctl restart squid

5. OSに証明書の登録

Windowsクライアントを例として、証明書の登録手順を記載する。

先ほど作成したSquidの証明書となるbump.crtをエクスポートして、インポート対象のOSに配置する。

「ファイル名を指定して実行」→「certlm.msc」を実行し、証明書の管理画面を表示させる。

「信頼されたルート証明機関」を右クリックし、「すべてのタスク」→「インポート」を選択する。

「証明書のインポートウィザード」が表示されるため、以下の通り設定する。

設定項目 設定値
証明書のインポートウィザードの開始 そのまま次へ
インストールする証明書ファイル bump.crtを選択
証明書ストア 「信頼されたルート証明機関」を選択

動作確認

まず、SSL Bump設定前のSquidのaccess.logを確認すると、見ての通りCONNECTメソッドのログしか表示されない

1627814980.824    394 192.168.11.240 TCP_TUNNEL/200 556 CONNECT cas.criteo.com:443 - HIER_DIRECT/182.161.74.15 -
1627814981.360    928 192.168.11.240 TCP_TUNNEL/200 339 CONNECT quriosity.yahoo.co.jp:443 - HIER_DIRECT/183.79.219.252 -
1627814981.360   1114 192.168.11.240 TCP_TUNNEL/200 339 CONNECT yads.c.yimg.jp:443 - HIER_DIRECT/182.22.31.124 -
1627814981.634  47616 192.168.11.240 TCP_TUNNEL/200 339 CONNECT ybx-test.yahoo.co.jp:443 - HIER_DIRECT/183.79.248.124 -
1627814981.657    318 192.168.11.240 TCP_TUNNEL/200 8737 CONNECT nav.smartscreen.microsoft.com:443 - HIER_DIRECT/13.67.52.249 -
1627814986.983  60014 192.168.11.240 TCP_TUNNEL/200 39 CONNECT static.criteo.net:443 - HIER_DIRECT/182.161.74.1 -
1627814989.985  60514 192.168.11.240 TCP_TUNNEL/200 39 CONNECT gum.criteo.com:443 - HIER_DIRECT/182.161.74.11 -

SSL Bump設定後のログでは、以下の通りGETPOSTのログが表示される
※ログは見やすくするために少し重複情報をを間引いて記載している。

1627815054.587     30 192.168.11.240 NONE/200 0 CONNECT dsb.yahoo.co.jp:443 - HIER_DIRECT/183.79.219.252 -
1627815054.604     24 192.168.11.240 NONE/200 0 CONNECT www.yahoo.co.jp:443 - HIER_DIRECT/182.22.25.124 -
1627815054.611     31 192.168.11.240 NONE/200 0 CONNECT s.yimg.jp:443 - HIER_DIRECT/183.79.249.124 -
1627815054.615     35 192.168.11.240 NONE/200 0 CONNECT yads.c.yimg.jp:443 - HIER_DIRECT/183.79.219.124 -
1627815054.623     28 192.168.11.240 TCP_MISS/202 471 POST https://dsb.yahoo.co.jp/api/v1/stream - HIER_DIRECT/183.79.219.252 application/json
1627815054.636     56 192.168.11.240 NONE/200 0 CONNECT adservice.google.co.jp:443 - HIER_DIRECT/2404:6800:4004:818::2002 -
1627815054.639     59 192.168.11.240 NONE/200 0 CONNECT adservice.google.com:443 - HIER_DIRECT/2404:6800:4004:81e::2002 -
1627815054.653     27 192.168.11.240 TCP_MISS/202 471 POST https://dsb.yahoo.co.jp/api/v1/stream - HIER_DIRECT/183.79.219.252 application/json
1627815054.743    133 192.168.11.240 TCP_MISS/200 63418 GET https://www.yahoo.co.jp/ - HIER_DIRECT/182.22.25.124 text/html
1627815054.806     10 192.168.11.240 TCP_MISS/304 293 GET https://s.yimg.jp/images/weather/general/next/256_day.png - HIER_DIRECT/183.79.249.124 -
1627815054.819     10 192.168.11.240 TCP_MISS/304 293 GET https://s.yimg.jp/images/shp_edit/other/fc/other/Edit/21081_660_200.jpg - HIER_DIRECT/183.79.249.124 -

また、SSL Bump有効時は一見通常のWebアクセスと同様にHTTPS通信ができているように見え、アドレスバーの鍵マークも正常に表示される。ただし、鍵マークをクリックしてSSLサーバ証明書の詳細情報を確認すると、Squidの自己署名証明書である「Squid Private CA」となっていることがわかる。

以上でSquidによるSSL Bumpの設定は完了となる。

参考

0 件のコメント:

コメントを投稿

人気の投稿