Squid Reverse Proxy For Ssl

from web site robata

SSL リバースプロキシの構築
http://squid.robata.org/ReverseProxy_ssl.html

SquidはSSLを使ったリバースプロキシも構成できる事は、Webサーバの管理者にとっては喜ばしい事だ。 1つのサイト証明書を使って複数のWebサーバが同時に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リバースプロキシの構築手順を説明。

「サイト証明書」と「プライベートキー」の入手
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 が最初に受け取るようになる。