2020年1月24日金曜日

syslog-ng Store Box大活用連載企画第5回「Ciscoスイッチ、FortigateファイアウォールログをSSBで受信!よりログを検索しやすく」


SSB 検索画面
ジュピターテクノロジー株式会社のブログへようこそ!本連載記事の執筆者螺子(ネジ)です。

syslog-ng Store Box大活用連載企画と題して連載ブログをアップしています。今回は、Ciscoスイッチのログ、FortigateファイアウォールのログをSSBで受信してみます。受信したログメッセージを検索しやすくするのに利用できるSSBの機能についても紹介します。

これまでの、煩雑だったログ検索の不満が解消できるかもしれませんよ。



Ciscoスイッチログの受信

まずは、CiscoスイッチのシステムメッセージをSSBに送信します。loggingコマンドを使用してsyslogサーバーを設定します。デフォルトでは、UDPプロトコル 514ポートを使用してシステムメッセージをsyslogサーバーに送信します。詳細については、ご使用中のCisco製品のドキュメントを参照してください。

#configure terminal
(config)#logging 192.168.91.127 <- SSBのIPアドレスを指定
(config)#end
#copy running-config startup-config
Destination filename [startup-config]?
Building configuration...
[OK]
図1 loggingコマンド例

SSBで受信したログを閲覧してみます。Ciscoスイッチのシステムログメッセージは以下のフォーマットで表されます。
seq no:timestamp: %facility-severity-MNEMONIC:description
図2 Ciscoスイッチログフォーマット例

Ciscoシステムログメッセージは、BSD-syslog メッセージフォーマットに準拠していません。そのため、SSBはsyslogメッセージを正しく処理できず[Program]カラムにシーケンス番号(seq no)が入力されています。
図3 Ciscoスイッチログ受信例

Ciscoスイッチログを[Do not parse]で受信

このように、不正なログメッセージは正しく出力されないばかりか、SSBのパフォーマンスなどに影響します。場合によってはsyslogメッセージを受信できずにログロストが発生します。この場合、ログソース([Log]>[Sources])の[Incoming log protocol and message format]セクションの[Do not parse]を有効にします。詳細については、過去記事「syslog-ng Store Box(SSB) 不正なログメッセージへの対処法」を参照してください。

図4 [Do not parse]有効例

[Do not parse]を有効にすると、受信したsyslogメッセージ全体をMESSAGE部として扱います。以下のようにCiscoスイッチによって送信されたsyslogメッセージ全体が[Message]カラムに入力されます。ただし、ファシリティ([Facility]カラム)とセベリティ([Priority]カラム)は、SSBによって任意の値が入力されます。
図5 Ciscoスイッチログ受信([Do not parse])例

Fortigateファイアウォールログの受信

次に、FortigateファイアウォールのログメッセージをSSBに送信します。管理画面にアクセスして、[ログ&レポート]>[ログ環境設定]>[ログ設定]で、[リモートSyslogサーバ設定]にチェックを入れて、SSBのIPアドレスを入力します。詳細については、ご使用中のfotigate製品のドキュメントを参照してください。

図6 Fortigateログ送信設定例

Fortigateファイアウォールのログも、[Program]カラムに不正な値が入っています。
図7 Fortigateファイアウォールログ受信例

Fortigateファイアウォールログを[Do not parse]で受信

Ciscoスイッチログの受信と同じように、[Do not parse]を有効にします。以下のようにFortigateのsyslogメッセージ全体が[Message]カラムに入力されます。ただし、ファシリティ([Facility]カラム)とセベリティ([Priority]カラム)は、SSBによって任意の値が入力されます。

図8 Fortigateファイアウォールログ受信([Do not parse])例

さて、FortigateファイアウォールのログはCiscoスイッチのログに比べて、複雑なようです。ログの詳細を見るにはリスト右側のをクリックします。

図9 SSBログの詳細表示と反転例(その1)

Fortigateファイアウォールログのフォーマットについては、お手持ちのドキュメントを見てもらうこととして、ここでは、特定のソースから特定のディスティネーションのログを検索してみましょう。

ご存知の方もいると思いますが、メッセージ部分の検索したい文字列の上にマウスを置くと、その文字列の色が反転(上の図では"192.168.10.20")します。そこで、クリックすると[Search expression]フィールドに、その文字列が入力されます。(検索ページについては、「syslog-ng Store Box(SSB)のログ閲覧・検索」も参照してください。)

以下は、メッセージの"src"、"192.168.10.20"、"dst"、"192.168.93.203"の箇所にマウスを置き、クリックした例になります。

図10 検索式例(その1)

これで、メッセージ部分に"src"、"192.168.10.20"、"dst"、"192.168.93.203"が含まれているメッセージを検索することができます。

しかし、これでは以下のようなソースとディスティネーションが逆のメッセージも検索されてしまいます。

...src=192.168.93.203 src_port=10895 src_int="wan1" dst=192.168.10.20 dst_port=7680...
図11 Fortigateメッセージ例(ソースとディスティネーション)

文字列が"src=192.168.10.20"と"dst=192.168.93.203"のように検索できればいいのですが...

まてよ、SSBは、なぜ上記のように"src"、"192.168.10.20"、"dst"、"192.168.93.203"と分けて文字列を検索できるのだろう?

Fortigateファイアウォールログを区切り文字を変更して受信

そうです、SSBはメッセージを検索できる単語(トークン)に分けるために区切り文字を使用しています。デフォルトでは、以下の区切り文字がログスペース([Log]>[Logspaces]の[Indexed fields]セクションの[Delimiters]フィールド)ごとに設定されています。

:&~?![]=,;()'"
図12 デフォルトの区切り文字

図13 [Log]>[Logspaces]>[Indexed fields]>[Delimiters]フィールド

例えば、ログメッセージにMACアドレスが含まれていて特定のMACアドレスを含むメッセージを検索できるようにするには、区切り文字のリストからコロン(':')を削除します。

ここでは、以下のように変更してログを受信します。(コロン(':')、イコール('=')、ダブルクォーテーション('"')を削除しています。)

&~?![],;()'
図14 区切り文字の変更例

メッセージの文字列"src=192.168.10.20"箇所にマウスを置くと、"src=192.168.10.20"が反転され、クリックするとイコール('=')を含む"src=192.168.10.20"が[Search expression]フィールドに入力されます。"dst=192.168.93.203"についても同様に行えます。

図15 反転例(その2)

図16 検索式例(その2)

これで、ソースIPアドレスが"192.168.10.20"、ディスティネーションIPアドレスが"192.168.10.20"の単一方向のみのログが検索できるようになりました。

区切り文字([Delimiters]フィールド)の設定は、[Commit]後、すぐに適用されます。つまり、[Commit]後に受信されたログに対して設定が有効になります。ただし、設定変更前のログに対して、"src=192.168.10.20"あるいは"dst=192.168.93.203"の検索はヒットしません。なぜなら、設定変更前でトークン(検索文字列の最小文字列)が"src", "192.168.10.20", "dst", "192.168.93.203"に分割されているため、"src=192.168.10.20"などとは一致しないからです。


Fortigateファイアウォールログをkey=valueパーサーを使用して受信

さて、Fortigateのログはイコール('=')を挟んで、名前(key)=値(value)(例:"src=192.168.10.20")というペアになっています。SSBは、これらペアを分割してカラムと値に表示することが可能です。

これを行うには、[Log]>[Parsers]ページで、ペアになっているkey-valueペアのパーサーを設定します。以下の例では、区切り文字([Value separator character]フィールド)にイコール('=')、カラム名を重複しないようにするために、[Namespace]フィールドに"fg"を入力しています。

図17 パーサー設定例

次に、[Log]>[Paths]の[Parser]フィールドで、上述で設定したkey-valueペアパーサーを適用します。

図18 パスのパーサー適用例

ログを再度、閲覧してみましょう。
特に変わった表示はないようですが、[Customize colums]をクリックしてください。

図19 [Customize colums]ボタン

[Available dynamic columns]セクションに、key-valueペア部分の名前(key)がカラム名としてリスト表示されます。ここで、リストから".sdata.fg.src"と".sdata.fg.dst"を選択して、ログ一覧のリストにカラムを表示します。key-valueパーサーで作成されたカラムを動的カラムと言います。

図20 カラム設定画面

ログ一覧に独立したカラムとして表示されます。ソースIPとディスティネーションIPが一目でわかるようになりました。

図21 動的カラムの表示例

この独立したカラムについても、[Search expression]フィールドで検索式を入力することができます。

図22 動的カラムの検索例

ただし、以下のようにnvpairプレフィックスを使用して、key-valueパーサーで設定した[Namespace].名前(key)=値と指定します。

nvpair:.sdata.fg.src=192.168.10.20 nvpair:.sdata.fg.dst=192.168.93.203
図23 動的カラムの検索式

特定のソースとディスティネーションのみのログを検索できます。

図24 動的カラムを使用した検索結果例

key=valueパーサーの設定は、[Commit]後、すぐに適用されます。つまり、[Commit]後に受信されたログに対して設定が有効になります。区切り文字([Delimiters]フィールド)の設定した文字も利用できます。また、区切り文字はkey=valueパーサー処理された文字列(value文字列)には適用されません。例えば、コロン(".")が区切り文字に含まれていた場合でも、value文字列のIPアドレス(例: "192.168.93.203")は区切り文字で分割されません。


まとめ


いかがでしたでしょうか?今回キーとなるSSBのオプションを以下にまとめました。

Do not parse
syslogメッセージ全体をMessage部として受信します。
Delimiters
区切り文字を設定します。SSBは区切り文字は使用して検索する単語を分けています。
Parses
メッセージ部のkey=valueに対応した部分をカラムと値にすることができます。

[Do not parse]、区切り文字([Delimiters])の変更、あるいはkey=valueパーサー([Parses])機能を使うことでログの検索が格段にしやすくなったのではないでしょうか?

受信したログのフォーマットに応じて各機能を使い分けて、煩雑なログ検索を解消してください。


SSBは、高信頼ログ管理アプライアンスです。様々なデバイスおよびアプリケーションからログメッセージを収集、分類、フィルタリング、正規化して安全に保存可能です。ログデータの信頼性を担保し、膨大なログが発生する高負荷環境、あるいはログロストが許されない企業・組織のログ管理に最適です。


syslog-ng Store Boxについての詳細は、製品紹介ページ・製品ガイドをご参照ください。


評価版のダウンロード

問合わせ