株式会社セキュアイノベーション

    Menu

    セキュリティコラム

    • セキュリティ教育
    • ネットワーク

    公開:2022.01.24 10:00 | 更新: 2022.04.20 04:33

    SplunkのAdd-Onから学ぶprops.confとtransforms.confの見方

    本記事はSplunkを既に利用中またはSplunkを学習中の方向けの内容となっています。

    FortiGateのAdd-Onから学ぶ

    Step 1.

    今回はFortiGate用のAdd-Onを対象に説明しますのでsplunkbaseからダウンロードします。
    (本記事では最新版のversion1.6.7をダウンロードします)

    Fortinet FortiGate Add-On for Splunk | Splunkbase

    Step 2.

    適当なところにダウンロードしたAdd-Onを解凍します。今回見るのはdefault配下にある以下のファイルです。

    transforms.conf
    props.conf

    ログを見ながら確認したい方はsamplesフォルダにサンプルデータがありますので合わせて確認できます。

    今回はtrafficログを対象に説明しますので「sample.ftnt_fortigate_traffic」を確認ください。

    Splunk_TA_fortinet_fortigate\samples

    Step 3.

    実際にファイルを見ていきたいのですが、その前にステップ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」に設定する。
    と解釈してください。

    Step 4.

    まずは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

    Step 5.

    props.confで設定されていたTRANSFORMS-force_sourcetype_fortigateの設定を確認するためtransforms.confを確認します。

    2行目にTRANSFORMS-xxxxxの設定値と同じ「force_sourcetype_fortigate」があります。props.confと同様に[]で囲まれている部分はスタンザと呼ばれる設定名となるので3~6行目が設定値となります。

    [force_sourcetype_fortigate]
    SOURCE_KEY = raw

    DEST_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 6.

    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...

    セキュアイノベーション サービス一覧

    ネットワーク・サーバー

    Webサイトを守る

    ヘルプデスク・サポート