●rsyslogの基本
RHEL6.0 より従来からのsyslogではなくrsyslogが標準採用されています。従来のsyslogよりも格段に使いやすくなっており、かなり便利になったと 感じています。ネットワーク機器を大量に導入するケースなどでは全ての機器を特定のサーバ に集約することが多々ありますが、こういった場合にもrsyslogが有効です。
設定ファイルは/etc/rsyslog.confです。syslogでは起動オプションに-rをつけるとリモー トからのsyslogを受け取れましたがrsyslogでは設定ファイルに記述致します。以下、編集箇所のみ記載しています。
# Provides UDP syslog receptio $ModLoad imudp.so $UDPServerRun 514 $umask 0022 $FileCreateMode 0644 $DirCreateMode 0755 |
上記に加えてリモートにある機器のIPアドレス等を指定して特定ファイルにsyslogを保存することができま す。
●rsyslogの詳細設定
rsyslogの考え方は上から順番に条件判断をしていきます。例えば以下の例。
:fromhost-ip, isequal, "192.168.1.100" /var/log/message_192.168.1.100 & ~ :fromhost-ip, isequal, "192.168.1.200" /var/log/message_192.168.1.200 & ~ :fromhost-ip, !isequal, "127.0.0.1" /var/log/remote_message & ~ *.info;mail.none;authpriv.none;cron.none -/var/log/messages |
送信元IPが192.168.1.100のみ、/var/log/message_192.168.1.100へ 出力。& ~は直前の条件 (送信元IPが192.168.1.100)を破棄するという意味になります。次に送信元がIPが192.168.1.200のみ、/var/log/message_192.168.1.200へ出力。この際、送信元IPが 192.168.1.100は直前に破棄しているのでここに含まれません。次に送信元が127.0.0.1ではない機器、つまりリモートの任意のIPからのログを/var/log/remote_messageに保存し、直前の 2つのログは含まれません。最後にローカルのログを/var/log/messageに保存という動きになります。
●機器別に保存
多数の機器からのログを受け取る場合に一つのファイルに書き込むのはあまり良くありませんし、何もしなければ延々 とたまり続けていきます。rsyslogにはこういった場合にも便利に保存できる仕組みが儲けられています。
ホスト名、日付別に保存することが可能で、rsyslog再起動なしにファイルやフォルダまで自動作成してくれま す。これにはrsyslogのtemplate機能を使用します。
$template logFileName,\ "/bkdata/log/%$year%/%$month%/%$day%/%fromhost%_%$year%%$month%%$day%.log" :fromhost-ip, !isequal, "127.0.0.1" -?logFileName & ~ |
まずテンプレートを指定します。ここでは「/bkdata/log/【年】/【月】/【日】/送信元ホスト _ 年月日.log」で保存します。ファイル、フォルダは自動で作成されます。テンプレートで使われているプロパティとして以下のものがあります。
%fromhost% | 送信元IPを逆引きして得られたホスト名。逆引きできなけれ ばIPアドレスになります。 |
%fromhost_ip% | ログを出力したホストのIPアドレス。ローカルの場合は 127.0.0.1になります。 |
%$year% | 西暦年を表します。 |
%$month% | 西暦月を表します。1~9月でも2桁で表示されます。 |
%$day% | 西暦日を表します。1~9日でも2桁で表示されます。 |
●syslog検索およびメール送信
受け取ったログに対して特定の条件を満たした場合にメールを送信することができます。これはommailモジュー ルを使用します。解析も構文が複雑になるものの、ちゃんと細かく指定できるので、特定のIPアドレスのログ、特定のファシリティの 特定キーワードが含まれている場合はこのメールアドレスへ送信するなど造作もないです。 rsyslog.confに以下の基本設定を行います。
$ModLoad ommail $ActionMailSMTPServer mailserver.address $ActionMailFrom admin@example.local $ActionMailTo admin-ml@example.local $template mail_subject,"Syslog Warning" $template mail_body,"%fromhost%\r\n%msg%" $ActionMailSubject mail_subject $ActionExecOnlyOnceEveryInterval -1 |
・特定キーワードが含まれていたらメール送信
if $msg contains 'Failed password' then :ommal:;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 |
・複数の条件式を組み合わせる
$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”