SYSKLOGD(8)

名前
sysklogd - Linux システムロギングユーティリティ

書式
syslogd [ -a socket ] [ -d ] [ -f config file ] [ -h ] [ -l hostlist ] [ -m interval ] [ -n ] [ -p socket ] [ -r ] [ -s domainlist ] [ -v ]

説明
sysklogd はシステムロギングとカーネルメッセージの確保という二つの機能 を提供するユーティリティである。 このユーティリティではインターネットと UNIX ドメインの両方のソケットが 利用可能なので、ローカルとリモートの両方で記録可能である。 このシステムの記録を提供する syslogd(8) は BSD のソースコードに由来しているものである。 カーネルロギング機能は klogd(8) ユーティリティによって提供され、スタンドアロン形式、syslogd クライアントのどちらの形式でも動作する。 syslogd は最近の多くのプログラムにロギングの手段を提供する。 記録されるメッセージは少なくとも時間の情報とホスト名を持ち、 通常はそれらに加えてプログラム名のフィールドも持っている。 しかしながら記録される内容の信頼性については それぞれのプログラムに依存する。 syslogd のソースコードは激しく変更されながらも二つの特徴についてはそれを維持し つづけている。まず第一に、その基本となる、一般的な BSD らしい挙動への 追随を保証することの系統的な意図の維持である。第二の重要な特徴は、この 版の syslogd が標準ライブラリに含まれる syslog と透過的に相互に影響し あっていることである。もし標準の共有ライブラリがリンクされたバイナリコ ードが正常に機能しないならば、作者達にその異様な挙動の例を送って欲しい。 起動時にその主設定ファイルである /etc/syslog.conf かまたは代替として -f オプションであたえられる名前のファイルが読み込まれる。その各行のうち、 シャープ記号 (``#'') ではじまるものと空行は無視する。その行の解析におい てエラーを生じた行もまた無視する。

オプション

-a socket
    この引数を使って、 syslogd が listen する追加のソケットを指定できる。 これはデーモンを chroot() 環境で動作させようとする時に必要である。 追加のソケットは 19 個まで指定できる。 もしもっと多くのソケットが必要なら、syslogd.c ファイルの MAXFUNIX シンボルの値を増やす必要がある。 chroot() デーモンの例としては OpenBSD の人が記した http://www.psionic.com/papers/dns.html がある。

-d  デバッグモードを有効にする。このときデーモンは自身をバッググラウ ンドに推移させるための fork(2) を使用せずにフォアグラウンドに留まり、豊富なデバッグ情報を現在有効な tty へ出力する。このマニュアルページのデバッギングの章に詳細な解説があ るので参照すること。

-f config file
    既定値の /etc/syslog.conf ファイルの代替として、指示された名前のファイルを使用する。

-h  syslogd の既定値の設定では、リモートのホストから受信したメッセージをそ れ以上転送することはない。コマンドラインからこのスイッチを使用するとデ ーモンはリモートホストから受信したメッセージをさらに別に定義されるホス トへ転送する。

-l hostlist
    記録するホストとして、FQDN ではなく単純にホスト名のみを指定する。 コロン(``:'')を区切りに用いて複数のホストを指定することもできる。

-m interval
    syslogd に定期的にタイムスタンプを記録させる。 二行の -- MARK -- を記録する間隔 interval の既定値は 20 分であり、このオプションで変更可能である。 interval を 0 にすると、-- MARK -- 行を全く出力しない。

-n  自動的なバックグラウンドへの移行を抑止する。これは syslogd が init(8) により起動および制御される場合にのみ必要である。

-p socket
    /dev/log の代りに指定した UNIX ドメインソケットを利用する。

-r  このオプションで、ネットワーク上でインターネットドメインソケットにより syslog サービス( services(5) を参照せよ)を使用してメッセージを受信する機能が有効になる。既定 値ではネットワークからのいかなるメッセージも受信しない。 このオプションは sysklogd パッケージの version 1.3 で導入された。既定 値の挙動がより以前の版の挙動の反対となっていて(ネットワーク越しに受信 するには)このオプションを利用しなければならないという点にどうか注意し ていただきたい。

-s domainlist
    記録する際に剥ぎ取るドメイン名を指定する。 コロン(``:'')を区切りに用いて複数のドメインを指定することもできる。 ドメインの一部ではなく、ドメイン全体を指定することに注意すること。 例えば、 -s north.de と指定して、ログを記録するホスト名が satu.infodrom.north.de だった場合、 ドメインは剥ぎ取られない。このような場合、 -s north.de:infodrom.north.de のように二つのドメインを指定しなければならない。

-v  バージョンを出力し、終了する。

シグナルの処理
syslogd はシグナルに反応する。 syslogd に簡単にシグナルを送るには次のように実行すればよい:

    kill -SIGNAL `cat /var/run/syslogd.pid`

SIGHUP
    このシグナルは syslogd に再初期化を指示する。全ての開いていたファイルを閉じ、設定ファイル(既 定値では、 /etc/syslog.conf) を再度読み込んで、 syslog(3) の機能を再び有効にする。

SIGTERM
    syslogd は終了する。

SIGINT, SIGQUIT
    デバッグモードが有効である場合は無視するが、そうでなければ syslogd は終了する。

SIGUSR1
    デバッグモードのオン/オフを切り替える。この動作は syslogd がその起動時に -d オプションが指示されている場合にのみ有効。

SIGCHLD
    メッセージの一斉通知のために、子プロセスがあればその終了を待つ。

設定ファイル文法の差異について
syslogd の設定ファイル文法はオリジナルの BSD のソースコードとは微妙に差異があ る。オリジナルでは、指示されたものとそれ以上の優先順位をもつメッセージ は全てログファイルに記録される。

    たとえば、下記の例は daemon facility を使用する「全て (debug は最低の 優先順位なので、それ以上の全てが適合するわけである)」のデーモンからの 出力が /usr/adm/daemons に記録される:

    	# syslog.conf のサンプル
    	daemon.debug			/usr/adm/daemons

新しい仕組みのもとでもこの記述は全く同じ動作をもたらす。 アスタリスク(*)、イコール記号(=)、エクスクラ メーションマーク(!)、マイナス記号(-)の四つの新たな記述子が 追加された相異点である。 * を指定すると、指示した facility に関するの全てのメッ セージを一つに集めることができる。この動作は特定の priority レベルに対 するデバッグに支障がでるかもしれない点に注意すること。このアスタリスク 記法はより直観的なものであることがわかるだろう。 = ワイルドカードは記録を指示された priority のもののみに限定する。 たとえば特定のロギングについて、デバッグメッセージのみを集めることが可 能となる。

    下記の syslog.conf の記述例はすべての debug メッセージを /usr/adm/debug に記録する。

    	# syslog.conf のサンプル
    	*.=debug			/usr/adm/debug

priority の先頭に付く ! は、上記の priority、記述子の解釈を 反転する(訳注：すなわち、!info なら info 未満の priority を表す)。

    以下の例では、priority が info であるものを除くすべての mail facility のメッセージが /usr/adm/mail ファイルに記録される。そして news.info(これは含む) から news.crit(こち らは含まれない)までのすべてのメッセージが /usr/adm/news ファイルに記録される。

    	# syslog.conf のサンプル
    	mail.*;mail.!=info		/usr/adm/mail
    	news.info;news.!crit	/usr/adm/news

除外する指示子はもっと直観的にも利用できる。上述の例はもっと簡単にでき る。たとえば…
	mail.none
であるとか
	mail.!*
であるとか
	mail.!debug
と記述すると mail facility によるすべてのメッセージが除外される。もっ と楽しむ余地もあるよね :-) - をファイル名に接頭すると書き込み時のファイルシステムバッファの フラッシュ動作を抑制することができる。 純粋な BSD 的挙動からは多少順応した結果なのかもしれないが、 使う立場からすれば、BSD 的挙動よりもよりいくらかでも柔軟であることがわ かるだろう。これらの変更は標準的な syslog.conf(5) ファイルにはなんら影響を及ぼしていない点に注意せよ。拡張機能を利用する には明示的に設定ファイルを調整する必要がある。

リモートロギングサポート
syslogd の機能にネットワークへのサポートを提供する変更点がいくつかある。 ネットワークサポートとは、syslogd が稼働しているあるホストでのメッセー ジを別の syslogd が稼働しているホストへ転送し、そこで実際にディスクの ファイルに記録するようにできる、ということである。 この機能を有効にするにはコマンドラインで -r オプションを指定する。 syslogd の既定の動作はネットワークを関知しない。 syslogd はローカルに生成されるメッセージについて UNIX ドメインソケット を監視する方法を用いる。この方法が syslogd に標準 C ライブラリに含まれ る syslog との協調動作を可能にしている。同時に syslogd は他のホストか ら送信されるメッセージのために標準の syslog ポートを監視している。正し い動作のためには services(5) ファイル (普通 /etc にある)に次のエントリが必要である:

    	syslog          514/udp

もしこのエントリがなければ、UDP ポートが開設できないために syslogd はリモートのメッセージを受信することも他へ送信することもできない。この 場合、 syslogd は即座に終了する代りにエラーメッセージを出力する。 メッセージを送信するべきホスト名に @ を接頭して syslog.conf ファイルの通常のファイル名のかわりに記述することで、他のホストへメッセ ージを送信することができる。

    たとえば「すべて」のメッセージをリモートのホストへ送信するには、 syslog.conf に次のように記述する:

    	# メッセージをすべてリモートのホストへ
    	# 送信するための syslogd 設定ファイルの例
    	*.*			@hostname
    すべての カーネル メッセージをリモートのホストに送信するには (syslog.conf に)次のように記述する:

    	# カーネルメッセージをリモートのホストへ
    	# 送信する設定ファイルの例
    	kern.*		@hostname

起動時にネームサーバ(通常、syslogd よりも後から起動する)が応答しないた めにリモートのホストネームが名前解決できなくても問題はない。 syslogd はホスト名の問い合わせを 10 回繰り返し、そののちにエラーメッセージ出す。 あるいはこの問題を回避するために、 /etc/hosts ファイルに当のホスト名を記述しておくという方法もある。 普通の syslogd では、リモートホストが実は自分自身であった場合 (または、より複雑な三角関係とか、そんなの) syslog-loop が発生する。 たとえば作者のドメイン(Infodrom Oldenburg)でもたった一つのメッセージが われわれのディスクをあふれかえさせるという事故が起きたことがある :-( これをさけるべく、リモートホストから(または自分自身)から発信されたメッ セージはそれ以上転送されない。これでもまだ問題があるような状況があるの なら作者(Joey) まで連絡してほしい。 もしリモートのホストが syslogd が稼働しているホストと同じドメインに属しているのであれば、FQDN ではな くて単純にホスト名のみが記録される。 ローカルネットワークにおいて、重要な情報のすべてを一台のコンピュータに 集めるための中央ロギングサーバを提供することができる。もしネットワーク が複数のドメインからなっているような場合には、単純なホスト名ではなくて FQDN で記録されるが、それが嫌な場合は、 -s でそのサーバで strip-domain 機能を使えばよい。これで syslogd はサーバが属するドメイン以外であっても剥ぎ取って単純にホスト名のみを記 録する。 -l オプションを使用するとローカルのコンピュータとしてのホスト名を定義でき る可能性が生じる。この場合でもやはり FQDN ではなくて単純なホスト名だけ を記録する。 リモートホストへメッセージを転送したり、リモートホストからメッセージを 受け取るために用いられる UDP ソケットは、 それが必要な時にだけオープンされる。 1.3-23 より前のリリースでは UDP ソケットは毎回オープンされていたが、 読み込み用あるいは転送用という形ではなかった。

名前付きパイプ(FIFO)への出力
この版の syslogd は複数の名前付きパイプ(FIFO) へのログ出力も可能である。 記録するメッセージをFIFO あるいは名前付きパイプで記録するには、ファイ ル名の前にパイプ記号(``|'')を付ける。これはデバッグに役に立つ。使用す る FIFO は syslogd の起動に先立って mkfifo コマンドで作成しておかなけ ればならない点に注意すること。

    下記はカーネルのデバッグメッセージを FIFO で記録する為の設定例である。

    	# 名前付きパイプとしての /usr/adm/debug へ
    	# カーネルのデバッグメッセージを記録するための
    	# 基本的な設定例
    	kern.=debug			|/usr/adm/debug

インストール関連
この版の syslogd をインストールする場合において、重要な考察を要す る点が多分一つだけある。この版の syslogd は syslog ファンクションによ るメッセージのフォーマットが適切なものであることを前提としている。共有 ライブラリにより提供される syslog ファンクションの動作内容は、 libc.so.4.[2-4].n の範囲のなかだけでもどこかしら変更されている。なかで も明らかな変更は /dev/log ソケットへ出力される際にメッセージが NUL-terminate (\0 で終端される こと) されるようになった ことである。よって、この版の syslogd はメッセージが \0 で終端されてい ることに依存することとなった。 この問題は、概して、システム上で古いスタティックにリンクされたバイナリ コードを動作させるときにあらわになる。古い syslog ファンクションを用い るバイナリコードは、メッセージ中の最初の文字が削除されたメッセージを記 録し、空行を(複数)作ってしまう。この問題を修正するには、新しい版の共有 ライブラリを用いてリンクしなおすしかない。 syslogd(8) と klogd(8) の両方とも init(8) を用いる起動でも rc.* の中で起動でもどちらでも可能である。もし、init を用いる場合は -n オプションを必ず設定すること、さもなくばたく さんの syslog デーモンが起動してしまう。これは init(8) がプロセス ID に依存しているためである。

セキュリティ上の注意
syslogd デーモンは使用不能攻撃の抜け道として利用されてしまう潜在的な可 能性を持っている。Jon Morrison (jmorrison@rflab.ee.ubc.ca) がこの可能 性を警告した。ごろつきのプログラマ(達)が、 syslog メッセージを syslogd デーモンに殺到させて、その結果、ログファイルで全ての利用可能な ファイルシステムを埋め尽すことが簡単にできるようになっていた。インター ネットドメインソケットを用いるロギングを有効にすることはローカルのコ ンピュータの上のプログラムや、他の誰かによる外部からの危険にシステムを さらすことになりうる。 コンピュータを守るための手段がいくつかある:

1.  514/UDP ソケットにアクセスすることができるホストやネットワークを制限す るファイアウォールをカーネルに実装する。

2.  ログの出力先をもしそれが破壊されてもコンピュータを損なうことはないよう な独立しているかまたはルート (/) ではないファイルシステムにする。

3.  ext2 ファイルシステムはそのうちの特定の割合を root だけが使用可能とす る制限を設定することができる。注意 この方法は syslogd を root で はないプロセスで実行する必要がある。さらに注意 この方法は syslogd が 514/UDP ソケットと接続できなくなるので、リモートロギングが 不可能となる。

4.  ローカルのコンピュータへの危険を制限するためにインターネットドメインソ ケットを無効にする。

5.  ステップ 4 を用いてもなお問題が残っていて、それが 3.5 フィート(だいた い 1 メートル)の吸出し棒(注)を持ったごろつきのプログラム/デーモンどこ ろのさわぎではないようであれば、 問題を起しているユーザとおしゃべりし てみるしかないね。 注:吸出し棒とは — 3/4、7/8、1 インチ の鋼鉄の棒で両端に吸い口が付 いている。もともとは西ノースダコタの油田などで使われた油井から油を`吸 い出す'ポンプで使われているもののことである。それが転じて牧場で牛に餌 をあたえるため、また時には反抗的だったり喧嘩腰だったりする牛を追うため に使われている棒を差す。

デバッギング
-d オプションを用いてデバッグモードを有効にすると syslogd はとてつもなく饒舌になって、いまなにがおこっているかを標準出力に出力す る。設定ファイルが再度読み込み込まれ解釈され直すときはいつでもテーブル 化された内部データ構造が出力される。このテーブルは四つのフィールドから 成っている:

number
    このフィールドは 0 から始まるシリアル番号である。 この番号は内部データ構造上(すなわち配列)での位置をあらわす。 もし番号がないときは、 /etc/syslog.conf の対応する行にエラーがある。

pattern
    このフィールドは巧妙で正確に内部構造を表現している。各列は facility( syslog(3) を参照)を表わす。 以前使用されていたいくつかの facility もまだ残っているが、使用されてい るものだけがある。 列の各フィールドは priority( syslog(3) を参照)をあらわす。

action
    このフィールドには(facility/priority の)パターンに一致するメッセージを 受信したときの action の詳細が記述される。 全ての action については syslog.conf(5) マニュアルページを参照すること。

arguments
    このフィールドは action の最後のフィールドによる付加的な引数を示す。 ファイルロギングではログファイルとするファイル名; ユーザロギングでは(ログ出力を通知する)ユーザの一覧; リモートロギングではログを配信するコンピュータのホスト名; コンソールロギングでは使用されるコンソール; ttyロギングでは指定された tty; 一斉通知の場合は付加引数はなし。

ファイル
/etc/syslog.conf
    syslogd の設定ファイル。 正確な情報は syslog.conf(5) を見ること。
/dev/log
    ローカル syslog メッセージを読み出す UNIX ドメインソケット。
/var/run/syslogd.pid
    syslogd のプロセス ID を保持するファイル。

バグ
ある行にエラーがあると全てのルールを無視してしまう。 syslogd はその処理過程のどの時点においてもログファイルのファイルモードを変更し ない。もしファイルが誰でも読み書きできるように作成されていても、である。 もしこのことによる問題を回避したいのであれば作成時に管理者のみがあつか えるように変更する必要がある。 これは、 smail 3.x の配布に含まれる savelog(8) によるログファイルのローテーションと連携して都合がよい。auth.* メッセ ージはパスワードが含まれていることがあり、それが誰にでも読めるというこ とは重大なセキュリティホールになるという点を忘れないように。

関連項目
syslog.conf(5), klogd(8), logger(1), syslog(2), syslog(3), services(5), savelog(8)

協力
syslogd は BSD のソースコードに由来していて、Greg Wettstein (greg@wind.enjellic.com) が Linux に移植し、Martin Schulze (joey@linux.de) が幾つかのバグの修正と新しい機能追加を実装した。 klogd のオリジナルは Steve Lord (lord@crya.com)によって書かれ、Greg Wettstein が多くの改善を施した。
Dr. Greg Wettstein
Enjellic Systems Development
Oncology Research Division Computing Facility
Roger Maris Cancer Center
Fargo, ND
greg@wind.enjellic.com
Stephen Tweedie
Department of Computer Science
Edinburgh University, Scotland
sct@dcs.ed.ac.uk
Juha Virtanen
jiivee@hut.fi
Shane Alderton
shane@ion.apana.org.au
Martin Schulze
Infodrom Oldenburg
joey@linux.de