新世代syslogデーモン徹底活用
UNIX系OSのシステムロギングをおよそ20年の長きにわたって支えてきた「syslogd」にも、限界が見えつつあります。その限界を打ち破る機能を備えた新しいシスログデーモンを紹介します。 |
シスログデーモン「syslogd」は、UNIX系OSのシステムロギングをおよそ20年の長きにわたり支えてきました。しかし、増大する信頼性や安全性への要求、ログの適正保管といった要望に応えるには、syslogdでは力不足との声が高まっています。
そんな折、システムロギングをより確実に行い、RDBMSへのデータ保存や監視システムの連携といった可用性にも優れた、「syslog-ng」や「rsyslog」が注目を集めています。この連載では、こうした次世代シスログデーモンを取り上げ、導入方法や活用方法を解説します。
実行したイベントの履歴、システム不調や変更の記録、不正アクセスの痕跡など、シスログの用途は多義にわたります。またUNIX系OSに限らず、ほかのOSやネットワーク機器にも利用されており、システム管理全般においてシスログは欠かすことができません。
![]() |
syslogサーバの活用 |
■syslogdの利点
syslogdが、シスログデーモンのデファクトスタンダードとして20年近くにわたって利用されているのには、主に次のような利点が挙げられます。
また、設定がシンプルで、デフォルトのままでもsyslogdサーバとして十分機能することも、広く利用される原因となっています。syslogdの設定は、下のような「/etc/syslog.conf」で行います。
|
|
/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レベルのログも同時に出力されます。
|
||||||||||||||||||||||||||||
表1 ファシリティ(facility)一覧 |
|
||||||||||||||||||
表2 プライオリティ(priority)一覧 |
主要なプロセスやデーモンについては、あらかじめ表1のようにファシリティが指定されていますが、表にないサービスやプロセスでも、ログを受け取る側と出力する側でファシリティを合わせることで、シスログの取得が可能です。
例えば、sshdサービスでは設定ファイル「/etc/ssh/sshd_config」で、次のようにファシリティ「authpriv」が指定されており、ログを/var/log/secureファイルに出力することができます。
|
|
/etc/ssh/sshd_configでsshdのログ出力方法を設定する |
UNIX系OSでは、syslogdがデフォルトインストールされていることに加え、ファシリティとプライオリティの組み合わせで出力を制御できる手軽さが相まって、シスログが広く利用され、そのデーモンにsyslogdがデファクトスタンダードとして普及しています。
しかし、これほど広範囲に利用されているにもかかわらず、シスログがRFC3164(http://www.ietf.org/rfc/rfc3164.txt)として標準化されたのは2001年と比較的最近のことです。その間もsyslogdは使い続けられ、キャリアクラスの用途でない限り、見直されることはありませんでした。
ところが最近になり、日本版SOX法に代表される内部監査の一環として、内外の通信記録、メールの送受信記録、ログイン記録など、シスログの用途が広がりを見せています。従来シスログは、障害の検知やその原因調査など、何かトラブルがあったときの備えとしての役割が主なものでした。ところが内部監査では、正常時の状態を確実に収集する必要があり、信頼性についても強い要望が上がっています。内部監査を実施するほどの規模でなくとも、単一ファイルに書き出すだけのログの在り方に、不満を持っているユーザーは少なくありません。
syslogdの問題点は主に次のとおりです。
■シスログを細かく分別できない
シスログの分別は、ファシリティとプライオリティに基づいているため、組み合わせに限りがあります。シスログを生成したプログラムごとに出力先を分けたり、特定の文字列に一致したシスログだけ出力先を分ける、といったことができません。
■シスログファイルのローテーションを行うことができない
シスログファイルを容量や日付で分割することができないため、別途logrotateのようなソフトウェアを導入し、ログファイルを整理する必要があります。
■ディスクI/Oを制御できない
シスログを一元管理するような大規模運用では、書き込みタイミングを調整するなどディスクI/Oの制御が重要になりますが、syslogdにはI/Oに掛かる負荷を抑える手段がありません。
■シスログを自動的に監査できない
syslogdだけでは、シスログの中に特定のメッセージを見つけた場合に自動的に処理を行うような設定ができません。別途、logwatchやswatchのようなソフトを導入する必要があります。
■シスログが正常に取得されているか監視できない
ログの取りこぼしがないか監視することができません。
■シスログに出力される日付情報が貧弱
TIMESTAMPを定期的に挿入することはできますが、日付フォーマットは「Mmm dd hh:mm:ss」以外に変更できません。
■シスログをネットワーク経由で転送する際UDPを使用する
一般的に信頼性を必要とする通信にはTCPを用いますが、syslogdではUDPを用います。そのため帯域が限られたネットワークでの使用や、サーバの負荷が高い場合に、パケットの取りこぼしが発生します。UDPではパケットは再送されず、シスログの取りこぼしを引き起こします。
■シスログを受ける側がダウンした場合、シスログが消失する
シスログを受け取る側が停止している間、出力側でバッファリングし、受け取る側が復旧した後でまとめてシスログを転送するといったことができません。
■シスログを出力する側・受け取る側で認証手段が提供されていない
IPアドレスによる接続制限は可能ですが、転送先や転送元の信ぴょう性を確認するような認証方法が提供されていません。クライアントになりすまし、大量のシスログを送り付けられるなどの危険性があります。
■送信データを暗号化できない
syslogdにはシスログを暗号化し、転送する手段がありません。別途SSLラッパーを導入する必要があります。
syslogdの問題点を克服したシスログデーモンは、特定機器のために用意された有償製品も含めれば数多くありますが、ここではオープンソースソフトウェアで、Linuxディストリビューションでも標準採用されている「syslog-ng」と「rsyslog」を紹介します。
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を最適化できます。
reliable(信頼できる)シスログデーモンを目指して名付けられた「rsyslog」は、名前の由来となっている信頼性とともに、豊富な機能も特徴としています。TCPを使ったシスログの配送や、MySQLをはじめとするデータベースとの連携など、2004年の開発開始以来、syslogdに求められた機能を積極的に取り込んでいます。
Fedoraではバージョン8以降、rsyslogを標準のシスログデーモンとして採用しています。主な特徴は次のとおりです。
■rsyslogの主な特徴
やはり、信頼性確保のための機能が目を引きます。RFC3195はシスログ転送方式の信頼性を高めた、新しい転送方法を定めたものです。対応する機器は多くありませんが、今後の普及が期待されています。
rsyslogはいち早くRFC3195のサポートをうたっています。syslogdでもsyslog-ngでも、データベースへのシスログの保存は、パイプ処理を使って外部プログラムを呼び出すことで実現しています。さらにrsyslogは、その仕組みの中にMySQLやPostgreSQLとの連携機能を有しているため、大規模な運用でも効率よくシスログをデータベースに保存することができます。
|
|
rsyslogの削除 |
|
|
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/syslog-ngのインストール |
なお、eventlog以外に、libnetやtcp_wrappers(およびtcp_wrappersのライブラリ、インクルードファイル)といったパッケージが必要な場合があります。その際は各ディストリビューションのインストールメディアやリポジトリから追加インストールしてください。
次に、自動起動スクリプトや設定ファイルを用意します。主要なディストリビューションでは、ソースアーカイブに同梱されたファイルをそのまま使用できます。
以下はFedoraでの作業例ですが、Red HatやopenSUSEでも、ソースディレクトリ中の「contrib/」に各ファイルを見つけることができます。そのほかのディストリビューションでは、これらのファイルを参考にして作成する必要があります。
この後の手順は「syslog-ngの設定」へ続きます。
|
|
自動起動スクリプトと設定ファイルの用意 |
syslog-ng単体で新たに設定する方法は「syslog-ngの基本的な設定」で解説します。その前にここでは、syslogdで使用していた「syslogd.conf」を変換して利用する方法を紹介します。変換には「syslog2ng」スクリプトを使用します。
syslog2ngスクリプトは、ソースからインストールした場合は、ソースディレクトリ中の「contrib/」に見つけることができます。バイナリパッケージを使った場合は「/usr/share/doc/syslog-ng-2.0.9」などにあります。
|
|
syslog2ngを使ってsyslogdの設定ファイルを変換する |
変換されたsyslog-ng.confに対しては、syslog-ngを起動する前に必ず構文チェックを実施しておきましょう。
|
|
syslog-ng設定ファイルの構文チェック |
■syslog-ngの起動、停止、再起動
次に、syslog-ngを起動します。
syslogdなどほかのデーモンを使用している場合には、デーモンを停止し、自動起動も解除する必要があります。CentOSなど、標準シスログデーモンとしてsyslogdを使用している場合の解除方法は、次のとおりです。
|
|
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では「サービスの設定」を利用します。
|
|
syslog-ngの自動起動設定 |
![]() |
画面2 Ubuntuのサービスの設定(デスクトップメニューの「システム→システム管理→サービスの設定」で起動) |
手動でsyslog-ngデーモンの起動や停止、再起動を行う場合も「/etc/init.d/syslog-ng」スクリプトを利用します。設定を修正するたびに、再起動が必要になります。
|
|
syslog-ngの起動、停止、再起動 |
■動作確認
syslog-ngの動作を確認するためにloggerコマンドを使用します。loggerコマンドでシスログを意図的に発生させ、ログファイルにログが書き込まれていることを確認します。
|
|
loggerコマンドを使った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 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」を指定します。
|
|
置き換える前の/etc/syslog.confのサンプル |
これをsyslog-ngの設定に書き換えます。まず「source」を使って、ログの取得元を指定します。Linuxではソケットファイル「/dev/log」を通してログを取得します(定義名「s1」)。
次に「filter」でログの抽出条件を定義します。ファシリティ「authpriv」で、プライオリティ「info」〜「emerg」までのログを抽出するようにします(定義名「f1」)。
続いて「destination」で出力先を定義します。出力先には「/var/log/secure」ファイルを指定します(定義名「d1」)。
最後に「log」を使って、source/filter/destinationを組み立てます。
|
|
syslog-ng.confの設定に置き換えたもの |
【注意】 以降はrootユーザーにて作業を行います。Ubuntuのようにrootユーザーが直接使用できない場合には、sudoコマンドを使用します。作業に当たって、第2回「syslog-ngの導入と設定」で紹介している基本的な設定方法を習得しておく必要があります。今回は設定ファイルの解説に終始しています。設定ファイルを有効にするための再起動の方法などは、第2回を参考にしてください。 |
syslog-ngでは設定ファイル「syslog-ng.conf」にマクロを用いることができます。マクロで指定された個所は、あらかじめ定義された規則に従って置換されます。
例えばログファイル「/var/log/messages」の名前に日付を付加するには、次のように「$YEAR」「$MONTH」「$DAY」といったマクロを使います。
|
|
リスト1 ログファイル「/var/log/messages」の名前に日付を付加するsyslog-ng.confの設定例 |
上のようなマクロを使った場合、「/var/log/messages_20080909」のようなログファイルが生成されます。これを使ってログファイルを日付ごとに整理できます。次の設定では、ディレクトリ名の指定に日付マクロを使用し、月ごとにディレクトリを作成し、さらにその中に日ごとにログファイルを作成しています。
なお、ディレクトリを自動的に生成するには「create_dirs(yes)」オプションの指定が必要です。
|
|
リスト2 ログファイルが出力されるディレクトリ名の指定に日付マクロを使用 したsyslog-ng.confの設定例(リスト1の「d_1」を書き換えたもの) |
ログを集中して管理するシスログサーバは、さまざまなネットワーク機器やサーバからのログを受け取ります。そのため、次のように「$HOST」を使って、機器ごとにログファイルを整理するようにすると便利です。その際「$PROGRAM」を使えば、ログを出力しているプログラム名を付加し、より見分けやすくできます。
|
|
リスト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)」を指定します。
|
|
リスト4 syslog-ng.confのグローバルオプションに「use_time_recvd (yes)」と指定 |
またマクロでは使用法によっては、悪意のあるログメッセージを送り込んで、意図しないファイルやディレクトリを生成することも可能となってしまいます。マクロを使用する際は、慎重に設定を行います。
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
表1 syslog-ng.confで使用可能なマクロ ※本文のとおり、マクロには「S_」で始まるログが生成された日時に基づくものと、「R_」で始まるログを受け取った日時に基づくものがあります(例:S_DATE,R_DATE)。デフォルトでは「S_」が使用されます。 |
syslog-ngでは、ログメッセージを自由な書式に組み立てることができます。組み立てにはテンプレートを使用します。一例として、テンプレートを使って、リスト1のログ出力を変更したものをリスト5として挙げておきました。
テンプレートを指定するには、「template 定義名 {...};」のような定義を使用します。定義の中では、先ほど紹介した表1のようなマクロを使用します。
「destination」で出力方法を指定する際に、ファイルパスと一緒に、使用するテンプレートを指定します。
リスト5とリスト6は同じ設定内容になります。わざわざ「template{...}」で定義することなく、リスト6のように直接「destination」でテンプレートを組み立てることもできます。なお「template_escape(no)」オプションは、エスケープ処理で問題が発生する場合のみ指定します。指定することで「'」「"」文字のエスケープ処理を無効化します。
|
|
リスト5 テンプレートを使ったsyslog-ng.confの設定例 |
|
syslog-ngでは、ログメッセージに対しフィルタを使って、特定の文字列を検出することができます。例えば、sshdで出力されるリスト7のようなログに対し「Failed password」を検出する場合には、「filter定義名 {...};」を使ってリスト8のように設定します。
|
|
リスト7 sshdのパスワードエラー時のログ |
|
|
リスト8 フィルタを使ったsyslog-ng.confの設定例 |
さらに、設定したフィルタに合致するログが検出された場合に、特定のプログラムを起動することもできます。例えば、メール通知スクリプト「syslog2mail.pl」を起動するには、「destination」でリスト9のように設定します。
|
|
リスト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 |
|
|
リスト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 |
|
|
リスト11 データベース側の準備 |
|
|
リスト12 データベースの設定内容 |
syslog-ng.confに加える設定は、リスト13のとおりです。「template」とマクロを使って、MySQLに挿入するINSERTクエリを組み立てます。「destination」で名前付きパイプを出力先に指定するには、pipe()を用います。
|
|
リスト13 データベースサーバにログメッセージを挿入するsyslog-ng.confの設定例 |
続いて、名前付きパイプをmkfifoコマンドで作成します。
># mkfifo /var/log/mysql.pipe |
名前付きパイプに出力されるINSERTクエリを拾い、クエリを実行するために、付録2のようなスクリプト「syslog2mysql.sh」を用意します。スクリプト中で使用しているコマンドパスなどは適宜変更してください。また、MySQLユーザーとパスワード、データベース名やテーブル名を変更している場合は、スクリプトを修正します。詳細はスクリプト中のコメントを参照してください。
スクリプト準備後、次のようにスクリプトに実行権を与えます。今回、スクリプトは常駐プロセスとしてバックグラウンドで実行します。
# chmod +x /..pathto../syslog2mysql.sh |
作業終了後、syslog-ngを再起動し設定を有効にします。ログがMySQLに挿入されているかを次のようにして確認します。
# mysql --user=user --password=password syslogng |
サンプルファイル2: | |
![]() |
syslog2mysql.sh |
前回までの2回にわたり「syslog-ng」のインストール方法と特徴を解説しました。syslog-ngはキャリアクラスの信頼性や豊富な機能を持ちますが、それと引き替えにsyslogdとの互換性を犠牲にしていました。一方、今回紹介する「rsyslog」は、syslog-ng同様、多くの機能と高い信頼性を実現しながら、syslogdの設定をそのまま使用することができます。
今回から2回にわたり、次世代syslogデーモンのもう1つの候補「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コマンドを使用します。 |
ここでは、ソースからインストールする方法とバイナリパッケージを使ってインストールする方法の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」で確認し、適宜追加します。
|
|
リスト1 rsyslogのインストール |
以上の操作で、次のようにファイルが配置されます。
|
|
ファイルの配置先(/usr/localにインストールした場合) |
・設定ファイルの準備
次に、自動起動スクリプトや設定ファイルを用意します。Red Hat互換ディストリビューションでは、ソースアーカイブに同梱されたファイルを使用することができます。以下はCentOSでの作業例ですが、Red Hatでも同様の作業が可能です。
Red Hat互換ディストリビューション向けの自動起動スクリプトや設定ファイルは、ソースディレクトリ中のredhatに納められています。ディレクトリを移動し、作業を行います。
初めに設定ファイル「rsyslog.conf」を/etcにコピーします。次に、自動起動スクリプト「rsyslog.init」に修正を加えた後、/etc/init.dにコピーします。ログファイルのローテションを定期的に実施するlogrotateのための設定ファイルも用意されているため、併せて作業します。作業内容は次のとおりです。
|
|
リスト2 自動起動スクリプトと設定ファイルの用意 |
|
|
リスト3 自動起動スクリプトの修正内容 |
・syslogdの停止
rsyslogを標準syslogデーモンとして利用するため、syslogdを停止します。またsyslogdが自動起動しないよう、停止処理を行います。
自動起動の解除にはchkconfigコマンドを使用していますが、ntsysvやサービス設定ツールを使っても同じように自動起動解除ができます。サービス設定ツールは「デスクトップメニュー→システム→管理→サーバ設定→サービス」で実行できます。
|
|
リスト4 syslogdの停止、自動起動の解除 |
ログファイルを定期的にローテションするのにlogrotateを使用している場合、ログファイルを置き換えた後に、syslogdの再起動が行われます。誤動作しないよう設定ファイルを削除(または任意のディレクトリに待避)します。なおrsyslog用のlogrotate設定ファイルは先ほどの作業でインストールされています。
|
|
リスト5 syslogdの停止、自動起動の解除 |
・rsyslogの起動、動作確認、自動起動の登録
rsyslogを起動します。設定はデフォルトのまま使用することにします。起動には先ほどインストールした/etc/init.d/rsyslogを利用します。起動後、動作を確認します。確認作業ではloggerコマンドでシスログを発生させ、/var/log/messagesにログが出力されていることを確認します。
|
|
リスト6 rsyslogの起動 |
|
|
リスト7 loggerコマンドを使ったrsyslogの動作確認 |
rsyslogを停止させる場合も/etc/init.d/rsyslogを利用します。
|
|
リスト8 rsyslogの停止 |
問題なく動作していることが確認できた後、自動起動の登録を行います。これによりサーバ起動時に自動でrsyslogも起動します。
自動起動の登録にはchkconfigコマンドを使用していますが、ntsysvやサービス設定ツールを使っても同じように自動起動登録ができます。サービス設定ツールは「デスクトップメニュー→システム→管理→サーバ設定→サービス」で実行できます。
|
|
リスト9 ryslogの自動起動登録 |
rsyslogは多くのディストリビューションに対応しており、各ディストリビューションに用意されているパッケージ管理ツールを使ってインストールできます。
Fedoraではrsyslogが標準採用されているため、作業の必要はありません。CentOSでもyumコマンドを使って、オンラインインストールを実行できます。ただし、パッケージとして用意されているrsyslogのバージョンが古いため、最新のものを利用するには、先に紹介したようにソースファイルからインストールする必要があります。
ではUbuntuを例に、バイナリパッケージを利用して導入する方法を解説します。UbuntuではSynapticを使って、すべての処理を自動的に行うことができます。
デスクトップメニューの「システム→システム管理→Synaptic パッケージ・マネージャ」でSynapticを起動し、「rsyslog」をキーワードに検索を実行します。表示されたパッケージを右クリックし「インストール指定」を選択します。そして上部メニューから「適用」をクリックし、インストールを完了します。
このインストール処理では、競合するパッケージ(klogdやsysklogd)の削除、デーモンの起動と自動起動の登録までが一括して行われます。
![]() |
画面3 UbuntuのSynaptic(デスクトップメニューの「システム→システム管理→Synaptic パッケージ・マネージャ」で起動、クリックすると拡大します) |
![]() |
画面2 競合するパッケージの削除(パッケージの競合が自動で解決されます) |
rsyslogの動作を確認するために、loggerコマンドを使用します。loggerコマンドの使用法は、「ソースからインストールする」で紹介した方法と同様ですが、Ubuntuでは/var/log/syslogにテスト内容が出力されます。
|
|
リスト10 loggerコマンドを使ったrsyslogの動作確認 |
Ubuntuのほか、DebianでもSynapticを利用できます。またopenSUSEでは、YaST2といったパッケージ管理ツールを使ってrsyslogをオンラインインストールします。
rsyslogで使用する設定ファイルはsyslogdのものと互換性があり、syslogdの設定方法(第1回 syslogdの限界と次世代シスログデーモン 参照)がそのまま使用できます。
rsyslogでは設定ファイルにマクロやテンプレートを適用することができます。ログの内容を自由に組み立てたり、ファイル名に日時やホスト名を付加することが可能です。また拡張モジュールを追加することで、ログをメールで送信したりデータベースに格納することができます。今回はそうしたrsyslogの活用方法を解説します。
注意:以降はrootユーザーにて作業を行います。Ubuntuのようにrootユーザーが直接使用できない場合には、sudoコマンドを使用します。rsyslogのインストール方法や基本的な設定方法は、「第4回 rsyslogの導入」を参考にしてください。 |
「第4回 rsyslogの導入」では、rsyslogのインストール方法を解説しました。前半の「ソースからのインストール」で使用した設定ファイルは、rsyslogの旧バージョンのものを利用しています。そのため起動時に次のようなログが/var/log/messagesに出力されます。
|
|
リスト1 旧バージョンの設定ファイルを使用しrsyslogを起動した際のログ |
メッセージに従い、バージョン3互換モードで起動するには、rsyslogdの起動オプションに「-c3」を指定します。前回の解説に従ってインストールしている場合、オプションを付加するには、「/etc/sysconfig/rsyslog」に次の1行を追加します。
|
|
リスト2 rsyslogをバージョン3互換モードで起動させるための/etc/sysconfig/rsyslogの記述例 |
また、rsyslogをバージョン3互換モードで動作させた場合、UNIXソケット(注1)からログを受け取れるように、rsyslog.confに次のような行が必要になります。ほかにも、カーネルログを受け取るための追加設定も必要です。詳細は、後に「拡張モジュールの利用」で解説します。
|
|
リスト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を適用しています。
|
|
リスト4 テンプレートとマクロを使用したrsyslog.confの記述例1 |
テンプレートの定義には、マクロ以外に、定型メッセージを埋め込むこともできます。
|
|
リスト5 テンプレートとマクロを使用したrsyslog.confの記述例2 |
利用可能な主なマクロには、表1のようなものがあります。「%マクロ名%」のように、前後に「%」を付けて使用します。
バージョン3.17.0より新しいrsyslogでは「%MSG%」のような大文字でも、「%msg%」のような小文字でも同じように利用できます。なお、表1に挙げたもの以外に使用可能なマクロは、ソースアーカイブに付属するドキュメント「property_replacer.html」やrsyslog配布元の「The Property Replacer」を参考にしてください。
|
||||||||||||||||||||||||||||||||||||||||
表1 rsyslog.confで使用可能な主なマクロ |
テンプレートの中には、rsyslogで事前に定義されているものがあります。定義済みのテンプレートは「RSYSLOG_FileFormat」や「RSYSLOG_DebugFormat」のように、接頭文字に「RSYSLOG_」が使用されています。そこで、独自に定義する際には、予約語の「RSYSLOG_」を使用しないように注意してください。使用可能な定義済みテンプレートの詳細は、付属ドキュメント「rsyslog_conf.html」やrsyslog配布元の「Templates」を参照してください。
rsyslogでは、ログのファイル名や保存先ディレクトリの指定に、日付やホスト名といったマクロを用いることができます。そうすることで、別途「logrotate」のようなツールを組み合わせなくても、ログファイルを日付ごとに整理できます。
次の例では「/var/log/messages_20081110」のようなログファイルが日次で生成されます。さらに、テンプレートに従って動的にファイルを生成するには、ログ出力先の指定で「?テンプレート名」のように「?」を付加します。
|
|
リスト6 ログファイルの名前に日付を付加するためのrsyslog.confの記述例 |
注2:本稿ではrsyslog.confの設定で、ログをより分けるために頻繁に「*.*」を指定しています。「*.*」は全ファシリティの全プライオリティのログが対象になります。特定のファシリティ、例えばauthprivファシリティに関するログだけを対象にするには、「authpriv.*」のような指定を用います。詳細は第1回を参考にしてください。 |
次の設定では、ディレクトリ名を指定するのに日付マクロを使用しています。年月日ごとにディレクトリを作成し、その中にログファイルを作成する仕組みです。
|
|
リスト7 日付ごとに整理されたディレクトリにログファイルを保存するためのrsyslog.confの記述例 |
ログを集中して管理するサーバでは、さまざまなネットワーク機器やリモートホストからのログを受け取ることになります。そのようなサーバでは、次のように「%hostname%」を使って、機器ごとにログファイルを整理するようにすると便利です。その際「%programname%」を使えば、機器名だけでなく、ログを出力しているプログラム名を付加することができます。使用可能なマクロは、前述の表1のとおりです。
|
|
リスト8 ホストや日付ごとに整理されたディレクトリにログファイルを保存するためのrsyslog.confの記述例 |
このようにテンプレートを活用すれば、日付やホスト名に基づいてログファイルを整理できます。しかし、7日前のログファイルを順次削除するような世代管理や、古いファイルの圧縮保存といった処理までは、rsyslog単体ではできません。そうしたアーカイブ管理まで実行するには、logrotateのようなツールを使用する必要があります。
rsyslogはモジュールの追加によっても機能を拡張できます。外部プログラムに頼ることなく、バリエーションに富んだ出力方法や入力方法を備えています。
■モジュールの追加方法(カーネルログの取り込み)
モジュールを追加するには、設定ファイルのrsyslof.confで「$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……」が使用されています。なおリモートサーバにログを送信する方法や、リモートクライアントからログを受け取る方法については、次回、解説を加えます。
|
|
リスト10 リモートホストのログを取り込むためのrsyslog.confの記述例 |
出力系モジュールには、メールでログを送信するための「ommail」や、MySQLサーバにログを格納するための「ommysql」のようなモジュールがあり、接頭文字に「om……」が使用されています。
モジュールのいくつかはデフォルトで使用できますが、ommailやommysqlはrsyslogインストール時にビルドしておく必要があります。モジュールをビルドするには、configure実行時に、次のようなオプションを追加します。
なおommysqlモジュールをビルドする場合、MySQLのクライアントライブラリやヘッダファイルが必要になります。
例えばCentOSやFedoraでMySQLのクライアントライブラリやヘッダファイルをインストールするには、yumコマンドを使って、「# yum install mysql mysql-devel」のようにオンラインでインストールを実行します。ちなみにMySQLのインストール方法は、「今から始める MySQL入門」などが参考になります。
|
|
リスト11 rsyslogインストール時に拡張モジュールを有効にする |
ディストリビューションのパッケージを使ってrsyslogをインストールした場合は、インストール時点ですでに多くの拡張モジュールが付属しています。ビルドされた拡張モジュールの保存先は、第4回に記したとおりです。
|
|
リスト12 rsyslogのビルド済みモジュール一覧 |
モジュールはビルドしただけでは使用できません。rsyslog.confで「$ModLoad」を使って組み込む必要があります。
最終回となる次回は、こうした機能活用の具体例として、「ommailモジュールを使ってメールでログを送信する方法」と「ommysqlモジュールを使ってMySQLサーバにログを格納する方法」を解説します。