2013年7月13日土曜日

rsyslogの設定まとめ

目的
syslogで受け付けたログを別サーバへsyslogを使って転送させる。
ログの取りこぼしを可能な限り避けたいのでtcpを利用できるrsyslogを利用する。
それ以外にもsyslogよりrsyslogの方がメリットが多いのでsyslogを選択する理由はないだろう。


環境
・ 転送元サーバ群
  複数台いることを想定

・ 転送先サーバ
  IPアドレス : 192.0.2.1(設定で使うため)


転送元       転送先
サーバ群      サーバ(192.168.2.1)
 -----
|     |   → 
 -----
 -----          -----
|     |   →   |    |
 -----          -----
 -----
|     |   → 
 -----

local6.*          local6.info
                  適合:match1, match2
                  除外:test1, test2


転送元サーバからrsyslog経由で転送先サーバへログを飛ばす。
すべて転送するのではなく、ファシリティが6(local6)のすべてのプライオリティを対象とする。

転送先では以下の条件にマッチしたものだけをログに出力させる。
近くで除外するという考えが正しいのだろうが、
転送元ノードが多くなった場合に、ポリシーを一元管理させたいためにそうする。

【適合条件】
・match1 または match22 文字列が含まれる
・ファシリティがlocal6でプライオリティがinfo以上

【除外条件】
・test1 または test2 文字列が含まれる



syslogからrsyslogへの切り替え(転送元、転送先共通)
# /etc/init.d/syslog stop

# chkconfig syslog off

# yum install rsyslog

# chkconfig rsyslog on

パッケージで入れていれば自動で入るはず。
# cat /etc/logrotate.d/syslog
/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron {
  sharedscripts
  postrotate
   /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
   /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
  endscript
}



rsyslog設定(転送元、転送先共通)
# cp /etc/rsyslog.conf /etc/rsyslog.conf.default

# vi /etc/rsyslog.conf
# 読み込ませたいその他コンフィグディレクトリファイルの指定
$IncludeConfig /etc/rsyslog.d/*.conf

# タイムスタンプフォーマット
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# カーネルログのサポート (previously done by rklogd)
$ModLoad imklog

# ローカルシステムログのサポート (e.g. via logger command)
$ModLoad imuxsock


# 下段にて説明
$SystemLogRateLimitInterval 0
# $SystemLogRateLimitInterval 10
# $SystemLogRateLimitBurst 500


# 514/udpソケットで受付
$ModLoad imudp
$UDPServerRun 514
# $AllowedSender UDP, 127.0.0.1, 192.168.0.0/24, *.example.jp, host.example.jp

# 514/tcpでソケット受付
$ModLoad imtcp
$InputTCPServerRun 514
# $AllowedSender TCP, 127.0.0.1, 192.168.0.0/24, *.example.jp, host.example.jp


### スプールを使用する場合
# スプール方式の指定
# サーバにログを送信する前に一時的にログを蓄える
$ActionQueueType Disk

# スプールディレクトリの指定
$WorkDirectory /var/spool/rsyslog

# ログ送信の再試行回数(-1で無限に再試行を実行)
$ActionResumeRetryCount 5

# スプールディレクトリに作られるキューのファイル名「例:queue.00000001」
$ActionQueueFileName queue

#シャットダウン時にメモリ上のキューを保存
$ActionQueueSaveOnShutdown on


/var/log/messagesにrsyslogが以下のようなログを出すことがある。
imuxsock begins to drop messages from pid ***** due to rate-limiting
ディフォルト10秒間に500以上のメッセージを1つのPIDから受信した場合、
rate-limitingが動作しメッセージが捨てられる。
メッセージのロストを防ぐために制限をなくすために0を指定した。
加えて短い時間に大量にログを発生させる原因の追及もあわせてやるべきである。



rsyslog設定(転送元)
# vi /etc/rsyslog.conf
# 転送先の指定(@はudp, @@はtcp)
local6.*               @@192.0.2.1:514

# /etc/init.d/rsyslog restart



rsyslog設定(転送先)
# mkdir /etc/rsyslog.d/

少し煩雑だがやっていることはすぐに分かるだろう。
・ログの出力フォーマットの変更
・条件文の設定
# vi /etc/rsyslog.d/my.conf
$template myFormat, "%HOSTNAME% %msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"
$ActionFileDefaultTemplate myFormat

if \
  $syslogfacility-text == 'local6' \
  and $syslogseverity-text == 'info' \
  and ($msg contains_i 'match1' or $msg contains_i 'match2' ) \
  and not ( $msg contains_i 'test1' or $msg contains_i 'test2' ) \
then /var/log/my.log;myFormat


rsyslogその他設定(転送元、転送先共通)
# mkdir /var/spool/rsyslog/

# cp /etc/sysconfig/rsyslog /etc/sysconfig/rsyslog.default

# vi /etc/sysconfig/rsyslog
SYSLOGD_OPTIONS="-c 5"



確認
# /etc/init.d/rsyslog restart

起動後ポートが開くことを確認する。
# netstat -an | grep 514

iptablesでフィルタの状態もあわせて確認しておく。
# iptables -nvL



試験
転送元からloggerコマンドを使いメッセージを送る、
# logger -p local6.info "host1"

転送先にメッセージが到達していることを確認する。
※除外させることにした"test:"は送ってもログに出力されない。
# tail -f /var/log/rsyslog-local6.log

また、転送しないログは送信側で受け取れていることも確認する。
# tail -f /var/log/messages