システムログの読み方を理解しよう

 いちばん近道なLinuxマスター術
 サーバとして運用していく上で,自分のマシンが現在どのように動作しているのかを把握するのは,とても重要なことだ。なぜならば,公開サーバとして第三者がアクセスできるようにすると,自分が思いもよらないセキュリティホールが存在したり,それ以前にも設定を誤っていてエラーログが記録されていることがあるからだ。このような状況下であっても,ログを見られる目を養えば速やかに対処することができるだろう。システムが教えてくれるログを理解することは,サーバ運用の中でも必須事項なのだ。
第4回 システムログの読み方を理解しよう

 Linuxを始めとするUNIX OSやソフトウェアは,非常に多くの動作記録(ログ)が記録される。一元的に情報を集めるシステムログは,管理作業に不可欠な情報収集のための重要な仕組みであり,これによって管理者は日常的かつ網羅的に情報集を行うことができるのである。

 しかし,システムログをうまく活用できないと,システム管理が非常に面倒なのになってしまう。たとえば何らかのトラブルが起こった場合,不慣れな管理者では原因不明だと大騒ぎしてしまうだろう。このような状態であっても,実はシステムログを見れば一目瞭然で解決できることが多いのだ。

 第4回目の今回は,システム管理を行う上で重要な情報が記録されるシステムログについて,その内容と理解する方法について解説していこう。

icon システムログの仕組み

 システムログ(一般的には「シスログ」と呼ばれる)は,その名の通りシステムの動作状態が記録されている記録のことだ。システムログが記録される代表的なタイミングは次のような状態(イベント)である。

 この点から分かるのは,マシンが動作している上で何らかのチェックが行われたり,エラーが発生したり,システム状況に変化があった場合に記録されるということだ。

 具体的には,アプリケーションなどが記録したいメッセージとともに syslog(3) というシステムコールを呼び出すことによってメッセージはsyslogdというプログラムに渡される。その内容は,/var/log/messagesなどのファイルに記録されるのだ。また,システムログには次のようないくつかの種類がある。

 それぞれのアプリケーションによって使い分けられており,たとえばカーネルメッセージだけを特定のログファイルに記録するようなことできるようになっている。「どのメッセージをどこに出力するか(出力先はファイルとは限らない)」という設定をするのが,「syslog.conf」と呼ばれる設定ファイルである。

icon syslog.confの記述方法

 syslog.confは,一般的には/etc/syslog.confというファイル名で用意されている。次の例では,標準のsyslog.confを元に,具体的な設定方法について解説してみよう。

ファシリティ(facility)とプライオリティ(priority)

 システムログには「facility」と「priority」という考え方がある。「facility」は,「カーネル」,「メール」,「認証」などの「システムログの種類」のことで次のような種類がある。

facility 説明
auth セキュリティ・認証関連
authpriv セキュリティ・認証関連 (プライベート)
cron cron 関連メッセージ
daemon デーモン(サーバプログラム)関連
kern カーネル関連
lpr プリンタ関連
mail メール関連。メールサーバ(sendmail)などが利用
news NetNews 関連のメッセージ
security auth に同じ (Linux、FreeBSDのみ)
ftp ftp 関連(FreeBSDのみ)
ntp ntp 関連(FreeBSDのみ)
syslog syslog 自身のメッセージ
user ユーザーアプリケーションのメッセージ
uucp UUCP 関連のメッセージ
local0〜local7 独自に利用できる facility

 一方,「priority」には次のような種別がある。

priority 内容
debug デバッグメッセージ
info 一般的な報告メッセージ
notice 重要なメッセージ
warning 警告メッセージ(warnも同じ)
err エラーメッセージ(errorも同じ)
crit 重大なエラーメッセージ
alert すぐに何らかの対処が必要なメッセージ
emerg システムが不安定な状態(panicも同じ)

 この表から分かることは,「priority」は優先度を表わし表の下側の方がより高い優先度となっていることだ。また「none」というプライオリティを利用すると,「出力しない」という選択もできる。これらの「facility」と「priocity」を組み合わせることによって,システムグの種類を指定する。たとえば,「カーネルのデバッグ情報」であれば「kern.debug」と表現できるし,「メール関連の情報」であれば「mail.info」となる。これらを syslog.confでログファイルとして関連付ければよいのである。

 ただし,プライオリティを指定するとより高いプライオリティのシステムログも同時に指定したことになる。つまり,「warning」と指定すると「warning,err,crit,alert,emerg」すべてを指定したことになり,「crit」を指定すると「crit,alert,emerg」を指定したことになる。このプライオリティ指定の詳細は,後述しよう。

icon syslog.confにおける書式のルール

 syslog.conf内では,1行に1つのルールを記述するという決まりがある。

<selecor>    <action>

 書式は上記のようになっている。「selector」部には「mail.info」や「kern.*」のように記述し,複数指定する場合にはセミコロン「;」で区切り,「mail.*;news.*」のように指定する。ファシリティにおいては,「mail」や「kern」などの指定のほかに,ワイルドカードを使い「*」としてすべてを指定したり,「!kern」と指定して特定のファシリティ以外のすべてを指定することが可能だ。

 プライオリティを指定する際,そのプライオリティおよびそれよりも高いシステムログすべてが記録される。たとえば,「info」というプライオリティを指定した場合,指定したログファイルには,「info, notice, warning, err, crit, alert, emerg」すべてのファシリティのログが記録される。特定のプライオリティのみを指定したい場合には,「mail.=info」のようにプライオリティの前に「=」を付加することで実現できる。

 さらに,逆に特定のプライオリティ以下を記録したい場合には,プライオリティの前に「!」を付加することもできる。これらの指定を利用した場合,実際に記録されるログのプライオリティは,次の表のようになる。

priority *.warning *.=warning *.!warning *.!=warning
debug    
info    
notice    
warning    
err    
crit    
alert    
emerg    

「action」には記録するログファイルの出力先のパス名を指定する。一般的には,「/var/log/messages」や「/dev/console」だろう。また,syslogはほかのマシンにシステムログを送ることができる。「@loghost」のように指定することで,ネットワーク上の別のホストでシステムログを記録することができる。この場合,ログを受ける側のサーバ上で,システムログを受け入れる設定済みであることが前提だ。

 このほかにも,ログイン中のユーザー端末に出力させることもできる。操作は簡単であり,「action」の項目に送りたいログイン名を指定するだけだ。たとえば,認証関連のログをrootに通知したい場合には,次のように指定すればよい。

auth.*;authpriv.*        root

 また,出力先に「*」を指定すると,現在ログインしているユーザー全員の端末に出力される。この書式に従うと,次のような設定を行うことができる。

# カーネルのログは /var/log/kernel に
kern.*             /var/log/kernel
# 基本的に情報はすべて /var/log/messages へ
*.info             /var/log/messages
# 認証関連情報は他のホストへ飛ばす
auth.*;authpriv.*         @loghost
# 緊急性の高いログはログインしているユーザーにも知らせる
*.emerg              *


icon syslog.confの実際

 ここでは,実際に稼動しているマシン上のsyslog.confを見てみよう。FreeBSDやSolarisには,独自に利用できる機能も備わっているため,それも併せて解説する。

Linuxの場合

 次の例は,Red Hat Linuxの標準設定状態のsyslog.confだ。前述した解説を理解していれば把握することのできるシンプルな内容だろう。

リスト
別ウィンドウで見る or 04a.txt

FreeBSDの場合

 FreeBSDのsyslog.conf例は次の通りだ。

リスト
別ウィンドウで見る or 04b.txt

 この中で注目したいのは,FreeBSDのsyslog.confでは次のような書式が見当たることだ。

!startslip
*.*                 /var/log/slip.log

 これは,「startslip」というプログラムが送るログをすべて,/var/log/slip.log に記録させる指定だ。同じく次の記述方法は,pppが記録するログをすべて/var/log/ppp.log に記録するという意味である。

!ppp
*.*                 /var/log/ppp.log

 このように,特定のプログラムに絞って特定のファイルにログ記録ができる。効率的に管理していくためにはとても重要な設定なのだ。

Solarisの場合

 次の例は,Solarisでの例である。

リスト
別ウィンドウで見る or 05a.txt

 Solarisのsyslog.confは,最初にプリプロセッサm4で処理されるため,「ifdef」という書式が使用されている。「ifdef(LOGHOST, foo, bar)」の場合,LOGHOSTが定義されている際には「foo」,LOGHOSTが定義されていない場合には「bar」が当てはまる。

mail.debug           ifdef(`LOGHOST', /var/log/syslog, @loghost)

 上記の例は,「LOGHOST」が定義されている場合にはローカルサーバ上の/var/log/syslogに記録することを意味する。一方,LOGHOSTでない場合には,「loghost」というホストにログを送信する。つまり,LOGHOST が定義されている場合には,次のように解釈されるのだ。

mail.debug       /var/log/syslog

 また,LOGHOSTが定義されていない場合には,次のように解釈されてログ配信をすることになる。

mail.debug       @loghost

 同じく次のようなifdefによる定義がある場合,LOGHOSTが認識されると空として解釈される。LOGHOSTが定義されていない場合には,userの4行だけが解釈されるのだ。

ifdef(`LOGHOST', ,
user.err              /dev/sysmsg
user.err              /var/adm/messages
user.alert                   `root, operator'
user.emerg                   *'
)

 このように,syslogによる記録方式は管理者が自由にコントロールすることが可能である。標準設定でもある程度はサービスごとに記録ファイルが分けられているが,自分で見やすいように分類することがシステム管理をしていく上で重要な作業になるだろう。次回の連載5回目では,インターネットサーバを理解する上で最も重要なnamedについて解説していこう。

icon 実際のシステムログを見てみよう

 ここで,実際のSYSLOGの出力例を見てみよう。復習になるが,SYSLOGの書式は次のように構成されている。これを念頭に見ていくと分かりやすいだろう。

<日付> <時間> <ホスト名> <プログラム名> <ログメッセージ>

 次の例は,「artemis」というホスト名のLinuxマシンのSYSLOGを一部抜粋したものである。

リスト
別ウィンドウで見る or 06a.txt

 最初の方には,起動時のログが並んでいる。文字列から判断するとよいが,カーネル(kernel)がUSBやPS/2マウス,PCMCIAカードサービスなどを初期化していることが分かる(1〜6行目)。その後、ランレベル5に移行して(7行目),ランレベル5で実行する起動スクリプトを実行する。APM,PCMCIA(cardmgr)を実行するが,文字列が見えるだろう。networkが起動された場合にはカーネルモジュールがロードされている。カーネルがネットワークカードを認識した旨のメッセージも記録されている(21行目)。

 その後,Apache(httpd)を起動,inetdを起動した後にsshd を起動していることが分かる(最終行)。

 次に,外部からのリモートアクセスを受け付けた際のログの例を挙げてみよう。

リスト
別ウィンドウで見る or 06b.txt

 これは,外部からSSHを利用してログインした場合のログである。SSHが「192.168.2.11」からの接続を受け付けて,「snaga」というユーザーのログインを許可(accept)したことが分かる。

 また,パスワードが一致せずにログインに失敗した場合には次のように記録が残る。このログからは、パスワード認証に失敗(authentication failed)していることが分かる。

リスト
別ウィンドウで見る or 06c.txt

 サーバアプリケーションの種類によって記録方法が違るが,基本的にはネットワーク経由で利用されるアプリケーションの場合「接続してきたホストのIP」や「ログイン名」などが記録される。これによって,誰(ユーザー名やIPで判断)がどこから(ドメインやIPで判断)接続してきたのかを知ることができる。

 たとえば,ftpログインの場合は次のように記録される。ここでも,ログインしたユーザ名やホスト名,IPアドレスが記録されているのが分かるだろう。

リスト
別ウィンドウで見る or 06d.txt

 なお,ここで示してきたのはLinuxでの出力例だ。カーネルや一部のプログラムなど,SYSLOGはよりシステムに近い領域でログ記録が行われるため,FreeBSDやSolaris,Linuxなどで若干の違いはあるものの,ApacheやFTPdなどはログ記録される書式にはプラットフォームによる違いはない。このため,システムの違いを特に気にすることなくシステムログを利用することができるのだ。