Skip to content

Splunk Integration

Forward detection events to Splunk for centralized security monitoring, threat hunting, and SIEM dashboards.

  • Splunk Cloud or Splunk Enterprise
  • HTTP Event Collector (HEC) enabled
  • HEC token with write access
  1. Log into Splunk Web
  2. Go to Settings → Data Inputs
  3. Click HTTP Event Collector
  4. Click Global Settings
  5. Set All Tokens to Enabled
  6. Click Save
  1. In HTTP Event Collector, click New Token
  2. Enter name: “WebDecoy Integration”
  3. Click Next
  4. Select Input Settings:
    • Source type: _json
    • App context: search
    • Index: Select your security index
  5. Click ReviewSubmit
  6. Copy the generated token
  1. Go to Integrations → Splunk

  2. Click Add Splunk Integration

  3. Enter:

    Field Description
    HEC URL Your Splunk HEC endpoint
    HEC Token HTTP Event Collector token
    Index Target index (optional)
    Source Event source identifier
  4. Configure event forwarding:

    Setting Description
    Forward all detections Every detection as an event
    Forward high risk Only critical detections
    Include raw data Include full detection payload
  5. Click Connect

Deployment URL Format
Splunk Cloud https://http-inputs-<stack>.splunkcloud.com:443
Splunk Enterprise https://<your-server>:8088
Splunk Cloud Classic https://input-<stack>.cloud.splunk.com:443

Detections are sent as JSON events to Splunk:

{
"time": 1705315800,
"host": "webdecoy",
"source": "webdecoy",
"sourcetype": "_json",
"index": "security",
"event": {
"detection_id": "det_abc123",
"event_type": "detection",
"source_type": "decoy_link",
"ip_address": "192.168.1.100",
"unified_score": 85,
"bot_score": 92,
"threat_level": "critical",
"threat_category": "scanner",
"confidence": 0.94,
"request_method": "GET",
"user_agent": "Mozilla/5.0...",
"geo_country": "US",
"geo_city": "New York",
"geo_latitude": 40.7128,
"geo_longitude": -74.006,
"is_vpn": false,
"is_proxy": false,
"is_tor": false,
"is_relay": false,
"signature_verified": null,
"token_verified": null,
"cryptographic_trust": null,
"abuse_confidence_score": 97,
"rules_enforced": true,
"organization_id": "org_xyz789",
"property_id": "prop_def456",
"decoy_id": "decoy_uuid",
"scanner_id": null,
"timestamp": "2026-07-15T10:30:00Z"
}
}
Field Type Description
detection_id string Unique detection identifier
event_type string detection, high_risk_detection, rule_enforced
source_type string decoy_link, bot_scanner, endpoint, sdk, honeypot_agent
ip_address string Source IP address
unified_score number Headline threat score (0-100)
bot_score number Bot-likelihood component score
threat_level string minimal, low, medium, high, critical
threat_category string e.g. scraper, scanner, attacker
confidence number Detection confidence
request_method string HTTP method
user_agent string Browser/client user agent
geo_country / geo_city string GeoIP location
geo_latitude / geo_longitude number GeoIP coordinates
is_vpn / is_proxy / is_tor / is_relay boolean Network risk flags
signature_verified / token_verified boolean Cryptographic identity checks
abuse_confidence_score number Threat-intel abuse score
rules_enforced boolean Whether a response action enforced
organization_id / property_id / decoy_id / scanner_id string Resource identifiers
timestamp string ISO 8601 timestamp
index=security source=webdecoy
| stats count by threat_level
index=security source=webdecoy threat_level IN ("high", "critical")
| table _time, ip_address, source_type, unified_score, threat_category
| sort - unified_score
index=security source=webdecoy
| timechart span=1h count by source_type
index=security source=webdecoy
| stats count, avg(unified_score) as avg_score by ip_address
| sort - count
| head 20
index=security source=webdecoy is_bot=true
| stats count by ip_address, user_agent
| sort - count
index=security source=webdecoy
| iplocation ip_address
| geostats count by Country
index=security source=webdecoy
| stats count by threat_category
| sort - count

Detection Overview:

index=security source=webdecoy
| timechart span=1h count by threat_level

Threat Level Distribution:

index=security source=webdecoy
| stats count by threat_level
| sort - count

Top Decoy Paths:

index=security source=webdecoy source_type=decoy_link
| stats count by decoy_id
| sort - count
| head 10

Real-Time Detection Feed:

index=security source=webdecoy
| table _time, ip_address, threat_level, source_type, unified_score
| sort - _time
| head 50
<dashboard>
<label>WebDecoy Security Dashboard</label>
<row>
<panel>
<title>Detections Over Time</title>
<chart>
<search>
<query>index=security source=webdecoy | timechart span=1h count by threat_level</query>
</search>
<option name="charting.chart">column</option>
<option name="charting.chart.stackMode">stacked</option>
</chart>
</panel>
<panel>
<title>Threat Level Breakdown</title>
<chart>
<search>
<query>index=security source=webdecoy | stats count by threat_level</query>
</search>
<option name="charting.chart">pie</option>
</chart>
</panel>
</row>
<row>
<panel>
<title>Top Attacking IPs</title>
<table>
<search>
<query>index=security source=webdecoy | stats count, max(unified_score) as max_score by ip_address | sort - count | head 10</query>
</search>
</table>
</panel>
<panel>
<title>MITRE ATT&CK Tactics</title>
<chart>
<search>
<query>index=security source=webdecoy | stats count by threat_category | sort - count</query>
</search>
<option name="charting.chart">bar</option>
</chart>
</panel>
</row>
</dashboard>

Create a saved search with alerting:

index=security source=webdecoy threat_level=critical
| stats count
| where count > 0

Alert settings:

  • Schedule: Every 5 minutes
  • Trigger: When number of results > 0
  • Action: Send email / Slack / PagerDuty
index=security source=webdecoy
| timechart span=5m count as detection_count
| streamstats window=12 avg(detection_count) as avg_count stdev(detection_count) as stdev_count
| eval threshold = avg_count + (3 * stdev_count)
| where detection_count > threshold
index=security source=webdecoy is_bot=true
| stats dc(ip_address) as unique_bots count as total_requests by property_name
| where total_requests > 100
index=security source=webdecoy threat_level IN ("high", "critical")
| stats earliest(_time) as first_seen count by ip_address
| where first_seen > relative_time(now(), "-1h")
index=security (source=webdecoy OR source=firewall OR source=ids)
| eval event_source=source
| stats count by ip_address, event_source
| xyseries ip_address event_source count
index=security source=webdecoy
| transaction ip_address maxspan=1h
| where eventcount > 3
| table ip_address, eventcount, duration, path

If using Splunk Enterprise Security (ES):

Configure WebDecoy events to create ES notable events:

  1. Go to Configure → Content → Content Management
  2. Create new correlation search
  3. Use search:
    index=security source=webdecoy threat_level=critical
    | eval src=ip_address, dest=property_name
  4. Enable adaptive response action: Create Notable Event

Integrate WebDecoy IPs with threat intel:

index=security source=webdecoy
| lookup threat_intel ip AS ip_address OUTPUT threat_category
| where isnotnull(threat_category)
  • ✅ Use a dedicated security index
  • ✅ Set appropriate retention policies
  • ✅ Create role-based access to WebDecoy data
  • ✅ Build dashboards for security operations
  • ✅ Set up alerts for critical detections
  • ✅ Correlate with other security data
  • ❌ Forward to main index (use security index)
  • ❌ Ignore index sizing for high-volume events
  • ❌ Skip HEC token rotation
  • ❌ Use admin credentials for HEC token
  1. Verify HEC URL is correct
  2. Check HEC token is valid and enabled
  3. Test HEC endpoint directly:
    Terminal window
    curl -k "https://<hec-url>/services/collector" \
    -H "Authorization: Splunk <token>" \
    -d '{"event": "test"}'
  4. Check target index exists and has capacity
  5. Verify source type settings
  1. Regenerate HEC token
  2. Verify token hasn’t been disabled
  3. Check token permissions include target index
  4. Ensure Global Settings has tokens enabled
  1. Enable indexer acknowledgment for reliability
  2. Consider using multiple HEC endpoints for load balancing
  3. Batch events if high volume
  4. Monitor HEC queue size
  1. Verify certificate chain is complete
  2. For self-signed certs, add CA to trust store
  3. Use correct port (8088 for Enterprise, 443 for Cloud)