syslog とは
syslog とは、UNIX 系のシステムログを管理する機能です。
一般的には IP ネットワーク経由でリモートホストのシステムログを取得するプロトコルを指すことが多いですが、本来はローカルホストのログとリモートホストの扱いを一元的に管理する機能です。
また、syslog は UDP を使うイメージが強いですが、TCP での実装をしている製品も多いです。
TCP でも UDP でもポート番号は 514 番を使うのが一般的です。
一般的な構成では 1 台、もしくは 2 台の Linux サーバを syslog サーバとして動作させ、他の Linux サーバや NW 機器の syslog を受信します。
UDP の場合は再送がないため欠損の可能性がありますので、2 台同時に送信するケースも多々あります。
なお、Linux には標準で rsyslog (読み方:あーるしすろぐ) がインストールされており、syslog サーバとしても syslog クライアントとしても動作しますが、Windows には標準では syslog を扱うことはできませんので、個別に NTsyslog 等のソフトウェアをインストールする必要があります。
また、大抵の NW 機器は設定により syslog クライアントとして動作させることができます。
syslogで送られる情報
syslog では大きく以下の 3 つの情報が送受信できます。
- PRI (Priority): Facility と Severity の情報が含まれる
- HEADER: タイムスタンプやホスト名等が含まれる
- MSG: 自由記述
『どのようなエラーのときにどのような Facility/Severity/MSG を出力するか』というのはすべてOS 開発者やアプリケーション作成者がプログラミングの中で決定していきます。
例えばルータの例外発生時の syslog の Severity に何を使うか、というのも、ルータの OS 開発者が決定しているのです。
なのでメーカが異なれば Severity の基準が異なる可能性も十分あります。
Facility
Facility とは、syslog の大分類のことです。RFC5424 では以下のように定義されています。
Facility の 4 番と 10 番のペア、および 9 番と 15 番のペアが同じ内容になっていますが、これには理由があります。
この RFC5424 の基になった RFC3164 においても同様の定義がされているのですが、そもそも RFC3164 は規格を定めたものではなく、『UNIX 系 syslog (BSD syslog) の動作および慣例を調査した結果、このように使われていますよ』という調査結果を記したものなのです。
つまり、内容が重複している項目については、色々なアプリケーションがそれぞれ異なる facility 番号を使っていた背景があるためなのです。
同様に、local0 ~ local7 もローカル用として予約されていましたが、現状ではあまり意識されず、リモートホスト (syslog サーバ) へ転送することが多いです。
Severity
Severity とは、syslog の知らせる緊急度です。具体的には以下が定義されています。
Emergency は比較的分かり易いですが、Alert, Critical は前述の通り、プログラマのさじ加減となりそうです。Error と Warning, Warning と Notice あたりも境界は曖昧そうです。
syslog のパケットフォーマット
syslog のパケットフォーマットは 2 種類あります。
1 つがBSD 形式 (RFC3164)、もう 1 つはIETF 形式 (RFC5424) です。
前述の通り、RFC3164 は、フォーマットの規格を定めたわけではなく、BSD でどのような形式で使われているかを調査した結果をまとめたものです。
2009 年に定められた RFC5424 では「フォーマットの不統一性」や「認証がないことによる不正なログの差し込み」等を改善することを目的とし、規格化を行いました。
具体的にはフォーマットを定め、また、TCP での転送が可能になることを見越し、TLSによる認証・暗号化機能も実装されました。
その後 2012 年に RFC6587 により TCP による規格化も為されました。
BSD形式のフォーマット
まずは BSD 形式のフォーマットから見ていきます。
全て可変長のフィールドで、また、全て ASCII 文字列です。
全て人間が目視するためのものなので、特にフィールドの長さを示すことはしていません。
PRI は Priority のことです。Severity と Priority をごっちゃにしてしまっている解釈も稀に見ますが、RFC の記述とは反しています。
PRI は Facility のコード番号を 8 倍したものと、Severity のコード番号を足した数字を、<>で囲み、ASCII 文字で表現しています。例えば Facility=2 (mail system)、Severity=5 (Notice) の場合は <21> という 4 Bytes の ASCII 文字列が格納されます。
なお、RFC3164 には『syslog のパケット長は 1024 Bytes 未満であること』と書かれています。
IETF形式のフォーマット
次に、IETF 形式を見ていきます。
BSD 形式と同じく、全て ASCII となっており、長さを示すフィールドはありません。
PRI と TimeStamp, Hostname, MSG は BSD 形式と同じです。
Version は RFC5424 のフォーマットが 01 となります。
App-Name は BSD 形式 の Tag と同じく、アプリケーション名が入ります。
プロセス ID はログを吐いたプロセスの ID です。(起動時に OS から払い出される番号)
メッセージ ID は syslog メッセージの重複を検知するための識別子です。
Structured-Dataというのは、syslog に関連するパラメータをログするためのフィールドです。
SD-ID というのが Structured-Data の識別子で、それに紐付き、1 つ以上の SD-PARAM (属性と属性値のペア) が含まれます。
また、SD-ID 自体も 1 つの syslog メッセージに 1 つ以上ですので、複数持つことも可能です。
また、RFC5424 ではパケット長については 2048 Bytes が目安として記されています。
syslog クライアントの設定(Ciscoルータの場合)
syslog クライアントは設定により、その機器で出力されたログの Facility と Severity がどのような値の場合に syslog サーバへ転送するかを決めることができます。
例えば Cisco ルータでは以下のように設定します。
(config)# service timestamps debug datetime msec localtime show-timezone (config)# service timestamps log datetime msec localtime show-timezone (config)# clock timezone JST 9 (config)# logging host 192.168.1.1 transport tcp port 514 (config)# logging trap warning (config)# logging facility sys9
上記の例の場合、Severity が Warning 以上 (つまり 4 以下) の場合、Facility=sys9 にセットした syslog メッセージを 192.168.1.1 の TCP port=514 へ転送します。
コメント