Splunkで正規表現を使ったフィールド抽出
前回Squidのアクセスログを取り込んだが、Requestフィールドにメソッド、URL、HTTPバージョンが含まれています。
今回はこれらの値を複数に分割していきます。
※前記事の続きです。
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のフィールドが抽出されます。
毎回このコマンドを打つのは億劫なので、このフィールド抽出設定を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使わなくてもフィールド抽出ができているはずです。
正規表現は吟味して書いていないので間違いやこうしたほうがいい等あればご指摘お願いします。
おまけ
conf等をまとめてgithubにアップロードしました。