🔐 Squid + ADCS で SSL Bump を構成する手順(社内向け)

🔍 概要

このドキュメントは、社内の Active Directory Certificate Services (ADCS) を用いて、Squid プロキシで SSL Bump(HTTPS 通信の中間解釈) を構成する方法を説明します。

目的は、社内クライアントの HTTPS トラフィックを可視化・制御(マルウェア検査・URL フィルタリング等)することです。

⚠️ 注意:SSL Bump は暗号化通信を復号するため、プライバシー・法令・社内ポリシーに十分配慮してください。

🧩 前提条件

🗺️ アーキテクチャ概要

[Client]
   │ HTTPS
   ▼
[Squid Proxy (ssl_bump + CA cert + ssl_crtd)]
   │ HTTPS
   ▼
[Internet / Origin Server]

Squid は ADCS から発行された「サブCA証明書」を使い、HTTPS 通信を復号・再暗号化します。

⚙️ 構成パターン

方式説明推奨度
A. サブCA方式(推奨)ADCS から Squid 用のサブCA証明書を発行し使用⭐⭐⭐⭐⭐
B. 自己署名方式Squid が自己署名 CA を作成し、GPO で配布⭐⭐

🧾 ADCS 側の設定(サブCA発行)

CSR 生成(Squid側)

・Squid用のサブCA証明書を発行するための「証明書署名要求(CSR)」を作成します。

・CSRの署名用にまず秘密鍵(※)を作成し、その秘密鍵を指定してCSRを発行します。

※秘密鍵は、SSL bump時に各サイト用の「偽サーバ証明書」を発行・署名するための鍵となります。
openssl genrsa -out squid_subca.key 4096

cat > ca_req.conf
[ req ]
default_bits       = 4096
prompt             = no
distinguished_name = dn
x509_extensions    = v3_ca

[ dn ]
C  = JP
ST = Tokyo
L  = Tokyo
O  = Cisco
OU = CXPS
CN = Squid-Proxy-SubCA

[ v3_ca ]
basicConstraints = critical, CA:TRUE, pathlen:0
keyUsage         = critical, cRLSign, keyCertSign
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer

openssl req -new -key squid_subca.key -out squid_subca.csr -config ca_req.conf

🧱 Squid 側の設定

ssl_crtd 初期化

・ssl_crtd とは、Squidで SSL Bump を行う際に使われる「動的証明書生成用の補助プログラム」です。

・SSL Bump では、プロキシが中間者として通信を復号するために、アクセス先ごとに「偽のサーバ証明書」を動的に発行します。
・その証明書を実際に生成・キャッシュしているのが ssl_crtd です。

SSLDB=/var/lib/ssl_db
mkdir -p ${SSLDB}
chown -R proxy:proxy ${SSLDB}
/usr/lib64/squid/security/ssl_crtd -c -s ${SSLDB}

証明書配置

1. サブCA証明書を /etc/squid/ssl_cert/squid_ca_cert.pem に書き込みます。

2. ルートCA証明書を /etc/squid/ssl_cert/squid_ca_cert.pem の末尾に追記し、「証明書チェーン」を1ファイルにまとめます。
3. サブCAの秘密鍵を .pem 形式で保存します。この鍵が実際に SSL bump で動的証明書を署名するために使用されます。

cat squid_subca.crt > /etc/squid/ssl_cert/squid_ca_cert.pem
cat root_ca.crt >> /etc/squid/ssl_cert/squid_ca_cert.pem
cat squid_subca.key > /etc/squid/ssl_cert/squid_ca_key.pem

squid.conf 設定例

http_port 3128
https_port 3129 ssl-bump cert=/etc/squid/ssl_cert/squid_ca.pem generate-host-certificates=on dynamic_cert_mem_cache_size=4MB

sslcrtd_program /usr/lib/squid/security/ssl_crtd -s /var/lib/ssl_db -M 4MB
sslcrtd_children 8 startup=1 idle=1

acl step1 at_step SslBump1
ssl_bump peek step1
ssl_bump bump all

sslproxy_cert_error allow all
sslproxy_flags DONT_VERIFY_PEER
sslproxy_options NO_SSLv3 NO_TLSv1
sslproxy_cipher HIGH:!aNULL:!MD5

🖥️ クライアント側:CA信頼の配布(GPO)

  1. GPO → Computer Configuration → Windows Settings → Security Settings → Public Key Policies → Trusted Root Certification Authorities
  2. ADCSルートCAまたはSquidサブCAをインポート
  3. gpupdate /force で反映
  4. ブラウザでアクセスし、発行者が Squid-Proxy-SubCA になっていれば成功

🧪 動作確認

コマンドライン

curl -x http://<squid-ip>:3128 -k https://www.google.com/ -v

ブラウザ

HTTPS サイトにアクセスし、証明書発行者が Squid-Proxy-SubCA であることを確認します。

🧰 トラブルシュート

症状原因 / 対処
証明書エラークライアントにCA未配布/チェーン不完全
ssl_crtdエラーディレクトリ権限/初期化忘れ
一部サイトでエラーHSTSやピン留め → ssl_bump spliceで除外
acl sensitive dstdomain .bank.example
ssl_bump peek step1
ssl_bump splice sensitive
ssl_bump bump all

✅ チェックリスト

📚 補足:自己署名CA方式(簡易構成)

openssl req -new -x509 -days 3650 -newkey rsa:4096 -keyout squid_ca.key -out squid_ca.crt
cat squid_ca.crt squid_ca.key > /etc/squid/ssl_cert/squid_ca.pem

GPOでroot_ca.crtを配布し、構成はサブCA方式とほぼ同じです。

📎 参考リンク