SSL/TLS復号化の設定

現在のインターネット通信は大半がWebアクセスですが、ほぼSSL/TLSで暗号化された通信になっています。

[参考]Google透明性レポート: ウェブ上での HTTPS 暗号化

SSL/TLSによって暗号化された通信は、Firewallで脅威を検知することが難しいため、脅威検知すべきトラフィックは復号化が必要です。

以下は、PA FirewallによるSSL/TLS復号化の動作概要です。

SSL復号化は、「Webサイト〜PA Firewall間」のSSLセッション (SSLセッション-A) と、「PA-Firewall〜クライアント間」のSSLセッション (SSLセッション-B) はそれぞれ別々に確立されます。

中間に入るPA Firewallは、受け取ったデータを復号化し、再び暗号化して送り出す、という処理を行います。

以下は、その処理フローの概要です。

  • [1] (SSLセッション確立前の) SSLハンドシェークの段階で、PA FirewallがWebサイト(www.acme.com)からの正式な証明書を受け取る。
  • [2] PA Firewallがその証明書の内容を一部書き換え、PA Firewall内の秘密鍵で署名を行う。
  • [3] PA Firewallは、クライアントPCとのSSLハンドシェークで、[2]の証明書をクライアントに送り出す。
  • [4] クライアントPCは、PA Firewallで生成したルート証明書を持っているので、[3]で受け取った証明書を信頼する。
  • [5] このことで、「Webサイト〜PA Firewall間」 と 「PA-Firewall〜クライアント間」 で、それぞれ異なるSSLハンドシェークが行われる。
  • [6] SSLハンドシェークが完了すると、「Webサイト〜PA Firewall間」 と 「PA-Firewall〜クライアント間」 で、それぞれ異なるSSLセッションが確立される。
  • [7] その結果、PA Firewall内では、通信データは復号化されるので、脅威の有無をチェックすることができる。

以降、PA FirewallのSSL/TLS復号化の設定を行います。

ルート証明書の生成

PA Firewallがインターネットに存在するWebサイトのサーバー証明書を受け取り、それを書き換えてクライアントに送り出すためには、PA Firewall内に認証局の秘密鍵が必要です。

本ガイドでは、PA Firewallが認証局となり、PA Firewall自身でルート証明書及び秘密鍵を生成することにします。
(自社内に認証局がある場合、そのルート証明書及び秘密鍵をPA Firewallにインポートして利用することもできます。)

a)「Device」 → 「証明書の管理」の下のb)「証明書」 → c)「生成」をクリックします。

a)証明書名に「SSL-Forward-Proxy-Trust-CA (任意)」、b)共通名に「SSL-Forward-Proxy-Trust-CA (任意)」、
c)「認証局」にチェックを入れます。
d)「OK」をクリックします。

証明書の生成が成功したことを示すメッセージが出ます。「OK」をクリックします。

ルート証明書の用途設定

インターネット上のWebサイトには、商用の認証局から発行された正しいSSL証明書を持つサイトと、自己署名の証明書を持つサイトが存在します。

PA Firewallでは、商用の認証局から発行された正しいSSL証明書を「信頼された証明書」、自己署名の証明書を「信頼されない証明書」という言い方をします。

ここでは簡易的に一旦、「信頼された証明書」、「信頼されない証明書」のどちらでも、PA Firewallで生成したルート証明書:「SSL-Forward-Proxy-Trust-CA」と秘密鍵を使って、「PA Firewall〜クライアントPC間」のSSLハンドシェークを行う、という設定を行います。
(後ほどの設定で、「信頼されない証明書」を持つサイトは警告を出す、またはブロックする設定に変更します。)

生成した「SSL-Forward-Proxy-Trust-CA」をクリックします。

a)「フォワードプロキシ用の信頼された証明書」および「フォワードプロキシ用の信頼されない証明書」にチェックを入れ、b)「OK」をクリックします。

SSL/TLS復号ポリシーの設定

SSL復号化を行うには、どのような条件(例:送信元や宛先)の場合に復号するのか、という復号ポリシーの設定も必要です。

まずは、全ての宛先に対して復号化するポリシーを設定します。

a)「Policies」 → b)「復号」 → c)「追加」 をクリックします。

a)「全般」タブで、b)名前に「Dec_Rule1 (任意)」と入力します。

a)「送信元」タブで、b)「追加」をクリックし、c)「Trust」を選択します。

a)「宛先」タブで、b)「追加」をクリックし、c)「Untrust」を選択します。

a)「サービス/URLカテゴリ」は、デフォルトのままb)「Any」とします。

a)「オプション」タブで、b)アクションで「復号」を選択し、c)タイプが「SSLフォワードプロキシ」であることを確認します。
d)「OK」をクリックします。

「コミット」を実施します。

ルート証明書のエクスポートとWindows端末へのインポート

PA Firewallからルート証明書をエクスポートして、それをクライアントPCへインポートします。

証明書のエクスポート

「信頼された証明書」用のルート証明書をエクスポートします。
(次のセクションで、このルート証明書をクライアントPCへインポートします。)

a)「Device」→b)「証明書」で表示されたc)「SSL-Forward-Proxy-Trust-CA」が選択された状態で、d)「エクスポート」をクリックします。

a)ファイルフォーマットで「Base64エンコード済み証明書(PEM)」を選択して、b)「OK」をクリックします。

エクスポートされたルート証明書を、一時的にコンソールPCへ保存しておきます。

クライアントPCへルート証明書をインポート

PA Firewallからエクスポートしたルート証明書を、TrustゾーンのクライアントPCへインポートします。

このことで、PA Firewallが再生成したサーバー証明書を、クライアントPCが信頼できるようになります。

PA Firewallからエクスポートしたルート証明書を、クライアントPC(例:Windows)へコピーします。

そのファイルをダブルクリックして表示された画面で、「証明書のインストール」をクリックします。

「現在のユーザー」が選択された状態で「次へ」をクリックします。

「証明書を全て次のストアに配置する」を選択して、「参照」をクリックします。

「信頼されたルート証明機関」を選択して、「OK」をクリックします。

「次へ」をクリックします。

警告が出ますが、「Yes / はい」をクリックします。

ルート証明書のインポートが完了しました。「OK」をクリックします。

通信確認

「信頼された証明書」を持つサイトへの通信確認

一般的なインターネット上のHTTPSサイトへアクセスできること及びそのサーバー証明書の状態を確認します。

Trustゾーン:192.168.45.0/24のクライアントPCのWebブラウザ(例:Chrome)で、インターネットのHTTPSサイト(例:https://www.paloaltonetworks.com) へアクセスします。

Chromeブラウザのa)錠前マーク → b)「この接続は保護されています」をクリックします。

「証明書は有効です」をクリックします。

a)「*.paloaltonetworks.com」証明書のb)「発行者」が、PA Firewallで生成した「SSL-Forward-Proxy-Trust-CA」になっています。

本来の証明書の方は、c)「*.paloaltonetworks.com」は変わりませんが、b)「発行者」が商用認証局の「DigiCert SHA2 Secure Server CA」になっています。

PA Firewallが「*.paloaltonetworks.com」の正式な証明書を受け取り、その証明書の一部の情報を書き換え & ルートの秘密鍵で署名し直して、クライアントPCに渡しているので、このような証明書になります。

クライアントPCには事前にPA Firewallのルート証明書(SSL-Forward-Proxy-Untrust-CA)をインポートしたので、セキュリティの警告がでることなく、Webサイトをみることができます。

ログの確認

復号化されているかどうかを、ログから確認することができます。

a)「Monitor」 → b)「トラフィック」 → c)ログの先頭のアイコンをクリックします。

SSL/TLS復号されたトラフィックには、「復号化」にチェックが入っています。

「信頼されない証明書」を持つサイトへ警告もなくアクセスできることの確認

現在の設定のままでは「信頼されない証明書」を持つサイトへは警告もなくアクセスできてしまうこと及びそのときのサーバー証明書を確認します。

テスト用として、自己署名のサーバー証明書を持つHTTPSのWebサーバー:temp.pansetech.netを構築しました。

TrustゾーンのクライアントPC(10.0.2.227)のWebブラウザ(例:Chrome)で、そのテスト用Webサーバーにhttps://temp.pansetech.netでアクセスします。

結果、現在の設定では、「保護された通信」として扱われてしまいます。

正式な商用認証局から取得したサーバー証明書ではない、「信頼されない証明書」であるにも関わらず、信頼されています。

「この接続は保護されています」→ 「証明書は有効です」をクリックします。

以下が、Webブラウザが受け取ったサーバー証明書の状態です。

発行者は「SSL-Forward-Proxy-Trust-CA」であるため、Webブラウザにインポート済みなので、署名検証はOKと判断されます。

更に、サブジェクト代替名 (SAN: Subject Alternative Name) がDNS Name=temp.pansetech.netとなっていて、Webブラウザに入力したURLと一致するので、Webブラウザは、この証明書を「信頼できるサーバー証明書」として認識してしまいます。
(最近のブラウザは、特にChromeは昔から、Common NameではなくSANが一致するかどうかを判定してします。)

会社のポリシー的にこれで問題ない場合は、このままでよいです。

例えば、独自に設置した社内Webサーバーがたくさんあって、ほとんどが自己署名の証明書を使っているので、いちいち警告を出したくない、というような場合。

しかし、「信頼されないサーバー証明書」を持つWebへのアクセスは警告を出したい、というのが一般的な要件だと思います。

よって、以降、「信頼されないサーバー証明書」を持つWebへのアクセスは警告を出す設定方法を記載します。

「信頼されない証明書」を持つサイトは警告を出す設定

「信頼されない証明書」を持つサイトへクライアントPCがアクセスした際に、必ずセキュリティ警告を出すようにする設定方法です。

もう一つ、ルート証明書を生成します。

設定

a)「Device」 → b)「証明書」 → c)「生成」をクリックします。

以下の通り入力し、新しく認証局の証明書を生成します。

生成した証明書をクリックして開きます。

a)「フォワード プロキシ用の信頼されない証明書」にチェックを入れ、b)「OK」をクリックします。

以下のように、「SSL-Forward-Proxy-Trust-CA」の用途は「フォワードプロキシ用の信頼された証明書」だけになり、「Untrust-CA」の用途が、「フォワードプロキシ用の信頼されない証明書」になります。

「コミット」を実施します。

通信確認

クライアントPCのWebブラウザからhttps://temp.pansetech.netへアクセスします。

今度は、「保護されていません」という結果になります。

a)「保護されていない通信」 → b)「証明書が無効です」をクリックします。

「発行者」が「Untrust-CA」となっています。

Untrust-CAは、クライアントPCにインポートしていないので、クライアントPCはこのサーバー証明書の署名検証ができないため、これを信頼しません。

SANがWebブラウザのURLと一致していても、署名が検証できなければ信頼されません。

Trustゾーンのユーザーに、「セキュリティ警告は出しつつも、信頼されない証明書を持つサイトへのアクセスは許可したい」という要件の場合は、この設定を行なってください。

次セクションの「信頼されない証明書を持つサイトとの通信をブロック」する設定を行う場合は、ここで示した設定は必要ありません。
この設定か、次の設定か、どちらかでOKですので、お好みの方を設定してください。

「信頼されない証明書」を持つサイトはブロックする設定

信頼された認証局から発行されたサーバー証明書を持たないサイトとの通信は、ブロックする設定が可能です。

設定

a)「Objects」 → 「復号」の下のb)「復号プロファイル」 → c)「追加」をクリックします。

a)名前に「Decrypt_Profile01 (任意)」と入力します。
b)「SSL復号化」タブ → c)「SSLフォワードプロキシ」タブの、「サーバー証明書の確認」内にあるd)「発行者が信頼されていないセッションをブロック」にチェックをいれます。e)「OK」をクリックします。

a)「Policies」 → b)「復号」 で表示された「Dec_Rule1」行の、復号プロファイル列のc)「なし」をクリックします。

a)復号プロファイルで「Decrypt-Profile001」を選択し、b)「OK」をクリックします。

「コミット」を実施します。

通信確認

クライアントPCのWebブラウザからhttps://temp.pansetech.netへアクセスします。

以下のような、ブロックされたことを示す画面が表示されます。

[参考]そもそも「信頼された証明書」や「信頼されない証明書」とは?

PA Firewallは、信頼された認証局(証明機関)のリストを事前に保持しています。

(Windows等のクライアントPCのWebブラウザが事前に保持している「信頼されたルート証明機関」のリストと同等だと考えれば分かりやすいかもしれません。)

インターネット上に存在するWebサイトが持つサーバー証明書が、そのリストに存在する認証局が発行したものであれば、「信頼された証明書」であると判断し、逆にそのリストにない認証局が発行した証明書であれば、「信頼されない証明書」である、と判断します。

その認証局のリストは、a)「Device」 → b)「証明書」 → c)「デフォルトの信頼された証明機関」で確認できます。

一部のURLカテゴリを復号化から除外する設定

PA Firewallは、URLカテゴリ単位にSSL復号化を実施する/しないの制御が可能です。

ここでは、「ユーザーのプライバシー保護の観点から、インターネットバンキングなどの金融系の復号化は行わない」という要件を想定し、その設定を行います。

金融サービスのカテゴリは復号化から除外する設定

a)「Policies」 → b)「復号」 → c)「Dec_Rule1」が選択された状態でd)「コピー」をクリックします。

ルール順序をa)「最上部へ」を選択して、b)「OK」をクリックします。

「Dec_Rule1-1」というルールが生成されます。そのルール名をクリックします。

a)「全般」タブで、b)名前に「Finance (任意)」と入力します。

a)「サービス/URLカテゴリ」で、URLカテゴリのb)「追加」をクリックし、c)「financial-services」を選択します。

(※URLフィルタリングのサブスクリプションライセンスが必要です。)

a)「オプション」タブで、b)アクションで「No Decrypt」を選択し、c)「OK」をクリックします。

「コミット」を実施します。

通信確認

SSL/TLS復号化の設定が、期待通り動作する(金融系サービスだけが復号化されない)ことを確認します。

金融系サービスへアクセス

ある銀行のHTTPSサイトへアクセスします。

  1. の錠前マークのある部分をクリックし、b)「この接続は保護されています」をクリックします。

その後に表示される「証明書は有効です」をクリックして、証明書を表示します。

発行者が、PA Firewallで生成した認証局(SSL-Forward-Proxy-Trust-CA)ではない(=復号化されていない)ことがわかります。

金融系以外のWebサイトへアクセス

金融系以外のWebサイト(例:https://www.paloaltonetworks.com)へアクセスします。

発行者が、PA Firewallで生成した認証局(SSL-Forward-Proxy-Trust-CA)となっている(復号化されている)ことがわかります。

コメント欄 質問や感想、追加してほしい記事のリクエストをお待ちしてます!

タイトルとURLをコピーしました