2017年4月9日日曜日

オープンソースのログ統合管理ツール「Graylog」でsquidのログを管理する

自宅の検証環境では、squidを使ってプロキシサーバーを構築しており、このプロキシサーバーを経由してインターネットにアクセスするように構成している。このsquidログをsyslogでGraylogに飛ばして管理してみたのだが、ログの中身までは分析されず、ただ保存されるだけとなってしまい、統計情報を確認したり、ログを分析することは困難となっていた。

そこで、Graylogでこのsquidログに対し、分類・タグ付け(ログの正規化)を行い、統計情報を表示できるようにしてみた。

GraySquidのダウンロード

まず、Graylogにてsquidを管理するためのContent Packを以下からダウンロードしておく。

GraySquid
https://marketplace.graylog.org/addons/bd3efa5f-6ccb-47ce-97ea-6ebe0270a9c7

拡張子が.jsonとなるJSONで記載されたテキストファイルがダウンロードされる。
※JSON (JavaScript Object Notation):XMLのようなテキストベースのデータフォーマット

このContet Packの概要は以下の通り。

 ・Graylogの受信ポート番号はTCP/19302を使う
 ・squidログは標準形式のものを取り込む(apacheのログ形式はきちんと取り込めない)
 ・squidログの各種情報(アクセス先URLやステータスコードなど)を正規化して取り込む
 ・squidの直近の通信の統計情報を表示するDashboardも用意されている

GraylogにGraySquidをインポート

GraylogのWeb GUIにログインし、Content Packのインポートから実施する。

「System」→「Content Packs」を選択し、「Select content packs」の一番下に「Import Content Pack」という項目があるため、先ほどダウンロードしたJSONのファイルを選択し、「Upload」ボタンを押下する。


インポートが成功すると、「Select content packs」に「Proxies」という項目が新たに表示されるので、その中の「Squid Logs」を選択し、「Apply Content」ボタンを押下する。


これだけで、TCP/19302で受信したログをsquidのログとして取り込む準備が完了する。

squid側の設定

squid側でログを飛ばす設定を行う。squidのaccess.logをrsyslogにてGraylogに飛ばす設定となる。なお、今回ログを飛ばすOS、squid、rsyslogのバージョンは以下の通りとなる。

# cat /etc/redhat-release
------------------------------
CentOS Linux release 7.3.1611 (Core)
------------------------------

# squid -v
------------------------------
Squid Cache: Version 3.5.20
------------------------------

# rsyslogd -v
------------------------------
rsyslogd 7.4.7
------------------------------

squidがインストールされたLinuxにログインし、以下ファイルを新規作成する。

# vi /etc/rsyslog.d/60-squid.conf
------------------------------
# Load Modules
module(load="imfile")
module(load="omfwd")

# rsyslog Input Modules
input(type="imfile"
         File="/var/log/squid/access.log"
         Tag="squid-access"
         Severity="info"
         Facility="local7"
         ruleset="SquidForward")

# rsyslog RuleSets
ruleset(name="SquidForward") {
        action(type="omfwd"
        Target="<GraylogのIPアドレス>"
        Port="19302"
        Protocol="tcp"
        template="RSYSLOG_SyslogProtocol23Format")
}
------------------------------

設定反映のため、rsyslogサービスをリスタートする。

# systemctl restart rsyslog
# systemctl status rsyslog   ←確認
------------------------------
● rsyslog.service - System Logging Service
   Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
   Active: active (running) since 日 2017-04-02 07:22:34 JST; 5s ago
 Main PID: 5493 (rsyslogd)
   CGroup: /system.slice/rsyslog.service
           mq5493 /usr/sbin/rsyslogd -n

 4月 02 07:22:34 t3023ce72 systemd[1]: Starting System Logging Service...
 4月 02 07:22:34 t3023ce72 systemd[1]: Started System Logging Service.
------------------------------

Graylogにてログの確認

squid側の設定が完了したら、実際にログが表示されることを確認する。

「Search」タブにてログを表示させ、squidのログをクリックしてみる。MethodやStatus_Codeがそれぞれ分類されて表示されており、ログが正規化されていることがわかる。


次に「Dashboards」を選択すると、以下3つのDashboardが追加されていることがわかる。

 ・Squid TCP_ALLOWED
 ・Squid TCP_DENIED Stats
 ・SquidStats


お勧めは3つめの「SquidStats」で、直近15分のsquidを経由した通信の統計情報が表示される。直近15分では統計情報として物足りないのであれば、時間をカスタマイズすることも可能な模様。ただし、時間を延ばせば、その分Graylogの処理も増えるはずなので、マシンリソースと相談して設定するのがよいだろう。



以上で、Graylogにてsquidログを正規化して取り込み、統計情報を表示することができた。ただし、squidログは生ログで見ると時間表示がUNIX時間(1970/1/1からの累計時間)で表示される仕様となっており、人間が確認する場合は視認性がいまいちである。squidログはapache形式にログ表示を変えることができるので、apache形式でログ取得して同様のことができないかも調べていきたい。