HTTP Event Collector (HEC) ↗ 是从 Splunk Enterprise 或 Splunk Cloud Platform 接收数据的可靠方法。Cloudflare Logpush 支持通过 Cloudflare 仪表板或 API 将日志直接推送到 Splunk HEC。
-
在 Cloudflare 仪表板中,前往账户或域名(也称为 zone)级别的 Logpush(日志推送) 页面。
账户级别:Go to Logpush ↗
域名(也称为 zone)级别:Go to Logpush ↗
-
根据你的选择,可分别访问账户范围数据集与 zone 范围数据集。
-
选择 Create a Logpush job(创建 Logpush 作业)。
-
在 Select a destination(选择目标) 中,选择 Splunk。
-
输入或选择以下目标信息:
- Splunk HEC URL
- Channel ID - 这是一个随机 GUID,可使用 guidgenerator.com ↗ 生成。
- Auth Token - 以单词
Splunk为前缀的 Event Collector token。例如:Splunk 1234EXAMPLEKEY。 - Source Type(源类型) - 例如
cloudflare:json。如果使用 Cloudflare App for Splunk ↗,请参阅 Details(详情) 部分中与对应数据集相匹配的 source type。例如,对于 Zero Trust Access 请求日志,source type 为cloudflare:access。 - Use insecure skip verify option(不推荐)。
输入完目标详细信息后,选择 Continue(继续)。
-
选择要推送到存储服务的数据集。
-
在下一步中,需要配置你的 Logpush 任务:
- 输入 Job name(作业名称)。
- 在 If logs match(如果日志匹配) 下,可以选择要包含和/或从日志中排除的事件。更多信息请参阅 Filters。并非所有数据集都提供此选项。
- 在 Send the following fields(发送以下字段) 中,可以选择将所有日志推送到存储目标,或有选择地指定要推送的日志。
-
在 Advanced Options(高级选项) 中,你可以:
- 选择日志中时间戳字段的格式(
RFC3339(默认)、Unix或UnixNano)。 - 为日志选择采样率,或推送随机采样的一定百分比日志。
- 启用针对
CVE-2021-44228的脱敏。该选项会将每一次出现的${替换为x{。
- 选择日志中时间戳字段的格式(
-
配置完 Logpush 任务后,选择 Submit(提交)。
要设置 Splunk Logpush 任务:
- 使用相应的端点 URL 和身份验证参数创建任务。
- 启用任务以开始推送日志。
在尝试读取或配置 Logpush 任务之前,请确保已启用 Log Share 权限。更多信息请参阅角色部分。
要创建任务,请向 Logpush jobs 端点发送 POST 请求,并包含以下字段:
-
name(可选)- 使用你的域名作为任务名称。
-
destination_conf - 由端点 URL、channel id、insecure-skip-verify 标志、source type、authorization header 组成的日志目标,格式如下所示的字符串。
- <SPLUNK_ENDPOINT_URL>:带端口的 Splunk raw HTTP Event Collector URL。例如:
splunk.cf-analytics.com:8088/services/collector/raw。- 配置并设置 Logpush 任务时,Cloudflare 期望 Splunk 端点为
/services/collector/raw。 - 确保已在 Splunk 中启用 HEC。有关如何在 Splunk 中设置 HEC,请参阅 Splunk Analytics Integrations。
- 添加错误 URL 时,你可能会看到 API 请求因 504 错误而失败。Splunk Cloud 端点 URL 通常在主机名之前包含
http-inputs-或类似文本。
- 配置并设置 Logpush 任务时,Cloudflare 期望 Splunk 端点为
- <SPLUNK_CHANNEL_ID>:唯一的 channel ID。这是一个随机 GUID,可通过以下方式生成:
- 使用在线工具,例如 GUID generator ↗。
- 使用命令行。例如:
python -c 'import uuid; print(uuid.uuid4())'。
- <INSECURE_SKIP_VERIFY>:布尔值。Cloudflare 建议将此值设为
false。设为true等同于在 Splunk 示例中对curl使用-k选项,不推荐。仅在 HEC 使用自签名证书时将此值设为true。
- <SOURCE_TYPE>:Splunk source type。例如:
cloudflare:json。 - <SPLUNK_AUTH_TOKEN>:URL 编码的 Splunk 授权 token,必须以单词
Splunk为前缀。例如:Splunk e6d94e8c-5792-4ad1-be3c-29bcaee0197d。
- <SPLUNK_ENDPOINT_URL>:带端口的 Splunk raw HTTP Event Collector URL。例如:
"splunk://<SPLUNK_ENDPOINT_URL>?channel=<SPLUNK_CHANNEL_ID>&insecure-skip-verify=<INSECURE_SKIP_VERIFY>&sourcetype=<SOURCE_TYPE>&header_Authorization=<SPLUNK_AUTH_TOKEN>"-
dataset - 你希望接收的日志类别。有关支持的数据集完整列表,请参阅 Datasets。
-
output_options(可选)- 要配置字段、采样率和时间戳格式,请参阅 Log Output Options。对于时间戳,Cloudflare 建议使用
timestamps=rfc3339。
使用 cURL 的示例请求:
Required API token permissions
At least one of the following token permissions is required:Logs Write
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/logpush/jobs" \
--request POST \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"name": "<DOMAIN_NAME>",
"destination_conf": "splunk://<SPLUNK_ENDPOINT_URL>?channel=<SPLUNK_CHANNEL_ID>&insecure-skip-verify=<INSECURE_SKIP_VERIFY>&sourcetype=<SOURCE_TYPE>&header_Authorization=<SPLUNK_AUTH_TOKEN>",
"output_options": {
"field_names": [
"ClientIP",
"ClientRequestHost",
"ClientRequestMethod",
"ClientRequestURI",
"EdgeEndTimestamp",
"EdgeResponseBytes",
"EdgeResponseStatus",
"EdgeStartTimestamp",
"RayID"
],
"timestamp_format": "rfc3339"
},
"dataset": "http_requests",
"enabled": true
}'响应:
{
"errors": [],
"messages": [],
"result": {
"id": <JOB_ID>,
"dataset": "http_requests",
"kind": "",
"enabled": true,
"name": "<DOMAIN_NAME>",
"output_options": {
"field_names": ["ClientIP", "ClientRequestHost", "ClientRequestMethod", "ClientRequestURI", "EdgeEndTimestamp","EdgeResponseBytes", "EdgeResponseStatus", "EdgeStartTimestamp", "RayID"],
"timestamp_format": "rfc3339"
},
"destination_conf": "splunk://<SPLUNK_ENDPOINT_URL>?channel=<SPLUNK_CHANNEL_ID>&insecure-skip-verify=<INSECURE_SKIP_VERIFY>&sourcetype=<SOURCE_TYPE>&header_Authorization=<SPLUNK_AUTH_TOKEN>",
"last_complete": null,
"last_error": null,
"error_message": null
},
"success": true
}请参阅 Manage Logpush with cURL 以了解如何更新任务(包括启用与禁用)。
请参阅 Logpush FAQ 获取故障排除信息。
如果你的 Logpush 目标主机名通过 Cloudflare 代理,并且已开启 Cloudflare Web Application Firewall (WAF),则在 Cloudflare 向 Splunk HTTP Event Collector (HEC) 发起请求时,可能会被质询或拦截。为避免这种情况,你需要创建一条自定义规则,允许 Cloudflare 绕过 HEC 端点。
-
在 Cloudflare 仪表板中,前往 Security rules(安全规则) 页面。
Go to Security rules ↗ -
选择 Create rule(创建规则) > Custom rules(自定义规则)。
-
为规则输入描述性名称(例如
Splunk)。 -
在 When incoming requests match(当传入请求匹配时) 下,使用 Field(字段)、Operator(运算符) 和 Value(值) 下拉列表创建规则。完成每一行后,选择 And(并且) 以创建下一行规则。应输入的值请参阅下表:
Field Operator Value Request Method equalsPOSTHostname(主机名) equals你的 Splunk 端点主机名。例如: splunk.cf-analytics.comURI Path equals/services/collector/rawURI Query String containschannelAS Num is in13335,132892,202623User Agent(用户代理) equalsGo-http-client/2.0 -
按表中所示输入值后,你应能看到包含你为该规则所添加值的 Expression Preview。以下示例反映主机名
splunk.cf-analytics.com。(http.request.method eq "POST" and http.host eq "splunk.cf-analytics.com" and http.request.uri.path eq "/services/collector/raw" and http.request.uri.query contains "channel" and ip.geoip.asnum in {13335 132892 202623} and http.user_agent eq "Go-http-client/2.0") -
在 Then(然后) > Choose an action(选择操作) 下拉列表中,选择 Skip。
-
在 WAF components to skip(要跳过的 WAF 组件) 下,选择 All managed rules(所有托管规则)。
-
选择 Deploy(部署)。
-
登录 Cloudflare 仪表板 ↗ 并选择你的账户。前往 Security(安全) > WAF > Custom rules(自定义规则)。
-
选择 Create rule(创建规则) 并输入描述性名称(例如
Splunk)。 -
在 When incoming requests match(当传入请求匹配时) 下,使用 Field(字段)、Operator(运算符) 和 Value(值) 下拉列表创建规则。完成每一行后,选择 And(并且) 以创建下一行规则。应输入的值请参阅下表:
Field Operator Value Request Method equalsPOSTHostname(主机名) equals你的 Splunk 端点主机名。例如: splunk.cf-analytics.comURI Path equals/services/collector/rawURI Query String containschannelAS Num is in13335,132892,202623User Agent(用户代理) equalsGo-http-client/2.0 -
按表中所示输入值后,你应能看到包含你为该规则所添加值的 Expression Preview。以下示例反映主机名
splunk.cf-analytics.com。(http.request.method eq "POST" and http.host eq "splunk.cf-analytics.com" and http.request.uri.path eq "/services/collector/raw" and http.request.uri.query contains "channel" and ip.geoip.asnum in {13335 132892 202623} and http.user_agent eq "Go-http-client/2.0") -
在 Then(然后) > Choose an action(选择操作) 下拉列表中,选择 Skip。
-
在 WAF components to skip(要跳过的 WAF 组件) 下,选择 All managed rules(所有托管规则)。
-
选择 Deploy(部署)。
WAF 现在应会忽略 Cloudflare 对 Splunk HEC 发起的请求。
如果在设置 Splunk 任务时收到验证错误,请检查以下内容:
- Endpoint URL(端点 URL):Cloudflare 仅支持通过 HTTPS 的 Splunk HEC raw 端点。请确认你的端点 URL 正确且包含端口(通常为
:8088)。 - Authentication token(身份验证令牌):确保 Splunk 身份验证 token 已 URL 编码并以
Splunk为前缀。例如,token 中的空格请使用%20。 - Certificate configuration(证书配置):由 Splunk 或第三方生成的证书,其 Common Name(通用名称) 字段必须与 Splunk 服务器的域名匹配。否则,你可能会看到类似如下的错误:
x509: certificate is valid for SplunkServerDefaultCert, not <YOUR_INSTANCE>.splunkcloud.com。
当 insecure-skip-verify 参数设为 true 时,会与 Splunk 建立不安全连接。这等同于对 curl 使用 -k 选项,不推荐。
为何存在此参数:由 Splunk 或第三方生成的证书,其 Common Name(通用名称) 字段应与 Splunk 服务器的域名匹配。当它们不匹配时(尤其是 Splunk 启动时生成的默认证书),除非修复证书,否则推送将失败。此参数适用于极少见的场景:你无法访问或修改证书,例如不允许更改服务器配置的 Splunk Cloud 实例。
在创建 Logpush 任务之前,请先通过不带 -k 标志且 insecure-skip-verify=false 的 curl 发布测试事件,验证你的 Splunk HEC 是否正常工作:
curl "https://<SPLUNK_ENDPOINT_URL>?channel=<SPLUNK_CHANNEL_ID>&insecure-skip-verify=false&sourcetype=<SOURCE_TYPE>" \
--header "Authorization: Splunk <SPLUNK_AUTH_TOKEN>" \
--data '{"BotScore":99,"BotScoreSrc":"Machine Learning","CacheCacheStatus":"miss","CacheResponseBytes":2478}'预期响应:
{"text":"Success","code":0}Cloudflare 期望 HEC 网络端口配置为 :443 或 :8088。不支持其他端口。
Logpush 与 Cloudflare App for Splunk ↗ 集成。只要你使用 cloudflare:json source type 摄取日志,即可使用 Cloudflare Splunk App 分析与可视化日志。
有关详细设置说明,请参阅 Splunk Analytics integration。