ログ監視ツール logsurfer

logsurfer とは

システムログをリアルタイムで監視し、イベントの発生を報告します。
swatch と類似していますが、swatch にない機能を実装しています。

関連するログをグループ化できる。たとえば、ブート時には多数のログが書かれます。
その場合、ブート時のメッセージをグループ化して、管理者宛にシステムが起動したことを示す件名のメールを1つだけ送信できます。

C言語で書かれているので、多量のログが発生する環境でも運用できます。

logsurfer 1.5b インストールメモ

リアルタイムにログファイルを監視する logsurfer 1.5b をインストールする。

swatch に対して、次のような特長がある。

  • 関連する複数のログメッセージを コンテキスト というひとまとまりで扱える。
  • 動的にルールを追加・削除できるため、柔軟なログ監視ができる。
  • C で書かれているので Perl のモジュールを幾つもインストールする必要がない。

このドキュメントの前提環境

  • Red Hat Linux 7.3, 9 あよび Fedora Core 1, 2, 3 (これ以降でも問題ないはず)
  • logsurfer 1.5b

logsurfer 1.5b インストールメモ

logsurfer の tarball をダウンロードする。
ホームページ http://www.cert.dfn.de/eng/logsurf/
ファイル名 logsurfer-1.5b.tar
(2006.12.26現在、上記リンクが切れています)

tarball を伸張する。

$ tar xvf logsurfer-1.5b.tar
$ cd logsurfer-1.5b

INSTALL の手順に従いコンパイルする。

$ ./configure --with-etcdir=/etc/logsurfer
$ make

root になりインストールする。

$ su
# make install

実行ユーザ/グループの作成

Logsurfer のプロセスを実行するユーザ/グループを作成する。

# /usr/sbin/groupadd logadm
# /usr/sbin/useradd -g logadm -s /bin/sh logadm

ログファイルのパーミッションの変更

監視対象となるログファイルのパーミッションを、logadm グループのユーザが読めるように変更する。

# cd /var/log
# chmod 0640 maillog* messages* secure*

# chown root.logadm maillog* messages* secure*

設定ファイルの構造

設定ファイルは '#' で始まる行はコメント行となり、空白またはタブで始まる行は、前の行の続きとなる。

設定ファイルのルールは、以下の 7 つのフィールドから構成される。

match_regex not_match_regex stop_regex not_stop_regex timeout [continue] action

1. match_regex

監視するメッセージの正規表現を記述する。 パターンマッチした場合は、次に not_match_regex が評価される。

2. not_match_regex

match_regex にパターンマッチした後、評価を打ち切る (action を実行しない) ための正規表現を記述する。 not_match_regex にパターンマッチした場合は action が実行されない。 '-' を記述すると、match_regex にパターンマッチした場合、必ず action が実行される。

3. stop_regex

action で追加されたルールを削除するための正規表現を記述する。パターンマッチした場合は、ルールを削除するが、 not_stop_regex にマッチする場合は、ルールを削除しない。

4. not_stop_regex

stop_regex にパターンマッチした後、ルールの削除を行わないための正規表現を記述する。

5. timeout

ルールの有効期限を指定する。'0' を指定すると無期限となる。

6. continue

現在のログ行について action 実行後も他のルールの評価を行う場合に指定する。省略可能。

7. action

引数: action_command [arguments ...] 以下の形式で action を指定する。アクションの引数をダブルクォートで囲んだ場合、$0〜$9 が使える。 $0 は、メッセージ行全体を、$1 は match_regex にパターンマッチした部分を、$2〜$9 は、match_regex 中の副表現 (sub-expression) にマッチした部分に置き換えられる。

   ignore
       引数: なし
       パターンマッチを無視する。
   exec
       引数: command [arguments ...]
       コマンド command を実行する。引数をコマンドに渡す場合は、
       コマンドと引数全体をシングルクォートまたはダブルクォートで囲む。
   pipe
       引数: command [arguments ...]
       コマンド command の標準入力に、パターンマッチした行が送られる。
   open
       引数: match_regex match_not_regex line_limit timeout_abs timeout_rel default_action
       新規のコンテキストを作成する。コンテキストは match_regex の文字列により識別され、
       同じ識別名を持つコンテキストが存在する場合は、コンテキストは作成されない。

       match_regex
           コンテキストに追加する正規表現を記述する。
       match_not_regex
           match_regex にパターンマッチした後、評価を打ち切る (コンテキストに追加しない) ための正規表現を記述する。
           match_not_regex にパターンマッチした場合は、コンテキストに追加しない。'-' を記述すると、
           match_regex にパターンマッチした場合、必ずコンテキストに追加される。
       line_limit
           コンテキストに追加可能なメッセージの最大値 (行数) を指定する。
           最大値を超えた場合、default_action が実行され、コンテキストは自動的に削除される。'0' を指定すると、無制限に追加する。
       timeout_abs
           コンテキストが生成されてからの有効期限を秒数で指定する。
           timeout_abs 秒経過した場合、default_action が実行され、コンテキストは自動的に削除される。'0' を指定すると、有効期限が無期限となる。
       timeout_rel
           コンテキストに最後にメッセージが追加されてからのタイムアウトを秒数で指定する。
           timeout_rel 秒経過した場合、default_action が実行され、コンテキストは自動的に削除される。'0' を指定するとタイムアウトは無期限となる。
       default_action
           コンテキストの制限を越えた場合に実行されるアクションを指定する。
           書式はルールの ignore, exec, pipe, report と同一である。

   delete
       引数: match_regex
       match_regex で識別されるコンテキストを削除する。
   report
       引数: command match_regex
       コマンド command の標準入力に match_regex で識別されるコンテキストの内容が送られる。
   rule
       引数: {before|behind|top|bottom} ルール定義
       新しいルールを、指定した位置に追加する。

環境設定

設定ファイルのデフォルトは /usr/local/etc/logsurfer.conf であるが、ここでは /etc/logsurfer/logsurfer.conf とした。監視ポリシーに合わせて、監視対象とするパターンを設定する。

次のログ出力を Logsurfer にて監視する。

1: Sep 14 13:13:26 sv1 sshd[17072]: Accepted password for foo from aaa.bbb.1.210 port 65512
2: Sep 14 13:13:26 sv1 PAM_pwdb[17072]: (sshd) session opened for user foo by (uid=0)
3: Sep 14 13:32:56 sv1 PAM_pwdb[17072]: (sshd) session closed for user foo

次の例では、2 行目の '(sshd) session opened' の出力後、2 行目のみをメールで送信する。

'PAM_pwdb\[([0-9]*)\]: \(sshd\) session opened' - - - 0
    pipe "/bin/mail root -s \"sshd: session opened\""

次の例では、2 行目の '(sshd) session opened' の出力後、1, 2 行目をメールで送信する。'17072' という同じ PID により関連するログ出力である。3 行目とマッチしたら、コンテキストを削除する。3 行目が 1 行目の出力から 43200 秒以内に出力されないときも、コンテキストが自動的に削除される。

'sshd\[([0-9]*)\]: Accepted password' - - - 0
    open "PAM_pwdb\\[$2\\]:" - 5000 43200 0 ignore
'PAM_pwdb\[([0-9]*)\]: \(sshd\) session opened' - - - 0
    report "/usr/local/sbin/start-mail root \"sshd: session opened\""   "PAM_pwdb\\[$2\\]:"

'PAM_pwdb\[([0-9]*)\]: \(sshd\) session closed' - - - 0
    delete "PAM_pwdb\\[$2\\]:"

次の例では、3 行目の '(sshd) session closed' の出力後、1, 2, 3 行目をメールで送信する。

'sshd\[([0-9]*)\]: Accepted password' - - - 0
    open "PAM_pwdb\\[$2\\]:" - 5000 86400 0 ignore
'PAM_pwdb\[([0-9]*)\]: \(sshd\) session opened' - - - 0
    rule before "PAM_pwdb\\[($2)\\]: \\(sshd\\) session closed" - '.*' - 86400
    report "/bin/mail root -s \"sshd: session closed\"" "PAM_pwdb\\[$2\\]:"

'PAM_pwdb\[([0-9]*)\]: \(sshd\) session closed' - - - 0
    delete "PAM_pwdb\\[$2\\]:"

自動起動の設定

/etc/rc.d/rc.local から起動するように設定する。

# logsurfer
if [ -x /usr/local/bin/logsurfer ]; then
    su - logadm -c '/usr/local/bin/logsurfer \
      -c /etc/logsurfer/logsurfer.conf \
      -p /var/run/logsurfer.pid \
      -f -l `/usr/bin/wc -l /var/log/messages` &'
fi

logsurfer の仕様上、起動時にはログファイルを先頭から読み込みます。
そのため、設定を変更したりして logsurfer を再起動させると大変なことになる可能性があります。
対策として上記スクリプトでは、-l オプションを利用して出力済みのログは再度読み込まないようにしています。
kimi さん情報ありがとうございます。
ログのローテートへの対応

ログのローテートが発生した場合、ローテートされた古いファイルを監視し続けるため、Logsurfer に HUP シグナルを送り再起動させる。

/etc/logrotate.d/syslog

/var/log/messages {
    create 0640 root logadm
    postrotate
        /usr/bin/killall -HUP syslogd
        /usr/bin/killall -HUP logsurfer
    endscript
}

ログファイルの集約

これまでの説明では、複数のシステムログファイルを別々に監視するような形をとっていますが、これでは不便だと思いsyslogをすべて集約して1つのファイルに出力するようにして使用しています。
以下の設定は集約ログファイルsystemlogを作成して、ログローテートは過去1回分(今週分と先週分)保存にしています。

/etc/syslog.conf

*.*           /var/log/systemlog

/etc/logrotate.d/syslog

/var/log/systemlog {
    rotate 1
    create 0640 root logadm
    postrotate
        /bin/kill -HUP `cat /var/run/logsurfer.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

その他の部分は基本的には変わりません。読み取り元のファイルが変わるくらいです。

なお、この設定は他のログ監視ツールにおいても使用できますので便利に使用できています。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-09-16 (水) 08:17:53 (353d)