じゅのぶろ

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

Squidのログフォーマット設定

設定はsquid.confで行います。
※私の環境では「/usr/local/squid/etc/squid.conf」でした。

必須の設定は2つで「ログフォーマットの定義」と「ログ出力ファイルの指定」です。

ログフォーマットの定義


以下のように名前とログフォーマットの指定を行います。

logformat <名前> <ログフォーマット指定>

デフォルトで定義されているものは以下の5種類のようです。

logformat squid      %ts.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %[un %Sh/%<a %mt
logformat common     %>a %[ui %[un [%tl] "%rm %ru HTTP/%rv" %>Hs %<st %Ss:%Sh
logformat combined   %>a %[ui %[un [%tl] "%rm %ru HTTP/%rv" %>Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh
logformat referrer   %ts.%03tu %>a %{Referer}>h %ru
logformat useragent  %>a [%tl] "%{User-Agent}>h"

ログ出力ファイルの指定


定義したログフォーマットとログ出力先を指定します。
以下は定義済みの「combined」をフォーマットとして利用する例です。

access_log daemon:/usr/local/squid/var/logs/access.log combined

フォーマットコード

リンクから公式サイトのフォーマット一覧が確認できます。 squid : logformat configuration directive よく利用するフォーマットコードを以下に記載します。


時間

フォーマットコード 意味
%ts エポック秒 1561905301
%tu エポックミリ秒 001
%tl ローカル時間 30/Jun/2019:23:30:16 +0900

* 通りがかりの人のコメント通りで修正しました。ありがとうございます。

一般に%tsと%tuは組み合わせて使われることが多いようです。 「%ts.%03tu」→「03」は0で埋めて3桁にするということです。

%tlは更に細かくフォーマットの順番を指定できます。
日本でなれた形式にするには以下のようにします。 %{%Y/%m/%d %H:%M:%S}tl → 2019/07/01 00:00:00

通信


フォーマットコード 意味
%>a 接続元のIPアドレス 192.168.1.2
%<a 宛先のIPアドレス 192.168.1.1
%>Hs HTTPステータスコード 200
%mt MIMEコンテントタイプ text/html, text/plain
%rm リクエストメソッド GET
%ru リクエストURL(クエリなし) http://192.168.1.1/hoge?
%>ru リクエストURL(フル) http://192.168.1.1/hoge?fuga
%{Referer}>h リファラ http://192.168.1.1/login.html?test
%{User-Agent}>h ユーザエージェント Mozilla/5.0 (compatible; MSIE 10.0; )

squidのデフォルトがクエリなし「%ru」なので出力したい方は 「%ru」ではなく「%>ru」を使うようにしましょう。
※クエリにはセンシティブな情報が含まれることもあるのでログファイルの扱いにはご注意ください。

ssl/tls

ssl/tlsのロギングを有効にするにはssl bumpを有効にする必要があります。
これについては別記事でご紹介します。

フォーマットコード 意味
%ssl::<cert_subject 接続先サイトのSubject /C=US/ST=California/L=Mountain View/O=Google LLC/CN=www.google.com
%ssl::<cert_issuer 接続先サイトのIssuer /C=US/O=Google Trust Services/CN=Google Internet Authority G3
%ssl::>negotiated_version クライアントが要求したTLSバージョン TLS/1.2
%ssl::<negotiated_version サーバが応答したTLSバージョン TLS/1.2
%ssl::>received_hello_version クライアントHelloメッセージのTLSバージョン TLS/1.0
%ssl::<received_hello_version サーバHelloメッセージのTLSバージョン TLS/1.2
%ssl::>received_supported_version クライアントがサポートする最大のTLSバージョン TLS/1.2
%ssl::<received_supported_version サーバがサポートする最大のTLSバージョン TLS/1.2
%ssl::>negotiated_cipher クライアントが要求したCipher Suite AES256-GCM-SHA384
%ssl::<negotiated_cipher サーバが応答したCipher Suite ECDHE-ECDSA-AES128-GCM-SHA256

色々見ましたが最終的に私はcombinedをベースにして、足りないと感じた値を追加し以下にしました。 ※後ほどこのログをSplunkに取り込んでパースしたいと思います。

logformat mycombined   "%{%Y/%m/%d %H:%M:%S}tl.%03tu" %>a %>st %<a %<st %>rP %mt "%rm %>ru HTTP/%rv" %>Hs "%{Referer}>h" "%{User-Agent}>h" "%Ss:%Sh" "%ssl::<cert_subject" "%ssl::<cert_issuer" "%ssl::<received_hello_version"
access_log daemon:/usr/local/squid/var/logs/access.log mycombined