UNIX系OSのシステムロギングをおよそ20年の長きにわたって支えてきた「syslogd」にも、限界が見えつつあります。その限界を打ち破る機能を備えた新しいシスログデーモンを紹介します。(編集部)
前回「マクロとテンプレートによるrsyslog活用法」では、rsyslogの導入方法に続き、マクロやテンプレート、拡張モジュールを組み合わせることにより、ログの内容を自由に組み立てたり、ファイル名などをカスタマイズできることを紹介しました。最終回となる今回は、その内容を踏まえ、rsyslogの活用例を具体的に紹介します。
まず、ommailモジュールを使ってログをメールで送信する方法を解説します。併せて、無条件にすべてのログを送信しないよう、特定の語彙(ごい)に一致したログだけ送信する方法も解説します。
最初に「$ModLoad」でommailを組み込み、「$ActionMail……」を駆使し、リスト1のように設定します。メールサーバの指定には「$ActionMailSMTPServer」、送信先アドレスには「$ActionMailTo」、題名の設定には「$ActionMailSubject」といった項目を使用します。加えてリスト1では、メールの題名や本文にテンプレートを使用しています。
さらに、リスト1ではログが排出されるたびにメールが送信されないよう、送信時の条件を設定しています。具体的には、ログに「Failed password」が含まれる時だけメールを送信するように「if $msg contains 'Failed password' then」としています。
単純にファシリティやプライオリティでログを選り分けることもできます。例えばauthprivファシリティに関するログをメール送信の対象にするには「authpriv.* :ommail:;テンプレート名」のような指定を用います。
$ModLoad ommail #ommailモジュールの組み込み $ActionMailSMTPServer mail.example.jp #メールサーバの指定 #$ActionMailSMTPPort 587 #SMTPのポート番号(デフォルトは25:注1) $ActionMailFrom from@example.jp #送信者アドレス $ActionMailTo to@example.jp #送付先アドレス #メール題名テンプレートの定義 $template mail_subject,"Log Report on %hostname% #メール内容テンプレートの定義 $template mail_body,"RSYSLOG Alert\r\nmsg='%msg% #メール題名の設定 $ActionMailSubject mail_subject #ログに「Failed password」を含むものをメール送信。 #その際mail_bodyテンプレートを使用 if $msg contains 'Failed password' then :ommail:;mail_body
注1:プロバイダーがスパムメール対策として、自網内でTCP25番ポートを規制したOP25B(Outbound Port 25 Blocking)を実施している場合、サブミッションポートのTCP 587番を指定するなどします。なおサブミッションポートは、メールサーバによっては使用できない場合がありますので注意してください
リスト1の設定が施されたrsyslogサーバでは、sshなどでログインが失敗した場合に次のようなメールが送信されます。
From: from@example.jp To: to@example.jp Subject: Log Report on サーバ△△ RSYSLOG Alert msg=' Failed password for ×× from ○○ port 40067 ssh2'
rsyslogは、外部プログラムを使用することなく、拡張モジュールを追加するだけでデータベースサーバにログを格納することができます。データベースにログを格納することで、SQLを使ったログの抽出や集中的なログ管理が可能になります。
rsyslogにはMySQLのためのommysqlモジュールと、PostgreSQLのためのompgsql(注2)が用意されています。以降ではommysqlモジュールを使って、MySQLサーバにログを格納する方法を解説します。
この説明では、rsyslogとMySQLが同一サーバ上で稼働しているものとしていますが、遠隔のMySQLサーバを利用することもできます。その際は、MySQLやrsyslogサーバの指定で「localhost」と指定されている個所を、それぞれのサーバのIPアドレスで置き換えるようにします。
なおUbuntuでは、パッケージを使ってMySQLに対応したrsyslogをインストールすることができます。インストールの際、自動的にMySQLの設定が行われますが、事前の準備が必要です。詳細はこの後の「Ubuntuの場合の注意」で述べます。
注2:ompgsqlをビルドするには、rsyslogをインストールする際に、configureで「--enable-pgsql」オプションを付加し、ビルドを実行します
MySQLのインストール方法は、連載「今から始める MySQL入門」などをご覧ください。またディストリビューションによっては、パッケージを利用することもできます。例えばFedora9やCentOSでは、次のようにyumコマンドを使ってオンラインでインストールできます。
# yum install mysql mysql-server
UbuntuではSynaptic、openSUSEではyast2といったパッケージ管理ツールを使ってMySQLをインストールできます。インストール後、MySQLサーバを起動しておきます。なおMySQLサーバにログを格納する場合、サーバ起動時に、rsyslogより先にMySQLサーバが起動している必要があるので、自動起動の順序には注意を払ってください。
# /etc/init.d/mysqld start
次にリスト5の設定内容でデータベース、テーブルを作成し、権限を設定します。
データベース: Syslog テーブル: SystemEvents、SystemEventsProperties ユーザ名: rsyslog パスワード: password
# mysql -u root -p ←MySQLのクエリモードを開始します。 ※「mysql>」プロンプトに続けて、次のようなSQLクエリを入力します (データベース「Syslog」の作成) CREATE Database Syslog; (テーブル「SystemEvents」の作成) CREATE TABLE SystemEvents( ID int unsigned not null auto_increment primary key, CustomerID bigint, ReceivedAt datetime NULL, DeviceReportedTime datetime NULL, Facility smallint NULL, Priority smallint NULL, FromHost varchar(60) NULL, Message text, NTSeverity int NULL, Importance int NULL, EventSource varchar(60), EventUser varchar(60) NULL, EventCategory int NULL, EventID int NULL, EventBinaryData text NULL, MaxAvailable int NULL, CurrUsage int NULL, MinUsage int NULL, MaxUsage int NULL, InfoUnitID int NULL , SysLogTag varchar(60), EventLogType varchar(60), GenericFileName VarChar(60), SystemID int NULL ); (テーブル「SystemEventsProperties」の作成) CREATE TABLE SystemEventsProperties( ID int unsigned not null auto_increment primary key, SystemEventID int NULL , ParamName varchar(255) NULL , ParamValue text NULL ); (権限の設定 ユーザー:rsyslog、パスワード:password) GRANT ALL PRIVILEGES ON Syslog.* TO rsyslog@localhost IDENTIFIED BY 'password'; (※rsyslogとMySQLが同一サーバで稼働していない場合、localhostをrsyslogサーバのIPアドレスに置き換えます)
rsyslogでログをMySQLに格納するには、rsyslog.confで「$ModLoad」を使って、ommysqlモジュールを組み込み、ログ出力先の指定で「:ommysql:MySQLサーバのアドレス,データベース名,ユーザー名,パスワード」と設定します。MySQLとrsyslogが同一サーバで稼働し、リスト5のとおりMySQL側が設定されていれば、次のような設定でMySQLにログを格納することができます(リスト7)。
ModLoad ommysql *.* :ommysql:localhost,Syslog,rsyslog,password (:ommysql:MySQLサーバのアドレス,データベース名,ユーザー名,パスワード) #上の行と下の行は同じ設定内容(「:ommysql:」を「>」で置き換えています) *.* >localhost,Syslog,rsyslog,password
rsyslog.confの修正後、rsyslogdを再起動して設定内容を有効にします。その後、MySQLサーバにログが格納されていることを確認してください(リスト8)。
$ mysql -u rsyslog -p Syslog mysql> PAGER less -S(ページャーで表示を抑制します) mysql> SELECT * FROM SystemEvents LIMIT 0,5(先頭から5件だけ表示) +-----+------------+---------------------+---------------------+- | ID | CustomerID | ReceivedAt | DeviceReportedTime | +-----+------------+---------------------+---------------------+- | 331 | NULL | 2008-11-10 02:38:01 | 2008-11-10 02:38:01 | | 332 | NULL | 2008-11-10 02:38:01 | 2008-11-10 02:38:01 | | 333 | NULL | 2008-11-10 02:38:18 | 2008-11-10 02:38:18 | | 334 | NULL | 2008-11-10 02:38:18 | 2008-11-10 02:38:18 | | 390 | NULL | 2008-11-10 02:49:58 | 2008-11-10 02:19:55 | +-----+------------+---------------------+---------------------+-
なおMySQLサーバにログを格納する場合、rsyslogよりも先にMySQLサーバが起動するように自動起動を設定する必要があります。
ここではrsyslogで指定されたテーブル定義をそのまま使用しましたが、テンプレートやマクロを組み合わせることで、独自に定義したテーブルに対しINSERTクエリを発行することもできます。
Copyright © ITmedia, Inc. All Rights Reserved.