フリーテキスト解析言語
フリーテキスト解析言語は、入力文字列を解析し、情報を取り出し、ログフィールドを定義することができます。ログフィールドは、ログサーバのCheck Pointログの一部として表示されます。また、イベントの定義として使用されます。各解析ファイルにはコマンドのツリーが含まれています。各コマンドで入力文字列の一部を確認または解析し(結果としてログにフィールドを追加する場合もあります)、文字列の解析を続けるかどうか判断します(実行の成功/失敗に基づきます)。
コマンド
各コマンドは以下のパートから成ります。
-
cmd_name
- コマンドの名前。 -
command arguments
- コマンドの動作を定義する引数。 -
on_success
(オプション) - 現行コマンドの実行が成功した時に実行される次のコマンド。 -
on_fail
(オプション) - 現行コマンドの実行が失敗した時に実行される次のコマンド。
サンプル
|
Try
try
コマンドは、入力文字列に対して正規表現を一致させます。
'Try'コマンドパラメータ
引数 |
内容 |
---|---|
|
|
|
一致させる正規表現。 |
|
1つ以上のフィールドを結果に追加します(正規表現が成功した場合のみ)。 |

|
上記の例では、ログ全体(parse_from (start_position)
- ログの最初から解析)を見る正規表現 "([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)
" を一致させようとしています。正規表現が一致すると、ソースフィールドが追加されます。
Group_try
コマンドgroup_try
は、以下のモードで1つ以上のコマンドを実行します。
-
"
try_all
"は、グループのすべてのコマンドを実行し、コマンドのリターンコードは無視します。 -
"
try_all_successively
"は、グループのすべてのコマンドを実行し、コマンドのリターンコードは無視します。各コマンドは前回成功したコマンドの最後の場所から実行します。
-
"
try_until_success
"は、いずれかが成功するまですべてのコマンドを実行し続けます。 -
"
try_until_fail
"は、いずれかが失敗するまですべてのコマンドを実行し続けます。
コマンド"group_try
"は、取り出したい多くのフィールドを含むログのフリーテキスト部分を解析するときに通常使われます。
例:
%PIX-6-605004:Login denied from 194.29.40.24/4813 to outside:192.168.35.15/ssh for user 'root'
ログのこのセクションを見ると、このストラクチャを使用できます。

|
この例では、"group_try
"の最初のtryコマンド(発信元対象)が実行されます。
発信元、宛先、ユーザがsyslogで特定のシーケンスにない場合は、"try_all_successively
"ではなく"try_all
"モードを使用します。

lこの例では、異なるコマンドの正規表現が特定のログと一致しようとします。
多くてもgroup_try
ブロックの1つのコマンドが成功します。
1つが成功すると、それ以外を検査する必要はなくなります。
|
注 - 新しいデバイスを追加すると、解析ファイルの最初の"try
"コマンドは"try_until_success
"パラメータを使用する必要があります。
|
Switch
このコマンドにより、事前定義された一定値のリストに対して特定フィールドの結果を比較できるようになります。
'Switch'コマンドパラメータ
パラメータ |
内容 |
---|---|
パラメータ |
内容 |
|
値が検査されるフィールド名。 |
|
1つ以上のcase属性に、比較する値が続きます。 |
|
関連するcaseが利用できない場合のみ実行。デフォルト値はオプションです。 |

|
Unconditional_try
このコマンドは"空の"コマンドで、条件なしで結果にフィールドを追加することができます。

|
Unconditional_try
は、通用switchコマンドと共に使われます。

この例では、各メッセージIDが、付随する"message
"フィールド(意味を示すフィールド)にアタッチされます。
|
Include
このコマンドにより、新しい解析ファイルを含むことができます。
|
フルパスと含まれるファイルの名前。 |

|
Add_field
各"add_field
"にはいくつかのパラメータがあります。
-
Type - "
add_field
"コマンドのタイプ。このパラメータは次のいずれかの値になります。-
Index - 正規表現の一部がフィールドとして取り出されます。"
field_index
"の値はどのパートが取り出されるかを示します("field_index
"の箇所を参照)。 -
Const - 正規表現から取り出された情報に依存しない値を持つ、不変のフィールドを追加します。
field_value
の箇所を参照してください。
-
-
field_name - 新しいフィールドの名前。
一部のフィールドには、一致するカラムがSmartConsole > ログ&モニタリング > ログにあります。
この表には、ログ&モニタリング > ログカラムで表示されるフィールドの名前が表されています(他の追加フィールドが表示される情報フィールドではない):
与えられるフィールド名
ログ&モニタリング > ログのカラム
Src
発信元
Dst
宛先
proto
プロトコル
s_port
ソースポート
product
製品
service
サービス(解決済みにポート
とプロトコルが含まれる場合)
Action
アクション
ifname
インタフェース
User
ユーザ
上記のフィールドにそれぞれ名前を付けると、ログ&モニタリング > ログの正しいカラムの位置に移動します。
これにより、カラムでのあらゆるフィルタリングの対象にすることができます。これらのフィールド名は、既存のイベント定義に自動的に加わります。
-
field_type - ログのフィールドのタイプ。
可能なフィールドタイプは、以下の表のとおりです。
フィールドタイプ
コメント
int
uint
string
ipaddr
SrcとDstフィールドで使用するIPアドレス。
pri
ファシリティとsyslogの重要度。
timestmp
syslogの日付と時刻。フォーマットは'Oct 10 2019 15:05:00'。
time
フォーマットは'15:05:00'。
string_id
文字列のより効率的な使用法。このフィールドに使用可能な値が有限な場合に使用。
action
アクションは、drop、reject、accept、encrypt、decrypt、vpnroute、keyinst、authorize、deauthorize、authcrypt、defaultがあります。
ifdir
0 - 受信
1 - 発信
ifname
インタフェース名("ifname"フィールドで使用)。
protocol
フィールド名は"proto"になります。
port
"service"には"s_port"または"port"フィールドとなります。
このテーブルのフィールド名のフィールドタイプは以下のようになります。
フィールド名
フィールドタイプ
Src
ipaddr
Dst
ipaddr
proto
protocol
s_port
port
service
port
Action
action
ifname
ifname
-
field_indexまたはfield_value - 使われるパラメータは"
type
"フィールドの値に基づきます。-
"
type
"フィールドがindexの場合、"field_index
"が表示されます。 -
"
type
"フィールドがconstの場合は"field_value
"が表示されます。
"
field_index
"には、パターンのグループ化に従って正規表現のどの部分が取り出されるかが表わされます。グループ化するには、特定の表現を括弧で記します。
この表現では、"
field_index
"の数字はパターンが考慮される括弧の数字を示します。'Add_field'コマンド - サンプル1
:command (
:cmd_name (try)
:parse_from (last_position)
:regexp ("Failed password for ([a-zA-Z0-9]+) from ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+) port ([0-9]+)")
:add_field (
:type (index)
:field_name (User)
:field_type (string)
:field_index (1)
)
:add_field (
:type (index)
:field_name (Src)
:field_type (ipaddr)
:field_index (2)
)
:add_field (
:type (index)
:field_name (port)
:field_type (port)
:field_index (3)
)
)ユーザのパターンである"
[a-zA-Z0-9]+
"は、最初の括弧に位置します。そのため、"field_index
"は1になります。発信元アドレスのパターンである"
[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+
"は、2番目の括弧に位置します。このインデックスは2になります。ポートのパターンは、3番目の括弧に位置します。
各解析正規表現の括弧の最大数は9です。
正規表現から9要素より多く取り出す場合は、表現を2つに分けます。
最初の正規表現には1番目の括弧が含まれます。
残りの正規表現は"
on_success
"にあります。:command (
:cmd_name (try)
:parse_from (start_position)
:regexp ("access-list (.*) (permitted|denied|est-allowed) ([a-zA-Z0-9_\([a-zA-Z0-9_\\.[0-9]+\.[0-9]+\.[0-9]+)\(([0-9]*)\) -> "))
:add_field (
:type (index)
:field_name (listID)
:field_type (string)
:field_index (1)
)
:add_field (
:type (index)
:field_name (action)
:field_type (action)
:field_index (2)
)
:add_field (
:type (index)
:field_name (proto)
:field_type (protocol)
:field_index (3)
)
:add_field (
:type (index)
:field_name (ifname)
:field_type (ifname)
:field_index (4)
)
:add_field (
:type (index)
:field_name (Src)
:field_type (ipaddr)
:field_index (5)
)
:on_success (
:command (
:cmd_name (try)
:parse_from (last_position)
:regexp ("([a-zA-Z0-9_\\.[0-9]+\.[0-9]+\.[0-9]+)\(([0-9]*)\) hit-cnt ([0-9]+) ")
:add_field (
:type (index)
:field_name (destination_interface)
:field_type (string)
:field_index (1)
)
)
)
)'Add_field'コマンド - サンプル2
"
field_value
"は追加される定数の値です。:command (
:cmd_name (try)
:parse_from (last_position)
:regexp ("%PIX-([0-9])-([0-9]*)"))
:add_field (
:type (const)
:field_name (product)
:field_type (string_id)
:field_value ("CISCO PIX")
)
) -
-
dict_nameは、値を変換するために使用するディクショナリ(辞書)の名前です。名前が辞書に見つからない場合は値が結果になります。
フリーテキストパーサーで、辞書を使ってログから値を変換できます。これらは、異なるデバイスからのログで、同じ意味を持つ値を共通の値に変換し、イベント定義に使用するために利用します。
辞書ファイルはそれぞれ
.ini
ファイルとして定義されます。.ini
ファイルでは、セクション名は辞書名で値は辞書の値です(各辞書に1つ以上のセクションを含むことが可能)。[dictionary_name]
Name1 = val1
Name2 = val2
[cisco_action] [3com_action]
permitted = accept Permit = accept
denied = reject Deny = reject
'Add_field'コマンド - サンプル3
:command (
:cmd_name (try)
:parse_from (start_position)
:regexp ("list (.*) (permitted|denied) (icmp) ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+) -> ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).* packet")
:add_field (
:type (index)
:field_name (action)
:field_type (action)
:field_index (2)
:dict_name (cisco_action)
)
)