膨大なログから必要な情報を素早く抽出──システム管理者の悩みを解消するITサーチエンジン「Splunk」

 システム運用において、トラブルシューティングやチューニング、法令などの理由でさまざまなログを取得・保管していると思うが、必要な情報を見つけ出すためには、どこに記録されていているのか、抽出するためのキーワードは何が適切かといった情報を事前に整理できていることが必要となる。とくにトラブル発生時は素早い対応が要求されるが、必要な情報を手軽に素早く取り出す手段を用意していない運用は多いのではなかろうか。そういったときに役立つのが、さまざまなログから情報抽出を行えるマクニカネットワークスの「Splunk」というツールだ(開発元は米Splunk)。

 「ITサーチエンジン」と呼ばれるこのツールは、さまざまなログを取り込み、インデックス化し、素早く横断的に検索して情報を抽出できる。一般的なファイルのログのほか、設定ファイルやコンピュータリソース(CPU、メモリ、ネットワーク帯域など)の使用状況、データベースシステムのログ、WMI(Windows Management Instrumentation)経由でWindowsの情報、SNMPサーバーに集めたネットワーク機器の情報なども取り込める。Splunkは自動化された強力な構文解析機能を備え、取り込むデータを指定するだけで適切なインデックスを作成し、高速検索とフリーフォームでの自由度の高い検索を両立しているのだ。

 これによって、たとえば、迅速な対応が要求されるトラブル発生時の一次エスカレーションに使う、任意の箇所での負荷やエラーを監視するといった一連の作業がSplunkのWebコンソールだけで行えるようになる。具体的にどのようなことが行えるのか、いくつかの例を下の表にまとめたので参考にされたい。

目的 主な活用例 対象となる主なデータ
可用性の向上 ログおよび性能データのリアルタイム監視とアラートにより、トラブルの早期発見と迅速な対応を可能にする。 シスログ、各種アプリケーションのログ、ルータの統計データ、vmstat等のステータス監視コマンドの出力など
セキュリティの向上 セキュリティインシデント(不正侵入など)を抽出するための検索ルールを定期的に実行(1分おきなど)して、検出時にメール等で管理者に通知 シスログ、ファイアウォールや認証システムのログ、外部のIDSのログなど
コンプライアンス Splunkサーバーへのログの集約と、Splunkのレポート機能により、法令に準拠したデータ処理(定期的な監視と長期保存)に必要なコストを削減 すべてのログ
ビジネスインテリジェンス Webサイトのアクセスレポートの作成や、把握するのが困難なITデータを横断的に検索、レポート。 シスログ、独自アプリケーションのログなど

Splunkは無償でも使える

 本稿では、Splunkのフリー版を使ってその操作感を確かめてみる。フリー版は1日に取り込めるデータ量が500MBまでと制限されているが、使用期限などはなく、コア部分の機能は商用版(エンタープライズ版)とほぼ同等である(エンタープライズ版ではクラスタリングやアクセスコントロール、複数ユーザアカウントの設定などが行える)。

●Splunk製品情報
http://www.macnica.net/splunk/

●ダウンロードページ図1
http://www.macnica.net/splunk/tech.html

図1:Splunkダウンロードページ

 ダウンロードページ中央の「Splunk フリー版 ライセンス」のボタンをクリックすると、開発元のダウンロードページが開くので、OSに合わせてパッケージのリンクをクリックする。ユーザー情報登録画面が開くので、必要事項を記入し、画像認証コードを入力して「Submit」をクリックする。記入漏れや認証コードに間違いがなければ、これでパッケージのダウンロードが自動的に開始される。

 また、同じくダウンロードページ右側にあるリンクからは、日本語の製品資料がダウンロードできる。日本語資料のうち、これからSplunkを試すのであれば、「Splunkインストール&クイックリファレンスガイド(日本語版)」はぜひ入手しておきたい。また、Splunkを利用することでどんな問題がどのように解決するのかを知るうえで、「オレゴン州立大学 オープンソースラボ ケーススタディ」も大変参考になる。

インストールしてみよう

 ここではSplunkの検索およびレポート機能を評価するために、SourceFroge.JPのWebサーバーのエラーログを取り込むことにした。実運用時は、システムやアプリケーションが出力するログをSplunkが逐次取り込むが、ここではすでに保管してあるログを取り込むことにする。

 用いた環境は、Ubuntu 8.10 x86_64のデスクトップPCで、64ビット版のSplunkをインストールした。Linux版の場合、インストール作業はパッケージをrpmコマンドもしくはdpkgコマンドでインストールするだけだ。

$ sudo dpkg -i splunk-3.4.6-51113-linux-2.6-amd64.deb
[sudo] password for morihide: ←パスワードを入力
未選択パッケージ splunk を選択しています。
(データベースを読み込んでいます ... 現在 116918 個のファイルとディレクトリがインストール されています。)
(splunk-3.4.6-51113-linux-2.6-amd64.deb から) splunk を展開しています...
splunk (3.4.6-51113) を設定しています ...
----------------------------------------------------------------------
Splunk has been installed in:
        /opt/splunk

To start Splunk, run the command:
        /opt/splunk/bin/splunk start

To use the Splunk Web interface, point your browser at:
        http://ubuntu:8000

Complete documentation is at http://www.splunk.com/r/docs
----------------------------------------------------------------------
 インストールはほぼ一瞬で終わる。表示されたメッセージにあるように、「/opt/splunk/bin/splunk start」と実行すれば、Splunkが起動した状態になり、デフォルトでは8000ポート(http://localhost:8000/)でWebコンソールにアクセスできる状態になる。また、システム起動時にSplunkも起動させたいのであれば、以下のコマンドを実行すれば良い。
$ sudo /opt/splunk/bin/splunk enable boot-start

 上記のコマンドにより、そのシステムに合わせた起動スクリプトがインストールされる仕組みになっている。

データの取り込み

 インストール後の作業はWebコンソールから行う。WebコンソールにアクセスするにはWebブラウザで「http://localhost:8000/」を指定すれば良い。リモートからアクセスするのであれば、「localhost」の代わりにホスト名かIPアドレスを指定する。なお、利用するWebブラウザとしては、Adobe Flash 9以降がインストールされた、Internet Explorer 6/7、Firefox 1.5/2.0が推奨されている。ここではFirefox 3.0を利用したが、特に問題はなかった。

 最初にWebコンソールを開くと、図2の「Getting Started」の画面が表示される。ここではデータの取得方法に応じて緑色のボタンをクリックする。ネットワークポートやさまざまの出力を指定ディレクトリから取り込む場合は右側の「Index More Data」をクリックする。ここではファイルからログを読み込むので、左側の「Index files」をクリックすれば良い。ファイル以外のデータソースを取り込む方法については、前述のインストールガイドを参照されたい。

Webコンソール(Getting Started)
図2:Webコンソール(Getting Started)

 次の画面では、まず「Source」の部分でデータの取得先を指定する(図3-1)。Splunkサーバー上のファイル/ディレクトリを監視して逐次データを取り込む場合は「Monitor a directory or file」を、手元のファイル(Webブラウザが動作しているホストのファイル)をアップロードする場合は「Upload a local file」を、Splunkサーバー上にある静的なファイルを取り込む場合は「Index a file on the Splunk server」をチェックする。

取り込むデータの指定
図3:取り込むデータの指定

 「Upload a local file」を選択すると下のフィールドが変化して「参照」ボタンが表示されるので、それをクリックして選択ダイアログでファイルを指定する。ここで取り込んだアーカイブファイルERRORLOG.tarの中には、error.log、error.log.1.gz、error.log.2.gz……のように1年分のApacheのエラーログが、一週間ごとにローテートされた状態で入っている。error.log以外は、gzip形式で圧縮されているが、Splunkは圧縮アーカイブを直接取り込むことができるので、あらかじめ展開しておく必要はない。

 次に「Host」以下の項目でデータに関連付けるホスト名を指定する(図3-2)。これはデータの識別子の1つとなるもので、任意のホスト名を付けることができる。ここでは「Fully qualified domain name or IP address」に「sf-web」と指定した。なお、「Source」で「Monitor a directory or file」を選択し、かつ複数台分のログがホストごとのディレクトリに分けて保存されるようになっている場合は、パスからホスト名(もしくはIPアドレスなど)を抜き出してそれぞれのデータに割り当てることも可能だ。

 最後に「Souce Type」でデータの種類を指定する(図3-3)。指定方法は3つ用意されており、デフォルトの「Automatic」ではタイプが自動的に判別される。また、「From list」ではあらかじめ定義されたリストからタイプを選択する。「Manual」では取り込むデータにオリジナルのタイプ名を割り当てることができる。なお、「From list」はフィルタを兼ねており、指定したタイプに合致しない形式の行は取り込まれないので注意されたい。ここでは「Manual」を選択して「sf-web-error」というタイプ名を付けた。任意のタイプ名を付けたのは、ここで取り込んだログの中にフォーマットの異なるものが含まれるためだ。Apacheがそのまま出力したログのほかに、Apache経由で出力されたWebアプリケーション(主にPHP)のログが大量にあり、しかもアプリケーションごとに書式が異なっていたりする。このバラバラなログをまとめて識別できるようにするため一意のタイプ名を付けた。

 指定を済ませて「Submit」ボタンをクリックすると、データが取り込まれてインデックスが作成され、図4の画面に遷移する。この画面で「New Input」ボタンをクリックすれば、続けて取り込みを行える。一方、取り込んだデータを検索するのであれば、画面左上の「Back to search」をクリックする。すると最初の「Getting Started」のページに戻るので、右上の「Dashboard」のメニューから「main」を選択する。mainダッシュボードでは、左上の「1,688,028 events」という表示から、ここでのログに約168万件のイベントが記録されていたことがわかる(図5)。

データの取り込み完了画面
図4:データの取り込み完了画面 検索画面(mainダッシュボード) 図5:検索画面(mainダッシュボード)

データの検索とレポートの作成

 評価用のデータが準備できたところで、早速検索機能を試してみよう。基本的には、Webのサーチエンジンと同じ要領で、検索フィールドにキーワードを入力してEnterキーを押せば良い。検索フィールドを空のまま(あるいは「*」と入力して)実行すれば、直近のものからすべてのログが検索される(図6)。検索フィールドの下にはヒット数が表示され、さらにその下にはタイムラインごとのヒット数がグラフで表示される。そして、画面下部にはヒットしたデータ(ログ)の内容が時系列(降順)で表示される。ただし、この画面でヒット数が「≥50,000 result」となっているように、件数が多い場合は上限値に達した時点で検索処理が中断される。グラフが途中から斜線領域になっているのはそのためだ。

検索結果(すべてのログを検索)
図6:検索結果(すべてのログを検索)

 デフォルトの上限値はLinux5万件、Windows1万件となっており、この上限値はページ右上の「Preferences」から変更できる。ここでは10万件に増やしてみたが、増やし過ぎるとレスポンスが悪くなる怖れがあるので注意されたい。

 それではもう少し意味のある検索をしてみよう。Webのエラーログから調べられることは色々あるが、ここでは一例としてスパム投稿について調べてみることにする。SF.JPのフォーラムシステムにはスパムフィルタが実装されており、怪しげな書き込みは排除されるようになっている。図7はキーワードに「spam detected」を指定して、スパムフィルタが排除した書き込みに関するログを抽出した様子だ。過去3か月で58,597件のスパム書き込みが試みられたことがわかる。

スパムフィルタのログを抽出
図7:スパムフィルタのログを抽出

 さて、ここで抽出されたログには、「addr=XXX.XXX.XXX.XXX」という形式でクライアントのIPアドレスが記載されている。Splunkはデータを取り込む際に、構文を解析して「key=value」形式の項目を自動的にフィールドとして認識してくれる。そこで、抽出したログをIPアドレス別に集計してみよう。グラフ領域下の左端にある「Fields」メニューを開き、「addr」をチェックして「Apply」をクリックする(図8)。これで、「Fields」メニューの右側に「addr」フィールドのメニューが追加される。このメニューではフィールドの値(IPアドレス)がイベント数の多い順に10件表示される(図9)。さらに、メニューの一番下にある「Report this field」のリンクをクリックすると、そのフィールドをキーにしたレポートをグラフ付きで作成できる(図10)。

フィールドの指定 「addr」フィールドのメニュー
図8:フィールドの指定 図9:「addr」フィールドのメニュー

スパムフィルタのログのIPアドレス集計
図10:スパムフィルタのログのIPアドレス集計

 グラフはページ右上の「display as」メニューから、棒グラフや線グラフ、エリアグラフ、円グラフなどに変更可能だ。またレポート画面左のフィールド一覧から他のフィールドを選択すれば、別なフィールドを使ったレポートも作成できる。このようなレポートは、スパム対策を行ううえで重要な材料となるだろう。突出してイベント数が多いクライアント(IPアドレス)があるようなら、アクセス規制などの対策を行うことでサーバーの負荷を抑えることができるかもしれない。

 そこで、イベント数が最も多かった「XXX.62.97.23」の活動履歴を見てみることにする。まず、「Back to search results」のリンクから検索画面に戻り、「addr」フィールドのメニューで最上位にある「XXX.62.97.23」をクリックする。するとウィンドウ下部のログがこの値でフィルタリングされた状態になる。さらにグラフでイベント履歴を見たければ、「Add filter to search」をクリックすれば良い。これで、このフィルタが検索条件に加えられてグラフにも反映される(図11)。これを見ると、このIPアドレスからのスパム投稿は2008年12月から2009年1月の間に限定されていたことがわかる。試しに検索フィールドの条件を「”spam detected” addr=”XXX.62.*”」に変えてアドレス範囲を広げてみたが、結果は1件しか増えなかった。スパマーがまったく別のアドレスを使うようになったか、あるいはスパムフィルタの存在に気づいてスパム投稿をあきらめたのか。ユーザーがスパムボットの感染に気づいて対策を行ったということもあり得る。

特定IPアドレスによるデータの絞り込み
図11:特定IPアドレスによるデータの絞り込み

 ここまでは過去3か月を対象に検索してみたが、検索フィールド下のメニューから対象期間を変更すれば、より最近の状況を調べられる。図12は、最近1週間で最もスパムフィルタのログが多かったIPアドレスの活動履歴だ。このグラフを見ると、ほぼ1時間に1回のペースでスパム投稿を繰り返していることがわかる。おそらくスパムボットがそのようにスケジューリングされているのだろう。この程度なら放置しておいても問題ないかもしれないが、ところどころ歯抜けになっているのが気になる点だ。もしかすると、歯抜け部分はスパムフィルタをすり抜けて投稿に成功したことを意味している可能性もある。この点はここで取り込んだエラーログだけでは追求できないが、アクセスログも取り込めば、そちらで当該IPアドレスがその時間に投稿を行ったかどうか、もしそうであればどのフォーラムに投稿したのかといったことが調べられる。その投稿内容からスパムフィルタをより高精度にチューニングすることも可能になるわけだ。

別のIPアドレスの活動履歴
図12:別のIPアドレスの活動履歴

 このように、取り込むデータの種類が多ければ多いほど、Splunkの利用価値は高まる。Splunkはログ以外のデータも含めて、そのまま簡単に取り込めるところも魅力だ。たとえば、Webアプリケーションのソースコードを取り込んでおけば、ログに記録されたエラーコードをキーワードにしてソースコードを検索し、当該部分の処理に問題がないかどうかをチェックするといったことも即座に行える。設定ファイルの類も取り込んでおくと便利だ。今回紹介したレポートだけでなく、異なるログの相関分析機能なども含めて、1日あたり500MBまでのデータならフリーで利用できる。まずは手元のサーバーなどで試してみてはいかがだろうか。

●Splunkダウンロードページ
http://www.macnica.net/splunk/tech.html

●マクニカネットワークス
http://www.macnica.net/