pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


CentOS7でsquidでSSLをフィルタリングするproxyをforward proxyで設定し、さらにGoogleの個人アカウントへのアクセスを禁止する

過去に、squidで透過型プロキシを立てるネタを2件ほど書いているのですが、透過型プロキシのテストは案外めんどくさいものです。Linuxがルータとして動作するように設定した上で port forward を設定し、さらにクライアント側もそのルータを経由するように設定せねばなりません。

そこで、こういった設定をせずとも SSLの中継をテストするために、通常の forward proxy でSSLを取り扱えるように設定してみます。そしてさらにGoogleの個人アカウントを禁止する設定も作ってみます。

まずは過去記事の紹介から

pslabo.hatenablog.com

[http://pslabo.hatenablog.com/entry/2017/06/11/Ubuntu_16.04_LTS%E3%81%A7_squid%E3%81%AE%E9%80%8F%E9%81%8E%E5%9E%8B%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%82%92%E7%AB%8B%E3%81%A6%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB_squid_%E3%82%92%E3%83%AA%E3%83%93:embed:cite]

今回の環境

いまさらCentOS6で環境を作るのもイマイチですから、今回はCentOS7でやってみることにします。 なお、CentOS7のsquidは–with-opensslつきでビルドされていますので、今回はこれをそのまま使います。

設定上のポイント

  • SELinux を使用している場合は「都度生成されるサーバ証明書ディレクトリに対して squid がアクセスできるように設定変更する」ことをお忘れなく。これを忘れると意味不明なエラーが出てハマることになります。
  • forward proxy の場合は ssl_bump の設定が client-first となります。(透過型の場合は server-first です)
  • https_port は設定しません。今回のケースでは、http_port ですべてのリクエストを取り扱います。
  • http_port の設定には intercept の設定を書きません。透過型ではなく forward proxy ですから。

実際の作業

CentOS7 のインストール

CentOS-7-x86_64-Minimal-1611.iso でインストールします。

squid のインストール

とりあえずはこれだけでOK。

sudo yum install squid

オレオレCAの作成

CentOS7 の場合は openssl をインストールすると /etc/pki/CA/private というディレクトリがあるので、ここにオレオレCAをセットアップするのが妥当な気がします。そこで今回は以下のように作業しています。(過去記事との違いは cd するディレクトリが違うことだけです)

cd /etc/pki/CA/private

# オレオレ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 の設定

これは以前の記事と基本的に同じですが、ここで作成する /var/lib/ssl_db には SELinux での権限割り当てが行われていないので、SELinux が有効な場合はsquid からのアクセスが失敗します。

/usr/lib64/squid/ssl_crtd -c -s /var/lib/ssl_db
chown -R squid /var/lib/ssl_db

よって SELinux が有効な場合は以下のコマンド実行を忘れないようにしてください。

chcon -R -t squid_cache_t /var/lib/ssl_db

これを忘れていると /var/log/squid/cache.log あたりにこういうメッセージが出てsquidが異常終了するという罰ゲームに遭遇します。このエラーメッセージを見ると ssl_crtd の初期化ができていないように読めますが、実はそうではなく、権限がないからアクセスできていない状態であることを、初期化できていないと判定しているわけです。

(ssl_crtd): Uninitialized SSL certificate database directory: 
/var/squid/ssl_db. To initialize, run "ssl_crtd -c -s /var/squid/ssl_db". 
(ssl_crtd): Uninitialized SSL certificate database directory: 
/var/squid/ssl_db. To initialize, run "ssl_crtd -c -s /var/squid/ssl_db". 
(ssl_crtd): Uninitialized SSL certificate database directory: 
/var/squid/ssl_db. To initialize, run "ssl_crtd -c -s /var/squid/ssl_db". 
(ssl_crtd): Uninitialized SSL certificate database directory: 
/var/squid/ssl_db. To initialize, run "ssl_crtd -c -s /var/squid/ssl_db". 
(ssl_crtd): Uninitialized SSL certificate database directory: 
/var/squid/ssl_db. To initialize, run "ssl_crtd -c -s /var/squid/ssl_db". 

squid を設定する

デフォルトの squid.conf.default との差分形式を掲示しておきます。ここで記述している内容は過去記事に書いてますので、不明点があればそちらをご参照いただきたく。また、一部の設定では証明書の検証エラーをスルーしていますので、そのまま用いるとセキュリティ上の問題が生じることにご注意ください。これはあくまで基本的な動作検証を目的に作成した設定です。

[root@localhost squid]# diff -u /etc/squid/squid.conf.default /etc/squid/squid.conf
--- /etc/squid/squid.conf.default   2017-04-13 04:43:17.000000000 +0900
+++ /etc/squid/squid.conf   2017-06-18 11:23:11.852000000 +0900
@@ -2,6 +2,21 @@
 # Recommended minimum configuration:
 #
 
+visible_hostname [適当なサーバ名]
+
+http_port 3128 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/pki/CA/private/oreoreCA.pem
+
+always_direct allow all
+ssl_bump client-first all
+
+sslproxy_cert_error allow all
+sslproxy_flags DONT_VERIFY_PEER
+
+cache_dir aufs /var/spool/squid 100 16 256
+
+acl to_google dstdomain .google.com
+request_header_add X-GoogApps-Allowed-Domains [自社ドメイン] to_google
+
 # Example rule allowing access from your local networks.
 # Adapt to list your (internal) IP networks from where browsing
 # should be allowed
@@ -56,7 +71,7 @@
 http_access deny all
 
 # Squid normally listens to port 3128
-http_port 3128
+#http_port 3128
 
 # Uncomment and adjust the following to add a disk cache directory.
 #cache_dir ufs /var/spool/squid 100 16 256

クライアント側の設定

oreoreCA.der をクライアント側のブラウザにインストールしてください。これを実施していない場合は、すべてのSSL/TLSな接続で証明書エラーが出てしまいます。

また、今回の設定は forward proxy ですから、クライアント側でプロキシサーバを明示的に設定しておく必要があります。

上記の設定で、自分の環境ではGoogleへの個人アカウントでの利用(メールとかGoogleドライブ)が禁止できることを確認できています。ただし、Google へのログイン自体は個人アカウントでも通ってしまいますので、検証の際は gmail 等の個別のサービスにアクセスしてみてください。

そして、forward proxy が意図通りに動くようになってから、transparent proxy の動作を確認するとよいでしょう。