近年はセキュリティの観点から、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_program
、sslproxy_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
設定内容は以下の通りとはなるが、詳細は以下を確認いただきたい。
- Squid 4.16 Configuration File: sslcrtd_program
- Squid 4.16 Configuration File: sslproxy_cert_error
- Squid 4.16 Configuration File: ssl_bump
設定値 | 説明 |
---|---|
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設定後のログでは、以下の通りGET
やPOST
のログが表示される。
※ログは見やすくするために少し重複情報をを間引いて記載している。
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 件のコメント:
コメントを投稿