BluecoatSGのSSL復号化

このドキュメントはSGOS 6.5.96をベースに記載しています。

1.SSLプロキシの設定
(1)概要
クライアントからプロキシサーバ経由でSSLサイトに接続する場合、Connectメソッドを使用する。ConnectメソッドはHTTPであるため、プロキシサーバはHTTPヘッダを参照することができる。つまり複合化しなくても接続先のHOST(FQDN)とUser-Agentをチェックすることができる。

その後の通信はSSLをトンネル処理するため、HTTPヘッダをプロキシでチェックすることはできない。よってプロキシサーバで復号化/再暗号化する必要が生じる。

SGでSSLを復号化するということは、もとはクライアント-サーバ間でSSLセッションを張っていたところを、
クライアント-SG間と、SG-サーバ間でそれぞれSSLセッションを張るということになる。
クライアントはオリジナルのサーバ証明書をチェックするのではなく、SGの持つサーバ証明書をチェックする。
実際にはSGはサーバ証明書を持っているわけではなく、オリジナルのサーバ証明書にSGが署名しなおすような動作をしている。

(2)フロー
クライアントからのCONNECTメソッドがあるとSGはサーバにSynを送る。
クライアントからのClient Helloを受け取ってからサーバにClient Helloを送り、
サーバからServer HelloとCertificate(証明書)を受け取ってからクライアントにServer Helloを送る。
このSSLの処理の途中で通信が止まってしまうことがある。この場合は最悪復号化できず、その宛先については復号化除外の設定が必要になる。仮に技術的に解析できても、SGでは対応ができない可能性もある。
また、SGはサーバ証明書をキャッシュする。キャッシュしたサーバ証明書は最後に使用されてから2時間で削除される。キャッシュがあってもサーバの証明書が更新されていればキャッシュを更新してクライアントに応答する。とのことだが、サーバにアクセスできない状態でもクライアントに証明書を応答している事象もあったので、真偽はわからない。SGでは、キャッシュしている証明書の一覧は表示できるが、内容や残存期間は表示できない。証明書をキャッシュする理由はよくわからないが、処理を高速化するためだと思われる。署名しなおした証明書も一緒に(もしくはそれだけ)キャッシュしているのではないかと思う。

(3)証明書の問題の対応
デフォルト動作としてはサーバの証明書に不備があった場合には接続が拒否される。
不備とは、「ローカル証明書を使用している」「有効期限が切れている」「CNとサーバ名が異なる」場合。
この場合のSGの動作は「許可」「拒否」を選択することができる。デフォルト動作をどちらにするか。またはサイト個別にどちらにするか。という設定が可能。許可すれば証明書の検証はしないが複合化はされる。

プロキシで複合化するとクライアントはオリジナルのサーバ証明書を検証することができないということになるが、subjectは変更されないので、その内容で判断する。Man in the middle attackに対して脆弱になるような気がするが、SGがオリジナルの証明書をチェックしているので、クライアントはSGの証明書を確認できれば良いということではないかと思う。よって極力SGの証明書のチェックを除外はしないほうが良いのではないかと考える。

(4)クライアント
SGは信頼された認証局ではないため、署名した証明書はクライアントには「この Web サイトのセキュリティ証明書には問題があります。」のように表示される。この対応としてSGのCA証明書をクライアントにインストールする。SGの証明書を中間証明書として構成したのであれば、ルート証明書もインストールする。

(5)セットアップ
①CSRの作成
[Configuration][Keyrings]でCreate
Keyring nameに任意の名前(仮にProxyAとする)を設定してOK
ProxyAを選択してEdit
Certificate Signing RequestでCreate
一旦画面を閉じて、再度ProxyAのEdit画面を開き、CSRの欄をコピーして保存。
保存したCSRを認証局に渡す(認証局チームに渡して証明書を作成してもらう)

②証明書インポート
できた証明書を受け取り、再度ProxyAを選択してEdit
Certificateでimport

③detectの設定
想定としては8080に接続してくるSSLを全て復号化対象とする
[Configuration][Service][Proxy Services]を開く
ExplicitHTTPにあるAll->Explicit:8080がBypassになっているところをInterceptに変更する

④ポリシーの設定
VPMを起動
SSLレイヤでAdd rule
できたルールのActionにSSL Interceptionを選択。Source、Destinationは要件に合わせるが、とりあえずAnyで良い
Enable HTTPS interceptionにチェック
Issur Keyrigをチェックし、ProxyAを選択。Install Policy

⑤動作確認
クライアントからProxy経由でSSLサイトに接続し、証明書を表示する。発行者がProxyAであれば良い。

⑥Encrypted-tapの設定
復号化した通信を解析するために外部に転送する場合にEncrypted-tap(ライセンスはオプション)を用いる。
[Maintenace][Licesing][install]を表示
License Key Manual Instllationでlocal fileを選択してベンダから取得したライセンスを指定し、適用する
VPMを起動
SSL Accessレイヤでadd rule
できたルールのActionにEncryptedTapを選択
※Enable encrypted tapにチェックし、Interfaceに出力するインターフェース名を選択してOK。Install Policy
(Encrypted-tapは1つしか設定できない。冗長化を考えるなら2つ設定しておいて1つはdesableにしておき、障害発生時に手動で切り替える。)