Network / Script / Windows のデータを収集【Splunk】

この記事は約14分で読めます。
sponsored link

Splunkでの高度なデータ収集

前回の記事では、データ収集の1つの方法として『ディレクトリの監視』を取り上げました。そこで今回は別の方法である『Network (TCP/UDP)』『Script』『Windows data』『HTTP Events』を用いたデータ収集を紹介したいと思います。

データの収集設定は主にwebから行い、設定後は input.conf から細かなカスタマイズを行うことができます。

Network (TCP/UDP)

『TCP/UDP』ポートからデータ (e.g., syslog) を受信し、UF, HFなどを通じてデータを収集します。
※ UDPではネットワークパケットの配信が保証されないため『TCP』の利用が推奨されています。

データの追加

[方法1] webを利用

[Add Data] > [Monitor] > [TCP/UDP]

[Source type]: イベントの加工方法を定義 (e.g., タイムスタンプ、イベント境界)
[Host]: ホスト名を IP, DNS, Custom から選択
[Index]: イベントを保存するインデックスを定義 (※基本は Default = main )

[方法2] add, edit を利用

CLI ( add tcp|udp ) でポート、インデックス、ホストなどを定義することもできます。

$SPLUNK_HOME add ump 514 -sourcetype syslog -auth admin:password

収集構成のカスタマイズ

上記の方法で構成を定義した後は input.conf を編集することで、細かくカスタマイズすることができます。
(e.g.) filtering, input queues

[tcp:9997]              # 9997ポートからデータを受信
connection_host = dns   # カスタム値を設定する場合はconnection_host=none, host=<value>
sourcetype = log4j
source = tcp:9995
acceptFrom = !10.1/16, !10.2.0.0   #10.1.*.*と10.2.0.0以外のアドレスからデータを収集 (IPv4/IPv6, CIDR, DNSに対応)

キュー (Queue) の設定

Forwarderのディスクに蓄積させるキューのサイズを調整することで、Indexerの負荷が大きくなった場合やネッtワークに異常があった場合でもデータの損失を防ぐことができます。

Forwarder側のキューには『output queue (default: auto)』『memory queue (default: 500KB)』『persistent queue (default: none)』の3種類あり、それぞれの値は maxQueueSize, queueSize, persistentQueueSize の変数で定義します。
※ output queue (auto) のサイズは useACK = true|false によって異なります。

  1. トラブル発生(Forwarder -> Indexer で正しく送信されなかった)
  2. データが output queue に保存
  3. (output queueが満たされれば) memory queue に保存
  4. (memory queueも満たされれば) persistent queue に保存

persistent queue に保存されたデータはインスタンス再起動後も $SPLUNK_HOME/var/run/splunk/ に保存され続けます。

# input.conf
[tcp://9994]
queueSize=50KB
persistentQueueSize=100MB

# output.conf
[tcpout:indexer1]
maxQueueSize=1024KB

Syslog はディレクトリ監視が良い理由

  • Syslog data はインデックス化のプロセスを含む (e.g., assign a timestamp, and a host)
  • Syslog tasks も同一のマシンで扱うと負荷が高くなりすぎる
  • インスタンスがダウンした際に元のログが復旧できない

Syslog のように外部から収集するデータは「Splunkのディレクトリに収集しそれを監視する」のがベストプラクティスだとされています。理由は、Forwarderがダウンしたした場合でも『_fishbucket』によりデータの損失を防ぐことができるからです。
(e.g.) SPLUNK_HOME/var/log/syslog.txt を監視

Script

Scripts (e.g., shell, python, java) を用いると様々な場所 (e.g., APIs, message queues, web) からデータを収集することが可能です。

例えばDBへポーリングするスクリプトでは、DBにクエリを発行し「インデックスに適した形式でディレクトリに結果を書き込む」「クエリ結果をSplunkにインデックス化させる」というような使い方ができます。

データの追加

[方法1] webを利用

[Add Data] > [Monitor] (or [Forwarder]) > {Scripts]
※ Forwarderの場合は追加の構成が必要です。

[Script Path]: スクリプトファイルのパス

$SPLUNK_HOME/etc/apps/<app>/bin/   # App内で実行するスクリプトファイル
$SPLUNK_HOME/bin/scripts/          # グローバルで実行するスクリプトファイル
$SPLUNK_HOME/etc/system/bin/       # Splunkの内部ファイル

[Interval Input]: 指定した秒数 or スケジュール
[Source name override]: Source 名の上書き

[方法2] cmd を利用

# Splunkの構成に関するpythonファイルを実行
$SPLUNK_HOME/bin/splunk cmd python SPLUNK_HOME/bin/scripts/sample.py

[script://SPLUNK_HOME/bin/scripts/sample.py]
passAuth = userA
host = my.company
source = SPLUNK_HOME/bin/scripts/sample.py
sourcetype = python_app
interval = 30.0
queueSize = 50KB   # default:500KB
persistentQueueSize = 100MB
# キューのサイズを指定することで、ネットワーク上に問題があった際でもデータの損失を防ぐことができます。

Windows data

Windows専用UF (using APIs) を用いると、バイナリフォーマットの Windows データ (e.g. Event logs, Registry, AD) をSplunkに収集することができます。
※ SplunkにはWindows Serverが搭載されているので、異なるOSのサーバーを利用することも可能です。

収集データ 収集方法 説明
Event logs UF, WMI Windows OS (local) のログ。
Performance UF, WMI Windows (local) のパフォーマンス。Splunk Cloud ではアラートが利用可能。
Registry UF Windows Registry (local) の変更を監視。監視用の権限が必要。
AD UF AD サーバーの変更を監視。

※ WMI = Windows Management Instrumentation (WMIを使うとリモートWindowsの構成データを取得できます)

データの追加

[方法1] webを利用

[Settings] > [Data inputs] > 収集したいデータを選択 (e.g., Local Event Logs, Powershell Modular Input) > 各種設定 > 保存 > Splunkがデータを収集
※ Powershellからデータを収集する場合は powershell.exe をそのまま利用します。(外部のライブラリに依存しません)

[方法2] input.conf を編集 (Windowsマシン)

input.conf では収集したいデータをスタンザで指定します。(編集後は再起動が必要です)

スタンザではそれぞれ最大9つの whitelist/blacklist が設定でき、whitelist/blacklist のどちらにも一致する場合は blacklist(拒否) が優先されます。

# Securityのイベントログを取得
[WinEventLog://Security]   # 他には[admon://<name>],[perfmon://<name>],[WinNetMon://<name>]などを指定できる
disable = 0
srart_from = newest
evt_dc_name = 
evt_dns_name = 
checkpointInterval = 5

# whitelist/blacklist = <list of eventIDs> | key = regex
whitelist1 = EventCode = %^200$%   # EventCodeが200のイベント
whitelist2 = User = %userA%        # userAに関係するイベント
blacklist = 1234                   # IDが1234のイベントを拒否

[方法3] WMI を利用 (wmi.conf を編集)

WMI* (wmi.conf の編集) では『Event logs』『Performance data』の2つを収集することができます。

WMIは「UFを用いずにWindows Serverのログを収集できる」「特定マシンのネットワーク上のアクセス権が利用できる (1つのIndexerにデータを集約できる)」というメリットをもつ一方、ドメインアカウントで実行しなければならない、という点に注意が必要です。

[WMI:LocalSystem]
disable = 0
interval = 10
event_log_file = System
index = wmi_eventlog
wql = select * from Win32_PerfFormattedData where Name = "splunkd"

HTTP Events

HTTP Event Collector (HEC) を用いると、HTTP[s] Events* をSplunkに収集することができます。
(e.g.) web logs, mobile apps, automation scripts

HECはトークンベースの認証モデルを利用するため、UFを介さずにあらゆる環境 (e.g., distributed, legacy) のHF/Indexer に柔軟にデプロイできるのが特徴です。

データの追加

[方法] webを利用

[Add Data] > [Monitor] > {HTTP Event Collector]

HTTP Events を保存するインデックスを指定。

HECを有効化 (default: OFF)
[Settings] > [Data inputs] > [HTTP Event Collector] > [Global Settings] > [All Token] (Enable)

HTPP Events を送信 (cURL)

curl を用いて (HECトークンを含む) リクエストを作成することで、あらゆるクライアントからHECにデータを送信することができます。

curl -k "https://<splunk_server>:8088/services/collector"   # -k: SSL証明書を無視 (Webサーバーにアクセス)
    -H "Authorization: Splunk <token>                       # -H: リクエストヘッダーを指定 (tokenを使用)
    -d '{"event": "Hello, world!",                          # -d: POSTするデータを記述 (今回はJSON)
         "sourcetype": "manual",
         "host: "my_company" }'

HEC Indexer Acknowledgement

デフォルトではHECがイベントを受信するとすぐに、HTTP Status 200 (成功) が送信者に返されます。しかし、これはイベントが処理パイプラインに入る前に送信されているので、ネットワーク障害などでデータが損失してしまっても200が返されるということを意味するのです。

この問題を解決する機能が『Indexer Acknowledgment (ACK)』であり、確実にイベントが届いたことを保証します。

<ACKの仕組み>

  1. イベントデータを含むHTTPリクエストをHECのエンドポイント (/services/collector) に送信
  2. HECからトークン毎に発行された『ackID』を受信 (e.g., {“ackID”: “2”})
  3. ackIDsを含むHTTPリクエストをHECのエンドポイント (/services/collector/ack) に送信することで、イベントがインデックス化されているかを確認
  4. HECからインデックス化のステータスを受信 (e.g., {“acks”: {“0”: true, “1”: false, “2”: true}})

※④の true は必ずしも全イベントのインデックス化を保証するものではありません。(途中で解析不可能なイベントは破棄されます)

ACKは、HECで登録したトークンの [編集] から有効化することができます。

生データを HEC に送信

curl でトークンパスの末尾に『raw?』をURLパラメータとして設定すると、生のテキストデータをHECに送信することができます。

curl -k "https://<splunk_server>:8088/services/collector/raw?/channel=<channel_id>"   # "channel_id"はクライアントにより発行されます
    -H "Authorization: Splunk <token>
    -d '1, 2, 3... Hello, world!'   # プレーンなテキストデータ

input.conf で HEC へのアクセスを制限

input.conf の [http] スタンザを編集することで、HECへのアクセスを制限することができます。

[http]
port = 8088   # default
enableSSL = 1   # default(有効)
crossOriginSharingPolicy = "!*://*.competitor.com:*"   # ライバル会社のドメインからのアクセスを拒否

References

Get data from TCP and UDP ports – Splunk Documentation

Configure inputs using TCP or UDP – Splunk Documentation

inputs.conf – Splunk Documentation

outputs.conf – Splunk Documentation

Network Inputs-Best Practices… – Splunk blogs

persistent queue – Splunk Documentation

Use persistent queues to help prevent data loss – Splunk Documentation

Protect against loss of in-flight data – Splunk Documentation

Setting up a scripted input – Splunk Documentation

Example script that polls a database – Splunk Documentation

Get data from APIs and other remote data interfaces through scripted inputs – Splunk Documentation

Protect against loss of in-flight data – Splunk Documentation

Writing reliable scripts – Splunk Documentation

Monitor Windows data with the Splunk platform – Splunk Documentation

How to get Windows data into your Splunk deployment – Splunk Documentation

Considerations for deciding how to monitor remote Windows data – Splunk Documentation

wmi.conf – Splunk Documentation

About HTTP Event Collector Indexer Acknowledgment – Splunk Documentation

Set up and use HTTP Event Collector in Splunk Web – Splunk Documentation

Use cURL to manage HTTP Event Collector tokens, events, and services – Splunk Documentation