新世代syslogデーモン徹底活用

ログ

第1回 syslogdの限界と次世代シスログデーモン
第2回 syslog-ngの導入と設定
第3回 マクロやテンプレでsyslog-ngを使い倒す
第4回 rsyslogの導入
第5回 マクロとテンプレートによるrsyslog活用法

第1回 syslogdの限界と次世代シスログデーモン

UNIX系OSのシステムロギングをおよそ20年の長きにわたって支えてきた「syslogd」にも、限界が見えつつあります。その限界を打ち破る機能を備えた新しいシスログデーモンを紹介します。

 シスログデーモン「syslogd」は、UNIX系OSのシステムロギングをおよそ20年の長きにわたり支えてきました。しかし、増大する信頼性や安全性への要求、ログの適正保管といった要望に応えるには、syslogdでは力不足との声が高まっています。

 そんな折、システムロギングをより確実に行い、RDBMSへのデータ保存や監視システムの連携といった可用性にも優れた、「syslog-ng」や「rsyslog」が注目を集めています。この連載では、こうした次世代シスログデーモンを取り上げ、導入方法や活用方法を解説します。

システムロギングとsyslogd

 実行したイベントの履歴、システム不調や変更の記録、不正アクセスの痕跡など、シスログの用途は多義にわたります。またUNIX系OSに限らず、ほかのOSやネットワーク機器にも利用されており、システム管理全般においてシスログは欠かすことができません。

syslogサーバの活用

■syslogdの利点

 syslogdが、シスログデーモンのデファクトスタンダードとして20年近くにわたって利用されているのには、主に次のような利点が挙げられます。

 また、設定がシンプルで、デフォルトのままでもsyslogdサーバとして十分機能することも、広く利用される原因となっています。syslogdの設定は、下のような「/etc/syslog.conf」で行います。

#kern.*                                  /dev/console
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.*                               /var/log/secure
#authpriv.info                           /var/log/secure
mail.*                                   -/var/log/maillog
cron.*                                   /var/log/cron
*.emerg                                  *
uucp,news.crit                           /var/log/spooler
local7.*                                 /var/log/boot.log
/etc/syslog.confの一例(#で始まる行は無効)

 おのおの1行が設定の単位です。スペースやタブで区切られた第1フィールドで「取得するログの種類」、第2フィールドで「出力先」や「出力方法」を指定します。

 例えば3行目の設定では、認証(authpriv)サービスにかかわるログを、「/var/log/secure」ファイルに出力するよう設定しています。

 また、ログのレベルによって出力を切り替えることができます。例えば4行目のように「authpriv.info」と指定した場合、認証サービス(authpriv)にかかわるログで、レベルが「info」以上のものだけファイルに書き出します。

 ログの種別はファシリティ(facility)プライオリティ(priority)の組み合わせで指定します。「authpriv.info」では、ファシリティが「authpriv」、プライオリティが「info」になります。

 シスログでは、次表のようにファシリティとプライオリティが決められています。プライオリティは表の下にあるものほどレベルが高く、指定したプライオリティより高レベルのものすべてが出力されます。例えば「warning」を指定した場合、err/crit/alert/emergレベルのログも同時に出力されます。

ファシリティ 用途
auth 認証メッセージ
authpriv プライベート認証メッセージ
cron cronやatなどのクロックデーモンのメッセージ
daemon ほかにファシリティの指定がない
デーモンプログラム一般のメッセージ
kern カーネルのメッセージ
lpr ラインプリンタのメッセージ
mail メールサービスのメッセージ
local0からlocal7 任意の用途で利用可能
security authと同様(非推奨)
syslog syslogdの内部メッセージ
user 任意のユーザープロセスメッセージ
uucp UUCPを利用したプログラムのメッセージ
lpr ラインプリンタのメッセージ
表1 ファシリティ(facility)一覧
プライオリティ 用途
debug デバッグレベルメッセージ
info 情報メッセージ
notice 通知状態
warning(warn) 警告状態
err(error) エラー状態
crit 致命的な状態
emerg システムが利用できないような緊急事態
local0からlocal7 任意の用途で利用可能
表2 プライオリティ(priority)一覧

 主要なプロセスやデーモンについては、あらかじめ表1のようにファシリティが指定されていますが、表にないサービスやプロセスでも、ログを受け取る側と出力する側でファシリティを合わせることで、シスログの取得が可能です。

 例えば、sshdサービスでは設定ファイル「/etc/ssh/sshd_config」で、次のようにファシリティ「authpriv」が指定されており、ログを/var/log/secureファイルに出力することができます。

SyslogFacility AUTHPRIV
LogLevel INFO
/etc/ssh/sshd_configでsshdのログ出力方法を設定する

syslogdの問題点

 UNIX系OSでは、syslogdがデフォルトインストールされていることに加え、ファシリティとプライオリティの組み合わせで出力を制御できる手軽さが相まって、シスログが広く利用され、そのデーモンにsyslogdがデファクトスタンダードとして普及しています。

 しかし、これほど広範囲に利用されているにもかかわらず、シスログがRFC3164http://www.ietf.org/rfc/rfc3164.txt)として標準化されたのは2001年と比較的最近のことです。その間もsyslogdは使い続けられ、キャリアクラスの用途でない限り、見直されることはありませんでした。

 ところが最近になり、日本版SOX法に代表される内部監査の一環として、内外の通信記録、メールの送受信記録、ログイン記録など、シスログの用途が広がりを見せています。従来シスログは、障害の検知やその原因調査など、何かトラブルがあったときの備えとしての役割が主なものでした。ところが内部監査では、正常時の状態を確実に収集する必要があり、信頼性についても強い要望が上がっています。内部監査を実施するほどの規模でなくとも、単一ファイルに書き出すだけのログの在り方に、不満を持っているユーザーは少なくありません。

 syslogdの問題点は主に次のとおりです。

■シスログを細かく分別できない

 シスログの分別は、ファシリティとプライオリティに基づいているため、組み合わせに限りがあります。シスログを生成したプログラムごとに出力先を分けたり、特定の文字列に一致したシスログだけ出力先を分ける、といったことができません。

■シスログファイルのローテーションを行うことができない

 シスログファイルを容量や日付で分割することができないため、別途logrotateのようなソフトウェアを導入し、ログファイルを整理する必要があります。

■ディスクI/Oを制御できない

 シスログを一元管理するような大規模運用では、書き込みタイミングを調整するなどディスクI/Oの制御が重要になりますが、syslogdにはI/Oに掛かる負荷を抑える手段がありません。

■シスログを自動的に監査できない

 syslogdだけでは、シスログの中に特定のメッセージを見つけた場合に自動的に処理を行うような設定ができません。別途、logwatchswatchのようなソフトを導入する必要があります。

■シスログが正常に取得されているか監視できない

 ログの取りこぼしがないか監視することができません。

■シスログに出力される日付情報が貧弱

 TIMESTAMPを定期的に挿入することはできますが、日付フォーマットは「Mmm dd hh:mm:ss」以外に変更できません。

■シスログをネットワーク経由で転送する際UDPを使用する

 一般的に信頼性を必要とする通信にはTCPを用いますが、syslogdではUDPを用います。そのため帯域が限られたネットワークでの使用や、サーバの負荷が高い場合に、パケットの取りこぼしが発生します。UDPではパケットは再送されず、シスログの取りこぼしを引き起こします。

■シスログを受ける側がダウンした場合、シスログが消失する

 シスログを受け取る側が停止している間、出力側でバッファリングし、受け取る側が復旧した後でまとめてシスログを転送するといったことができません。

■シスログを出力する側・受け取る側で認証手段が提供されていない

 IPアドレスによる接続制限は可能ですが、転送先や転送元の信ぴょう性を確認するような認証方法が提供されていません。クライアントになりすまし、大量のシスログを送り付けられるなどの危険性があります。

■送信データを暗号化できない

 syslogdにはシスログを暗号化し、転送する手段がありません。別途SSLラッパーを導入する必要があります。

2つの次世代syslogデーモン

 syslogdの問題点を克服したシスログデーモンは、特定機器のために用意された有償製品も含めれば数多くありますが、ここではオープンソースソフトウェアで、Linuxディストリビューションでも標準採用されている「syslog-ng」と「rsyslog」を紹介します。

次世代を意識した「syslog-ng」

 syslog-ngはGPLで利用可能なオープンソースソフトウェアです。ハンガリーに拠点を構えるBalaBit IT Securityにより提供されています。「ng」はnext generationを意味し、まさに次世代を意識した、さまざまな機能を備えています。

 1998年、当時未完であったDarren Reed氏の「nsyslog」を基に、キャリアクラスで使用されることを前提に開発が行われました。2006年にはIPv6対応やさらなる最適化が施されるなど、現在も積極的に開発が行われています。syslogdでは満たすことができなかった点を補いつつ、柔軟性や扱いやすさはそのままに、次のような機能を備えています。

■syslog-ngの主な機能

 シスログを識別する手段が増えたことで、swatchのようなアプリケーションを別途使用することなく、シスログの内容に基づいてメール通知やアクセスフィルタを実行するなど、syslog-ngだけで監視を自動化できます。また、日付単位でログファイルを生成する場合、syslogdではlogrotateを導入する必要がありましたが、syslog-ngでは日付マクロを用いることで可能になっています。

 いままでアドインソフトに依存していたシスログを適切に管理する機能や、syslogの安全性と信頼性を向上させる機能の追加が目を引きます。大規模運用では「ファイルシステムへのシスログ書き込みタイミングを指定」できることで、ファイルシステムのI/Oを最適化できます。

信頼性を特徴とする「rsyslog」

 reliable(信頼できる)シスログデーモンを目指して名付けられた「rsyslog」は、名前の由来となっている信頼性とともに、豊富な機能も特徴としています。TCPを使ったシスログの配送や、MySQLをはじめとするデータベースとの連携など、2004年の開発開始以来、syslogdに求められた機能を積極的に取り込んでいます。

 Fedoraではバージョン8以降、rsyslogを標準のシスログデーモンとして採用しています。主な特徴は次のとおりです。

■rsyslogの主な特徴

 やはり、信頼性確保のための機能が目を引きます。RFC3195はシスログ転送方式の信頼性を高めた、新しい転送方法を定めたものです。対応する機器は多くありませんが、今後の普及が期待されています。

 rsyslogはいち早くRFC3195のサポートをうたっています。syslogdでもsyslog-ngでも、データベースへのシスログの保存は、パイプ処理を使って外部プログラムを呼び出すことで実現しています。さらにrsyslogは、その仕組みの中にMySQLやPostgreSQLとの連携機能を有しているため、大規模な運用でも効率よくシスログをデータベースに保存することができます。

第2回 syslog-ngの導入と設定

第一回「syslogdの限界と次世代シスログデーモン」、シスログデーモン「syslogd」の問題点や限界について言及し、その代替として「syslog-ng」と「rsyslog」を紹介しました。今回はそのうち、シスログの内容に基づいてメール通知やアクセスフィルタを実行できるなど、さまざまな機能を備えたsyslog-ngを取り上げ、その導入方法やsyslogdからの移行方法を解説します。

syslog-ngのインストール

 openSUSEではデフォルトで採用するなど、一部ではsyslog-ngの標準化も進んでいます。openSUSEに限らず多くのディストリビューションでも、パッケージ管理ツールを使って容易にインストールすることができます。

 バイナリパッケージが用意されていないプラットフォームやカスタムインストールを実行する場合も、Linuxならソースから手軽にインストールすることもできます。バイナリパッケージを使用する場合と、ソースからインストールする場合、それぞれのインストール方法を解説します。

 以降はrootユーザーにて作業を行います。Ubuntuのようにrootユーザーが直接使用できない場合には、sudoコマンドを使用します。

■バイナリパッケージを利用する

 それぞれのディストリビューションで用意されているパッケージ管理ツールを使って、インストールを実行します。

 Fedoraではyumコマンドを使って、オンラインインストールを実行することができます。syslog-ngを使用するには、ほかにも依存するパッケージが必要になりますが、yumコマンドならパッケージの依存性を自動で解決し、必要なパッケージ(今回はeventlog)の追加インストールを自動で行います。

 なおFedora9では、syslog-ngをインストールすると、標準インストールされるrsyslogと競合し、「Error: rsyslog conflicts with syslog-ng」というエラーが表示されます。この場合は競合するパッケージを先に削除しておく必要があります。rsyslogを削除する際は、パッケージとの依存性を無視する必要があるため、rpmコマンドで「--nodeps」オプションを使用します。

 削除に先立ち、設定ファイルsyslogd.confのコピーを保存します。これは後ほど、syslog-ngの設定で利用します。

# cp /etc/syslogd.conf /etc/syslogd.conf.org
syslogdの設定ファイルを再利用するため、事前にバックアップを作成
# rpm -e --nodeps rsyslog
syslog-ngと競合する場合には、競合するパッケージを削除
rsyslogの削除

# yum install syslog-ng ←syslog-ngのオンラインインストール
...省略...
Is this ok [y/N]: y   ←「y」をタイプ
...省略...
Running Transaction
Installing   : eventlog                               [1/2]
Installing   : syslog-ng                              [2/2]
...省略...
syslog-ngのオンラインインストール

 オンラインインストール後、設定ファイルを編集し、syslog-ngを自動起動するようにします。この後の手順は「syslog-ngの設定」へ続きます。

 Fedora以外にCentOSやRed Hatでもyumコマンドが使用できますが、2008年8月時点ではパッケージが提供されていないため、ソースからインストールする必要があります。またUbuntuやDebianではSynapticを、openSUSEではYaST2といったパッケージ管理ツールを使ってオンラインインストールを実行します。

画面1 UbuntuのSynaptic(デスクトップメニューの「システム→システム管理→Synaptic パッケージ・マネージャ」で起動)

■ソースからインストールする

 ソースファイルを使ってインストールする場合は、BalaBitのWebサイトから、syslog-ngのソースアーカイブとともにeventlogのソースをダウンロードし、同時にインストールする必要があります。

関連リンク:
参考 BalaBitのダウンロードURL
http://www.balabit.com/downloads/files/syslog-ng/sources/stable/src/

 eventlogとsyslog-ngをソースからインストールする手順は以降のとおりです。ここでは、インストール先をデフォルトの「/usr/local」から「/usr」に変更するため、configure実行時にオプションを指定しています。そのほかのオプションも「# configure --help」で確認し、適宜追加します。

(eventlogのダウンロードとインストール)
# wget http://www.balabit.com/downloads/files/syslog-ng/sources/stable/src/eventlog-0.2.7.tar.gz
# tar xvfz eventlog-0.2.7.tar.gz
# cd eventlog-0.2.7
# ./configure --prefix=/usr ←prefix=/usr:インストール先の指定
# make
# make install

(syslog-ngのダウンロードとインストール)
# wget http://www.balabit.com/downloads/files/syslog-ng/sources/stable/src/syslog-ng-2.0.9.tar.gz
# tar xvf syslog-ng-2.0.9.tar.gz
# cd syslog-ng-2.0.9
# ./configure --prefix=/usr --sbindir=/sbin \
> --sysconfdir=/etc/syslog-ng \
> --enable-tcp-wrapper \
> --enable-dynamic-linking

  --prefix=/usr:インストール先の指定
  --sbindir=/sbin:syslog-ng本体プログラムのインストール先を指定
  --sysconfdir=/etc/syslog-ng:設定ファイルのパスを指定
  --enable-tcp-wrapper:TCP_Wrapperによるアクセス制限を有効化
  --enable-dynamic-linking:動的リンクを使用

# make
# make install
/eventlog/syslog-ngのインストール

 なお、eventlog以外に、libnetやtcp_wrappers(およびtcp_wrappersのライブラリ、インクルードファイル)といったパッケージが必要な場合があります。その際は各ディストリビューションのインストールメディアやリポジトリから追加インストールしてください。

 次に、自動起動スクリプトや設定ファイルを用意します。主要なディストリビューションでは、ソースアーカイブに同梱されたファイルをそのまま使用できます。

 以下はFedoraでの作業例ですが、Red HatやopenSUSEでも、ソースディレクトリ中の「contrib/」に各ファイルを見つけることができます。そのほかのディストリビューションでは、これらのファイルを参考にして作成する必要があります。

 この後の手順は「syslog-ngの設定」へ続きます。

(自動起動スクリプトの用意)
# cp contrib/fedora-packaging/syslog-ng.init /etc/init.d/syslog-ng
# chmod +x /etc/init.d/syslog-ng

(設定ファイルの用意)
# mkdir /etc/syslog-ng
# cp contrib/fedora-packaging/syslog-ng.conf /etc/syslog-ng/
自動起動スクリプトと設定ファイルの用意

syslog-ngの設定(syslogdの設定ファイルを再利用)

 syslog-ng単体で新たに設定する方法は「syslog-ngの基本的な設定」で解説します。その前にここでは、syslogdで使用していた「syslogd.conf」を変換して利用する方法を紹介します。変換には「syslog2ng」スクリプトを使用します。

 syslog2ngスクリプトは、ソースからインストールした場合は、ソースディレクトリ中の「contrib/」に見つけることができます。バイナリパッケージを使った場合は「/usr/share/doc/syslog-ng-2.0.9」などにあります。

(既存ファイルがある場合は、事前にバックアップを作成しておく)
# mv /etc/syslog-ng/syslog-ng.conf /etc/syslog-ng/syslog-ng.conf.org

(syslog2ngスクリプトの実行:yumやrpmを使ってインストールした場合)

# awk -f /usr/share/doc/syslog-ng-2.0.9/syslog2ng /etc/syslogd.conf > /etc/syslog-ng/syslog-ng.conf

(syslog2ngスクリプトの実行:ソースアーカイブを使ってインストールした場合)
# awk -f /...syslog-ng-2.0.9のソース.../contrib/syslog2ng /etc/syslogd.conf > /etc/syslog-ng/syslog-ng.conf
syslog2ngを使ってsyslogdの設定ファイルを変換する

 変換されたsyslog-ng.confに対しては、syslog-ngを起動する前に必ず構文チェックを実施しておきましょう。

# syslog-ng -s
syslog-ng設定ファイルの構文チェック

■syslog-ngの起動、停止、再起動

 次に、syslog-ngを起動します。

 syslogdなどほかのデーモンを使用している場合には、デーモンを停止し、自動起動も解除する必要があります。CentOSなど、標準シスログデーモンとしてsyslogdを使用している場合の解除方法は、次のとおりです。

# /etc/init.d/syslog stop ←syslogの停止
# chkconfig --list syslog ←syslogdの自動起動解除
syslog    0:off   1:off   2:on   3:on   4:on   5:on   6:off
  ←ランレベル2、3、4、5で自動起動が登録されていることを確認
# chkconfig --level 2345 syslog off
  ←ランレベル2、3、4、5で自動起動解除
syslogdの停止、自動起動解除

 なお、Fedoraのようにrsyslogを使用しているディストリビューションでは、「/etc/init.d/syslog」の代わりに、「/etc/init.d/rsyslog」に対し、停止と自動起動解除を行います。UbuntuやDebianでは「サービスの設定」やsysv-rc-confコマンドなどを利用します。
  続いて、syslog-ngのインストールで用意した「/etc/init.d/syslog-ng」スクリプトを使って、syslog-ngを自動起動するように登録します。chkconfigコマンドを利用した自動起動の登録/解除は次のとおりです。先ほどと同様、UbuntuやDebianでは「サービスの設定」を利用します。

# chkconfig --add syslog-ng  ←自動起動登録
# chkconfig --list syslog-ng  ←設定確認
syslog-ng    0:off   1:off   2:on   3:on   4:on   5:on   6:off
  ←ランレベル2、3、4、5で「on」になっていない場合は「# chkconfig --level 2345 syslog-ng on」を実行
syslog-ngの自動起動設定

画面2
画面2 Ubuntuのサービスの設定(デスクトップメニューの「システム→システム管理→サービスの設定」で起動)

 手動でsyslog-ngデーモンの起動や停止、再起動を行う場合も「/etc/init.d/syslog-ng」スクリプトを利用します。設定を修正するたびに、再起動が必要になります。

# /etc/init.d/syslog-ng start  ←syslog-ngの起動
# /etc/init.d/syslog-ng stop   ←syslog-ngの停止
# /etc/init.d/syslog-ng restart ←syslog-ngの再起動
syslog-ngの起動、停止、再起動

■動作確認

 syslog-ngの動作を確認するためにloggerコマンドを使用します。loggerコマンドでシスログを意図的に発生させ、ログファイルにログが書き込まれていることを確認します。

# logger -p daemon.crit syslog-ng install ok
   ←「-p」でファシリティとプライオリティを指定
# tail /var/log/messages(または/var/log/syslog)
Aug 5 05:07:29 ○○ ○○: syslog-ng install ok
loggerコマンドを使ったsyslog-ngの動作確認

syslog-ngの基本的な設定

 syslog-ngの設定ファイル「syslog-ng.conf」は、syslogdの設定ファイルと記述方法が異なっており、互換性がありません。従って、そのまま流用するわけにはいきません。

 上記で、syslogd.confをsyslog-ng.confに変換するsyslog2ngスクリプトの使い方を紹介しましたが、syslog-ngの利点を生かした設定を行ったり、新たなロギングを追加したりするには、syslog-ngの記述方法を理解しておく必要があります。

■syslog-ng.confの基本構文

 syslogd.confでは設定の単位が「行」であるのに対し、syslog-ngでは図1のような「構文」を用います。

 source ○○{...}でログの受け取り方法を、filter ○○{...}で対象とするログの分別条件を、destination ○○{...}で出力方法を定義します。定義だけではロギングは行われません。定義された各条件をlog { source(○○); filter(○○); destination(○○); };のように組み立てることで、ロギングが機能します。

 なお、定義されたsource/filter/destinationは何度でも使用することができます。同一のsourceに対し異なるfilterを組み合わせ、多面的にシスログを収集するといった利用法も可能です。

 syslog-ngの動作にかかわる設定はoptions {...}で行います。

図1
図1 syslog-ng.confの基本構文(クリックすると拡大します)

■syslog-ng.confの簡単な例

 では、syslogdで使用していた設定をsyslog-ng.confに置き換える作業を通して、設定方法を解説しましょう。

 syslogdの設定ファイルsyslod.confの次の1行では、認証(authpriv)サービスにかかわるログを、「/var/log/secure」ファイルに出力するよう設定しています。ログの種別にはファシリティ(facility)とプライオリティ(priority)の組み合わせを用いています。「authpriv.info」ではファシリティが「authpriv」、プライオリティが「info」になります。スペースまたはタブに続けて、出力先「/var/log/secure」を指定します。

authpriv.info                               /var/log/secure
置き換える前の/etc/syslog.confのサンプル

 これをsyslog-ngの設定に書き換えます。まず「source」を使って、ログの取得元を指定します。Linuxではソケットファイル「/dev/log」を通してログを取得します(定義名「s1」)。

 次に「filter」でログの抽出条件を定義します。ファシリティ「authpriv」で、プライオリティ「info」〜「emerg」までのログを抽出するようにします(定義名「f1」)。

 続いて「destination」で出力先を定義します。出力先には「/var/log/secure」ファイルを指定します(定義名「d1」)。

 最後に「log」を使って、source/filter/destinationを組み立てます。

source s1 {
        unix-stream("/dev/log");
        internal();
};
←internal()はsyslog-ng内部で生成するメッセージを取得する際に指定

filter f1 {
        facility(authpriv) and level(info..emerg);
};

destination d1 {
        file("/var/log/secure");
};

log { source(s1); filter(f1); destination(d1); };
←s1/f1/d1といった定義名には、syslog-ng.conf内で重複しない限り、任意の文字列を使用できます
syslog-ng.confの設定に置き換えたもの

第3回 マクロやテンプレでsyslog-ngを使い倒す

 「syslog-ngの導入と設定」で紹介したsyslog-ngの導入方法に続き、今回はその活用方法を紹介します。

 syslog-ngでは、設定ファイルにマクロやテンプレートを使うことができます。マクロを使ってログのファイル名に日時を付加したり、テンプレートを使ってログの内容を自由に組み立てることができます。

 またフィルタを設定することで、特定のメッセージを検出することができます。外部プログラムと組み合わせてメールを自動的に送信したり、不正アクセスを制限することも可能です。今回はそうしたsyslog-ngの活用方法を解説します。

【注意】
以降はrootユーザーにて作業を行います。Ubuntuのようにrootユーザーが直接使用できない場合には、sudoコマンドを使用します。作業に当たって、第2回「syslog-ngの導入と設定」で紹介している基本的な設定方法を習得しておく必要があります。今回は設定ファイルの解説に終始しています。設定ファイルを有効にするための再起動の方法などは、第2回を参考にしてください。

マクロを用いてログファイルをローテーション

 syslog-ngでは設定ファイル「syslog-ng.conf」にマクロを用いることができます。マクロで指定された個所は、あらかじめ定義された規則に従って置換されます。

 例えばログファイル「/var/log/messages」の名前に日付を付加するには、次のように「$YEAR」「$MONTH」「$DAY」といったマクロを使います。

source s_1 {
    file ("/proc/kmsg" log_prefix("kernel: "));
    unix-stream ("/dev/log");
    internal();
};

filter f_1 {
        level(info..emerg) and
        not facility(mail,authpriv,cron);
};

#destination d_1 { file("/var/log/messages" ); };
#これを日付単位で出力した場合

destination d_1 { file("/var/log/messages_$YEAR$MONTH$DAY"); };

log { source(s_1); filter(f_1); destination(d_1); };
リスト1 ログファイル「/var/log/messages」の名前に日付を付加するsyslog-ng.confの設定例

 上のようなマクロを使った場合、「/var/log/messages_20080909」のようなログファイルが生成されます。これを使ってログファイルを日付ごとに整理できます。次の設定では、ディレクトリ名の指定に日付マクロを使用し、月ごとにディレクトリを作成し、さらにその中に日ごとにログファイルを作成しています。

 なお、ディレクトリを自動的に生成するには「create_dirs(yes)」オプションの指定が必要です。

destination d_1 {
        file("/var/log/$YEAR.$MONTH/messages_$DAY" create_dirs(yes));
};
※「/var/log/年.月」ディレクトリを作成し、その下に「messages_日」をファイル名としたログを生成します。
リスト2 ログファイルが出力されるディレクトリ名の指定に日付マクロを使用 したsyslog-ng.confの設定例(リスト1の「d_1」を書き換えたもの)

 ログを集中して管理するシスログサーバは、さまざまなネットワーク機器やサーバからのログを受け取ります。そのため、次のように「$HOST」を使って、機器ごとにログファイルを整理するようにすると便利です。その際「$PROGRAM」を使えば、ログを出力しているプログラム名を付加し、より見分けやすくできます。

destination d_1 {
        file("/var/log/$HOST/$YEAR-$MONTH/$PROGRAM-$DAY.log" create_dirs(yes));
};
※「/var/log/ホスト名」ディレクトリを作成し、その下に「年-月」でディレクトリを作成し、さらに「プログラム名-日.log」をファイル名にログを生成します。
リスト3 $HOSTを使って機器ごとにログファイルを整理するsyslog-ng.confの設定例

 以上のようにマクロを使用すれば、logrotateのようなプログラムを別途使用することなく、ログファイルのローテーションが可能になります。ただし、ログファイルを柔軟に生成することはできますが、例えば「7日前のファイルを削除する」といった世代管理はできません。

■syslog-ngで利用できるマクロ

 syslog-ngで使用できる主なマクロは表1のとおりです。

 マクロには「S_」で始まるものと「R_」で始まるものがあり(例:S_DATE,R_DATE)、デフォルトでは「S_」が使用されます。「S_」はログが生成されたとき、「R_」はログを受け取った日時を基に、日付を算出します。

 ローカルホストで生成されるログなら、「S_」も「R_」も日時に大きなズレは発生しませんが、リモートホストからのログを収集する場合、通信経路の混雑など何らかの理由で、ログの受け取りが遅れる場合があります。その場合には「S_」と「R_」を区別する必要があります。「R_」で始まるマクロをデフォルトで使用する場合は、syslog-ng.confのグローバルオプションに「use_time_recvd (yes)」を指定します。

options {
    sync (0);
    time_reopen (10);
    log_fifo_size (1000);
    ...省略...
    use_time_recvd (yes);
};
リスト4 syslog-ng.confのグローバルオプションに「use_time_recvd (yes)」と指定

 またマクロでは使用法によっては、悪意のあるログメッセージを送り込んで、意図しないファイルやディレクトリを生成することも可能となってしまいます。マクロを使用する際は、慎重に設定を行います。

マクロ 説明
$FACILITY ログのファシリティ
$PRIORITY ログのプライオリティ
$DATE ($R_DATE, $S_DATE) BSD-syslog形式の日付
(例:Sep 13 15:58:00)
$FULLDATE ($R_FULLDATE,$S_FULLDATE) $DATEに年を加えたもの
(例:2008 Sep 13 15:58:00)
$ISODATE ($R_ISODATE, $S_ISODATE) ISO8601の日付
(例:2008-09-13T15:58:00.123+01:00)
$STAMP ($R_STAMP, $S_STAMP) ts_format()オプションで指定された
形式の日付
$YEAR ($R_YEAR, $S_YEAR)
$MONTH ($R_MONTH, $S_MONTH)
$DAY ($R_DAY, $S_DAY)
$WEEKDAY ($R_WEEKDAY,$S_WEEKDAY) 曜日(例:Sun)
$WEEK ($R_WEEK, $S_WEEK) 年の第何週
$HOUR ($R_HOUR, $S_HOUR) 時間
$MIN ($R_MIN, $S_MIN)
$SEC ($R_SEC, $S_SEC)
$UNIXTIME ($R_UNIXTIME,$S_UNIXTIME) UNIXタイム(1970-01-01T00:00:00からの秒数)
$TZOFFSET ($R_TZOFFSET,$S_TZOFFSET) GMTとの時差(例:+09:00)
$TZ ($R_TZ,$S_TZ) $TZOFFSETと同等
$HOST ログを出力したホスト
$FULLHOST ログを出力したホスト(FQDN)
$HOST_FROM ログを転送したホスト
$FULLHOST_FROM ログを転送したホスト(FQDN)
$SOURCEIP ログを転送したホストのIPアドレス
$PROGRAM ログを出力したプログラム
$PID ログを出力したプログラムのPID
$MSG/$MESSAGE $PROGRAMや$PIDを含んだログメッセージ
$MSGONLY ログメッセージから$PROGRAMや$PIDを除いたもの
表1 syslog-ng.confで使用可能なマクロ
※本文のとおり、マクロには「S_」で始まるログが生成された日時に基づくものと、「R_」で始まるログを受け取った日時に基づくものがあります(例:S_DATE,R_DATE)。デフォルトでは「S_」が使用されます。


第3回 マクロやテンプレでsyslog-ngを使い倒す


テンプレートを使って、自由にログメッセージを組み立てる

 syslog-ngでは、ログメッセージを自由な書式に組み立てることができます。組み立てにはテンプレートを使用します。一例として、テンプレートを使って、リスト1のログ出力を変更したものをリスト5として挙げておきました。

 テンプレートを指定するには、「template 定義名 {...};」のような定義を使用します。定義の中では、先ほど紹介した表1のようなマクロを使用します。

 「destination」で出力方法を指定する際に、ファイルパスと一緒に、使用するテンプレートを指定します。

 リスト5とリスト6は同じ設定内容になります。わざわざ「template{...}」で定義することなく、リスト6のように直接「destination」でテンプレートを組み立てることもできます。なお「template_escape(no)」オプションは、エスケープ処理で問題が発生する場合のみ指定します。指定することで「'」「"」文字のエスケープ処理を無効化します。

#テンプレートの定義
template t_1 {
        template("$ISODATE $HOST $MSG\n"); template_escape(no);
};
#テンプレートの使用
destination d_1 {
        file("/var/log/messages" template(t_1));
};
リスト5 テンプレートを使ったsyslog-ng.confの設定例

destination d_1 {
        file("/var/log/messages"
        template("$ISODATE $HOST $MSG\n")
        template_escape(no));
};
リスト6 destinationの定義中でテンプレートを使ったsyslog-ng.confの設定例

フィルタの設定と外部プログラムの起動

 syslog-ngでは、ログメッセージに対しフィルタを使って、特定の文字列を検出することができます。例えば、sshdで出力されるリスト7のようなログに対し「Failed password」を検出する場合には、「filter定義名 {...};」を使ってリスト8のように設定します。

Aug 19 12:26:46 ○○ sshd[24215]: Failed password for invalid user ○○ from ○○ port 60599 ssh2
リスト7 sshdのパスワードエラー時のログ

source s_1 {
    file ("/proc/kmsg" log_prefix("kernel: "));
    unix-stream ("/dev/log");
    internal();
};

#sshdプログラムが生成するログで「Failed password」にマッチするものを検出するよう設定
filter f_1 { program("sshd") and match("Failed password"); };
リスト8 フィルタを使ったsyslog-ng.confの設定例

 さらに、設定したフィルタに合致するログが検出された場合に、特定のプログラムを起動することもできます。例えば、メール通知スクリプト「syslog2mail.pl」を起動するには、「destination」でリスト9のように設定します。

#syslog2mail.plのパスは適宜変更
destination d_1 { program("/..pathto../syslog2mail.pl"); };

log { source(s_1); filter(f_1); destination(d_1); };
リスト9 スクリプト「syslog2mail.pl」を起動するsyslog-ng.confの設定例

 「syslog2mail.pl」は今回のために用意した付録1のPerlスクリプトです。ログの内容をメールで通知することができます。

 syslog2mail.plは、先ほどのリスト7のようなログが発生した場合に、リスト10のようなメールを送信します。外部のSMTPサーバを利用しメールを送信します。その際、OB25P(注1)にも対応するよう、サブミッションポートに対しSMTP接続を行うことができます。詳細はsyslog2mail.pl内のコメントを参考にしてください。スクリプト作成後、実行権を設定します。

# chmod +x /..pathto../syslog2mail.pl

From:    from@example.jp
To:      to@example.jp
Subject: [Syslog-ng Alert]: sshd alert

Sep 10 01:10:01 ○○ sshd[XXX]: Failed password for invalid user ○○ from 189.XX.XX.XX port 45977 ssh2
リスト10 送信されるメールの内容

 なお、こうしたスクリプトでは起動時の引数として、マクロを指定する方法が考えられますが、program()内でマクロを用いることはできません。

 ここで紹介したメール送信以外にも、さまざまなプログラムを起動することができます。例えば、攻撃の痕跡とおぼしきログに対しフィルタを設定し、ログの検出回数が一定数を超えたらアクセス制限を即座に実施するといったことも可能です。そのためには、iptablesのようなコマンドやパケットフィルタとスクリプトを組み合わせて利用します。

注1 OB25P(Outbound Port 25 Blocking):スパム対策としてプロバイダが、自網内でTCP25番ポートを使用するサービスに対し、特定のサーバ以外と接続しないよう制限を実施したものです。メールサーバによってはサブミッションポート(TCP 587番ポート)でSMTP接続が可能な場合があります。

サンプルファイル1:
参考 syslog2mail.pl

【注意】
・syslog2mail.plの動作にはPerlが必要です。
・Net::SMTPモジュールも同時にインストールされている必要があります。
・それぞれの環境に合わせ、syslog2mail.pl内のメールアドレスやメールサーバなどの設定を修正し利用します。
・日本語に未対応です。メールの題名や本文に日本語を使用することができません。
・総当たり攻撃が来た場合は、メールを大量に配送します。そうしたセキュリティに対する考慮が十分ではありません。

データベースサーバにログメッセージを挿入する

 syslog-ngには、今回紹介している無償版以外に、有償版も用意されています。有償版では、MySQLやOracleのようなデータベースサーバにログを挿入することができます。しかし無償版でも「名前付きパイプ(注2)」経由で、データベースサーバにログを挿入することができます。

注2 名前付きパイプ:複数のプロセス間で、双方向にデータをやりとりするための共有メモリ領域です。ファイル同様に読み書きが可能です。

 MySQLサーバを例に、設定方法を解説します。名前付きパイプを利用するため、syslog-ngサーバ上でMySQLを稼働させる必要があります。MySQLのインストールや起動は「今から始めるMySQL入門」などを参考にしてください。

 MySQLが利用可能なことを確認し、リスト11の手順でデータベース・テーブルを作成し、権限を設定します。テーブルやフィールドの定義などは、用途によって適宜変更するようにします。

# yum install mysql mysql-server
(FedoraやCentOSなど、yumが使用できるディストリビューションでのMySQLのインストール)

# /etc/init.d/mysqld start
(MySQLの起動)

# mysqladmin create syslogng
(データベースの作成)

# mysql syslogng
mysql> CREATE TABLE `logs` (
    -> `host` varchar(32) default NULL,
    -> `facility` varchar(10) default NULL,
    -> `priority` varchar(10) default NULL,
    -> `level` varchar(10) default NULL,
    -> `tag` varchar(10) default NULL,
    -> `date_time` datetime NOT NULL,
    -> `program` varchar(32) default NULL,
    -> `msg` text,
    -> `seq` int(10) unsigned NOT NULL auto_increment,
    -> PRIMARY KEY (`seq`),
    -> KEY `host` (`host`),
    -> KEY `seq` (`seq`),
    -> KEY `program` (`program`),
    -> KEY `priority` (`priority`),
    -> KEY `facility` (`facility`)
    -> );
Query OK, 0 rows affected (0.05 sec)
(テーブルの作成)

mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON syslogng.* TO user@localhost IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)
(権限の設定)
リスト11 データベース側の準備

データベース: syslogng
テーブル: logs
ユーザー名: syslogng
パスワード: password
リスト12 データベースの設定内容

 syslog-ng.confに加える設定は、リスト13のとおりです。「template」とマクロを使って、MySQLに挿入するINSERTクエリを組み立てます。「destination」で名前付きパイプを出力先に指定するには、pipe()を用います。

source s_sys {
    file ("/proc/kmsg" log_prefix("kernel: "));
    unix-stream ("/dev/log");
    internal();
};

template t_sql {
    template("INSERT INTO logs (host, facility, priority, level, tag, date_time, program, msg)
            VALUES
            ('$HOST', '$FACILITY', '$PRIORITY', '$LEVEL','$TAG',
            '$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC', '$PROGRAM', '$MSG' );\n");
            template_escape(yes);
};

destination d_mysql {
            pipe("/var/log/mysql.pipe" template(t_sql));
};

log { source(s_sys); destination(d_mysql); };
リスト13 データベースサーバにログメッセージを挿入するsyslog-ng.confの設定例

 続いて、名前付きパイプをmkfifoコマンドで作成します。

># mkfifo /var/log/mysql.pipe

 名前付きパイプに出力されるINSERTクエリを拾い、クエリを実行するために、付録2のようなスクリプト「syslog2mysql.sh」を用意します。スクリプト中で使用しているコマンドパスなどは適宜変更してください。また、MySQLユーザーとパスワード、データベース名やテーブル名を変更している場合は、スクリプトを修正します。詳細はスクリプト中のコメントを参照してください。

 スクリプト準備後、次のようにスクリプトに実行権を与えます。今回、スクリプトは常駐プロセスとしてバックグラウンドで実行します。

# chmod +x /..pathto../syslog2mysql.sh
(実行権設定)

# /..pathto../syslog2mysql.sh &
(バックグラウンドで実行)

 作業終了後、syslog-ngを再起動し設定を有効にします。ログがMySQLに挿入されているかを次のようにして確認します。

# mysql --user=user --password=password syslogng
mysql> SELECT * FROM logs LIMIT 0,5; (先頭から5件だけ表示)
5 rows in set (0.00 sec)
+---------+----------+----------+---------+------+---------------------+-----------+---------------------
| host | facility | priority | level | tag | date_time | program | msg
+---------+----------+----------+---------+------+---------------------+-----------+---------------------
| Fedora9 | syslog | notice | notice | 2d | 2008-09-11 21:02:41 | syslog-ng | syslog-ng[3660]: sys
| Fedora9 | authpriv | info | info | 56 | 2008-09-11 21:04:24 | sshd | sshd[3674]: Invalid
| Fedora9 | authpriv | info | info | 56 | 2008-09-11 12:04:25 | sshd | sshd[3675]: input_us
| Fedora9 | authpriv | warning | warning | 54 | 2008-09-11 21:04:26 | sshd | sshd[3674]: pam_unix
| Fedora9 | authpriv | notice | notice | 55 | 2008-09-11 21:04:26 | sshd | sshd[3674]: pam_unix
+---------+----------+----------+---------+------+---------------------+-----------+---------------------
(END)

※表示が乱れる場合は、「mysql> PAGER less -S」でページャを使って表示を抑制できます。

サンプルファイル2:
参考 syslog2mysql.sh

第4回 rsyslogの導入

 前回までの2回にわたり「syslog-ng」のインストール方法と特徴を解説しました。syslog-ngはキャリアクラスの信頼性や豊富な機能を持ちますが、それと引き替えにsyslogdとの互換性を犠牲にしていました。一方、今回紹介する「rsyslog」は、syslog-ng同様、多くの機能と高い信頼性を実現しながら、syslogdの設定をそのまま使用することができます。

 今回から2回にわたり、次世代syslogデーモンのもう1つの候補「rsyslog」を取り上げます。まず今回は、rsyslogのインストール方法を解説します。

rsyslogの特徴

 「reliable(信頼できる)シスログデーモン」という名前が示すように、rsyslogは高い信頼性を実現することを目標に開発されています。そのために、シスログのTCP転送(syslogdは信頼性が低いUDP)やデータベースへのログ保存などの機能が実現されています。

 rsyslogの特徴、syslogdやsyslog-ngとの違いは、「第1回 syslogdの限界と次世代シスログデーモン」を参照してください。

 syslog-ngはopenSUSEに採用されていますが、一方rsyslogもFedoraで標準採用されているなど(標準採用されたのはFedora 8以降です)、一部では標準化が進んでいます。Fedora以外のディストリビューションでも、パッケージ管理ツールを使って容易にインストールすることができます。

 バイナリパッケージが用意されていないプラットフォームやカスタムインストールを実行する場合も、Linuxならば、ソースコードから手軽にインストールすることもできます。

注意:以降はrootユーザーにて作業を行います。Ubuntuのようにrootユーザーが直接使用できない場合には、sudoコマンドを使用します。

rsyslogのインストール

 ここでは、ソースからインストールする方法とバイナリパッケージを使ってインストールする方法の2つについて解説します。前述のように、Fedoraではバージョン8以降、rsyslogがインストールされているため、特に作業の必要はありません。それ以外のCentOSやUbuntuを例にインストール方法を紹介します。

 まず、CentOS5.2にrsyslogをソースからインストールする方法を解説します。その後、Ubuntuにバイナリパッケージを使ってインストールする方法を解説します。

ソースからのインストール

 CentOS 5.2を例に、ソースファイルを使ってインストールする方法を解説します。ここではCentOSを取り上げますが、Red Hat互換といわれるほかのディストリビューションなら同様の作業でインストール可能です。

・ダウンロードとインストール

 rsyslogの配布元(http://www.rsyslog.com/)からソースアーカイブをダウンロードします。

 ホームページ中央、「rsyslog 3.18.5 (v3-stable) released」リリース記事中の「Download:」の下に示されたURLをクリックし、次のページに進みます。次ページの「Download this file now!」をクリックすると、ダウンロードが始まります。「Main Menu」の「Downloads」からもダウンロード可能ですが、開発版(devel、beta)もリストアップされるため、今回使用する安定版(stable)を探し当てるのに手間取るかもしれません。

 ソースアーカイブを展開し、configure、makeを実行してインストールを行います。ここではインストール先はデフォルトの「/usr/local」を使用しています。変更するにはconfigure実行時に「--prefix=/」という形でオプションを追加します。そのほかのオプションは「# configure --help」で確認し、適宜追加します。

# wget http://www.rsyslog.com/Downloads-req-getit-lid-133.phtml
# tar xvfz rsyslog-3.18.5.tar.gz
# cd rsyslog-3.18.5
# ./configure
# make
# make install
リスト1 rsyslogのインストール

 以上の操作で、次のようにファイルが配置されます。

/usr/local
|-- sbin
|  `-- rsylog       ←プログラム本体
|-- lib
|  `-- rsyslog       ←ライブラリ
`-- share
  |-- info
  `-- man
    |-- man5
    |  `-- rsyslog.conf.5 ←confファイルのためのマニュアル
    `--- man8
       `-- rsyslogd.8   ←rsyslogのマニュアル
ファイルの配置先(/usr/localにインストールした場合)

・設定ファイルの準備

 次に、自動起動スクリプトや設定ファイルを用意します。Red Hat互換ディストリビューションでは、ソースアーカイブに同梱されたファイルを使用することができます。以下はCentOSでの作業例ですが、Red Hatでも同様の作業が可能です。

 Red Hat互換ディストリビューション向けの自動起動スクリプトや設定ファイルは、ソースディレクトリ中のredhatに納められています。ディレクトリを移動し、作業を行います。

 初めに設定ファイル「rsyslog.conf」を/etcにコピーします。次に、自動起動スクリプト「rsyslog.init」に修正を加えた後、/etc/init.dにコピーします。ログファイルのローテションを定期的に実施するlogrotateのための設定ファイルも用意されているため、併せて作業します。作業内容は次のとおりです。

(rsyslogdのソースディレクトリで作業します)

# cd redhat/
# cp rsyslog.conf /etc/          ←設定ファイルのコピー
# cp rsyslog.sysconfig /etc/sysconfig/rsyslog
     ←設定ファイル(rsyslogdの起動オプション)のコピー
# cp rsyslog.log /etc/logrotate.d/rsyslog ←ログファイルをローテションする

logrotateのための設定ファイルのコピー

# vi rsyslog.init
     ←起動スクリプトの修正

(「自動起動スクリプトの修正」を参考に)
# chmod +x rsyslog.init          ←実行権の設定
# cp rsyslog.init /etc/init.d/rsyslog
     ←自動起動スクリプトのコピー
リスト2 自動起動スクリプトと設定ファイルの用意

25行目 rsyslogdのパスを変更
前) [ -x /sbin/rsyslogd ] || exit 5
後) [ -x /usr/local/sbin/rsyslogd ] || exit 5

26行目 rklogdを使用しないためコメントアウト
前) [ -x /sbin/rklogd ] || exit 5
後)# [ -x /sbin/rklogd ] || exit 5

39行目 rsyslogdのパスを変更
前) daemon rsyslogd $SYSLOGD_OPTIONS
後) daemon /usr/local/sbin/rsyslogd $SYSLOGD_OPTIONS

42・43行目 rklogdを使用しないためコメントアウト
前) echo -n $"Starting kernel logger (rklogd): "
daemon rklogd $KLOGD_OPTIONS

後)# echo -n $"Starting kernel logger (rklogd): "
# daemon rklogd $KLOGD_OPTIONS

49〜51行目 rklogdを使用しないためコメントアウト
前) echo -n $"Shutting down kernel logger (rklogd): "
killproc rklogd
echo

後)# echo -n $"Shutting down kernel logger (rklogd): "
# killproc rklogd
# echo

61行目 rklogdを使用しないためコメントアウト
前) status rklogd
後)# status rklogd
リスト3 自動起動スクリプトの修正内容


導入に必要な設定

・syslogdの停止

 rsyslogを標準syslogデーモンとして利用するため、syslogdを停止します。またsyslogdが自動起動しないよう、停止処理を行います。

 自動起動の解除にはchkconfigコマンドを使用していますが、ntsysvやサービス設定ツールを使っても同じように自動起動解除ができます。サービス設定ツールは「デスクトップメニュー→システム→管理→サーバ設定→サービス」で実行できます。

# /etc/init.d/syslog stop       ←syslogdの停止
# chkconfig --level 123456 syslog off ←syslogdの自動起動解除
# chkconfig --list syslog       ←確認
syslog 0:off 1:off 2:off 3:off 4:off 5:off 6:off
                  ←すべて「off」になっています
リスト4 syslogdの停止、自動起動の解除

 ログファイルを定期的にローテションするのにlogrotateを使用している場合、ログファイルを置き換えた後に、syslogdの再起動が行われます。誤動作しないよう設定ファイルを削除(または任意のディレクトリに待避)します。なおrsyslog用のlogrotate設定ファイルは先ほどの作業でインストールされています。

# cd /etc/logrotate.d/
# mv syslog /..backup../syslog.log
   ←syslogd用のlogrotate設定ファイルの待避(または削除します)
リスト5 syslogdの停止、自動起動の解除

・rsyslogの起動、動作確認、自動起動の登録

 rsyslogを起動します。設定はデフォルトのまま使用することにします。起動には先ほどインストールした/etc/init.d/rsyslogを利用します。起動後、動作を確認します。確認作業ではloggerコマンドでシスログを発生させ、/var/log/messagesにログが出力されていることを確認します。

# /etc/init.d/rsyslog start
# /etc/init.d/rsyslog status
rsyslogd (pid 14609) を実行中...
リスト6 rsyslogの起動

# logger -p daemon.crit syslog-ng install ok
(「-p」でファシリティとプライオリティを指定しています)

# tail /var/log/messages
Oct 10 05:07:29 △△ ○○: syslog-ng install ok
   ←loggerコマンドで入力したメッセージがそのまま出力されています
リスト7 loggerコマンドを使ったrsyslogの動作確認

 rsyslogを停止させる場合も/etc/init.d/rsyslogを利用します。

# /etc/init.d/rsyslog stop
リスト8 rsyslogの停止

 問題なく動作していることが確認できた後、自動起動の登録を行います。これによりサーバ起動時に自動でrsyslogも起動します。

 自動起動の登録にはchkconfigコマンドを使用していますが、ntsysvやサービス設定ツールを使っても同じように自動起動登録ができます。サービス設定ツールは「デスクトップメニュー→システム→管理→サーバ設定→サービス」で実行できます。

# chkconfig --add rsyslog      ←自動起動登録
# chkconfig --list rsyslog      ←確認
rsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off
                    ←2〜5で「on」になっています
リスト9 ryslogの自動起動登録

バイナリパッケージを利用したインストール

 rsyslogは多くのディストリビューションに対応しており、各ディストリビューションに用意されているパッケージ管理ツールを使ってインストールできます。

 Fedoraではrsyslogが標準採用されているため、作業の必要はありません。CentOSでもyumコマンドを使って、オンラインインストールを実行できます。ただし、パッケージとして用意されているrsyslogのバージョンが古いため、最新のものを利用するには、先に紹介したようにソースファイルからインストールする必要があります。

 ではUbuntuを例に、バイナリパッケージを利用して導入する方法を解説します。UbuntuではSynapticを使って、すべての処理を自動的に行うことができます。

 デスクトップメニューの「システム→システム管理→Synaptic パッケージ・マネージャ」でSynapticを起動し、「rsyslog」をキーワードに検索を実行します。表示されたパッケージを右クリックし「インストール指定」を選択します。そして上部メニューから「適用」をクリックし、インストールを完了します。

 このインストール処理では、競合するパッケージ(klogdやsysklogd)の削除、デーモンの起動と自動起動の登録までが一括して行われます。

画面3
画面3 UbuntuのSynaptic(デスクトップメニューの「システム→システム管理→Synaptic パッケージ・マネージャ」で起動、クリックすると拡大します)

画面2
画面2 競合するパッケージの削除(パッケージの競合が自動で解決されます)

 rsyslogの動作を確認するために、loggerコマンドを使用します。loggerコマンドの使用法は、「ソースからインストールする」で紹介した方法と同様ですが、Ubuntuでは/var/log/syslogにテスト内容が出力されます。

# logger -p daemon.crit syslog-ng install ok
(「-p」でファシリティとプライオリティを指定しています)

# tail /var/log/syslog
Oct 15 05:21:31 △△ ○○: syslog-ng install ok
   ←loggerコマンドで入力したメッセージがそのまま出力されています
リスト10 loggerコマンドを使ったrsyslogの動作確認

 Ubuntuのほか、DebianでもSynapticを利用できます。またopenSUSEでは、YaST2といったパッケージ管理ツールを使ってrsyslogをオンラインインストールします。

 rsyslogで使用する設定ファイルはsyslogdのものと互換性があり、syslogdの設定方法(第1回 syslogdの限界と次世代シスログデーモン 参照)がそのまま使用できます。

第5回 マクロとテンプレートによるrsyslog活用法

「第4回 rsyslogの導入」で解説したrsyslogの導入方法に続き、活用方法を紹介します。

 rsyslogでは設定ファイルにマクロテンプレートを適用することができます。ログの内容を自由に組み立てたり、ファイル名に日時やホスト名を付加することが可能です。また拡張モジュールを追加することで、ログをメールで送信したりデータベースに格納することができます。今回はそうしたrsyslogの活用方法を解説します。

注意:以降はrootユーザーにて作業を行います。Ubuntuのようにrootユーザーが直接使用できない場合には、sudoコマンドを使用します。rsyslogのインストール方法や基本的な設定方法は、「第4回 rsyslogの導入」を参考にしてください。

rsyslogをバージョン3互換モードで動作させる

 「第4回 rsyslogの導入」では、rsyslogのインストール方法を解説しました。前半の「ソースからのインストール」で使用した設定ファイルは、rsyslogの旧バージョンのものを利用しています。そのため起動時に次のようなログが/var/log/messagesに出力されます。

...rsyslogd: WARNING: rsyslogd is running in compatibility mode. Automatically generated config directives may interfer with your rsyslog.conf settings. We suggest upgrading your config and adding -c3 as the first rsyslogd opt
ion.
...rsyslogd: Warning: backward compatibility layer added to following directive to rsyslog.conf: ModLoad imuxsock
リスト1 旧バージョンの設定ファイルを使用しrsyslogを起動した際のログ

 メッセージに従い、バージョン3互換モードで起動するには、rsyslogdの起動オプションに「-c3」を指定します。前回の解説に従ってインストールしている場合、オプションを付加するには、「/etc/sysconfig/rsyslog」に次の1行を追加します。

SYSLOGD_OPTIONS="-c3"
リスト2 rsyslogをバージョン3互換モードで起動させるための/etc/sysconfig/rsyslogの記述例

 また、rsyslogをバージョン3互換モードで動作させた場合、UNIXソケット(注1)からログを受け取れるように、rsyslog.confに次のような行が必要になります。ほかにも、カーネルログを受け取るための追加設定も必要です。詳細は、後に「拡張モジュールの利用」で解説します。

$ModLoad imuxsock
リスト3 UNIXソケットからログを受け取るための/etc/rsyslog.confの記述例

注1:ソケットファイルはUNIX系OSのプロセス間通信で使用されるファイルです。ソケットファイルを使用することで、サーバ/クライアント間のプロセス間通信を、ファイルを通じて行うことができます。UNIXドメインソケットファイルと呼ばれる場合もあります。

 なお、前回の後半で解説したUbuntuの場合、すでにバージョン3互換モードでrsyslogを起動しており、「$ModLoad imuxsock」のような設定も行われているため、ここで説明した修正は不要です。

テンプレートとマクロの活用

 rsyslogは、日付/ホスト名/ログメッセージ/ファシリティ/プライオリティといった項目に対しマクロが定義されており、設定ファイルの中でマクロを使って、ログの内容を組み立てることができます。またログの内容以外に、出力先ディレクトリ名やファイル名にもマクロを使うことができ、日付ごとにファイルを管理するといったことも可能です。

■テンプレートとマクロでログをカスタマイズする

 ログをカスタマイズするにはテンプレートを使用します。

 テンプレートを定義する際には、マクロを使ってさまざまな情報を盛り込みます。テンプレートは「/etc/rsyslog.conf」で「$template」を使って定義します。

 次の例では、「ログが作成された日付,ログメッセージ」といった内容でテンプレート「mytemplate」を定義しています。なお、ログを1行ずつファイルに書き出すには、末尾に「\n(改行)」を付けるようにします。リスト4ではファシリティ「local7」のログを「/var/log/custom.log」に出力する際に、mytemplateを適用しています。

$template mytemplate,"%timegenerated%,%msg%\n"
local7.* /var/log/custom.log;mytemplate
リスト4 テンプレートとマクロを使用したrsyslog.confの記述例1

 テンプレートの定義には、マクロ以外に、定型メッセージを埋め込むこともできます。

$template mytemplate,"日時:%timegenerated% 内容:%msg%\n"
mail.* /var/log/custom.log;mytemplate
リスト5 テンプレートとマクロを使用したrsyslog.confの記述例2

 利用可能な主なマクロには、表1のようなものがあります。「%マクロ名%」のように、前後に「%」を付けて使用します。

 バージョン3.17.0より新しいrsyslogでは「%MSG%」のような大文字でも、「%msg%」のような小文字でも同じように利用できます。なお、表1に挙げたもの以外に使用可能なマクロは、ソースアーカイブに付属するドキュメント「property_replacer.html」やrsyslog配布元の「The Property Replacer」を参考にしてください。

ファシリティ 用途
msg ログメッセージ
hostname ログを出力したホストの名前
fromhost ログを受け取ったホストの名前
programname プログラム名
syslogfacility ファシリティ(数字)
syslogfacility-text ファシリティ(テキスト)
syslogseverity プライオリティ(数字)
syslogseverity-text プライオリティ(テキスト)
syslogpriority syslogseverityと同等
syslogpriority-text syslogseverity-textと同等
timegenerated ログを受け取った日時
timereported ログが出力された日時
timestamp timereportedと同等
$now 現在時刻(書式:YYYY-MM-DD)
$year 現在の年(4けた)
$month 現在の月(2けた)
$day 現在の日(2けた)
$hour 現在の時(24時間表記、2けた)
$minute 現在の分(2けた)
表1 rsyslog.confで使用可能な主なマクロ

 テンプレートの中には、rsyslogで事前に定義されているものがあります。定義済みのテンプレートは「RSYSLOG_FileFormat」や「RSYSLOG_DebugFormat」のように、接頭文字に「RSYSLOG_」が使用されています。そこで、独自に定義する際には、予約語の「RSYSLOG_」を使用しないように注意してください。使用可能な定義済みテンプレートの詳細は、付属ドキュメント「rsyslog_conf.html」やrsyslog配布元の「Templates」を参照してください。

テンプレートでログファイルを日付ごとに管理

 rsyslogでは、ログのファイル名や保存先ディレクトリの指定に、日付やホスト名といったマクロを用いることができます。そうすることで、別途「logrotate」のようなツールを組み合わせなくても、ログファイルを日付ごとに整理できます。

 次の例では「/var/log/messages_20081110」のようなログファイルが日次で生成されます。さらに、テンプレートに従って動的にファイルを生成するには、ログ出力先の指定で「?テンプレート名」のように「?」を付加します。

$template DynamicFileName1,"/var/log/messages_%$year%%$month%%$day%"
*.* ?DynamicFileName1(※注2
リスト6 ログファイルの名前に日付を付加するためのrsyslog.confの記述例

注2:本稿ではrsyslog.confの設定で、ログをより分けるために頻繁に「*.*」を指定しています。「*.*」は全ファシリティの全プライオリティのログが対象になります。特定のファシリティ、例えばauthprivファシリティに関するログだけを対象にするには、「authpriv.*」のような指定を用います。詳細は第1回を参考にしてください。

 次の設定では、ディレクトリ名を指定するのに日付マクロを使用しています。年月日ごとにディレクトリを作成し、その中にログファイルを作成する仕組みです。

$template DynamicFileName2,"/var/log/syslog/%$year%/%$month%/%day%/message.log"
*.* ?DynamicFileName2
リスト7 日付ごとに整理されたディレクトリにログファイルを保存するためのrsyslog.confの記述例

 ログを集中して管理するサーバでは、さまざまなネットワーク機器やリモートホストからのログを受け取ることになります。そのようなサーバでは、次のように「%hostname%」を使って、機器ごとにログファイルを整理するようにすると便利です。その際「%programname%」を使えば、機器名だけでなく、ログを出力しているプログラム名を付加することができます。使用可能なマクロは、前述の表1のとおりです。

$template DynamicFileName3,"/var/log/syslog/%hostname%/%$year%/%$month%/%day%/%programname%.log"
*.* ?DynamicFileName3

(「/var/log/syslog/ホスト名/年/月/日」でディレクトリを作成し、
「プログラム名-日.log」をファイル名に持ったログを生成します)
リスト8 ホストや日付ごとに整理されたディレクトリにログファイルを保存するためのrsyslog.confの記述例

 このようにテンプレートを活用すれば、日付やホスト名に基づいてログファイルを整理できます。しかし、7日前のログファイルを順次削除するような世代管理や、古いファイルの圧縮保存といった処理までは、rsyslog単体ではできません。そうしたアーカイブ管理まで実行するには、logrotateのようなツールを使用する必要があります。

拡張モジュールの利用

 rsyslogはモジュールの追加によっても機能を拡張できます。外部プログラムに頼ることなく、バリエーションに富んだ出力方法や入力方法を備えています。

■モジュールの追加方法(カーネルログの取り込み)

 モジュールを追加するには、設定ファイルのrsyslof.confで「$ModLoad」に続けてモジュール名を指定します。例えばカーネルログを取り込むには、次のようにモジュール「imklog」を有効にします。

$ModLoad imklog
リスト9 カーネルログを取り込むためのrsyslog.confの記述例

 ローカルホストから排出されるログは、通常、UNIXソケットを通して受け取ります。rsyslogでUNIXソケットからログを受け取るには、imuxsockモジュールが必要ですが、バージョン2互換モード(注3)でrsyslogを起動している場合、特に設定を加えることなくデフォルトで使用することができます。リモートホストのログをUDPで受け付けるにはimudpモジュールを、TCPで受け付けるにはimtcpモジュールを使用します。

注3:rsyslogをバージョン3互換モードで動作させた場合、imuxsockモジュールは有効になりません。「$ModLoad imuxsock」とrsyslog.confに記述し、imuxsockモジュールを有効にする必要があります。rsyslogのバージョン3互換モードについては、冒頭の「rsyslogをバージョン3互換モードで動作させる」を参照してください。

 このように入力系モジュールには、接頭文字として「im……」が使用されています。なおリモートサーバにログを送信する方法や、リモートクライアントからログを受け取る方法については、次回、解説を加えます。

#UDPを使用する場合
$ModLoad imudp
$UDPServerRun 514 #ポート番号の指定

#TCPを利用する場合
$ModLoad imtcp
$InputTCPServerRun 514 #ポート番号の指定
リスト10 リモートホストのログを取り込むためのrsyslog.confの記述例

 出力系モジュールには、メールでログを送信するための「ommail」や、MySQLサーバにログを格納するための「ommysql」のようなモジュールがあり、接頭文字に「om……」が使用されています。

 モジュールのいくつかはデフォルトで使用できますが、ommailやommysqlはrsyslogインストール時にビルドしておく必要があります。モジュールをビルドするには、configure実行時に、次のようなオプションを追加します。

 なおommysqlモジュールをビルドする場合、MySQLのクライアントライブラリやヘッダファイルが必要になります。

 例えばCentOSやFedoraでMySQLのクライアントライブラリやヘッダファイルをインストールするには、yumコマンドを使って、「# yum install mysql mysql-devel」のようにオンラインでインストールを実行します。ちなみにMySQLのインストール方法は、「今から始める MySQL入門」などが参考になります。

# ./configure --enable-mysql --enable-mail
--enable-mysql:ログをメールで送信するためのモジュールをビルドします。
--enable-mail:ログをMySQLサーバに格納するためのモジュールをビルドします
(configure以外のrsyslogのインストール方法は、第4回を参照)
リスト11 rsyslogインストール時に拡張モジュールを有効にする

 ディストリビューションのパッケージを使ってrsyslogをインストールした場合は、インストール時点ですでに多くの拡張モジュールが付属しています。ビルドされた拡張モジュールの保存先は、第4回に記したとおりです。

# ls /usr/local/lib/rsyslog/
imklog.la imtcp.la imuxsock.la lmregexp.la lmtcpsrv.la omtesting.la
imklog.so imtcp.so imuxsock.so lmregexp.so lmtcpsrv.so omtesting.so
immark.la imudp.la lmnet.la lmtcpclt.la ommysql.la
immark.so imudp.so lmnet.so lmtcpclt.so ommysql.so

(rsyslogをソースファイルを使ってインストールした場合、デフォルトでは/usr/local/lib/rsyslog/にビルド済みモジュールを見つけることができます)
リスト12 rsyslogのビルド済みモジュール一覧

 モジュールはビルドしただけでは使用できません。rsyslog.confで「$ModLoad」を使って組み込む必要があります。

 最終回となる次回は、こうした機能活用の具体例として、「ommailモジュールを使ってメールでログを送信する方法」と「ommysqlモジュールを使ってMySQLサーバにログを格納する方法」を解説します。