Universal Forwarder からHTTPプロキシ経由で Splunk Cloud にデータを送信する

Universal Forwarder からHTTPプロキシ経由で Splunk Cloud にデータを送信する

Clock Icon2025.02.10

Splunk の Universal Forwarder はデフォルトの動作では、独自プロトコル(TCP 9997)を使ってデータ転送を行います。
組織のファイアウォールで 9997ポート アウトバウンドを許可していない場合や、HTTPプロキシ経由でしかインターネットに接続できないようなポリシーを採用している場合も多いかと思います。

今回は、Universal Forwarder のデータ送信を HTTPS443 にし、かつHTTPプロキシを通してデータを転送していきたいと思います。

あらかじめ Amazon Linux 2023 に Universal Forwarder のインストールした状態から進めていきます。

Universal Forwarder の概要やインストール手順は以下を参考にしてください。

Windows
https://dev.classmethod.jp/articles/slug-UmuZJZaWYlej/

Linux
https://dev.classmethod.jp/articles/slug-tjcJqqXoFGfa/

構成

  • 組織のFWでは、HTTP アウトバウンド 443 のみが許可
  • 社内LANからはDMZのHTTPプロキシを介してインターネットが許可(今回HTTPプロキシはsquidで構築)

Universal Forwarder with Proxy.png

HTTPプロキシの構築(squid)

本検証を行う上で、HTTPプロキシも構築していますが、既に利用している環境があれば不要です。
Amazon Linux 2023 で構築しています。

squid をインストールします。

## リポジトリを最新にアップデート
sudo dnf update

## squid のインストール
sudo dnf install squid

## systemd で管理
sudo systemctl enable squid

設定ファイルを編集します。

## 設定ファイルを編集
sudo vi /etc/squid/squid.conf

# 環境に併せて必要のない送信元IPレンジをコメントアウト
acl localnet src 0.0.0.1-0.255.255.255  # RFC 1122 "this" network (LAN)
#acl localnet src 10.0.0.0/8            # RFC 1918 local private network (LAN)
acl localnet src 100.64.0.0/10          # RFC 6598 shared address space (CGN)
acl localnet src 169.254.0.0/16         # RFC 3927 link-local (directly plugged) machines
acl localnet src 172.16.0.0/12          # RFC 1918 local private network (LAN)
#acl localnet src 192.168.0.0/16                # RFC 1918 local private network (LAN)
acl localnet src fc00::/7               # RFC 4193 local private network range
acl localnet src fe80::/10              # RFC 4291 link-local (directly plugged) machines

# 443ポートへの転送を有効
acl SSL_ports port 443

# localnet からのアクセスを許可
http_access allow localnet

# squid が受け付けるポートを3128に設定
http_port 3128

squid を起動します。

## サービスを開始
sudo systemctl start squid

squid の確認

curl --head https://www.google.com -x http://127.0.0.1:3128

HTTP/1.1 200 Connection established

HTTP/2 200
...

Universal Forwarderのホストからもプロキシが経由できることを確認します。

## 172.31.29.204 がHTTPプロキシ (squid)のアドレス
curl --head https://www.google.com -x http://172.31.29.204:3128
HTTP/1.1 200 Connection established

HTTP/2 200
...

Splunk Cloud で HEC を作成

Splunk Cloud では HEC (HTTP Event Collector) を作成することで、HTTPS 443 経由でデータを受信できるようになります。

参考ドキュメント
https://docs.splunk.com/Documentation/SplunkCloud/latest/Data/UsetheHTTPEventCollector#Create_an_Event_Collector_token_on_Splunk_Cloud_Platform

Settings > Data Inputs を選択します。

Screenshot 2025-02-10 at 14.37.04.jpg

HTTP Event Collector で「Add new」を選択します。

Screenshot 2025-02-10 at 14.37.19.jpg

Source nameEnable indexer acknowledgement(Splunk Cloud では有効化不可)、sourcetypeは空白のままにして設定します。
indexはご自身の環境に合わせて適切なものを設定します。

Screenshot 2025-02-10 at 14.38.08.jpg

設定完了後にトークンをコピーしておきます。

Universal Forwarder を HTTPOUT に設定

HTTPプロトコルでデータを転送するよう設定を変更します。
$SPLUNK_HOME/etc/system/localoutputs.conf に設定を追記します。ない場合は新規作成します。

参考ドキュメント
https://docs.splunk.com/Documentation/Forwarder/latest/Forwarder/Configureforwardingwithoutputs.conf#Configure_the_universal_forwarder_to_send_data_over_HTTP

sudo vi /opt/splunkforwarder/etc/system/local/outputs.conf

## 以下の設定を追記します
[httpout]
httpEventCollectorToken = <hecトークン>
uri = https://http-inputs-<your-splunk-instance>.splunkcloud.com:443

HECエンドポイントのURLについてはこちらを参照してください。

また、HTTPOUTとフォワーダーのデフォルト動作であるTCPOUTはどちらか片方だけしか使うことができませんので注意が必要です。
下記ドキュメント引用の通り、仮に設定ファイルに両方の設定を記載していた場合は、HTTPOUTの設定だけが有効になるようです。

When a single Splunk Universal Forwarder has both tcp output settings and http output settings, http output will take precedence. The tcp output settings will be ignored in favor of http output configurations.

Universal Forwarder でプロキシを経由するよう設定

Universal Forwarder の通信がプロキシを経由するように設定します。
$SPLUNK_HOME/etc/system/localservers.conf に設定を追記します。

ドキュメント参考
https://docs.splunk.com/Documentation/Splunk/latest/Admin/ConfigureSplunkforproxy

sudo vi /opt/splunkforwarder/etc/system/local/server.conf

## squidサーバーのIPアドレス・ポートを指定
[proxyConfig]
http_proxy = http://172.31.29.204:3128
https_proxy = http://172.31.29.204:3128

設定反映のため、サービスを再起動します。

sudo /opt/splunkforwarder/bin/splunk restart

データが送信されているか確認

Splunk Web で確認してみます。

Universal Forwarder の内部ログが転送されていることが確認できました。

Screenshot 2025-02-10 at 15.16.31.jpg

Universal Forwarder、HTTPプロキシ (squid)から、それぞれ通信ログを見てみます。

[Universal Forwarder]

# tcpdump -nn dst port 3128
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on ens5, link-type EN10MB (Ethernet), snapshot length 262144 bytes
06:13:26.396106 IP 172.31.27.181.36214 > 172.31.29.204.3128: Flags [S], seq 2326042477, win 62727, options [mss 8961,sackOK,TS val 2149431242 ecr 0,nop,wscale 7], length 0
06:13:26.396309 IP 172.31.27.181.36214 > 172.31.29.204.3128: Flags [.], ack 3445423323, win 491, options [nop,nop,TS val 2149431242 ecr 3132778038], length 0
06:13:26.396346 IP 172.31.27.181.36214 > 172.31.29.204.3128: Flags [P.], seq 0:158, ack 1, win 491, options [nop,nop,TS val 2149431242 ecr 3132778038], length 158
06:13:26.547529 IP 172.31.27.181.36214 > 172.31.29.204.3128: Flags [.], ack 40, win 491, options [nop,nop,TS val 2149431394 ecr 3132778190], length 0

[HTTPプロキシ (squid)]

# tcpdump -nn dst port 443
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on ens5, link-type EN10MB (Ethernet), snapshot length 262144 bytes
06:12:51.477331 IP 172.31.29.204.35952 > ******.443: Flags [.], ack 3754786550, win 447, length 0
06:13:06.837332 IP 172.31.29.204.35952 > ******.443: Flags [.], ack 1, win 447, length 0
06:13:22.197321 IP 172.31.29.204.35952 > ******.443: Flags [.], ack 1, win 447, length 0

それぞれ意図した通信先とポートでデータが流れていることが確認できました。

まとめ

以上、HTTPプロキシ環境で Splunk Cloud へデータを転送してみました。
今回は、Linux OSで確認してみましたが、Windows OSでも同様の設定手順になるかと思います。
なお、ZscalerやCloudflare Zero Trustなどの Secure Web Gateway を利用している場合も、応用して設定ができそうです。
本記事がどなたかの助けになれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.