公開:2022.01.24 10:00 | 更新: 2022.04.20 04:33
本記事はSplunkを既に利用中またはSplunkを学習中の方向けの内容となっています。
今回はFortiGate用のAdd-Onを対象に説明しますのでsplunkbaseからダウンロードします。
(本記事では最新版のversion1.6.7をダウンロードします)
Fortinet FortiGate Add-On for Splunk | Splunkbase
適当なところにダウンロードしたAdd-Onを解凍します。今回見るのはdefault配下にある以下のファイルです。
transforms.conf
props.conf
ログを見ながら確認したい方はsamplesフォルダにサンプルデータがありますので合わせて確認できます。
今回はtrafficログを対象に説明しますので「sample.ftnt_fortigate_traffic」を確認ください。
Splunk_TA_fortinet_fortigate\samples
実際にファイルを見ていきたいのですが、その前にステップ1のリンク先にあるDetailsを確認すると以下の文言が見つかります。
原文:
Fortinet FortiGate Add-On for Splunk will by default automatically extractFortiGate log data from inputs with sourcetype 'fortigate_log'.
翻訳結果:
Splunk用のフォーティネットFortiGateアドオンは、デフォルトで、ソースタイプが「fortigate_log」の入力からFortiGateログデータを自動的に抽出します。
小難しく書かれていますが、
このAdd-Onを利用してFortiGateのログデータ(syslog)を取り込む場合はソースタイプを「fortigate_log」に設定する。
と解釈してください。
まずはprops.confを確認します。
何やら色々と書かれていますが、1行目の[]で囲まれている部分は「スタンザ」と呼ばれる設定名となります。そして、その下に続くのが実際の設定値となりkey=valueの形式で設定されています。
まず1行目ですが、Step3で確認したソースタイプと同じ名前が指定されていますので、ログを収集する際にソースタイプとして「fortigate_log」を指定すると、2~4行目の設定が反映されることを意味しています。
[fortigate_log]
TRANSFORMS-force_sourcetype_fortigate = force_sourcetype_fortigate
SHOULD_LINEMERGE = false
EVENT_BREAKER_ENABLE = true
2行目は、TRANSFORMS-xxxxx = yyyyyと設定されています。xxxxxの部分は識別子となる一意のリテラル文字なので特に説明はしません。yyyyyの部分はtransforms.confで指定されているスタンザ名を指しています。そのため、transforms.confを参照する必要があります。(後ほど見ます)
TRANSFORMS-force_sourcetype_fortigate = force_sourcetype_fortigate
3行目は、複数行のデータを1つにまとめるか否かの設定となりますが、FortiGateでは1行1ログとなるためfalseが設定されています。
SHOULD_LINEMERGE = false
4行目は、Universal ForwarderがIndexerへのログ転送時にイベント(ログ)の分散を改善するか否かとなりますが、今回はどちらでも良いのでスルーします。
EVENT_BREAKER_ENABLE = true
props.confで設定されていたTRANSFORMS-force_sourcetype_fortigateの設定を確認するためtransforms.confを確認します。
2行目にTRANSFORMS-xxxxxの設定値と同じ「force_sourcetype_fortigate」があります。props.confと同様に[]で囲まれている部分はスタンザと呼ばれる設定名となるので3~6行目が設定値となります。
[force_sourcetype_fortigate]
SOURCE_KEY = rawDEST_KEY = MetaData:Sourcetype
REGEX = ^.+?devid=\"?F(?:G|W|\dK).+?(?:\s|\,|\,\s)type=\"?(traffic|utm|event|anomaly)
FORMAT = sourcetype::fortigate$1
3~6行目の設定には関連性があるため、3 -> 5 -> 6 > 4の順番で確認します。
3行目は、SOURCE_KEYとして「_raw」が設定されていますので、生ログ(加工前の純粋なログデータ)がREGEXの対象となることを示しています。
SOURCE_KEY = _raw
5行目は、3行目で指定されたデータ(今回は_rawなので生ログ)に適用するREGEXが設定されています。正規表現の細かい説明は割愛しますが、fortigateのログの中でtraffic、utm、event、anomalyのログを対象にしていることが分かります。
REGEX = ^.+?devid=\"?F(?:G|W|\dK).+?(?:\s|\,|\,\s)type=\"?(traffic|utm|event|anomaly)
6行目のFORMATは5行目で設定されているREGEXと組み合わせて使用されます。「sourcetype::fortigate_$1」が設定されていますので、$1には5行目の正規表現の結果が入り「sourcetype::fortigate_traffic」のように解釈されます。
FORMAT = sourcetype::fortigate_$1
4行目は、DEST_KEYとして「MetaData:Sourcetype」が設定されていますので、6行目で設定した「sourcetype::fortigate_$1」が適用されます。
DEST_KEY = MetaData:Sourcetype
Step 5で「sourcetype::fortigate_$1」が設定されましたので、props.confで「fortigate_$1」というスタンザ名を探します。(今回はtrafficログの想定で「fortigate_traffic」を探します)
props.confの11行目が「fortigate_traffic」となっていますので、12~63行目までが設定となります。
[fortigate_traffic]
TIME_PREFIX = ^
SHOULD_LINEMERGE = false
EVENT_BREAKER_ENABLE = true
KV_MODE = none
REPORT-field_extract = field_extract
ANNOTATE_PUNCT = false
EVAL-vendor = "Fortinet"
EVAL-product = "Firewall"
EVAL-vendor_product = "Fortinet Firewall"
EVAL-product_version = coalesce(logver, "50")
EVAL-devname = coalesce(devname, devid)
FIELDALIAS-fortigate_traffic_dvc = devname as dvc
FIELDALIAS-fortigate_traffic_vendor_eventtype = eventtype as vendor_eventtype
FIELDALIAS-fortigate_traffic_vendor_transport = transport as vendor_transport
FIELDALIAS-vendor_action = action as vendor_action
FIELDALIAS-vendor_status = status as vendor_status
EVAL-ftnt_action = coalesce(utmaction, vendor_action, vendor_status)
LOOKUP-fortigate_traffic_action = ftnt_action_lookup ftnt_action OUTPUT action
EVAL-sentbyte = coalesce(sentdelta, sentbyte)
EVAL-rcvdbyte = coalesce(rcvddelta, rcvdbyte)
EVAL-bytes = coalesce(rcvddelta + sentdelta, rcvdbyte + sentbyte)
EVAL-bytes_in = coalesce(rcvddelta, rcvdbyte)
EVAL-bytes_out = coalesce(sentdelta, sentbyte)
FIELDALIAS-fortigate_traffic_dest_ip = dstip as dest_ip
FIELDALIAS-fortigate_traffic_dest = dstip as dest
FIELDALIAS-fortigate_traffic_dest_interface = dstintf as dest_interface
FIELDALIAS-fortigate_traffic_dst_mac = dstmac as dest_mac
FIELDALIAS-fortigate_traffic_dest_port = dstport as dest_port
FIELDALIAS-fortigate_traffic_dest_translated_ip = tranip as dest_translated_ip
FIELDALIAS-fortigate_traffic_dest_translated_port = tranport as dest_translated_port
EVAL-packets = (rcvdpkt + sentpkt)
EVAL-protocol_version = case(isnotnull(srcip), if(match(srcip,":"), "ipv6", "ipv4"), isnotnull(dstip), if(match(dstip,":"), "ipv6", "ipv4"))
EVAL-wifi = if(isnotnull(radioband), replace(radioband,",.*",""), null)
EVAL-tcp_flag = if(vendor_action IN("server-rst","client-rst"), "RST", tcp_flag)
FIELDALIAS-fortigate_traffic_packets_in = rcvdpkt as packets_in
FIELDALIAS-fortigate_traffic_packets_out = sentpkt as packets_out
FIELDALIAS-fortigate_traffic_rule = poluuid as rule
FIELDALIAS-fortigate_traffic_rule_id = policyid as rule_id
FIELDALIAS-fortigate_traffic_session_id = sessionid as session_id
FIELDALIAS-fortigate_traffic_src = srcip as src
FIELDALIAS-fortigate_traffic_src_interface = srcintf as src_interface
FIELDALIAS-fortigate_traffic_src_ip = srcip as src_ip
FIELDALIAS-fortigate_traffic_src_mac = srcmac as src_mac
FIELDALIAS-fortigate_traffic_src_port = srcport as src_port
FIELDALIAS-fortigate_traffic_src_translated_ip = transip as src_translated_ip
FIELDALIAS-fortigate_traffic_src_translated_port = srcport as src_translated_port
FIELDALIAS-fortigate_traffic_src_zone = srcintfrole as src_zone
FIELDALIAS-fortigate_traffic_dest_zone = dstintfrole as dest_zone
EVAL-ssid = coalesce(srcssid, dstssid)
LOOKUP-fortigate_traffic_ftnt_protocol_lookup = ftnt_protocol_lookup proto OUTPUT transport,protocol
EVAL-app = coalesce(app, service, transport)
EVAL-user = coalesce(user, unauthuser)
すべてを説明すると長くなるので必要なところだけを説明します。
16行目は、REPORT-xxxxx = yyyyyと設定されています。勘のいい方は気づいたと思いますが、yyyyyの部分はtransforms.confのスタンザ名が設定されているので、transforms.confを参照する必要があります。
REPORT-field_extract = field_extract
transforms.confでREPORT-xxxxxの設定値と同じ「field_extract」を探します。
24行目に同名のスタンザがありますので25行目が設定となります。
[field_extract]
DELIMS = "\ ,", "="
25行目は、DLIMISが設定されており、ログにおける区切り文字が指定されています。
DELIMS = "\ ,", "="
今回は設定値が二つあり「"\ ,"」と「"="」になります。「"\ ,"」はログの中でkey/valueのセットを認識するための区切り文字となります。fortigateのログでは「date=YYYY-MM-DD time=HH:MI:SS devname=XYZ …」という形式が一般的なので「date=YYYY-MM-DD」「time=HH:MIS:SS」「devname=XYZ」のように分割されます。次に「"="」ですが、先に分割したデータを対象にKEYとVALUEを区別するための区切り文字となりますので、「date=YYYY-MM-DD」を「date」「YYYY-MM-DD」のように分割します。
では、props.confに戻ります。
18行目は、EVAL-xxxxx = yyyyyとなっていますがtransforms.confとは関係ありません。任意のフィールドを作成するための設定となります。
EVAL-vendor = "Fortinet"
23行目もFIELDALIAS-xxxxx = yyyyyとなっていますがtransforms.confとは関係ありません。既存のフィールドに別名をつけるための設定となります。
FIELDALIAS-fortigate_traffic_dvc = devname as dvc
29行目は、LOOKUP-xxxxx = yyyyy zzzzz OUTPUT aaaaaとなっているので、yyyyyの部分についてtransforms.confを参照する必要があります。(zzzzzとaaaaaは後ほど)
LOOKUP-fortigate_traffic_action = ftnt_action_lookup ftnt_action OUTPUT action
transforms.confでLOOKUP-xxxxxの設定値と同じ「ftnt_action_lookup」を探します。13行目に同名のスタンザ名がありますので14行目が設定となります。
[ftnt_action_lookup]
filename = ftnt_action_info.csv
LOOKUP機能(csv等のファイルと読み取る機能と考えてください)に使用するファイルがftnt_action_info.csvであることが分かります。このファイルはAdd-Onの解凍先にあるlookupsフォルダの中に配置されています。
Splunk_TA_fortinet_fortigate\lookups\ftnt_action_info.csv
ftnt_action_info.csvの中身を確認すると1行目にftnt_action, actionとあります。
ftnt_action, action
pass, allowed
passthrough, allowed
log-only, allowed
blocked, blocked
block, blocked
monitored, deferred
analytics, deferred
detected, allowed
dropped, blocked
allowed, allowed
accept, allowed
close, allowed
deny, blocked
dns, allowed
timeout, teardown
ip-conn, allowed
allow, allowed
server-rst, allowed
client-rst, allowed
clear_session, blocked
ここで、props.confの設定にあったzzzzzとaaaaaの部分を見てみると「ftnt_action OUTPUT action」となっており、ftnt_action_info.csvの1行目にある情報と同じことが分かります。
props.confの内容
ftnt_action_lookup ftnt_action OUTPUT action
ftnt_action_info.csvの内容
ftnt_action, action
これは、ログからftnt_actionフィールドを読み取り、csvファイルのftnt_actionフィールドとマッチングさせて、マッチングした場合はcsvファイルのactionフィールドをログのactionフィールドに設定するという内容になります。
ログで説明すると、ログの中に「ftnt_action=pass」があった場合には「action=allowd」として設定すると解釈してください。
ですが、ここで一つ問題があります。fortigateのログには「ftnt_action=xxxxxは通常存在しません。そのため、「ftnt_action=xxxxx」がどこで作成されているかを確認する必要がありますので、props.confで探します。
28行目に、EVAL-ftnt_action = coalesce(utmaction, vendor_action, vendor_status)とあります。これはftnt_actionというフィールドにutmaction OR vendor_action OR vendor_statusフィールドの値を設定するという内容になります。
EVAL-ftnt_action = coalesce(utmaction, vendor_action, vendor_status)
ですが、vendor_actionとvendor_statusについては同じ問題があります。ftnt_actionで指定されている各フィールドはforigateのログには通常存在しませんので、props.confで探します。
26行目にFIELDALIAS-xxxxx = yyyyy as zzzzzの設定があります。これは、yyyyyというフィールドにzzzzzという別名をつけています。なので、actionフィールドとvendor_actionフィールドは同一となります。
FIELDALIAS-vendor_action = action as vendor_action
27行目も同様です。
FIELDALIAS-vendor_status = status as vendor_status
これで情報が出揃いましたので、LOOKUP-xxxxxの設定も読み解くことができました。
これまでに説明した情報で63行目までの設定は読み解くことができますので、解説は以上となります。
props.confとtransforms.confを行ったり来たり、別フォルダのcsvを読み取ったりと大変ですが、設定ファイル間に関係性があることだけでも知っておくといざという時に役立ちます。
また、公式ドキュメントでは各設定の情報が細かく記載されていますので、合わせて確認することをおススメします。
最後まで読んだ方はお疲れ様でした。m(_ _)m
LOADING...