Logwatchでサーバー上のログを集約する | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

Logwatchとは、サーバー上のログ(例えばsyslog等)を定期的にまとめ、集約してレポートを出してくれるソフトウェア(Perlのプログラム)です。

運用上で定期的にチェックするログファイルは膨大な上に、大部分は問題の無い単なる情報が書き出されています。

ログの出力レベルを落とすのも一つですが、問題が発生した時に単なる情報レベルのものでも有益なものとなる場合もあるので、それはそれで困る事態にもなったりします。


であれば、運用上注視すべきポイントだけをまとめて見ることができた方が、運用管理者の業務も楽になります。

Logwatchのメリットはそこにあり、ログファイルから特異点だけを抽出してレポートにまとめてくれるので運用担当者はその情報だけに目を通せばよくなります。


RedHat系のOSであればパッケージでも提供されており、デフォルトでインストールされている環境も多いかと思います。

パッケージが存在するかは


# rpm -qa | grep logwatch
logwatch-5.2.2-2.EL4

と入力してパッケージ名が表示されていればインストールされています。

もしパッケージが入っておらず、インストールしたい場合は本家のサイト からダウンロードできます。

または、up2dateコマンド(※1)またはyumコマンド(※2)からでも可能です。


※1 参考: up2dateによるRPMパッケージの更新管理

※2 参考: yumによるRPMパッケージの更新管理


Logwatchが出力するレポートの例は下記のような感じです。


################### LogWatch 5.2.2 (06/23/04) ####################
Processing Initiated: Sun Oct 14 03:30:04 2007
Date Range Processed: all
Detail Level of Output: 0
Logfiles for Host: hoge
################################################################
--------------------- httpd Begin ------------------------
Requests with error response codes
GET /src/test.html HTTP/1.1 with response code(s) 404 1 responses
GET /img/test.gif HTTP/1.1 with response code(s) 404 3 responses
---------------------- httpd End -------------------------

--------------------- Cron Begin ------------------------
Commands Run:
User root:
run-parts /etc/cron.daily: 1 Time(s)
run-parts /etc/cron.hourly: 24 Time(s)
run-parts /etc/cron.weekly: 1 Time(s)
User foo:
/usr/local/bin/php /home/scripts/backup.php > /dev/null: 1 Time(s)
---------------------- Cron End -------------------------

--------------------- ftpd-xferlog Begin ------------------------
TOTAL KB OUT: 558KB (0MB)
TOTAL KB IN: 558KB (0MB)
Incoming User FTP Transfers:
hoge -> /home/foo/scripts.tar.gz (User: foo)
Outgoing User FTP Transfers:
/home/foo/images.tar.gz -> hoge (User: foo)
---------------------- ftpd-xferlog End -------------------------

--------------------- pam_unix Begin ------------------------
su:
Sessions Opened:
root(uid=0) -> postgres: 1 Time(s)
foo(uid=502) -> root: 2 Time(s)

---------------------- pam_unix End -------------------------

--------------------- SSHD Begin ------------------------

Users logging in through sshd:
foo:
192.168.0.100: 2 times

---------------------- SSHD End -------------------------

--------------------- up2date Begin ------------------------

Package Installed:
['kdebase-3.3.1-6.el4', 'kdelibs-3.3.1-9.el4', 'tzdata-2007h-1.el4']
Package Added To Profile:
['kdebase-3.3.1-6.el4', 'kdelibs-3.3.1-9.el4', 'tzdata-2007h-1.el4']
Package Removed From Profile:
['kdebase-3.3.1-5.19.rhel4', 'kdelibs-3.3.1-6.RHEL4', 'tzdata-2007f-1.el4']
**Unmatched Entries**
allAvailablePackageList from network
allAvailablePackageList from network
Updating package profile
---------------------- up2date End -------------------------

------------------ Disk Space --------------------
/dev/sda7 1012M 234M 727M 25% /
/dev/sda1 122M 12M 105M 10% /boot
/dev/sda8 26G 1.4G 24G 6% /home
/dev/sda3 9.9G 2.2G 7.2G 23% /usr
/dev/sda5 5.0G 1.1G 3.7G 23% /var
/dev/sda2 30G 350M 28G 2% /sites
###################### LogWatch End #########################


Logwatchのレポートの見方


Logwatchのバージョンや設定によって出力される項目が異なってきます。

そのため、ここで紹介しているものは本の一例に過ぎません。


□ httpd Begin ~ httpd End


Apacheのログファイル(access_logやerror_logなど)の特異点を出力しています。

この例だと、test.htmlとtest.gifが存在しない(HTTPステータスコードが404のもの)と言う事が分かります。

Webサーバーのサービス提供に影響のあるエラーが出ていないかチェックする事ができます。



□ Cron Begin ~ Cron End


Cronに関する情報です。

ここからどのプログラムが、何回実行されたかが分かります。

上記の場合、fooユーザーのcrontabでbackup.phpというプログラムが1回実行された事が分かります。

本来Cronで動かしていないプログラムが実行されていないかチェックできます。



□ ftpd-xferlog Begin ~ ftpd-xferlog End


FTPに関する情報です。

1日のうちにサーバーからどれだけの容量のデータが転送された(TOTAL KB OUT)のか、どれだけの容量のデータが入ってきたのか(TOTAL KB IN)が分かったり、その転送されたファイル、入ってきたファイルが何かが分かります。


上記の場合、fooユーザーによってhogeというホストから、scripts.tar.gzと言うファイル転送されてきた事、fooユーザーによってhogeというホストに、images.tar.gzというファイルが転送された事が分かります。


本来接続されはずのないホストから、接続やファイルの転送が行われていないかをチェックする事ができます。



□ pam_unix Begin ~ pam_unix End


OS上のユーザーの変更履歴が確認できます。

上記の場合、rootユーザーからpostgresユーザーへ1回、fooユーザーからrootユーザーへ2回変更が行われた事がわかります。

その他にもユーザー変更の失敗回数も分かりますので、運用上ありえないユーザーへの変更、また変更の失敗回数から何か良からぬ事をしようとしていた(またはされた・・・)可能性がある事がわかります。



□ SSHD Begin ~ SSHD End


SSHでの接続履歴です。

接続が成功した場合は、そのIPアドレス(またはホスト名)が表示されます。

上記の場合、fooユーザーによって「192.168.0.100」のIPアドレスから2回の接続があったことがわかります。


また、アクセス制御をしていた場合、特定のネットワークからしか接続できなくなりますが、そういった場合はアクセスを拒否した履歴も表示されます。

どのIPアドレスからの接続を何回拒否したといった具合です。

ここから、想定しているアクセス元以外のところから接続が試みられた事がわかります。


※ SSHによるアクセス制御については「SSHのログインを制限する 」も参考にしてください。



□ up2date Begin ~ up2date End


これは、RedHat系のOSに限りますがup2dateによってパッケージのインストール、更新が行われた履歴を確認する事ができます。



ここでは基本的な出力内容について触れましたが、レポートの内容についてはLogwatchが独自に出しているものはほとんどありません。

各デーモンが出力したログの内容を精査したり、回数を数えたりしてレポートに出しているだけです。

ですので、各ログの内容はそのデーモンが出力する、メッセージについて調べる必要があります。


Logwatchは先にも書いたようにPerlのプログラムですので、設定ファイルを変更する以外にも独自のスクリプトを書くこともできます。

一般的な設定に関しては、設定ファイルである「/etc/log.d/logwatch.conf」の編集で対応できます。


Logwatchはデフォルトの設定であれば、そのレポートの内容をメールで送信しようとします。

しかし、MTAがサーバー上にインストール、設定されていなければもちろんメールは送信されません。

(この場合、恐らくclientmqueue以下のディレクトリにメールが溜め込まれてしまいます)

※ 対処方法は、下記を参考にしてください。


clientmqueueディレクトリ以下に吐き出される大量ファイルの対処法


Logwatchは、設定ファイルだけでなく実行コマンド(/usr/sbin/logwatch)にオプションを与える事でもレポートの出力レベルやログの対象を変更する事ができます。

主な設定内容、オプションは下記のものがあります。


設定ファイル 実行オプション 概要
MailTo --mailto レポートのメール送信先です。サーバー上にMTAが動いていなければ送信できません。
指定は、OS上のユーザーかE-Mailを指定します。
Save --save レポートをローカル上に保存させる場合に、そのファイル名(パス)を指定します。
Range --range 対象のログから抽出する時間の範囲を指定します。
「Today」なら今日の日付のログが、「Yesterday」なら昨日の日付のログが出力されます。
「ALL」ならログ全てが対象になります。
Archives --archives ログがアーカイブされていた場合、それも対象に入れるか指定します。
多くのログファイルは、一定期間で退避されていることが多いでしょうからそのようなログファイルも対象に含める場合は設定します。
Detail --detail レポートの出力レベルです。「Low」「Med」「High」(又は0から10の数字)が指定でき、「High」が一番細かいレベルでレポートが作成されます。


Logwatchは、予めCronに登録されていますので、デフォルトのままだとcron.dailyが実行される時間帯に起動され、ログの集約・レポートの作成を行います。


- cron.dailyに登録されているLogwatchの実行プログラム


/etc/cron.daily/00-logwatch

Logwatchが出力するレポートを、ローカルのファイルに落とし込む場合、前回出力したレポートで上書きしないよう、logrotateで退避させておけばよいでしょう。


※ logrotateについては、下記を参考にしてください。


参考: logrotateでログファイルがローテーションされない事への対処


参考: logrotateでローテーションされるファイル名を変更する