2021/03/20 CentOS Stream 20201203





シスログに特定文字列が出力されるとメール送信する

サーバやアプライアンス、ネットワーク機器を運用していると特定のログ条件でメールを送信したくなります。

・L2スイッチ間で異なるVLAN同士のケーブルを誤って接続してしまったことを検知したい
・FWでVPN接続したとき、メールで通知したい
・L3スイッチでOSPFが変化したときに通知したい




ここではログの文言を検知してメール通知する設定をします。
あとは検出したい具体的な文字列を設定すれば、メール通知が完成します。


まずはネットワークで取り込んだデータをファイルに保存するためSELinuxを無効化します。
# setenforce 0

# vi /etc/sysconfig/selinux

SELINUX=disabled

次に/etc/rsyslog.confを編集します。
ログをネットワーク機器から受け取り、メールを送信する設定するための設定を赤字で示しています。
ここではrsyslogのバージョンは、8.1911となります。
# rsyslog configuration file

# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# or latest version online at http://www.rsyslog.com/doc/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html

#### 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
#外部からのsyslog転送を受け入れます
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")

#### GLOBAL DIRECTIVES ####

# Where to place auxiliary files
global(workDirectory="/var/lib/rsyslog")

# Use default timestamp format
module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat")

# Include all config files in /etc/rsyslog.d/
include(file="/etc/rsyslog.d/*.conf" mode="optional")

#メール送信モジュールをロードします
module(load="ommail")


#### RULES ####

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# 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

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

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


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

# Everybody gets emergency messages
*.emerg                                                 :omusrmsg:*

# 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


#メール本文に、ログ送信元IPとログ内容を指定
template (name="mailBody" type="string" string="%fromhost-ip%\\r\\nmsg='%msg%'")


#メール件名
template (name="mailSubject" type="string" string="Alert mail")


#ログに「alarm str」が含まれた場合、メール送信
if $msg contains "alarm str" then {
   action(type="ommail" server="192.168.1.100" port="25"
          mailfrom="syslog@example.net"
          mailto="log-alarm@example.net"
          subject.template="mailSubject"
          action.execonlyonceeveryinterval="600")
}
#各パラメータで送信メールサーバ、送信元アドレス、送信先アドレスを指定
#一度メールを送信したら600秒はメール送信を抑止。多量ログ多量メールを抑制


# ### sample forwarding rule ###
#action(type="omfwd"
# An on-disk queue is created for this action. If the remote host is
# down, messages are spooled to disk and sent when it is up again.
#queue.filename="fwdRule1"       # unique name prefix for spool files
#queue.maxdiskspace="1g"         # 1gb space limit (use as much as possible)
#queue.saveonshutdown="on"       # save messages to disk on shutdown
#queue.type="LinkedList"         # run asynchronously
#action.resumeRetryCount="-1"    # infinite retries if host is down
# Remote Logging (we use TCP for reliable delivery)
# remote_host is: name/ip, e.g. 192.168.0.1, port optional e.g. 10514
#Target="remote_host" Port="XXX" Protocol="tcp")

本家によれば、上記のようななコンフィグが紹介されています。
以下は以前のバージョンの書式ですがVer8系でも動作しました。
以前のバージョンの設定

#送信に使用するSMTPサーバアドレス
$ActionMailSMTPServer 192.168.1.100


#送信に使用するメールアドレス
$ActionMailFrom syslog@example.com

#一度メールを送信したら600秒はメール送信を抑止
#多発するタイプのタイプのログならこれを設定
$ActionExecOnlyOnceEveryInterval  600

#メールの件名
$template mail_subject,"Alert mail"


#メール本文。ここではIPアドレスとログ本文
$template mail_body,"%fromhost-ip%\r\n%msg%"


#メール件名の設定
$ActionMailSubject mail_subject


#メール送信先アドレス
$ActionMailTo log-alarm@example.com

#ログに「alarm str」が含まれるとメール送信

if $msg contains 'alarm str' then :ommail:;mail_body
新しい世代の設定方法のほうが、条件分岐などが分かりやすそうです。

設定後、rsyslogを再起動します。


ログの検知テストをします。loggerコマンドを使用します。
# logger "alarm str"
正しくログが検出されれば、メールが送信されます。



ログを検知してメールを送信するが、特定条件ではメールを送信しない

メール送信前に条件分岐を入れてやれば、送信前に処理を除外できます。
template (name="mailBody" type="string" string="%fromhost-ip%\\r\\nmsg='%msg%'")

template (name="mailSubject" type="string" string="Alert mail")

#「alarm str」と「test」を含んでいる場合は、ここでログを破棄
if $msg contains "alarm str" and $msg contains "test" then ~

#「alarm str」が192.168.1.254から送信されたものなら、ここでログを破棄
if $msg contains "alarm str" and $fromhost-ip == "192.168.1.254" then ~

if $msg contains "alarm str" then {
   action(type="ommail" server="192.168.1.100" port="25"

          mailfrom="syslog@example.net"
          mailto="log-alarm@example.net"
          subject.template="mailSubject"
          action.execonlyonceeveryinterval="600")
}


なお、条件式に使用できる文字列は以下のようになっています。
contains
ログに指定文字が「含まれるか」。大文字小文字を区別しない場合は contains_i
isequal
ログが指定文字と「等しいか」
startswith
ログが指定文字で「始まっているか」。大文字小文字を区別しない場合は startswith_i
regex
ログを正規表現で評価します
ereregex
ログを拡張正規表現でします
isempty
プロパティが空かを評価します。







prev.gif