hirosanote’s blog

検証環境の構築手順やネットワーク機器のテスト結果、関連する事について記載します。このブログは個人で行っており、所属する会社とは関係ありません。

ロードバランサーでSSLインターセプトし、SquidでSSLアクセスログを取得

Squidをプロキシで使用している場合、HTTP通信はドメイン名の他にディレクトリを含めたアクセスログを取得できますが、SSL通信はドメイン名しか取得できません。
例:https://ja.wikipedia.org/wiki/WordPress にアクセス
Squidのログ
01/Jul/2018:11:07:19 +0900 1499 192.168.0.43 TCP_TUNNEL/200 5608 CONNECT jp.wikipedia.org:443 - HIER_DIRECT/jp.wikipedia.org -

アクセス先のディレクトリが見えないため、正確なアクセスログが取得できず、URLフィルタを使用することが出来ません。
社内通信の全てのアクセスログを取得する必要があったため、HTTPSをHTTPへ変換してSquidに送り、Squidからインターネットへ送るときに再度HTTPS化することにしました。
最近のロードバランサーにはSSL通信をインターセプトして平文にした後、再度暗号化を行いインターネットへ通信する機能があります。ロードバランサーですので、Squidサーバーを複数台用意して負荷分散も行うことが出来ます。

メリット:
- ドメイン名の他にディレクトリも含めた完全なログを取得できる
- ドメイン単位ではなくディレクトリも含めてURLフィルタが可能
- プロキシサーバーの負荷分散
- 既存のデフォルトゲートウェイ機器をロードバランサーに入れ替えることで動作するので、クライアント側で大幅な設定変更が不要

ロードバランサーSSL通信をいったん横取りする必要があるため、アクセスするサイトの証明書はロードバランサーが発行します。自己証明書になるため、ロードバランサーが発行するルート証明書を各端末にインストールし、チェーンチェックを行えるようにしておく必要があります。
Quick (UDP SSL)はインターセプト出来ないため、ロードバランサーACLで、443/UDPをブロックします。クライアント側は、443/UDPが使用できない場合、443/TCPに自動で切り替えます。

アレイネットワークス社APVシリーズロードバランサーSSLインターセプト機能を使用して構築してみました。


構成図
f:id:hirosanote:20180701203346p:plain


環境
CentOS7 / Squid x 2
Array APV x 2
Router x 1


設定のポイント Squid
1. IPv4転送を有効にします。

echo "net.ipv4.ip_forward = 1" | tee /etc/sysctl.d/10-ipv4.conf
sysctl -p /etc/sysctl.d/10-ipv4.conf
sysctl net.ipv4.ip_forward

2. Squid設定に透過プロキシ、ロードバランサーSSLポート443からHTTPポート8080に変換した通信を許可、ログフォーマットを追加します。

vi /etc/squid/squid.conf
#宛先ポート番号の許可を追加
acl Safe_ports port 8080

#透過プロキシの設定
# Squid normally listens to port 3128
http_port 3128 transparent

#ログフォーマットを追加
logformat combined %tl %6tr %>a %Ss/%03Hs %<st %rm %ru %un %Sh/%<A %mt
access_log /var/log/squid/access.log combined

3. IPマスカレードを有効にし、ロードバランサーSSLポート443宛ての通信をHTTPポート8080に変換した通信と、HTTPポート80の通信をSquidのポート3128にフォワードします。

firewall-cmd --permanent --add-masquerade
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" forward-port port="80" protocol="tcp" to-port="3128" to-addr="192.168.21.1"'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" forward-port port="8080" protocol="tcp" to-port="3128" to-addr="192.168.21.1"'


設定のポイント ロードバランサー Array APV
クライアント側のAPV
1. クライアントからのポート番号443のSSL通信をインターセプトします。

slb virtual tcps "sqvip" 0.0.0.0 443 noarp 0

2. 平文にしたHTTPトラフィックを宛先IPは変更せず、ポート番号を8080に変換してSquidサーバーへパケットを送り、負荷分散します。

slb real fwdip "sq01" 192.168.11.1 8080 10000 
slb real fwdip "sq02" 192.168.12.1 8080 10000 

3. SSL通信以外は、リンク分散機能でSquidへ送り、負荷分散します。

llb method outbound rr
llb link route "sq01" 192.168.11.1 1 0.0.0.0 0Mbps
llb link route "sq02" 192.168.12.1 1 0.0.0.0 0Mbps

インターネット側のAPV
平文にしたHTTPポート番号8080通信を受け取り、SSLに再暗号化とポート番号443に変換し、ルーターへパケットを送ります。

slb virtual tcp "sqvip" 0.0.0.0 8080 noarp 0
slb real tcps "router" 192.168.30.1 443 10000 icmp 3 3

HTTPポート8080以外の通信は、ルーティング設定に従ってルーターへ送られます。


設定のポイント クライアント
ロードバランサールート証明書RSA, ECCの両方をIEの信頼された証明書機関にインポートします。
f:id:hirosanote:20180701205707p:plain


動作の確認
サイトの証明書が、ロードバランサーが発行した証明書が使用されており、インポートしたルート証明書とチェーンチェックされていることを確認します。
f:id:hirosanote:20180701210218p:plain
f:id:hirosanote:20180701210858p:plain

Squidのログを確認し、ディレクトリまで取得できていることを確認します。
f:id:hirosanote:20180701211634p:plain


負荷の高いSSL処理をロードバランサー側が行い、Squidサーバーの負荷を軽減出来ることもメリットです。