2011/09/16 CentOS5.5





rsyslogで特定ログに対してメールを送信する


※これは古いコンテンツです。新しくログサーバを構築するなら
 「シスログに特定文字列が出力されるとメール送信するを参照してください。


ここではrsyslogで特定の文字列を発見したらメールを送信してします。
条件判断については別項「rsyslogで条件式を設定する」を参照してください。

rsyslog.confの例
syslogメッセージの内容に対して、メールを送信する


rsyslog.confの例(デフォルトのコメントアウト部は省いてあります)
#$ModLoad immark   # provides --MARK-- message capability
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imklog   # kernel logging (formerly provided by rklogd)

$template customformat,"%timegenerated% %HOSTNAME% %syslogtag%%msg%\n"
$template logFileName,"/var/log/syslog/%fromhost%/messages_%fromhost%_%$year%%$month%%$day%.log"
$template mailFileName,"/var/log/syslog/%fromhost%/mail_%fromhost%_%$year%%$month%%$day%.log"

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
#*.info;mail.none;authpriv.none;cron.none                -/var/log/messages
*.info;mail.none;authpriv.none;cron.none                -?logFileName;customformat
*.info;mail.none;authpriv.none;cron.none                @remoteserver

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.
#mail.*                                                  -/var/log/maillog
mail.*                                                  -?mailFileName;customformat

$ModLoad ommail

$ActionMailSMTPServer mailserver.address
$ActionMailFrom admin@example.local
$template mailsubject,"Syslog Warning"
$template mailbody,"%fromhost%\r\n%msg%"
$ActionMailSubject mailsubject
$ActionExecOnlyOnceEveryInterval  -1

$ActionMailTo admin-ml@example.local  #アドレスの定義1
if $fromhost-ip == '192.168.1.100' and $msg contains 'System Warning' then :ommail:;mailbody

$ActionMailTo admin-ml@example.local  #アドレスの定義2
if $fromhost-ip != '127.0.0.1' and $msg contains 'authenticated failure' and $syslogfacility-text == 'daemon' then :ommail:;mailbody

$ActionMailTo administrator@example.local    #アドレスの定義3
if $fromhost-ip =='192.168.1.254' and $syslogfacility-text == 'syslog' and $syslogseverity-text == 'crit' then :ommail:;mailbody

# Log cron stuff
cron.*                                                  -/var/log/cron

# Everybody gets emergency messages
*.emerg                                                 *

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          -/var/log/spooler

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log

# UDP Syslog Server:
$ModLoad imudp.so  # provides UDP syslog reception
$UDPServerRun 514 # start a UDP syslog server at standard port 514




syslogメッセージの内容に対して、メールを送信する

全ての機器のsyslogをrsyslogで解析し、特定キーワードを見つけたら警告メールを送信できます。
これはommailというモジュールを使用します。
解析も構文が複雑になるものの、ちゃんと細かく指定できるので、特定のIPアドレスのログ、特定のファシリティの特定キーワードが含まれている場合はこのメールアドレスへ送信するなど造作もないです。
なおメール送信には件名や本文に日本語を用いないほうが無難です。

まずはrsyslog.confの中でommailをロードし、メール送信に関する定義を行います。これは共通です。


rsyslog.conf

$ModLoad ommail   #メールモジュールのロード

#使用するメールサーバ
$ActionMailSMTPServer mailserver.address

#送信元アドレス
$ActionMailFrom admin@example.local

#送信先アドレス
$ActionMailTo admin-ml@example.local

#メールタイトル
$template mail_subject,"Syslog Warning"

#メールの本文。ここではログ送信元(%fromhost%)と改行(\r\n)と該当ログ(%msg%)
$template mail_body,"%fromhost%\r\n%msg%"

#メールタイトルの読み込み
$ActionMailSubject mail_subject

#メール送信抑制は120秒。メールを送信したら120秒間は他のメールも送信しません。
$ActionExecOnlyOnceEveryInterval  120



条件によって送信先アドレスが変化するなら、条件式の手前でその都度メールアドレスを定義しなおします。
判断にはプロパティ式と条件式の2種類があります。
プロパティ式は簡単に記述でき、条件式は複雑な条件を記述するのに向きます。
プロパティ式の文字列はダブルクォートで囲みます。
条件式はどちらでも動作しますが、シングルクォートを指定することが多いようです。

送信元アドレスの変数などを、プロパティ値と呼びます。
例えば「fromhost-ip」は、ログ送信元のIPアドレスの変数です。
本家にて、プロパティ値の解説があります。

また条件判断に使用するパラメータもありますが、数は多くありません。
本家のドキュメントにもあります。
contains
ログに指定文字が「含まれるか」。大文字小文字を区別しない場合はcontains_i
isequal
ログが指定文字と「等しいか」
startswith
ログが指定文字で「始まっているか」。大文字小文字を区別しない場合はstartswith_i
regex
ログを正規表現で評価します
ereregex
ログを拡張正規表現でします
isempty
プロパティが空かを評価します。




特定キーワードを含むログが出力されたらメール送信

プロパティ式

:msg, contains, "System warning":ommail:;mail_body

条件式

if $msg contains 'Failed password' then :ommal:;mail_body

ログに文字が含まれていたら、メールを送信します。


特定ホストからログが出力されたらメール送信

プロパティ式

:fromhost-ip, isequal, "192.168.1.100" :ommail::;mail_body

条件式
if $fromhost-ip == '192.168.1.100' then :ommail:;mail_body

これだけでは送信元からどんなログが来てもメールを連発するので、通常は他の条件を加えたりして絞り込みます。


特定ホストから特定キーワードを含むログが出力されたらメール送信

条件式
if $fromhost-ip == '192.168.1.100' and $msg contains 'System Warning' then :ommail:;mail_body


リモートホストから特定ファシリティの特定キーワードを含むログが出力されたらメール送信

条件式

if $fromhost-ip != '127.0.0.1' and $msg contains 'System Warning' and $syslogfacility-text == 'daemon' then :ommail:;mailbody

一般的単語だと、他のファシリティから送信されても検知してしまいます。より条件を絞りましょう。


一度メールを送ったら1時間はメールを再送信しない

定義式

$ActionExecOnlyOnceEveryInterval  3600    # infinite retries if host is down

3600秒の間は、メール送信を抑制します。さもないと、鬼のような連発でメールが飛んできます。
しかし他の条件のメールも全て抑えてしまうため、使いどころが難しい機能です。
なお「-1」を指定するとメール送信抑制はありません。


複数のメール送信条件を行う

条件式
$ActionMailTo admin-ml@example.local
if $fromhost-ip == '192.168.1.100' and $msg contains 'System Warning' then :ommail:;mail_body
& ~

$ActionMailTo admin-ml@example.local
if $fromhost-ip == '192.168.1.101' and $msg contains 'System Warning' then :ommail:;mail_body
& ~

$ActionMailTo administratorl@example.local
if $fromhost-ip == '127.0.0.1' and  $syslogfacility-text == "daemon" and  $syslogseverity-text == 'crit'  and $msg contains 'System Warning' then :ommail:;mail_body

メールアドレスは条件式のたびに与える必要があります。
同じメールアドレスであっても、その都度与えておかないと二つ目以降のメール条件でエラーログを出力し、送信できません。

条件式が複雑になると、動作は確認は必須です。
コンフィグファイルのチェック、そして確実にメール送信ができるかをコマンドにて確認します。

#syslogd -N 1 -c5

#logger -p daemon.crit "System Warning"






prev.gif