CentOS6ぐらいから標準でrsyslogが採用されています。
従来のsyslogは自分自身が吐き出すログをデフォルトで/var/log配下に吐き出すものであり、標準的にはrsyslogでもこれに変更はありません。
rsyslogの便利なところは遠隔にあるサーバからのsyslog転送を受け取り、それらを保存することができます。templateを活用することにより複数からのデバイスのシスログをホストごとに一括管理することも可能となり、ネットワーク機器のsyslogを集約する際にはかなり役立っております。
設定ファイルは/etc/rsyslog.confです。まずは遠隔から日付別にIPアドレス単位で受け取れるよう設定していきます。下記では一部抜粋して記載します。
# vi /etc/rsyslog.conf <抜粋> #### MODULES #### module(load="imuxsock" # provides support for local system logging (e.g. via logger command) SysSock.Use="off") # Turn off message reception via local log socket; # local messages are retrieved through imjournal now. module(load="imjournal" # provides access to the systemd journal StateFile="imjournal.state") # File to store the position in the journal #module(load="imklog") # reads kernel messages (the same are read from journald) #module(load="immark") # provides --MARK-- message capability # Provides UDP syslog reception # for parameters see http://www.rsyslog.com/doc/imudp.html module(load="imudp") # needs to be done just once コメントアウト input(type="imudp" port="514") #コメントアウト # Provides TCP syslog reception # for parameters see http://www.rsyslog.com/doc/imtcp.html module(load="imtcp") # needs to be done just once コメントアウト input(type="imtcp" port="514") #コメントアウト ########## Receiving Messages from Remote Hosts ########## # 無制限に書き込む $SystemLogRateLimitInterval 0 # 新規にファイル/ディレクトリを作成するための属性を指定 $umask 0022 $FileCreateMode 0644 $DirCreateMode 0755 # /var/log/host配下に日付別かつ送信元単位でファイルを保存する $template logFileName,"/var/log/host/%$year%/%$month%/%$day%/%fromhost%_%$year%%$month%%$day%.log" :fromhost-ip, !isequal, "127.0.0.1" -?logFileName & stop |
templateを用いて/var/log/host配下に年月日単位でフォルダを作り、IPアドレスが127.0.0.1(自分自身)以外のログを対象としてます。%%で囲んだ意味は何となくでもわかると思うのですが以下のとおりです。
%fromhost% | 送信元IPを逆引きして得られたホスト名。逆引きできなけれ ばIPアドレスになります。 |
%fromhost_ip% | ログを出力したホストのIPアドレス。ローカルの場合は 127.0.0.1になります。 |
%$year% | 西暦年を表します。 |
%$month% | 西暦月を表します。1~9月でも2桁で表示されます。 |
%$day% | 西暦日を表します。1~9日でも2桁で表示されます。 |
遠隔の機器単位ごとにIPアドレスを指定する場合は下記のように記載します。特定のホストしか受け付けない、という場合は下記の書き方が望ましいです。
:fromhost-ip, isequal, "192.168.1.100" /var/log/message_192.168.1.100 & stop :fromhost-ip, isequal, "192.168.1.200" /var/log/message_192.168.1.200 & stop |
●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 & stop $ActionMailTo admin-ml@example.local if $fromhost-ip == '192.168.1.101' and $msg contains 'System Warning' then :ommail:;mail_body & stop $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 |
メールアドレスは条件式のたびに与える必要があります。 同じメールアドレスであっても、その都度与えておかないと二つ目以降のメール条件でエラーログを出力し、送信できません。