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:

    FieldDescription
    HEC URLYour Splunk HEC endpoint
    HEC TokenHTTP Event Collector token
    IndexTarget index (optional)
    SourceEvent source identifier
  4. Configure event forwarding:

    SettingDescription
    Forward all detectionsEvery detection as an event
    Forward high riskOnly critical detections
    Include raw dataInclude full detection payload
  5. Click Connect

DeploymentURL Format
Splunk Cloudhttps://http-inputs-<stack>.splunkcloud.com:443
Splunk Enterprisehttps://<your-server>:8088
Splunk Cloud Classichttps://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",
"detection_type": "decoy_link",
"ip_address": "192.168.1.100",
"threat_score": 85,
"threat_level": "critical",
"mitre_tactic": "reconnaissance",
"mitre_technique": "T1595",
"path": "/admin/backup.zip",
"user_agent": "Mozilla/5.0...",
"country": "US",
"city": "New York",
"is_bot": true,
"is_vpn": false,
"property_id": "prop_def456",
"property_name": "production_site",
"timestamp": "2025-01-15T10:30:00Z"
}
}
FieldTypeDescription
detection_idstringUnique detection identifier
detection_typestringdecoy_link, bot_scanner, endpoint
ip_addressstringSource IP address
threat_scorenumberRisk score (0-100)
threat_levelstringminimal, low, medium, high, critical
mitre_tacticstringMITRE ATT&CK tactic
mitre_techniquestringMITRE technique ID
pathstringRequested path
user_agentstringBrowser/client user agent
countrystringGeoIP country code
citystringGeoIP city
is_botbooleanBot detection result
is_vpnbooleanVPN/proxy detected
property_idstringProperty identifier
property_namestringProperty display name
timestampstringISO 8601 timestamp
index=security source=webdecoy
| stats count by threat_level
index=security source=webdecoy threat_level IN ("high", "critical")
| table _time, ip_address, path, threat_score, mitre_tactic
| sort - threat_score
index=security source=webdecoy
| timechart span=1h count by detection_type
index=security source=webdecoy
| stats count, avg(threat_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 mitre_tactic, mitre_technique
| 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 detection_type=decoy_link
| stats count by path
| sort - count
| head 10

Real-Time Detection Feed:

index=security source=webdecoy
| table _time, ip_address, threat_level, path, threat_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(threat_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 mitre_tactic | 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)