
Syslogについて
syslogについて、/etc/rsyslog.confについて忘れないように調べたことをまとめてみました。
syslogとは
syslogとは、サーバーやルーターなどの機器の稼働状況を把握するための仕組みのこと。
Linuxでは、稼働しているプログラムのログをシステムログとして記録するsyslogdというプログラムが動いている。
これはデーモン(常駐プログラム)として常に稼働し続けてプログラムが出力するメッセージを記録する。
Linuxの稼働状況を示すログは「var/log」ディレクトリに格納され、プログラムごとに分かれてファイルに保存される。
ログファイルの例として以下のようなものがある
・messages:システムログ(いわゆるsysrog)
・cron:スケジューリングされたタイミングでプログラムを実行するcronのログ
・secure:ユーザのログイン状況などLinuxのセキュリティ関連
・cups:プリンター関連
・wtmp:ログイン履歴のログ
このほかに、ネットワーク上のメッセージを転送するために使用されるプロトコルもsyslog(System Logging Protocol)。
このプロトコルを利用して、ネットワーク上にあるシステムログを集約して管理するサーバをsyslogサーバーと呼ぶ。
syslogは、サーバーやネットワーク機器で稼働するプログラムのメッセージを保存する仕組みと、ネットワーク上のシステムログを転送するプロトコルという2つの意味を持つ。
Syslogの用途
syslogが最も活用される用途は「システムの監視」である。
syslogを利用して常時出力されるメッセージをファイルに保存して、その内容を監視ツールによって監視する。
例えば、システムログ(messages)には、CPUやメモリなどのハードウェアの異常やOSの異常を検知した場合にメッセージが出力される。
そこで監視ツールに対して「システムログでERRORまたはFailedの単語が出力されたら、アラートを通知するという設定を行う。
これにより、メッセージが出力されたタイミングで監視ツールによって通知が行われ、異常にたいしてすぐに気づくことができるといった具合。
また、syslogと監視ツールで監視できるのはハードウェアやOSの異常だけではなく、OS上で稼働しているアプリケーションやデータベースなどのプログラムのログも、同様に監視が可能。
プログラムの停止やエラー、パフォーマンスの停止などの異常が発生した場合もログに出力される。
このようなプログラムの稼働状況以外にも、ユーザのログイン状況(ログイン成功・失敗)もログ出力されるのでこれを監視すればセキュリティ監視も可能である。
このようにsyslogは主に監視のために利用される。
syslogの制限事項
syslogイベントを生成して送信するためには、監視対象のデバイスが稼働中でネットワークに接続されている必要があるのでシステムがオフラインになると、デバイスやサーバからエラーを送信することはなくなる。
なので、syslogはデバイスのアップ及びダウンステータスを監視するのに適していない。
このようにsyslogはネットワークデバイスのステータスを監視するのに適した方法ではないが、ネットワーク機器の全体的な状態を監視するのには適している。
syslogとrsyslog
Unix/Linux系OSにおいて、システムログを出力するプログラムは「syslog」と「rsyslog」がある。
rsyslogはsyslogを改良・機能追加したものであり、多くのLinuxディストリビューションに採用されている。

syslogは通信プロトコルとしてUDPを使用している。
UDPでは通信途中でデータが欠落する可能性があるため、信頼性の高いTCPを使用したrsyslogが開発された。
rsyslogはフィルタリングや振り分け設定が可能。
centos7ではデフォルトでrsyslogが採用されている。
rsyslogの基本設定
rsyslogの設定ファイルは「/etc/rsyslog.conf」設定ファイルは①MODULES➁GLOBAL DIRECTIVES③RULES④begin forwarding ruleの4つのパートに分かれていて③のRULESのパートでファシリティとプライオリティを組み合わせて、フィルタリング設定をする。
①MODULES
ロードするモジュールを記述している。
#### 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")
①module(load="imuxsock" SysSock.Use="off")
rsyslogのInputModule。旧来のunix socket file経由(systemd)のログ受信を有効にする。 またSysSock.Use`はデフォルト(off)の場合、旧来のunix socket file経由(systemd)のログ受信を停止する。onにすると受信するが、ModLoad imjournalなどを停止しないとログ内容を二重受信する。
module(load="imjournal" StateFile="imjournal.state")
rsyslogのInputModule。現行のjournald経由のログ受信を有効にする。 またStateFile`はJournalに関する永続ファイルの場所指定。
#module (load="imklog")
rsyslogのInputModule。ファシリティkernを受信するがコメントアウトされ無効となっている。journal(imjournal)で受け取っているため無効推奨。
#module (load="immark")
rsyslogのInputModule。rsyslogが動作していることを示すrsyslogd:-- MARK --を20分おきに発報する(/var/log/messages)。運用時は結構邪魔なので無効推奨。
#module (load="imudp")
UDP経由でのログを受け取る。デフォルトはコメントアウトで無効化されている。
#input (type="imudp" port="514")
UDP経由でのログを受け取る際のポート番号を指定する。デフォルトはコメントアウトで無効化されている。有効にする場合は上記の#module(load="imudp")も有効にすること。
#module (load="imtcp")
TCP経由でのログを受け取る。デフォルトはコメントアウトで無効化されている。
#input (type="imtcp" port="514")
TCP経由でのログを受け取る際のポート番号を指定する。デフォルトはコメントアウトで無効化されている。有効にする場合は上記の#$ModLoad imtcpも有効にすること。
なお、$TCPServerAddressは無い模様。
②GLOBAL DIRECTIVES
全体に係る制御内容を記述している。
#### 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")
global(workDirectory="/var/lib/rsyslog")
ワークディレクトリの指定。キューなどもこのディレクトリに保存される。
module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat")
Output Moduleのbuiltin:omfileをロードする。
またTemplateにてログのタイムスタンプ形式を変更する。
"RSYSLOG_TraditionalFileFormat" → "OCT 10 09:01:01"
"RSYSLOG_FileFormat" → "2018-10-10T10:37:53.063083+09:00"
include(file="/etc/rsyslog.d/.conf" mode="optional")
個別設定ファイルの読み取り先を指定。ファイル名はワイルドカード()となっており複数ファイルを読み込む。
またmodeについては以下を選択可能。
abort-if-missing:ファイルが存在しない場合に rsyslog が中止される
requiredrsyslog はエラー メッセージを発行しますが、ファイルが存在しない場合は続行する。
optional存在しないファイルは通知なしにスキップされる。
③RULES
ログの出力設定を記述している。
#### 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.*
ワイルドカードが指定可能なので、authpriv.*はFacility:authpriv.かつ全てのServerityを/var/log/secureに書き込み、.emergは全てのFacilityかつServerity:emerg以上をomusrmsg:*に書き込んだりすることになる。
ログファイルの冒頭に-を付記すると非同期書き込みモードになります。逆に何もないと同期書き込みモードになる。
また:omusrmsg:*はOutput Module User Messageとしてユーザコンソールに表示を吐き出す。
例えば、以下の設定では「cron関連のinfo以上のログを/var/log/cronに出力する」という内容。
cron.info /var/log/cron
④begin forwarding rule
このパートは別のサーバにログを転送する際の設定を記述している。
# ### 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")
#action (type="omfwd"
別サーバにログを転送する際は、Output Module Forwardを有効にするため、コメントアウトを外し action(type="omfwd" とします。
(閉じ括弧は最終行に記載)
#queue .filename="fwdRule1"
【TCP転送時】転送先サーバが停止している場合のキューファイル名。ディレクトリは$WorkDirectoryを使用する。デフォルトはコメントアウトで無効。
#queue .maxdiskspace="1g"
【TCP転送時】転送先サーバが停止している場合のキューファイルサイズ。デフォルトはコメントアウトで無効。
#queue .saveonshutdown="on"
【TCP転送時】転送先サーバが停止している場合のキューファイルをシャットダウンに保存する。デフォルトはコメントアウトで無効。
#queue .type="LinkedList"
【TCP転送時】転送先サーバが停止している場合のキュータイプを選択する。デフォルトはコメントアウトで無効。
#action .resumeRetryCount="-1"
【TCP転送時】転送先サーバが停止している場合のリトライ。0でリトライ、-1で無効。デフォルトはコメントアウトで無効。
#Target ="remote_host" Port="XXX" Protocol="tcp")
ログをrsyslogで転送するサーバとプロトコルを指定する。デフォルトではコメントアウトで無効。
なお、特定のログ指定に対して転送する場合は、RULEと混ぜて利用する模様。
#cronを転送
# Log cron stuff
cron.* /var/log/cron
cron.* action(type="omfwd"
queue.filename="fwdRule1"
queue.maxdiskspace="1g"
queue.saveonshutdown="on"
queue.type="LinkedList"
action.resumeRetryCount="-1"
Target="192.168.0.1" Port="514" Protocol="tcp")