じゅのぶろ

社内SEが自宅でSOC/CSIRTするために色々頑張っていきたいブログ 画像が見れない場合はjavascriptを有効にするかデスクトップからご覧下さい。

Splunkで正規表現を使ったフィールド抽出

前回Squidアクセスログを取り込んだが、Requestフィールドにメソッド、URL、HTTPバージョンが含まれています。
今回はこれらの値を複数に分割していきます。
前記事の続きです。

f:id:jnox:20190710215613p:plain

GUIの設定からポチポチしてフィールド抽出が可能ですが、今回はrexコマンドを使って設定を用意し、confファイルに設定を反映させる方法を紹介します。 REPORTとTRASNFORMSを使います。

rexコマンド

正規表現でフィールド抽出を行えるコマンド。
コマンドのシンタックスは以下の通り( rex - Splunk Documentation

rex [field=<field>] ( <regex-expression> [max_match=<int>] [offset_field=<string>] ) | (mode=sed <sed-expression>)

※今回は紹介しないがmode=sedはフィールド切り出しではなく、sed expressionを利用できます。

具体的には以下のように使います。

index="squid"
| rex field=Request "(?<method>\S+)\s(?<url>\S+)\sHTTP/(?<http_ver>\d\.\d)"

これはRequestフィールドから正規表現 "(?<method>\S+)\s(?<url>\S+)\sHTTP/(?<http_ver>\d\.\d)"でフィールド抽出するコマンドになります。 この結果として以下の画像のようにmethod, url, http_verのフィールドが抽出されます。 f:id:jnox:20190710223353p:plain

毎回このコマンドを打つのは億劫なので、このフィールド抽出設定をconfファイルに反映させます。
このコマンドは正規表現が思ったとおりに動くかを確認するために使うといいと思います。

confの設定

今回設定すべきはprops.confとtransforms.confです。
system全体/app内/ユーザのみのに設定を適用するかでconfファイルの場所が変わります。

# systemに設定を適用
/opt/splunk/etc/system/local/props.conf 
/opt/splunk/etc/system/local/transforms.conf 
# appに設定を適用
/opt/splunk/etc/apps/<app名>/local/props.conf
/opt/splunk/etc/apps/<app名>/local/transforms.conf
# userに設定を適用
/opt/splunk/etc/users/<ユーザ名>/<app名>/local/props.conf
/opt/splunk/etc/users/<ユーザ名>/<app名>/local/transforms.conf

※confファイルの読み込み順序(画像元

今回はsystemに設定を反映させます。
取り込み時に設定したフィールド設定もsystemのconfに記載されています。
transforms.confにフィールド抽出設定を記載し、
props.confでどのindex/source/sourcetypeにフィールド抽出設定を適用するか記載するイメージです。
以下の設定は先程サーチでフィールド抽出できることを確認した正規表現をtransformsに書き、
mysquidソースタイプに適用したものです。

transforms.conf

書き方はこちら

root@kali# vi /opt/splunk/etc/system/local/transforms.conf
[TRANSFORMS-Request]
REGEX = (?<method>\S+)\s(?<url>\S+)\sHTTP/(?<http_ver>\d\.\d)
SOURCE_KEY = Request
#ついでに以下も設定しました。
[TRANSFORMS-url]
REGEX = (?:https?://)?(?<domain>[^/\:]+)(?:\:\d+)?(?<url_path>/[^\?]*)?(?<url_query>\+)?
SOURCE_KEY = url

props.conf

書き方はこちら

root@kali# vi /opt/splunk/etc/system/local/props.conf
[mysquid]
DATETIME_CONFIG = 
FIELD_DELIMITER = space
FIELD_NAMES = ,src_ip,request_size,dest_ip,reply_size,dest_port,content_type,Request,status_code,referer,user_agent,squid_status,ssl_cert_subject, ssl_cert_issuer, ssl_hello_version
INDEXED_EXTRACTIONS = csv
KV_MODE = none
LINE_BREAKER = ([\r\n]+)
NO_BINARY_CHECK = true
SHOULD_LINEMERGE = false
category = Structured
description = Comma-separated value format. Set header and other settings in "Delimited Settings"
disabled = false
pulldown_type = true
## ~~~~ ここから追記~~~~
REPORT-Request = TRANSFORMS-Request
REPORT-Z_url = TRANSFORMS-url

REPORT-Z_urlとしたのはフィールド抽出の順番を意識しているためです。
アルファベット順で実行されるためRequest → Z_urlの順番で処理されます。
逆だとTRASNFORMS-urlが抽出されませんので要注意です。
再起動したら設定が反映されているはずです。 再起動は以下コマンドかリンクから。

splunk@kali$ /opt/splunk/bin/splunk restart
または「http://splunkserver:8000/en-US/manager/search/control」から再起動をクリック

再起動後はこんな感じでrex使わなくてもフィールド抽出ができているはずです。 f:id:jnox:20190710235151p:plain

正規表現は吟味して書いていないので間違いやこうしたほうがいい等あればご指摘お願いします。

おまけ

conf等をまとめてgithubにアップロードしました。

github.com