2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Cloudflare Logpush を Splunk Cloud Platform にプッシュ

Posted at

やっていること

ある組織からインターネットへの通信を Cloudflare Gateway で管理し、その ログ を、Splunk Cloud Platformで可視化。

構成

今回は Magic WAN を使った IPSec 接続で試した。

環境

Splunk Cloud Platform

Log Type Source Type
HTTP Request (WAF や CDN など) cloudflare:json
Gateway Network logs cloudflare:network
Gateway HTTP logs cloudflare:http
Gateway DNS logs cloudflare:dns
Access requests logs cloudflare:access
CASB Findings logs cloudflare:casb
Audit logs cloudflare:audit

今回の対象は下記3つ。

  • cloudflare:network, 各デバイスからの IP/TCP/UDP/TLS 通信(Stateful Firewall)
  • cloudflare:http, 各デバイスからの HTTP/HTTPS 通信(Forward Proxy)
  • cloudflare:dns, 各デバイスからの DNS 通信(Full Resolver)

Splunk Cloud の申込みと Cloudflare App の追加

cloudflare を入れて Cloudflare App for Splunk を見つける
Install (↑はインストール後のため Open App になっている)

Index の追加

  • Settings > Indexes > New Index
    Screenshot 2023-07-01 at 18.25.51.png
    Screenshot 2023-06-29 at 9.34.40.png

Index name: cloudflare
Index Data Type: Events
Max raw data size: 適当 (0 MB)
Serchable retention (days): 適当 (30 Days)

Index name
App の各マクロはデフォルトで cloudflare を参照しているので、それに合わせている。別の名前にする際はマクロ cloudflare_zt_index が参照するIndex名も変える。

Data Inputs の追加

HTTP Event Collector (HEC)
  • Settings > Data Inputs > HTTP Event Collector > + Add New
    Screenshot 2023-06-29 at 9.37.14.png
    Screenshot 2023-07-01 at 9.52.51.png

Source type > Select > cloudflare:network
Index > cloudflare

Source type は Automatic でもいいかも

HTTP と DNS も同じように追加

Source type > Select > cloudflare:http
Index > cloudflare

Source type > Select > cloudflare:dns
Index > cloudflare

  • 各コレクターの Token Value は後ほど Cloudflare ダッシュボードで入力する
    Screenshot 2023-07-01 at 18.08.19.png

Source Types の編集

  • Settings > Source Types
    Show only popular のチェックを外す
    search cloudflare
    Screenshot 2023-07-01 at 18.53.10.png
  • それぞれの Source Type で Regex Expression を編集
    Pattern:
    ([\r\n]+)\{\"\w+\"

    ([\r\n]+)
Splunk の解説
  • Specifies a regex that determines how the raw text stream is broken into initial events, before line merging takes place.
    *This sets SHOULD_LINEMERGE = false and LINE_BREAKER to the user-provided regular expression.
  • Defaults to ([\r\n]+), meaning data is broken into an event for each line, delimited by any number of carriage return or newline characters.
  • The regex must contain a capturing group -- a pair of parentheses which defines an identified subcomponent of the match.
  • Wherever the regex matches, Splunk considers the start of the first capturing group to be the end of the previous event, and considers the end of the first capturing group to be the start of the next event.
  • The contents of the first capturing group are discarded, and will not be present in any event. You are telling Splunk that this text comes between lines.

Cloudflare

Logpush (Account)

  • 分析とログ > Logs > Logpush ジョブを追加する > Gateway network
    Screenshot 2023-07-01 at 9.37.36.png
  • すべてのフィールドを選択 (とりあえず全部。パフォーマンスへの悪影響はない。後で取捨できる)
    Screenshot 2023-07-01 at 9.37.58.png
  • プッシュ先は Splunk
    Screenshot 2023-07-01 at 9.38.14.png
  • Splunk HEC の接続情報を入力
    Screenshot 2023-07-01 at 9.46.07.png
  • 証明書のエラーが出たら、skip verify は はい に。
    Screenshot 2023-07-01 at 9.54.28.png
  • 設定内容
項目 設定値 補足
Splunk raw HTTP イベント コレクタのURL <Splunk Cloud Platform管理ダッシュボードのホスト名>:8088/services/collector/raw Settings > Data Inputs >HTTP Event Collector > Global Settings にポート番号あり Screenshot 2023-07-01 at 20.59.30.png
チャネルID GUIDジェネレータなどで自作 ジェネレータpython -c 'import uuid; print(uuid.uuid4())'
認証トークン Splunk%20<トークンの値> トークンは HTTP Event Collector から見れる。Splunk%20を頭に。
ソースタイプ cloudflare:network タイプごとに個別の Logpush ジョブを作成
Insecure skip verify はい HEC が検査不合格の証明書を使っていたので true
作成したジョブの確認や変更は API
curl -Ls "https://api.cloudflare.com/client/v4/accounts/$ACCOUNTID/logpush/jobs" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: $CTYPE" | jq '.result[]|select (.destination_conf|startswith("splunk"))'

{
  "id": 258376,
  "dataset": "gateway_network",
  "frequency": "high",
  "kind": "",
  "enabled": true,
  "name": null,
  "logpull_options": "fields=AccountID,Action,Datetime,DestinationIP,DestinationPort,DetectedProtocol,DeviceID,DeviceName,Email,OverrideIP,OverridePort,PolicyID,PolicyName,SNI,SessionID,SourceIP,SourceInternalIP,SourcePort,Transport,UserID&timestamps=rfc3339&CVE-2021-44228=false",
  "destination_conf": "splunk://***.splunkcloud.com:8088/services/collector/raw?channel=***&header_Authorization=Splunk%20***&sourcetype=cloudflare:network&insecure-skip-verify=true",
  "last_complete": "2023-07-01T12:02:55Z",
  "last_error": null,
  "error_message": null,
  "time_created": "2023-07-01T00:54:41Z"
}
  • プッシュ !!!
    Screenshot 2023-07-01 at 9.54.40.png
所有権チャレンジの探し方 @ Splunk

index=cloudflare | spath filename | search filename="*"
Screenshot 2023-07-01 at 22.03.59.png

HTTP と DNS も同じように追加
  • チャネルID
  • 認証トークン
  • ソースタイプ

が別。後は共通。

動作確認

  • Apps > Cloudflare App for Splunk
    Screenshot 2023-07-01 at 9.55.13.png

  • Zero Trust > Cloudflare - Zero Trust - Gateway
    Screenshot 2023-07-01 at 9.55.27.png

  • HTTP (各デバイスからの HTTP/HTTPS 通信)
    Screenshot 2023-07-01 at 22.08.22.png
    Screenshot 2023-07-01 at 22.08.41.png

  • Network (各デバイスからの IP 通信)
    → デフォルトとは違う、カスタマイズ後の表示。理由は後述。
    Screenshot 2023-07-01 at 15.27.48.png

  • DNS (各デバイスからの DNS 通信)
    Screenshot 2023-07-01 at 22.14.29.png
    Screenshot 2023-07-01 at 22.13.39.png

カスタマイズ

Network はデフォルトでは思うような表示とならなかった。
下記のようにホスト名で表示され、実際にブロックしていたポート宛の通信が Blocked にあらわれていない。

Screenshot 2023-07-01 at 12.17.06.png

ソースの編集

  • Apps > Manage Apps
    Screenshot 2023-07-01 at 15.16.15.png

  • Search cloudflare > View objects
    Screenshot 2023-07-01 at 13.10.50.png

  • Search gateway > dashboard_cloudflare_zero_trust_gateway
    Screenshot 2023-07-01 at 22.23.19.png

  • XML の当該部分を編集
    SNI でフィルタしているため TLS 接続以外が表示されなかった。
    宛先IP を基準にするよう編集。
    Screenshot 2023-07-01 at 22.28.30.png

パッチ
--- Splunk.Cloudflare.app.origin.txt	2023-07-01 12:49:07
+++ Splunk.Cloudflare.app.origin.txt.new	2023-07-01 15:28:54
@@ -13,7 +13,7 @@
     <query>search ResolverDecision="*block*"</query>
   </search>
   <search id="network_base_search">
-    <query>`cloudflare_zt_index` sourcetype="cloudflare:network" SNI!="" | where isnotnull(SNI) | fields *</query>
+    <query>`cloudflare_zt_index` sourcetype="cloudflare:network" DestinationIP!="" | where isnotnull(DestinationIP) | fields *</query>
     <earliest>$earliest$</earliest>
     <latest>$latest$</latest>
     <sampleRatio>1</sampleRatio>
@@ -266,7 +266,7 @@
         <title>Click to Drilldown</title>
         <search base="network_base_search">
           <query>search action="*allow*" |stats count as Requests by
-                        SNI | rename SNI as Domain |sort - Requests</query>
+                        DestinationIP | rename DestinationIP as Destination |sort - Requests</query>
         </search>
         <option name="count">5</option>
         <option name="drilldown">row</option>
@@ -274,7 +274,7 @@
         <option name="totalsRow">false</option>
         <option name="wrap">true</option>
         <drilldown>
-          <set token="allow_network_domain">$row.Domain$</set>
+          <set token="allow_network_domain">$row.Destination$</set>
           <set token="allow_network_domain_hidden"></set>
         </drilldown>
       </table>
@@ -285,14 +285,14 @@
         <title>Click to Drilldown</title>
         <search base="network_base_search">
           <query>search action="*block*" |stats count as Requests by
-                        SNI | rename SNI as Domain|sort - Requests</query>
+                        DestinationIP | rename DestinationIP as Destination|sort - Requests</query>
         </search>
         <option name="count">5</option>
         <option name="drilldown">row</option>
         <option name="percentagesRow">false</option>
         <option name="totalsRow">false</option>
         <drilldown>
-          <set token="block_network_domain">$row.Domain$</set>
+          <set token="block_network_domain">$row.Destination$</set>
           <set token="block_network_domain_hidden"></set>
         </drilldown>
       </table>
@@ -304,7 +304,7 @@
       <table>
         <search base="network_base_search">
           <query>search action="*allow*"
-                        SNI="$allow_network_domain$"| table
+                        DestinationIP="$allow_network_domain$"| table
                         Action,DestinationIP,DestinationPort,DeviceName,Email,OverrideIP,OverridePort,PolicyName,SNI,SourceIP,SourceInternalIP,SourcePort,Transport
                     </query>
         </search>
@@ -319,7 +319,7 @@
       <table>
         <search base="network_base_search">
           <query>search action="*block*"
-                        SNI="$block_network_domain$"| table
+                        DestinationIP="$block_network_domain$"| table
                         Action,DestinationIP,DestinationPort,DeviceName,Email,OverrideIP,OverridePort,PolicyName,SNI,SourceIP,SourceInternalIP,SourcePort,Transport</query>
         </search>
         <option name="count">5</option>

トラブルシューティング

Splunk 素人なので遠回りしてるかもしれないが、やったことは下記。

  • なんか表示されない。
    Screenshot 2023-06-29 at 12.01.02.png
  • マウスホバーで出てくる虫眼鏡 (Open in Search) をクリック
    Screenshot 2023-07-01 at 23.49.39.png
  • マッチするログが出てくるところまで、絞り込みを緩める
    Screenshot 2023-07-01 at 23.49.09.png
  • 出てきたログの中身から、どこのフィルタで漏れているか調べる
    Screenshot 2023-07-01 at 23.46.09.png
    この場合はログの sourucetype = cloudflare.html ということで、フィルタ条件の cloudflare.http とマッチしない。Logpush 設定のタイポだったので、直した。

感想

いい点

公開 Web App に対するパフォーマンスやセキュリティのログも同じように取れるので、
Screenshot 2023-07-02 at 0.06.13.png

  • 組織ネットワークからの、インターネットへの接続
    例)マルウェアに感染したサーバーの外向けの活動

  • 組織ネットワークへの、インターネットからの接続
    例)公開サービスの脆弱性を利用したサーバーへの攻撃

という、2方向の情報のやり取りを

  • Cloudflare で一括制御し、Splunk で一括監視

と一元化できるのは、効率がいい。

下図の

  • 1、2 両方とも
  • 双方向に管理

できるので、アタックサーフェスってやつを減らせるんじゃないだろか。

悪い点

悪い点というか、Gateway の部分は Logpush の項目自体は豊富なので、さらに役立つアナリティクス画面が作れると思う。HTTP Request のように Gateway の方も今後の機能拡張を期待。

ただ、カスタマイズの例を書いたように、Cloudflare App を利用者側でカスタマイズできそうなので、バージョンアップを待たずに、用途に応じて柔軟にセルフサーブできるのは良いと感じる。

Splunk Cloud Platform が欲しくなった。。。

余談

余談だが、Cloudflare のプラットフォームを使う利点は、Innovating at the Edge にあると思う。

上の絵では表現できないが、
たとえば、

  • WAF/CDN に関しては、利用者や攻撃者(ユーザーの属する ISP)に近い PoP でサービスを提供
  • Gateway に関しては、利用者(My Network の属する ISP)に近い PoP でサービスを提供

できる。

言い換えると、

  • あなたの Web App を加速、保護する機能はサービス利用者の目の前で稼働
  • 組織の Internet 利用を加速、保護する機能は組織ユーザーの目の前で稼働

するよう、地球上にプロダクトをデプロイしてる。

そもそも、パフォーマンスとセキュリティを両立するのが目的なので、そういう作りになっている。
会社の考えがプロダクトに影響。
The Network is The Computer ™Supercloud

リンク

https://www.splunk.com/ja_jp/products/splunk-cloud-platform.html
https://splunkbase.splunk.com/app/4501
https://developers.cloudflare.com/fundamentals/data-products/analytics-integrations/splunk/
https://developers.cloudflare.com/logs/get-started/enable-destinations/splunk/

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?