1. HOME
  2. シスログ談話室
  3. シスログ活用術

シスログ活用術

概要

ログには記録という意味がありますが、コンピューターの世界では一般にシステム運用記録を指します。
本文ではこれを以下「シスログ」(または単に「ログ」)と称し、その活用方法をご紹介します。

情報セキュリティやシステム監査の観点から、各種シスログの収集・管理・活用は今や重要な業務の一つとなっています。
その中で収集・管理までは行っているものの、活用には至っていないのが多くの企業や組織の実情のようです。

そこで、手軽に利用できるツールを使用して、それを実現するための「ログ解析」の具体的な手法をこれから紹介していくことにします。

注記
・ 用語や語句の説明は必ずしも学術的なものではなく、内容に関しても網羅的でなく、最低限の必要範囲に留めてありますので、詳細は末尾の参考文献などをご参照ください。
・ 「Syslog」はIETF(The International Engineering Task Force)のRFC(Request for Comments)3164/5424で定義されているプロトコル仕様を指すものとし、上記の広義のシスログと表記上の違いで明示的に区別しています。

I. 入門編

1.シスログの出力元

①OS(サーバーやクライアントPC)
②アプリケーション(ソフトウェア)
③ネットワーク/インターネット機器(ルーター、スイッチ、ゲートウェイなど)

2.ログ解析の対象

①Webサーバー
②ファイアウォール
③プロキシサーバー
④メールサーバー
⑤その他(FTPサーバー、ファイルサーバー、プリンターサーバー、メディアサーバー、Syslogサーバー、アンチウィルスなど)

3.シスログの用途

①システムイベントの記録
②障害情報のアラート出力監視
③コンプライアンスや内部統制などの法規制への対応

4.ログ解析の目的

①システム動作(設定や実行イベント)の履歴調査
②システム不調の原因究明
③不正アクセスの痕跡追跡
④システムやアプリケーションのメンテナンス
⑤統計レポートの作成

5.ログ管理のポイント

①できるだけ多く(網羅的に)集めること
②集中管理すること
③重要な情報資産の一つとして、定期的にバックアップを取ること

6.ログフォーマットの大分類

Syslogはインターネットで使用されているネットワークプロトコルの一つですが、ログデータのフォーマットはこれを使用しているか否かで大きく2つに分けることができます。

①Syslogあり(シスログサーバー経由あるいはSyslog変換)
②Syslogなし(直接出力)

ログデータの中で最もキーとなる項目が統計処理のベースとなる出力日時(イベントの発生日時)ですが、出力元のログデータにこれが含まれていない場合はシスログサーバーを経由したり、何らかの手段でSyslogフォーマットに変換したりする必要があります。
つまり、Syslogは下記で説明するように3つの部分からなり、その場合ヘッダー部(ログ記録の日時を含む)を付加することになります。

7.Syslog(RFC3164: The BSD syslogd Protocol)データの基本構成

①PRI(= ファシリティ値 x 8 + プライオリティ値)
ファシリティとプライオリティからなり、上記の計算による数値で記録され、アプリケーション(syslogdやrsyslog)によっては省略されます。

ファシリティ: kern(0), user(1), mail(2), daemon(3), auth(4), syslog(5), lpr(6), news(7), uucp(8), cron(9), authpriv(10), ftp(11), ntp(12), security(13), console(14), n/a(15), local0(16), loca11(17), local2(18), local3(19), local4(20), local5(21), local6(22), local7(23)

プライオリティ: emerg/panic(0), alert(1), crit(2), error/err(3), warning/warn(4), notice(5), info(6), debug(7)

例: daemon.infoの場合、3 * 8 + 6 = 30

②HEADER(日時とホスト名)
日時表記の詳細は下記で説明しています。
ホスト名はドメイン部を含まず、IPアドレスの場合もあります。

③MSG(タグとメッセージ)
タグには、ログデータを出力したプログラムやプロセスなどの名称が記述されています。
メッセージは、ログデータの本文内容です。

8.ログの出力例

①BSD syslogd(rsyslogで出力)
<30>Feb 2 03:40:01 abc rsyslogd: [origin software=”rsyslogd” swVersion=”5.8.10″ x-pid=”993″ x-info=”http://www.rsyslog.com”] rsyslogd was HUPed

②Apache Web(HTTP)サーバー
192.168.1.1 – – [28/Feb/2014:03:15:54 +0900] “GET /support/customerportal/index.php HTTP/1.1” 200 124 “http://www.jtc-i.co.jp/index.html” “Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/7.0)” “-“

9.日時表記の例

ログフォーマットにおいて重要なのが日時フォーマットであり、代表的なものは次の通りですが、実に様々なバリエーションがあります。

①ISO8601基本形式
YYYYMMDDThhmmss+/-hh:mm

例: 20100326T105915+09:00

②ISO8601拡張形式
YYYY-MM-DDThh:mm:ss+/-hh:mm

例: 2010-03-26T10:59:15+09:00

③UNIX時間
協定世界時(UTC)1970年1月1日午前0時0分0秒からの経過秒数(UNIXエポック)

例: 1269568755(2010/03/26 10:59:15 JST)

10.正規表現の基本

ログフォーマットの識別に際して、日時以外に、そのログを特徴付ける部分を見付け出してフォーマットを定義することになります。それには「正規表現」が通常使われますので、ここでその基本的な表現方法と具体例をご紹介します。

①文字クラス
[](角括弧またはブラケット)で囲まれている部分で1文字の集合を表し、指定文字のどれかになります。
文字クラスの先頭で「^」が使用されると、それ以外という意味になります。 たとえば、[abc]は「abcのどれか」で、[^abc]は「abc以外の文字」という意味になります。

②グループ化
()(丸括弧)で囲まれている部分で、パターンマッチが成功した場合に最初に文字列として処理されます。
また、Perlなどの言語では複数の()で囲まれた部分を文字列として、$1~$nの変数に順番に代入してフィールドを切り出すことできます。

③正規表現の特殊文字(メタ文字)
全て半角で、主なものの意味は次の通りです。それ自体を普通の文字として扱う場合はその前に「\」(キーボードではバックスラッシュ)を置きます(これを「エスケープする」と言います)。

.  改行以外の文字
^  文字列の先頭
$  文字列の末尾
|  区切られた文字列のいずれか
?  0個または1個
+  1個以上
*  0個以上
{m} m個
{m,n} m個以上n個以下

④正規表現の基本表現
数字   [0-9]
数字以外 [^0-9]
英字   [a-zA-Z]
英小文字 [a-z]
英大文字 [A-Z]
英数字  [0-9a-zA-Z]
タブ文字 \t
改行文字 \n
文字列  .*

⑤正規表現の例
正規表現の記述方法は何通りもありますが、できるだけ分かりやすくシンプルにすることが大切です。
あまり凝り過ぎると、システム環境により違った動作をしたり、作成者自身でさえ分からなくなったりということになりかねません。

【Apache Webアクセスログ】サンプルログと正規表現の一例とその解説

このログフォーマットの一番の特長は「HTTP」という文字列が含まれていることです。先ずは、こうしたログデータ全体の特長を捉えることから始めて、一行の詳細内容を記述していきます。

192.168.1.1 – – [28/Feb/2014:03:15:54 +0900] “GET /support/customerportal/index.php HTTP/1.1” 200 124 “http://www.jtc-i.co.jp/index.html” “Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/7.0)” “-“

^[^ ]* [^ ]* .* \[../…/….:..:..:…*\] \”[A-Z]* [^ ]* HTTP.*\” [0-9]* [-0-9]* [^ ]* \”.*\” [^ ]* *$

(先頭に)空白以外が0個以上 空白以外が0個以上 改行以外が0個以上
[改行以外が2文字/改行以外が3文字/改行以外が4文字:
改行以外が2文字:改行以外が2文字:改行以外が2文字
改行以外が0個以上]
“英大文字が0個以上 空白以外が0個以上 HTTP改行以外が0個以上”
数字が0個以上 –または数字が0個以上 空白以外が0個以上 “改行以外が0個以上”
空白以外が0個以上 空白が0個以上(末尾)

※「[^ ]」という表現がよく出てきますが、「空白以外の文字」を意味し、あまり限定したくない場合に使うと便利です。

付録1. 参考文献

1. 鶴長鎮一(2011)『rsyslog 実践ログ管理入門』技術評論社
2. 木本裕紀(2012)『もっと自在にサーバを使い倒す 業務に役立つPerl』技術評論社
3. 辻 秀典・渡辺高志&できるシリーズ編集部(2013)『できるPRO CentOS 6 サーバー』株式会社インプレスジャパン.