じゅのぶろ

社内SEが自宅でSOC/CSIRTするために色々頑張っていきたいブログ 画像が見れない場合はjavascriptを有効にするかデスクトップからご覧下さい。

Squid 4.7 ssl bumpのアクションをACLで変える

モチベーション

  • HTTPSのサイトのパス、クエリを可視化したい
  • HTTPSの通信をロギングするにあたり、銀行やショッピングサイトのクエリまでロギングしたくない(MITMしたくない)
  • 通信許可しないサイトはブロックしたい ということがあり、ACLで設定してみました。

ロギングを緩和するリスト(SpliceSites.txt)と
拒否するサイトのリスト(TerminateSites.txt)を作ります。

私は/etc/squidの下にフォルダを作ってそこに入れました。

# mkdir -p /etc/squid/sitelist
# touch /etc/squid/sitelist/SpliceSites.txt
# touch /etc/squid/sitelist/TerminateSites.txt

リストの中身は一時的に以下にしました。

# cat SpliceSites.txt 
.google.com
# cat TerminateSites.txt 
.google.co.jp

公式サイト(以下の表)を参考にsquid.confに以下の設定を加えます。

acl SpliceSites ssl::server_name "/etc/squid/sitelist/SpliceSites.txt"
acl TerminateSites ssl::server_name "/etc/squid/sitelist/TerminateSites.txt"
acl TerminateSites_http dstdomain "/etc/squid/sitelist/TerminateSites.txt"

http_access deny TerminateSites_http !CONNECT
ssl_bump terminate TerminateSites
ssl_bump splice SpliceSites
ssl_bump stare !SpliceSites !TerminateSites

設定は上から評価されるのでご注意ください。
この設定で以下が達成できます。

  • 「*.google.com」にアクセスした際にはCONNECTのログのみ
    MITMしないのでsquidの証明書をインポートしていない場合であっても証明書エラーが発生しません
  • 「*.google.co.jp」にはhttp/httpsともにアクセスできない。
    httpは「http_access deny」、httpsは「ssl_bump terminate」で遮断
  • その他のサイトにアクセスした際にはパス、クエリもロギングされる MITMが発生しますのでsquidの証明書をブラウザに読み込ませないと証明書エラーが表示されます。

access.logは以下のようになりました。

# www.google.co.jp 遮断
"2019/07/06 16:07:10.183" 127.0.0.1 122 - 0 443 - "CONNECT ww.google.co.jp:443 HTTP/1.1" 0 "-" "curl/7.64.0" "NONE_ABORTED:HIER_NONE" "-" "-" "-"

# www.google.com CONNECTのみ
"2019/07/06 16:07:20.874" 127.0.0.1 1003 172.217.26.4 16533 443 - "CONNECT www.google.com:443 HTTP/1.1" 200 "-" "curl/7.64.0" "TCP_TUNNEL:HIER_DIRECT" "-" "-" "-"

# www.google.co.uk CONNECT/GET
"2019/07/06 16:07:25.196" 127.0.0.1 124 172.217.26.35 0 443 - "CONNECT www.google.co.uk:443 HTTP/1.1" 200 "-" "curl/7.64.0" "NONE:HIER_DIRECT" "/C=US/ST=California/L=Mountain View/O=Google LLC/CN=www.google.co.uk" "/C=US/O=Google Trust Services/CN=Google Internet Authority G3" "TLS/1.2"
"2019/07/06 16:07:25.346" 127.0.0.1 80 172.217.26.35 14257 443 text/html "GET https://www.google.co.uk/ HTTP/1.1" 200 "-" "curl/7.64.0" "TCP_MISS:HIER_DIRECT" "/C=US/ST=California/L=Mountain View/O=Google LLC/CN=www.google.co.uk" "/C=US/O=Google Trust Services/CN=Google Internet Authority G3" "TLS/1.2"

# yahoo.co.jp CONNECT/GET
"2019/07/06 16:10:19.479" 127.0.0.1 114 183.79.135.206 0 443 - "CONNECT yahoo.co.jp:443 HTTP/1.1" 200 "-" "curl/7.64.0" "NONE:HIER_DIRECT" "/C=JP/ST=Tokyo/L=Chiyoda-ku/O=Yahoo Japan Corporation/OU=EDGE_20190131/CN=*.yahoo.co.jp" "/C=JP/O=Cybertrust Japan Co., Ltd./CN=Cybertrust Japan Public CA G3" "TLS/1.2"
"2019/07/06 16:10:19.560" 127.0.0.1 80 183.79.135.206 3768 443 text/html "GET https://yahoo.co.jp/?test HTTP/1.1" 301 "-" "curl/7.64.0" "TCP_MISS:HIER_DIRECT" "/C=JP/ST=Tokyo/L=Chiyoda-ku/O=Yahoo Japan Corporation/OU=EDGE_20190131/CN=*.yahoo.co.jp" "/C=JP/O=Cybertrust Japan Co., Ltd./CN=Cybertrust Japan Public CA G3" "TLS/1.2"

http_access denyとssl_bump terminateの違い

http_access denyとssl_bump terminateはどちらを設定しても遮断可能であるが、
通信のどの段階で通信を遮断するかが異なります。

# access log
"2019/07/06 17:56:41.343" 127.0.0.1 124 - 0 443 - "CONNECT www.google.co.uk:443 HTTP/1.1" 200 "-" "curl/7.64.0" "TCP_DENIED:HIER_NONE" "-" "-" "-"
"2019/07/06 17:56:41.383" 127.0.0.1 80 - 3806 443 text/html "GET https://www.google.co.uk/ HTTP/1.1" 403 "-" "curl/7.64.0" "NONE:HIER_NONE" "-" "-" "-"

# Traffic
    1 0.000000000    127.0.0.1 → 127.0.0.1    TCP 74 37102 → 3128 [SYN] Seq=0 Win=43690 Len=0 MSS=65495 SACK_PERM=1 TSval=1316899939 TSecr=0 WS=128
    2 0.000032413    127.0.0.1 → 127.0.0.1    TCP 74 3128 → 37102 [SYN, ACK] Seq=0 Ack=1 Win=43690 Len=0 MSS=65495 SACK_PERM=1 TSval=1316899939 TSecr=1316899939 WS=128
    3 0.000059626    127.0.0.1 → 127.0.0.1    TCP 66 37102 → 3128 [ACK] Seq=1 Ack=1 Win=43776 Len=0 TSval=1316899939 TSecr=1316899939
    4 0.000348258    127.0.0.1 → 127.0.0.1    HTTP 190 CONNECT www.google.co.uk:443 HTTP/1.1 
    5 0.000366971    127.0.0.1 → 127.0.0.1    TCP 66 3128 → 37102 [ACK] Seq=1 Ack=125 Win=43776 Len=0 TSval=1316899940 TSecr=1316899940
    6 0.000713091    127.0.0.1 → 127.0.0.1    HTTP 105 HTTP/1.1 200 Connection established 
    7 0.000755905    127.0.0.1 → 127.0.0.1    TCP 66 37102 → 3128 [ACK] Seq=125 Ack=40 Win=43776 Len=0 TSval=1316899940 TSecr=1316899940
    8 0.002853778    127.0.0.1 → 127.0.0.1    TLSv1 583 Client Hello
    9 0.003418253    127.0.0.1 → 127.0.0.1    TLSv1.2 2725 Server Hello, Certificate, Server Hello Done
   10 0.003606545    127.0.0.1 → 127.0.0.1    TCP 66 37102 → 3128 [ACK] Seq=642 Ack=2699 Win=174720 Len=0 TSval=1316899943 TSecr=1316899943
   11 0.004701983    127.0.0.1 → 127.0.0.1    TLSv1.2 384 Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
   12 0.010473840    127.0.0.1 → 127.0.0.1    TLSv1.2 117 Change Cipher Spec, Encrypted Handshake Message
   13 0.010782922    127.0.0.1 → 127.0.0.1    TLSv1.2 175 Application Data
   14 0.011115717    127.0.0.1 → 127.0.0.1    TLSv1.2 3901 Application Data
   15 0.011315572    127.0.0.1 → 127.0.0.1    TLSv1.2 97 Encrypted Alert
   16 0.011327859    127.0.0.1 → 127.0.0.1    TCP 66 37102 → 3128 [ACK] Seq=1069 Ack=6616 Win=305664 Len=0 TSval=1316899951 TSecr=1316899950
   17 0.011433987    127.0.0.1 → 127.0.0.1    TCP 66 3128 → 37102 [FIN, ACK] Seq=6616 Ack=1069 Win=45952 Len=0 TSval=1316899951 TSecr=1316899951
   18 0.020934354    127.0.0.1 → 127.0.0.1    TLSv1.2 97 Encrypted Alert
   19 0.020972530    127.0.0.1 → 127.0.0.1    TCP 54 3128 → 37102 [RST] Seq=6617 Win=0 Len=0
# access log
"2019/07/06 17:50:08.492" 127.0.0.1 124 - 0 443 - "CONNECT www.google.co.uk:443 HTTP/1.1" 200 "-" "curl/7.64.0" "NONE_ABORTED:HIER_NONE" "-" "-" "-"

# Traffic
    1 0.000000000    127.0.0.1 → 127.0.0.1    TCP 74 37170 → 3128 [SYN] Seq=0 Win=43690 Len=0 MSS=65495 SACK_PERM=1 TSval=1317471853 TSecr=0 WS=128
    2 0.000031214    127.0.0.1 → 127.0.0.1    TCP 74 3128 → 37170 [SYN, ACK] Seq=0 Ack=1 Win=43690 Len=0 MSS=65495 SACK_PERM=1 TSval=1317471853 TSecr=1317471853 WS=128
    3 0.000058902    127.0.0.1 → 127.0.0.1    TCP 66 37170 → 3128 [ACK] Seq=1 Ack=1 Win=43776 Len=0 TSval=1317471853 TSecr=1317471853
    4 0.000451724    127.0.0.1 → 127.0.0.1    HTTP 190 CONNECT www.google.co.uk:443 HTTP/1.1 
    5 0.000471912    127.0.0.1 → 127.0.0.1    TCP 66 3128 → 37170 [ACK] Seq=1 Ack=125 Win=43776 Len=0 TSval=1317471854 TSecr=1317471854
    6 0.000821570    127.0.0.1 → 127.0.0.1    HTTP 105 HTTP/1.1 200 Connection established 
    7 0.000895572    127.0.0.1 → 127.0.0.1    TCP 66 37170 → 3128 [ACK] Seq=125 Ack=40 Win=43776 Len=0 TSval=1317471854 TSecr=1317471854
    8 0.003021123    127.0.0.1 → 127.0.0.1    TLSv1 583 Client Hello
    9 0.003511460    127.0.0.1 → 127.0.0.1    TCP 66 3128 → 37170 [FIN, ACK] Seq=40 Ack=642 Win=44800 Len=0 TSval=1317471857 TSecr=1317471856
   10 0.003724377    127.0.0.1 → 127.0.0.1    TCP 66 37170 → 3128 [FIN, ACK] Seq=642 Ack=41 Win=43776 Len=0 TSval=1317471857 TSecr=1317471857
   11 0.003740565    127.0.0.1 → 127.0.0.1    TCP 66 3128 → 37170 [ACK] Seq=41 Ack=643 Win=44800 Len=0 TSval=1317471857 TSecr=1317471857

次回はSplunkのFree版を導入してログを見ていきたいと思います。