Syslog について。ファシリティ/シビアリティ/プライオリティの違い

Syslog とは

Syslog とはログメッセージをIPネットワーク上で転送するための標準規格です。

ネットワークやセキュリティの入門レベルの参考書だと、

ログを重要度によって Emergency、Alert、Critical、Error、Warning、Notice、Informational、Debug の8つに分類し、Syslog サーバへある種一方的に送り付けます。

のように解説されますが、ここではもう少し踏み込んでみます。

Syslog の歴史

元々メールサーバソフトウェアである「sendmail」の一部として開発されましたが、2001年にIETFにより標準化され、RFC3164 として公開されました。

その後 RFC3164 は廃止され、RFC5424 へと移行しています。

sendmail

昔からよく使われている定番のメールサーバソフトウェアです。しかし、設定が複雑であったり、アーキテクチャが古いためセキュリティ的に脆弱であったりと、今ではメールサーバを sendmail で構築するということはほとんどありません。sendmail の代わりに postfix で構築することが一般的です。

ファシリティ(Facility)とシビアリティ(Severity)

Syslog ではログメッセージの種類とログの重要度に基づいてログの保存先を分けることができ、ログの種類を「ファシリティ(Facility)」、ログの重要度を「シビアリティ(Severity)」と呼びます。

※シビアリティを”セベリティ”と言う人もいますが、宗教なのでどちらでもいいです。

振り分け例:ファシリティが”0″でシビアリティが”2″以上(つまり Ctirical/Alert/Emergency) のログメッセージを /var/log/kernel.log に保存する

ファシリティとシビアリティは RFC5424 できちんと定義されています。

Numerical CodeFacility
0kernel messages
1user-level messages
2mail system
3system daemons
4security/authorization messages
5messages generated internally by syslogd
6line printer subsystem
7network news subsystem
8UUCP subsystem
9clock daemon
10security/authorization messages
11FTP daemon
12NTP subsystem
13log audit
14log alert
15clock daemon (note 2)
16local use 0 (local0)
17local use 1 (local1)
18local use 2 (local2)
19local use 3 (local3)
20local use 4 (local4)
21local use 5 (local5)
22local use 6 (local6)
23local use 7 (local7)
Numerical CodeSeverity
0Emergency: system is unusable
1Alert: action must be taken immediately
2Critical: critical conditions
3Error: error conditions
4Warning: warning conditions
5Notice: normal but significant condition
6Informational: informational messages
7Debug: debug-level messages

つまり、Syslog に対応しているのであれば、それがサーバであろうがネットワーク機器であろうが、上記のファシリティとシビアリティに則ったログメッセージを Syslog サーバに送信します。

ここで注意しなければならないのは、重要なのはファシリティ/シビアリティの数字(Code)ということです。ファシリティ/シビアリティの実態はこのコードです。隣にある文字列はただの説明だと思ってください。

例えば Linux(rsyslog) ではシビアリティの Emergency を emerg と表現しますが、別のベンダが Emergency を eme と表現していようが(追記: FortiGate は emergency と設定します)、Syslog 対応ということは RFC に準拠しているということであり、emerg も eme も内部的には10進数の “0” で処理されているはずです。

逆に言うと、emerg や eme といった単語は人間が分かりやすいようにコードに適当な単語を紐づけているだけです。コードに対する単語は RFC で定義されていませんが、上記で挙げた emerg のように、ほとんどの場合は似たような(というより全く同じ)表現になります。ファシリティも同様です。

ファシリティとシビアリティのコードはそのまま syslog メッセージとして送信されるわけではなく、この2つの値から計算して求める「プライオリティ(PRI)」という最大3桁の10進数が syslog メッセージに含まれることになります。ファシリティ/シビアリティの単語なんてそもそも Syslog メッセージに含まれません。

syslog メッセージは主に以下の3つから成り立ちます。syslog メッセージは1024バイト以下に収めることになっています。

  • PRI(Priority):プライオリティ
  • HEADER :タイムスタンプとホスト名
  • MSG   :プログラム名やプロセス名、メッセージ本文

プライオリティ(Priority)

RFC5424 ではファシリティとシビアリティの一覧のすぐ下にプライオリティの計算方法が記載されています。

The Priority value is calculated by first multiplying the Facility number by 8 and then adding the numerical value of the Severity.   For example, a kernel message (Facility=0) with a Severity of Emergency (Severity=0) would have a Priority value of 0.   Also, a “local use 4” message (Facility=20) with a Severity of Notice (Severity=5) would have a Priority value of 165.   In the PRI of a syslog message, these values would be placed between the angle brackets as <0> and <165> respectively.   The only time a value of “0” follows the “<” is for the Priority value of “0”. Otherwise, leading “0”s MUST NOT be used.

 

Priority値は、Facility値を8倍し、Severity値を加算して求める。例えば、kernelメッセージ(Facility=0)で重大度がEmergency(Severity=0)であれば、Priority値は0となる。同様に、「local use 4」メッセージ(Facility=20)で重大度がNotice(Severity=5)であれば、Priority値は165である。syslogメッセージのPRI部にはこのPriority値を山括弧で囲んで記述するので、それぞれ「<0>」「<165>」となる。「<」の直後に「0」が続くのはPriority値が0の場合だけで、それ以外の場合、頭に「0」をつけてはならない(MUST NOT)。

 

※上記は RFC3164 から内容に変化がないので、RFC3164 の日本語訳を記載しています。

つまり、Linux(rsyslog) 風に表現した

ファシリティが mail で シビアリティが crit 以上のログ

は、プライオリティ<16>~<18>と表現することができます。プライオリティ値は一意であるため、その値からファシリティとシビアリティを特定することができます。

rsyslog

生成された Syslog メッセージは Syslog サーバが受け取ります。Syslog サーバは基本的に Linux で構築します。

Syslog メッセージを Linux が受け取るわけですが、実際にはデーモンが受け取ることになります。Syslog デーモンは複数存在します。例えば、Syslog 実装当時の古い Syslog デーモンは「BSD syslogd(デーモン名としてはただの”syslogd”)」と呼ばれています。

BSD syslogのデメリット

  • 信頼性を高めることが難しい
  • ディスクI/Oを制御できない
  • 全ログメッセージが取得されているか保証できない
  • ログメッセージの転送にUDPを使用する
  • Syslogサーバーダウン中のログメッセージが消失する
  • サーバー/クライアント認証に未対応
  • 送信データを暗号化できない
  • 柔軟な運用が難しい
  • ログメッセージを細かく分別できない
  • ログメッセージを検索し自動処理する仕組みがない
  • 日時フォーマットのバリエーションがない
  • ログファイルのローテーションを行うことができない
  • 2Gバイトを超えるログファイルを扱えない

rsyslog 実践 ログ管理入門 より引用

現在広く利用されているのが rsyslog です。語源となっている「reliable( 信頼 できる)Syslog デーモン」が示すように、rsyslog は高い信頼性の実現を目標に開発されています。また、 BSD syslogd との互換性が高いことも重要な点と言えます。

Linux の全てのログが rsyslog で記録されるのか

Linux のログ全てが rsyslog で記録されるわけではありません。yum のログは rsyslog を停止していても yum.log に書き込まれますし、squid のログも同様です。イメージ的には Windows のイベントログだと思ってください

Windows でもアンチウイルスソフトのログはイベントログではなくソフトウェア内のログに記録されますし、バックアップソフトのログも同様ですよね。Linux も似たようなものだと思って問題ないかと思います。

以下のサイトが参考になります。

参考サイト:Windowsイベントログとsyslog の違いを比較表で説明

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)