CSE - Custom Parser作成方法
Continus Intelligence Platform(CIP)に取り込んだログメッセージをCloud SIEM Enterprise(CSE)に転送するには、Parsingと呼ばれる作業が必要です。 Parsingとは、ログメッセージをCSEが理解できる形式であるレコードに変換することです。
Parsing方法は、Log Parsing and Mapping方法の概要で説明したように、Parserを利用する方法(Parserがない場合は新規作成)またはFER(Field Extraction Rule)を作成して利用する方法があります。 ここでは、Parserを作成する方法を例と一緒にご紹介します。
Parserの仕組み
Parserは、次のように構成されます。
- Parserのフォーマットを指定する部分(parser)
- 使用するマッピングに関する情報を設定する部分 (MAPPER)
- ログメッセージからCSEに送信するフィールドと値を抽出する作業を行う部分 (transform)
[parser]
… main logic …
MAPPER:vendor = AWS
MAPPER:product = CloudTrail
MAPPER:event_id = {{eventType}}-{{eventName}}
[transform:<NAME>]
… other logic …
それでは、仕組みについてもう少し詳しく見てみましょう。
[parser] 部分ではキーと値を分割する方法、つまりフォーマットを指定します。 ログフォーマットに応じて、JSON、CSV、REGEXなどを使用できます。
MAPPER部分では、使用するログマッピング情報を設定します。上記のようにvendor、product、event_idを設定してください。この3つは必須項目です。event_id毎にログマッピングを作成して使用することもできます。
次に[transform:<NAME>]部分を設定します。Transformはログメッセージから値を抽出するために使用されます。例えば、正規表現を使用して、必要な値を抽出してフィールドに割り当てたり、抽出したフィールドを削除、フィールド名変更などを行うことができます。
さらに、Transformは他のTransformを呼び出すことができます(プログラミングのSub関数に似ています)。 特に、1つのログソースに収集されるログフォーマットが異なる場合は、各ログフォーマットに合ったTransformを呼び出す操作を行うことができます。
それでは具体的な例を見てみましょう。
ケース 1. アプリケーションログ
下記のsyslogログをCSEに送信するためのParserを作成しましょう。
2022/10/17 08:53:46,T9876553,test_user_id3,192.168.1.1,80,2,2,処理2,100,Mozilla/5.0 (Windows NT 10.0; WOW64)
#Parser
[parser]
FORMAT = REGEX
REGEX = ^(?<syslog_timestamp>[\d\/\s:]+),(?<syslog_message>.*)
#Set Time
START_TIME_FIELD = _messageTime
TIME_PARSER = X1
DROP:Timestamp = True
#Process log message
TRANSFORM:syslog_message = parse_syslog_message
DROP:syslog_message = true
#Set mapper information
MAPPER:vendor = Auth-Application
MAPPER:product = Application-log
MAPPER:event_id = {{result}}
#Transform
[transform:parse_syslog_message]
REGEX = ^(?<soc_code>\S*),(?<user_id>\S*),(?<src_ip>\S*),(?<src_port>\S*),(?<result>[1|2]),(?<failure_reason>\d*),(?<description>\S*),(?<point>\S*),(?<http_agent>.*)
- #Parser:Parsingするログの形式を指定します。その後、syslogタイムスタンプとsyslogメッセージをそれぞれ抽出します。
- #Set Time:ログに使用するタイムスタンプを設定します。ログの messageTime (ログが作成された時間) をログのタイムスタンプとして設定します。元のタイムスタンプは使用しないため、Dropします。
- #Process log message:Parser部分から抽出したsyslog_messageをparse_syslog_messageというTransformに送ります。syslog_messageは不要であるため、Dropします。
- #Set mapper information:使用するLog Mappingを設定します。event_idにはresultフィールドの値を割り当てます。
- #Transform:parse_syslog_messageというTransformを設定し、syslog_messageを正規表現を使用して抽出します。
これによりCIPに取り込まれたログがCSEに送信されます。
ケース 2. ファイアウォールログ
次のようなファイアウォールログがあるとしましょう。
Dec 16 21:36:42 fw-101 siteguard[65480]: 2022-12-16 21:36:42 : 1671194202.230107 0 1.1.1.1 TCP_MISS/000 0 GET http://www.aaa.com/WAF-TEST-SIGNATURE - DIRECT/192.168.1.1 - DETECT-STAT:WAF:RULE_SIG/PART_PATH//OFFICIAL/94001001/url-waf-test-1::/WAF-TEST-SIGNATURE:: ACTION:BLOCK: JUDGE:BLOCK:0: SEARCH-KEY:1671194202.230107.36:
しかし、このParserには追加要件があります。次の部分をdetect_nameというフィールドとして抽出し、最後のスラッシュ(/)以降の部分(url-waf-test-1)をsignatureというフィールドに割り当てる必要があります。
RULE_SIG/PART_PATH//OFFICIAL/94001001/url-waf-test-1
それでは作成したParserを見てみましょう。
[Parser]
FORMAT = REGEX
REGEX = (?<syslog_timestamp>\w+\s{1,2}\d+\s\S+)(?<syslog_message>.*)
# Set Time
START_TIME_FIELD = _messageTime
TIME_PARSER = X1
DROP:Timestamp = True
#Process log message
TRANSFORM:syslog_message = parse_syslog_message
DROP:syslog_message = true
#Set mapper information
MAPPER:vendor = Secure
MAPPER:product = Firewall1
MAPPER:event_id = {{result}}
[transform:parse_syslog_message]
REGEX = (?<device_hostname>\w+).*:\s(?<timestamp>[\d-]+\s[\d:]+)\s:\s(?<epoch_timestamp>\d{10}.\d{6}).*\d\s(?<src_ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s(?<result>\S*)\s(?<filesize>\d*)\s(?<http_method>\w*)\s(?<url>\S*)\s(?<username>\S*).*\/(?<device_ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s(?<content_type>\S*)\sDETECT-STAT:WAF:(?<detect_name>\S*):(?<detect_type>\S*):(?<detect_string>\S*):(?<detect_string_full>\S*):\sACTION:(?<action>\S+)\sJUDGE:(?<judge_result>\w+):(?<monitor_config>\d):\sSEARCH-KEY:(?<search_key>\S+):
SET:signature = {{detect_name}}
FIND_REPLACE:signature: = ^(?:.*[~\/])
ケース 1のParserと非常に似ていますが、detect_nameフィールドとして抽出した値から最後の部分をsignatureというフィールドとして抽出する処理が追加されました(最後の2行)。
このようにCustom Parserを作成することで、要件に合ったParsingが可能となります。Parsing構文の詳細については、Parsing Language Reference Guideを参照してください。また、他のOOTB Parserの中身を参照することでCustom Parser作成の役に立ちます。
以上、Custom Parser作成方法について説明しました。次回は Log Mapping作成方法とそのヒントについてご紹介したいと思います。
では、Happy Sumo!
Please sign in to leave a comment.
Comments
0 comments