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
ソケットは毎回オープンされていたが、
読み込み用あるいは転送用という形ではなかった。
この版の 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 (
[email protected]) がこの可能
性を警告した。ごろつきのプログラマ(達)が、
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 (
[email protected]) が Linux
に移植し、Martin Schulze (
[email protected])
が幾つかのバグの修正と新しい機能追加を実装した。
klogd のオリジナルは Steve
Lord
(
[email protected])によって書かれ、Greg
Wettstein
が多くの改善を施した。
- Dr. Greg Wettstein
- Enjellic Systems Development
- Oncology Research Division Computing Facility
- Roger Maris Cancer Center
- Fargo, ND
- [email protected]
-
- Stephen Tweedie
- Department of Computer Science
- Edinburgh University, Scotland
- [email protected]
-
- Juha Virtanen
- [email protected]
-
- Shane Alderton
- [email protected]
-
- Martin Schulze
- Infodrom Oldenburg
- [email protected]