Google Apps Users Group で掲題のネタが出ていたので実装を試してみるテスト。HTTPの透過型プロキシとしては動いているのだけど、Google サービスの利用制限がうまくできていない。。。この設定で意図通りに動いてました。この制限をかけていても Google に gmail.com なアカウントでのログインは行えるので設定が効いていないように見えるのですが、Gmail や Google Drive などのアプリケーションサービスに切り替えようとすると「このサービスは利用できません」と表示されました。
このようにして HTTPS の SSL/TLS に対するフィルタリングが行えることは、様々なことに応用できると思われます。ただしやっていることは man in the middle なので、セキュリティ上の問題があることを理解して導入することが大切です。
この記事の作業手順は CentOS6 向けを想定しています。また、SELinux については enforce だと以下の内容では動きませんので、permissive とかに変えて試してみてください。
Ubuntu の場合は squid のリビルドが必要かもしれまん。この手順については、以下の記事を参考にしていただくのが良いでしょう。
サマリ
squid のインストール
リクエストヘッダを追加するには squid 3.3 以降を使う必要があるらしい。リクエストヘッダの追記の設定は request_header_add で行う必要がありますが、これは squid 3.3 以降で利用可能なのだそうです。
しかし最新版は 3.5 ですから、せっかくなので最新版の 3.5 を CentOS に入れることにします。 yum で入れる場合は EPEL リポジトリと、squid のバイナリ配布用リポジトリ設定を追加しておけば以下のコマンド実行でOKです。
yum install perl-Crypt-OpenSSL-X509 squid squid-helpers
squid 3.5 のバイナリパッケージのリポジトリについては以下を参照してください。
http://wiki.squid-cache.org/SquidFaq/BinaryPackages#KnowledgeBase.2FCentOS.Squid-3.5
EPEL についてはここでは説明を省略します。squid バイナリの配布リポジトリは以下のURLで確認のこと。
http://wiki.squid-cache.org/SquidFaq/BinaryPackages#KnowledgeBase.2FCentOS.Squid-3.5
設定調整
となります。
SSL interception ではクライアントがアクセスするHTTPSサーバの証明書をその場で作成する必要があります。上記の作業を行うと、squid がこれを自動で行えるようになります。しかし証明書はオレオレなわけですから、HTTPS なサービスへの接続のたびにクライアント側で証明書の警告が出ます。これは非常によろしくないので「オレオレ証明書を発行するCAの証明書」をクライアント端末にインストールするわけですね。
オレオレCAの作成
既存のオレオレCAが存在する場合は、それを流用してもOKです。
mkdir /etc/squid/ssl_cert cd /etc/squid/ssl_cert # オレオレCA作成。 openssl req -new -newkey rsa:2048 -sha256 -days 3650 -nodes -x509 -keyout oreoreCA.pem -out oreoreCA.pem # オレオレCAの証明書作成。これは利用者のブラウザにインストールするものです。 openssl x509 -in oreoreCA.pem -outform DER -out oreoreCA.der
ssl_crtd の設定
/usr/lib64/squid/ssl_crtd -c -s /var/lib/ssl_db chown -R squid /var/lib/ssl_db
なお、SELinux が有効な場合は、/var/lib/ssl_db に対して squid がアクセスできるようにするために、以下のコマンドも実行しておきます。
chcon -R -t squid_cache_t /var/lib/ssl_db
squid.conf の設定変更
- 3128 は通常のプロキシとする。これは動作の比較用。本番運用で通常のプロキシ設定を残していると X-GoogApps-Allowed-Domains を付与できず、GoogleApps の利用制限ができない点に注意すべし。
- 3129 は HTTP 向けの透過型プロキシとして動かす。
- 3130 を HTTPS 向けの透過型プロキシとして動かす。
- Google のサービスを利用可能なドメインを制限する。
なお、以下の設定では SSL証明書の検証が失敗しても処理を継続します。実際の運用ではこの設定ではアウトだと思いますので証明書の検証エラーは処理を継続しないように設定すべきでしょう。
# 正しいFQDNでもよいし、unknown のような文字列でもよいかと。 visible_hostname [適当な文字列] # ポート毎の挙動の設定 # 3128 は通常の forward proxy との動作比較を想定しています。 # Google Apps 以外の利用制限が正しく動くことが確認できたら設定を消すべきです。 #http_port 3128 http_port 3129 intercept https_port 3130 intercept ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/squid/ssl_cert/oreoreCA.pem always_direct allow all # localhost からのリクエストは SSL interception しない。 ssl_bump none localhost # localhost 以外からのリクエストは SSL interception する。 ssl_bump server-first all # サーバ証明書の検証エラーは、すべて無視。 # これは試験用の設定。 sslproxy_cert_error allow all # 検証に失敗した証明書でも受け入れる。 # これも試験用の設定。 sslproxy_flags DONT_VERIFY_PEER # 以下の2行は Google Apps アカウントだけが Google にログインできるようにするための設定 # この設定を行っても Google へのログイン自体は禁止できないことに注意。 # 本設定で抑止できるのは Gmail や Google Drive 等のアプリケーションサービスの利用に限られる。 acl to_google dstdomain .google.com request_header_add X-GoogApps-Allowed-Domains 自社ドメイン名 to_google
透過型プロキシのための iptables の設定例(/etc/sysconfig/iptables からの抜粋)
-A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3129 -A PREROUTING -i eth1 -p tcp --dport 443 -j REDIRECT --to-port 3130 -A INPUT -m state --state NEW -m tcp -p tcp --dport 3128 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 3129 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 3130 -j ACCEPT
see also
http://codepoets.co.uk/2014/squid-3-4-x-with-ssl-for-debian-wheezy/
https://support.google.com/a/answer/1668854?hl=ja
なお、Squid のチューニングに関する書籍をお探しの場合は、こちらをどうぞ。ものは少々古めですが、それなりに参考になるかも?