Squid Reverse Proxy with Domain Based Virtual Hosting for HTTPS
以下のように経路全てをHTTPSで暗号化したい場合、設定工数がぐっと増えます。
クライアント(Webブラウザ) ⇔(HTTPS)⇔ Squid(Reverse Proxy) ⇔(HTTPS)⇔ 実サーバ群
まずは実サーバ群の1台1台にもSSL証明書(公開鍵証明書)のインストールが必要になります。
実サーバの台数分、秘密鍵を生成→CSRを生成→公開鍵証明書の作成を繰り返してください。
暗号化さえされていれば良いなら、手を抜く方法もあります...もちろん自己責任なのは言うまでもありません。
(この設定方法は割愛します)
4. Squid設定ファイル(/etc/squid/squid.conf)の編集
visble_hostname CentOS4 http_port 192.168.1.1:80 accel vhost https_port 192.168.1.1:443 accel vhost cert=/etc/pki/CA/certs/server.pem key=/etc/pki/CA/private/server.key acl http_access proto HTTP acl https_access proto HTTPS # first.example.com -> 192.168.1.2(port 80) acl site-1 dstdomain first.example.com http_access allow site-1 cache_peer 192.168.1.2 parent 80 0 no-query originserver name=sv-1 cache_peer_access sv-1 allow site-1 http_access cache_peer_access sv-1 deny all # first.example.com -> 192.168.1.2(port 443) cache_peer 192.168.1.2 parent 443 0 no-query originserver ssl sslflags=DONT_VERIFY_PEER name=sv-1-ssl cache_peer_access sv-1-ssl allow site-1 https_access cache_peer_access sv-1-ssl deny all # second.example.com -> 192.168.1.3(port 80) acl site-2 dstdomain second.example.com http_access allow site-2 cache_peer 192.168.1.3 parent 80 0 no-query originserver name=sv-2 cache_peer_access sv-2 allow site-2 http_access cache_peer_access sv-2 deny all # second.example.com -> 192.168.1.3(port 443) cache_peer 192.168.1.3 parent 443 0 no-query originserver ssl sslflags=DONT_VERIFY_PEER name=sv-2-ssl cache_peer_access sv-2-ssl allow site-2 https_access cache_peer_access sv-2-ssl deny all # third.example.com -> 192.168.1.4(port 80) acl site-3 dstdomain third.example.com http_access allow site-3 cache_peer 192.168.1.4 parent 80 0 no-query originserver name=sv-3 cache_peer_access sv-3 allow site-3 http_access cache_peer_access sv-3 deny all # third.example.com -> 192.168.1.4(port 443) cache_peer 192.168.1.4 parent 443 0 no-query originserver ssl sslflags=DONT_VERIFY_PEER name=sv-3-ssl cache_peer_access sv-3-ssl allow site-3 https_access cache_peer_access sv-3-ssl deny all
同じFQDNでHTTPとHTTPSにアクセスさせる場合、うまく動作せずに悩みました。
WebブラウザからSquid(Reverse Proxy)にHTTPS(SSL)でアクセスしても実サーバにはHTTPでしかアクセスしなくて...orz
悩んで悩みぬいた末、「cache_peer_access」にドメイン名(dstdomain)の他にプロトコル(proto)をANDで条件指定することで解決!
acl http_access proto HTTP acl https_access proto HTTPS
HTTPプロトコルのaclとして「http_access」、HTTPSプロトコルのaclとして「https_access」を定義
プロトコルではなくポート番号でも可能ですが、ここは敢えてプロトコル指定で( ・`д・´)
cache_peer 192.168.1.2 parent 80 0 no-query originserver name=sv-1 cache_peer 192.168.1.3 parent 80 0 no-query originserver name=sv-2 cache_peer 192.168.1.5 parent 80 0 no-query originserver name=sv-3
実サーバ(HTTP)の定義。ここの変更は無し。
cache_peer 192.168.1.2 parent 443 0 no-query originserver ssl sslflags=DONT_VERIFY_PEER name=sv-1-ssl cache_peer 192.168.1.3 parent 443 0 no-query originserver ssl sslflags=DONT_VERIFY_PEER name=sv-2-ssl cache_peer 192.168.1.5 parent 443 0 no-query originserver ssl sslflags=DONT_VERIFY_PEER name=sv-3-ssl
実サーバ(HTTPS)の定義。「sslflags=DONT_VERIFY_PEER」を入れないと公開鍵証明書の検証でエラーになります。
cache_peer_access sv-1 allow site-1 http_access cache_peer_access sv-1 deny all cache_peer_access sv-2 allow site-2 http_access cache_peer_access sv-2 deny all cache_peer_access sv-3 allow site-3 http_access cache_peer_access sv-3 deny all
HTTPプロトコルの転送設定。site-xの後に「http_access」を入れてプロトコルをHTTPのみに制限しています。
そうしないとHTTPSのアクセスもdstdomainのaclだけでマッチしてしまい、下のルールに飛ばなくなります。
ここになかなか気付けませんでした。
cache_peer_access sv-1-ssl allow site-1 https_access cache_peer_access sv-1-ssl deny all cache_peer_access sv-2-ssl allow site-2 https_access cache_peer_access sv-2-ssl deny all cache_peer_access sv-3-ssl allow site-3 https_access cache_peer_access sv-3-ssl deny all
HTTPSプロトコルの転送設定。site-xの後に「https_access」を入れてプロトコルをHTTPSのみに制限しています。
「cache_peer_domain」ではなく「cache_peer_access」を使う真骨頂かと思います。
いかがでしょうか?
自身の環境に置き換えて設定してもらえれば動くと思います。
Squidはaclを把握することが大事なんですね。
aclを使いこなせればURIによって振り分けするサーバを指定出来ることでしょう。
全ての経路をHTTPSにする必要性や意義はあるのか?と聞かれると答えるのが難しいですね。
まぁ、自分は技術者だから試したかっただけです(笑)
Admiring the time and energy you put into your site and in depth information you offer.
It's good to come across a blog every once in a while that isn't the same unwanted rehashed material.
Great read! I've saved your site and I'm adding your RSS feeds to
my Google account.