SquidはSSLを使ったリバースプロキシも構成できるようになっています。 この事は、Webサーバの管理者にとっては喜ばしい事だといえます。 なぜなら、この機能によって1つのサイト証明書を使って複数のWebサーバが同時にSSLによる暗号化の恩恵を受ける事を意味するからです。
SSLリバースプロキシを使った構成はおおよそ以下のような構成になります。
- 例えば、クライアント(ブラウザ)が HTTPSにて"www2.hogehoge.jp"
を呼び出す。 ----- ①
- 公開DNSにて、上記サイトのアドレスとして Squid のアドレスを返す。 この結果クライアントは
SquidとSSLによる接続が開始される。 ----- ②
- Squid はクライアントが要求したURLを判断して、そのサイトの実体のアドレスを内部DNSにて解決し、実際の
"www2.hogehoge.jp" へ通常のHTTPにてリクエストを行う。 ----- ③
- www2 はオブジェクトをSquidへ渡す。 この結果をSquidはクライアントへ返却する。
-----④
上記の例から判るように、クライントとSquidの間はSSLによって接続が開始される事で、安全な接続が確保されます。 Squid
は、クライアントからのリクエストされたURLを判断して実体のサーバからコンテンツを通常のHTTPにて取り出すようになります。 ですから、ルータやファイヤーウォールで実体のWebサーバへ直接アクセスさせないような設定を行うことで、安全かつ高速なSSLセッションが可能になります。
なお、この構成をとった場合、SSL化されるのはPeoxyとブラウザ間のみとなり、Proxyと基サーバ間は通常のHTTPでの接続となります。 またSSLの特性上、Proxyと基サーバ間のアクセス発生において、証明書のミスマッチがブラウザに上がってきます。
以下では、実際にSSLリバースプロキシの構築手順を説明します。
- 「サイト証明書」と「プライベートキー」の入手
SSLを利用する為に、サイト証明書の入手とプライベートキー生成を行ってください。 サイト証明書は正式な運用を行うならベリサインなどの公式のCAから入手すると良いでしょう。 またテスト運用や社内だけでの利用ならOpenSSLなどによって自前でCAを立てて、これを使ってサイト証明書を作っても良いでしょう。 サイト証明書とプライベートキーの生成方法は、インターネット上で"Apache
SSL"などのキーワードを検索すればその方法が多く記述されているのでそれらを参照してください。
- squid.conf の次の項目を編集します。
http_port 80
https_port 443 cert=/etc/squid/ssl/newcert.pem key=/etc/squid/ssl/private.key
http_access allow all
visible_hostname www.robata.org
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_uses_host_header on
(設定内容解説)
http_port |
Squid がHTTPのリクエスト待ち受けるポートです。 HTTPでリクエストが来た場合は通常のリバースプロキシとして機能します。 |
https_port |
HTTPSのリクエストを待ち受けるポート番号と、サイト証明書(newcert.pem)およびプライベートキー(private.key)の置いてある場所を指定します。 |
http_access |
HTTPおよびHTTPSのリクエストを許可するアクセスルールを設定します。ここでは説明を簡単にする為に全てのクライアントからを許可しています。 |
visible_hostname |
Squidに割り当てる表示上のサーバ名です。 指定がないと起動できません。 |
httpd_accel_host |
アクセラレータとしてバーチャルホスト(複数のサーバ)をサポートします。 |
httpd_accel_port |
実体のサーバへリクエストを送る際の送り先ポート番号です。 |
httpd_accel_uses_host_header |
URLを判断してリクエスト先を変えるので on を指定します。 |
- Squid 上で DNS を起動するか HOSTS を設定します。
Squid に来たリクエストのURLを見て実際のサーバのアドレスを検索する必要があります。 この為には、SquidのHOSTSファイルに実際のサーバのアドレスを登録するか、Squid用の内部DNSを構築すると良いでしょう。
- 公開DNS のアドレスを Squid へ集めるように設定する。
公開DNS を編集して、リバースプロキシを使ってアクセスさせるサーバのアドレスを全てSquidのアドレスへ変更します。この結果、クライアントからWebサーバへのリクエストはすべて
Squid が最初に受け取るようになります。