てんこ

ブログ名は愛猫(てん)の愛称です。中身は個人のIT系学習記録です。

Squidで復号プロキシを立ててみた

めずらしくAnsible系以外の記事になります。

Repsonaというプロジェクト管理ツールが個人的に気に入っていて、会社でも使いたいなーと思っているのですが、会社のHTTPS復号環境だと、ログイン画面の直前でWebSocket用のJavaScriptの読み込みで失敗するようでした。

↑再現させた自宅での環境もこんな感じ。

Repsonaの開発者の ガッシー( @GussieTech ) さんと会話をする中で、検証環境用にHTTPS復号プロキシを簡単に立てられないかなと思い、実際に立ててみました。その作業メモを残しておきます。

環境

手順

Squidのインストール

yumコマンドでインストールを行います。

$ sudo yum -y install squid

インストール後、バージョン確認と有効になっているOptionを確認。

$ squid -v 
[ansible@proxy2 ~]$ squid -v
Squid Cache: Version 3.5.20
Service Name: squid

以下のように、有効になっているオプションが表示されますが、このなかで赤字にしてある2点(--enable-ssl-crtd , --with-openssl)が入っていれば、HTTPS復号プロキシは利用可能です。

configure options: '--build=x86_64-redhat-linux-gnu'(略) '--enable-snmp' '--enable-ssl-crtd' '--enable-storeio=aufs,diskd,rock,ufs' '--enable-wccpv2' '--enable-esi' '--enable-ecap' '--with-aio' '--with-default-user=squid' '--with-dl' '--with-openssl' '--with-pthreads' '--disable-arch-native' 'build_alias=x86_64-redhat-linux-gnu' 'host_alias=x86_64-redhat-linux-gnu' 'CFLAGS=-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches (略)

オレオレ認証局の証明書と鍵の作成

Squidディレクトリに移動し、オレオレ認証局の証明書と鍵を作成します。

$ cd /etc/squid

$ sudo openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 -keyout secret.key -out squidCA.pem

Generating a 2048 bit RSA private key
...........................................................................................................+++
..................+++
writing new private key to 'secret.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:hogehoge
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:hogehoge.com
Email Address []:

#↑の部分は対話式で入力していきます。

結果、以下のように認証局証明書(squidCA.pem)と秘密鍵(secret.key)の作成が完了しました。

f:id:tatematsu_san:20200713202933p:plain

認証局証明書の取得、信頼するルートCAへのインポート

SCPなどを用いて、squidCA.pemをプロキシクライアント端末へ取得し、ブラウザの証明書ストアへインポートします。

※DER形式へのコンバートコマンドなども書いてありますが、FireFoxであれば、pemでそのままインポート可能でした。

設定→オプション→「プライバシーとセキュリティ」→「証明書」

f:id:tatematsu_san:20200713203302p:plain

証明書マネージャ→「インポート」

f:id:tatematsu_san:20200713203402p:plain

対象のpemファイルを選択し、「開く」

f:id:tatematsu_san:20200713203422p:plain

インポートダイアログで「この認証局によるウェブサイトの識別を信頼する」にチェックし「OK」

f:id:tatematsu_san:20200713203445p:plain

インポートした認証局の情報が表示されることを確認。(ここでは、Default Company Ltd)

f:id:tatematsu_san:20200713203615p:plain

証明書ファイルの所有者・権限の変更

以下コマンドを入力し、証明書ファイルをsquid:squidの所有権に変更します。

$ sudo chown squid:squid squidCA.pem
$ sudo chmod 400 squidCA.pem

f:id:tatematsu_san:20200713203918p:plain

証明書キャッシュの作成と初期化、所有権の変更

以下コマンドで、証明書キャッシュの作成と初期化を行います。

なお、参考サイトで記載しているカスペルスキーさんのところでは「/usr/lib/squid/ssl_crtd 」となっていますが、最近の環境では、下記のように「/usr/lib64/squid/ssl_crtd」に修正する必要があると思います。

$ sudo mkdir -p /var/lib/squid
$ sudo /usr/lib64/squid/ssl_crtd -c -s /var/lib/squid/ssl_db

Initialization SSL db...
Done

$ sudo chown -R squid:squid /var/lib/squid

/etc/squid/squid.confの修正

以下の箇所の変更を行います。

# Squid normally listens to port 3128
#http_port 3128 #コメントアウト
http_port 3128 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/squid/squidCA.pem key=/etc/squid/secret.key #追加

sslcrtd_program /usr/lib64/squid/ssl_crtd -s /var/lib/squid/ssl_db -M 4MB #追加

sslcrtd_children 5 #追加

ssl_bump server-first all #追加

sslproxy_cert_error deny all #追加

firewalldの設定追加

Squid用のTCP3128について、着信を許可します。

$ sudo firewall-cmd --add-port=3128/tcp --zone=public --permanent

success

$ sudo firewall-cmd --reload
success

$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens192
  sources:
  services: dhcpv6-client ssh
  ports: 3128/tcp  #これが出てればOK
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

SELINUXのPermissive

Enforceのままだと証明書キャッシュの生成に失敗するので、とりあえずPermissiveにします。(怒られそう)

$ sudo setenforce permissive

サービスの起動と動作確認

systemctlコマンドでsquidサービスを起動します。

$ sudo systemctl start squid

クライアントのプロキシ設定と動作確認

プロキシを以下のように設定。

f:id:tatematsu_san:20200713221305p:plain

以下のように、HTTPSサイトにアクセスしたときに証明書の認証局が書き換わっており、SquidアクセスログHTTPSでアクセスした詳細なパス情報が記録されていればOK。

f:id:tatematsu_san:20200713220809p:plain

$ sudo cat /var/log/squid/access.log | grep news.yahoo

1594645647.847     78 192.168.10.243 TAG_NONE/200 0 CONNECT news.yahoo.co.jp:443 - HIER_DIRECT/182.22.25.124 -
1594645647.946     91 192.168.10.243 TCP_MISS/200 29546 GET https://news.yahoo.co.jp/pickup/6365311 - HIER_DIRECT/182.22.25.124 text/html
1594645649.292     56 192.168.10.243 TCP_MISS/200 8623 GET https://news.yahoo.co.jp/comment/plugin/v1/short/? - HIER_DIRECT/182.22.25.124 text/html

上手く行かない時は…

だいたい、/var/log/squid/cache.logか、/var/log/messagesに理由が書いてあります。

  • 初期化されていない系→案内通りにやってみる。だめならSELINUX設定見直し。
Uninitialized SSL certificate database directory: /var/lib/squid/ssl_db. To initialize, run "ssl_crtd -c -s /var/lib/squid/ssl_db".
  • 証明書が有効でない系エラーの場合→squid.confと、証明書ファイルのアクセス権の見直し。

まとめ

大分雑な環境ですが、こんな形でSquidHTTPS復号を行うプロキシサーバを立てることができました。

実運用考えた場合、squidのスタートアップだけでなく、SELINUXもConfigいじったりしないといけませんし、復号除外用のACLが書けるような設定にしたり、プロセス数をチューニングしたりと色々考える必要がありますので、そのあたりは適宜調整していただければ。

何かのお役に立てば幸いです。

今度はこれ、Playbook化しよっと。

参考にさせていただいたサイト

カスペルスキーさんのサイト

Squid で SSL Bump なプロキシサーバを構築する - 約束の地