| Version | Datum | Autor | Beschreibung |
|---|---|---|---|
| 1.0 | 2026-02-10 | Marcus Pauli | Erstversion: Splunk-Vorbereitung, Index-Mapping, Verifikation, Migration |
| 1.1 | 2026-02-19 | Marcus Pauli | Abschnitt 6: Benoetigte Splunk Apps und Add-ons (Pflicht/Empfohlen, Installation, Konfiguration). Abschnitt 9: Troubleshooting mit Diagnose-Befehlen. |
| 1.2 | 2026-02-19 | Marcus Pauli | Abschnitt 0: Interaktiver Splunk Check & Fix Panel (Indexes, HEC, S2S, Apps via REST API pruefen und anlegen). |
Bevor Cribl Stream Daten an Splunk liefern kann, muessen auf dem Splunk-Indexer drei Komponenten konfiguriert werden: ein HEC-Token, ein S2S-Receiving-Port und die Ziel-Indexes.
https:// verwenden,
bei deaktiviertem SSL http://.cribl_hec_tokenmain.env auf dem Cribl-Server hinterlegen# .env auf dem Cribl-Server
SPLUNK_HEC_TOKEN=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
.env-Datei muss in .gitignore aufgefuehrt sein.
9997# Verifikation: Port pruefen
netstat -tlnp | grep 9997
# oder
ss -tlnp | grep 9997
Fuer die saubere Trennung der Datenquellen werden dedizierte Indexes erstellt. Navigieren zu Settings → Indexes → New Index:
| Index-Name | Datentyp | Max. Groesse | Aufbewahrung | Beschreibung |
|---|---|---|---|---|
idx_web | Events | 10 GB | 90 Tage | Apache Access und Error Logs |
idx_security | Events | 10 GB | 365 Tage | SSH-Authentifizierung, Sicherheits-Events |
idx_infrastructure | Events | 15 GB | 90 Tage | Systemd Journal, Samba, allgemeine Infrastruktur |
idx_containers | Events | 10 GB | 30 Tage | Docker/Home Assistant, Mosquitto |
os_journal, web_apache, infra_samba, iot_homeassistant,
iot_mqtt, sec_auth, sec_tor, infra_dns,
infra_cups, os_boot, os_packages.
Die Namenskonvention folgt dem Schema bereich_anwendung.
# CLI-Alternative: Indexes ueber Splunk REST API anlegen
curl -k -u admin:password https://localhost:8089/services/data/indexes \
-d name=idx_security \
-d datatype=event \
-d maxTotalDataSizeMB=10240 \
-d frozenTimePeriodInSecs=31536000
Das folgende Mapping definiert, welche Datenquellen in welchen Splunk-Index geschrieben werden. Die Zuordnung erfolgt ueber die Cribl-Route und die Destination-Konfiguration:
| Quelle | Route | Pipeline | Destination | Splunk-Index |
|---|---|---|---|---|
| Apache Access Log | route_apache_access | pipeline_apache_clf | HEC | idx_web |
| Apache Error Log | route_apache_error | pipeline_syslog_enrichment | HEC | idx_web |
| SSH Auth Log | route_ssh_auth | pipeline_security_auth | S2S | idx_security |
| Docker/HA Logs | route_docker | pipeline_docker_json | HEC | idx_containers |
| Mosquitto Logs | route_docker | pipeline_docker_json | HEC | idx_containers |
| Systemd Journal | route_journal | pipeline_syslog_enrichment | S2S | idx_infrastructure |
| Samba Logs | route_samba | pipeline_generic_passthrough | S2S | idx_infrastructure |
| Sonstige (Default) | route_default | pipeline_generic_passthrough | HEC | main |
Sourcetypes bestimmen, wie Splunk die eingehenden Daten parsed und indiziert.
Die folgende Zuordnung wird ueber die Quellen-Konfiguration in Cribl oder ueber Splunk props.conf gesteuert:
| Quelle | Sourcetype | Beschreibung |
|---|---|---|
| Apache Access Log | access_combined | Apache Combined Log Format (Splunk-Standard) |
| Apache Error Log | apache:error | Apache Error Log Format |
| SSH Auth Log | linux_secure | Linux-Authentifizierungslogs (Splunk TA Standard) |
| Docker/HA Logs | docker:json | Docker JSON Log Format |
| Mosquitto Logs | mosquitto | Mosquitto MQTT Broker Logs |
| Systemd Journal | syslog | Standard-Syslog-Format |
| Samba Logs | samba | Samba/SMB Server Logs |
| Boot Logs | linux:boot | Linux Boot Messages |
| CUPS Logs | cups:access | CUPS Druckserver Logs |
| DNSmasq Logs | dnsmasq | DNSmasq DNS/DHCP Logs |
| dpkg Logs | dpkg | Debian Paketmanager Logs |
| Tor Logs | tor | Tor Service Logs |
linux_secure ist kompatibel mit
dem Splunk Add-on for Unix and Linux.
Nach der vollstaendigen Konfiguration von Cribl und Splunk muss die Datenlieferung end-to-end verifiziert werden.
events_out und bytes_out muessen steigen.# 1. Syslog-Testevent senden (→ S2S → Splunk)
logger -n 127.0.0.1 -P 514 --tcp "E2E_TEST: $(date)"
# 2. In Splunk suchen (nach 10-15 Sekunden)
curl -sk -u admin:<password> "https://<splunk>:8089/services/search/jobs/export" \
-d search="search index=os_journal E2E_TEST earliest=-5m" \
-d output_mode=json
# 3. Cribl Output-Metriken pruefen
TOKEN=$(curl -s -X POST "http://localhost:9000/api/v1/auth/login" \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"admin"}' | jq -r '.token')
curl -s -H "Authorization: Bearer $TOKEN" \
"http://localhost:9000/api/v1/system/outputs" | jq '.items[] | {id, health: .status.health}'
index=idx_web sourcetype=access_combined
| stats count by status, method
| sort -count
index=idx_web sourcetype=access_combined status>=400
| stats count by client_ip, status, uri
| sort -count
| head 20
index=idx_web sourcetype="apache:error"
| stats count by syslog_program, syslog_host
| sort -count
index=idx_security sourcetype=linux_secure auth_action=failed_login
| stats count by src_ip, failed_user
| sort -count
| head 20
# MITRE ATT&CK-annotierte Events
index=idx_security mitre_technique_id=T1110
| stats count by src_ip, mitre_technique_name, mitre_tactic
| sort -count
# Erfolgreiche Logins
index=idx_security sourcetype=linux_secure auth_action=successful_login
| table _time, accepted_user, src_ip, auth_method
index=idx_containers sourcetype="docker:json"
| stats count by log_level, container_id
| sort -count
index=idx_containers sourcetype="docker:json" log_level=ERROR
| table _time, container_id, message
index=idx_infrastructure sourcetype=syslog
| stats count by syslog_program
| sort -count
| head 20
index=idx_infrastructure sourcetype=samba
| stats count by host
| sort -count
# Alle Events, die von Cribl verarbeitet wurden
index=* cribl_pipeline=*
| stats count by cribl_pipeline, index
| sort -count
# Durchsatz pro Pipeline in den letzten 24 Stunden
index=* cribl_pipeline=*
| timechart span=1h count by cribl_pipeline
Damit Splunk die von Cribl gelieferten Daten korrekt parsen, normalisieren und in Dashboards darstellen kann, muessen bestimmte Apps und Technology Add-ons (TAs) installiert werden. Die TAs stellen Sourcetype-Definitionen, Feld-Extraktionen und CIM-Mappings bereit.
Diese Apps sind fuer den korrekten Betrieb zwingend erforderlich:
| App / Add-on | Splunkbase-ID | Zweck | Betroffene Sourcetypes |
|---|---|---|---|
| Splunk Common Information Model (CIM) | 1621 | Stellt das CIM-Datenmodell bereit. Voraussetzung fuer alle TA-basierten Feld-Normalisierungen und fuer Splunk Enterprise Security. | alle |
| Splunk Add-on for Unix and Linux (TA-nix / Splunk_TA_nix) |
833 | Feld-Extraktionen fuer linux_secure, syslog, linux:boot. Stellt CIM-Mappings fuer Authentication, Change und Endpoint bereit. |
linux_secure, syslog, linux:boot, dpkg |
| Splunk Add-on for Apache Web Server (Splunk_TA_apache) |
3186 | Parsing und Feld-Extraktionen fuer Apache Access- und Error-Logs. CIM-Mapping fuer Web-Datenmodell. | access_combined, apache:error |
Diese Apps erweitern die Analysefaehigkeiten und werden dringend empfohlen:
| App / Add-on | Splunkbase-ID | Zweck | Betroffene Sourcetypes |
|---|---|---|---|
| Sophos XG Firewall Add-on for Splunk (TA-sophos-xg) |
3724 | Parsing der Key=Value-Paare aus Sophos XG/XGS Firewall-Syslog. CIM-Mapping fuer Network Traffic, IDS, Authentication. | sophos:xg:firewall, sophos:xg:idp, sophos:xg:atp |
| Splunk Add-on for Docker (splunk-add-on-for-docker) |
5765 | Feld-Extraktionen fuer Docker JSON Logs, Container-Metadaten. | docker:json, docker:daemon |
| Splunk Add-on for Samba (TA-samba) |
3218 | Parsing und Feld-Extraktionen fuer Samba/SMB-Logs. | samba |
| MITRE ATT&CK Framework App for Splunk | 4617 | Visualisierung der MITRE ATT&CK-Annotationen, die Cribl in der Security-Pipeline hinzufuegt. ATT&CK-Matrix Dashboard. | alle mit mitre_*-Feldern |
| Cribl Add-on for Splunk | 5556 | Erkennung und Darstellung von Cribl-Metadaten (cribl_host, cribl_pipeline). Durchsatz-Dashboards fuer Cribl-Pipeline-Monitoring. |
alle von Cribl gelieferten Events |
| Splunk Security Essentials | 3435 | Vorgefertigte Security-Use-Cases und -Detektionen. Nutzt CIM-kompatible Daten aus den TAs. | alle CIM-konformen Daten |
# 1. App-Paket (.tgz) von splunkbase.splunk.com herunterladen
# 2. Installation ueber Splunk CLI
/opt/splunk/bin/splunk install app /tmp/splunk-add-on-for-unix-and-linux_920.tgz -auth admin:<password>
# 3. Splunk neu starten (falls erforderlich)
/opt/splunk/bin/splunk restart
# App direkt von Splunkbase installieren
curl -k -u admin:<password> \
https://localhost:8089/services/apps/local \
-d name=Splunk_TA_nix \
-d filename=true \
-d update=true
Da die Daten nicht ueber den lokalen UF-Input, sondern ueber Cribl geliefert werden,
muessen die Inputs des TA deaktiviert bleiben. Nur die Feld-Extraktionen
(props.conf, transforms.conf) werden benoetigt.
# Pruefen, ob Inputs deaktiviert sind (Standard bei reiner Indexer-Installation)
cat $SPLUNK_HOME/etc/apps/Splunk_TA_nix/local/inputs.conf
# Sollte leer sein oder alle Stanzas auf disabled=1 haben
# Falls Inputs aktiv sind, deaktivieren:
cat > $SPLUNK_HOME/etc/apps/Splunk_TA_nix/local/inputs.conf << 'EOF'
[default]
disabled = 1
EOF
Die Cribl-Pipeline pipeline_sophos_fw fuehrt bereits eine KVP-Extraktion
und CIM-Normalisierung durch. Das Sophos TA ergaenzt zusaetzliche Lookups und
Feld-Alias-Definitionen fuer die vollstaendige CIM-Kompatibilitaet.
sourcetype=sophos:xg:firewall
liefert, greift das TA automatisch. Sicherstellen, dass der Sourcetype in der Cribl-Pipeline
korrekt gesetzt wird (Feld _sourcetype oder HEC-Payload sourcetype).
Nach der Installation ist keine zusaetzliche Konfiguration erforderlich. Das Add-on erkennt
automatisch alle Events mit cribl_*-Feldern und stellt Dashboards fuer
Pipeline-Monitoring bereit.
| Schritt | App | Neustart? | Konfiguration |
|---|---|---|---|
| 1 | Splunk CIM | Nein | Keine |
| 2 | Splunk_TA_nix | Nein | Inputs deaktiviert lassen |
| 3 | Splunk_TA_apache | Nein | Keine |
| 4 | TA-sophos-xg | Nein | Sourcetype-Mapping pruefen |
| 5 | Splunk Add-on for Docker | Nein | Keine |
| 6 | Cribl Add-on for Splunk | Nein | Keine |
| 7 | MITRE ATT&CK App | Nein | Macro-Setup bei Erststart |
| 8 | Security Essentials | Nein | Guided Setup bei Erststart |
| - | Splunk-Neustart empfohlen nach Installation aller Apps | ||
| Kriterium | Cribl Stream + Edge | Splunk Universal Forwarder |
|---|---|---|
| Datenverarbeitung | Volle Pipeline-Verarbeitung (Parsing, Anreicherung, Filterung) vor der Zustellung | Minimal: Nur Weiterleitung, Parsing erfolgt auf dem Indexer |
| Datenreduktion | Ja (Sampling, Aggregation, Suppression moeglich) | Nein (alle Daten werden weitergeleitet) |
| Routing | Flexible Routing-Regeln, mehrere Destinations pro Event | Festes Routing an konfigurierte Indexer |
| Format-Unterstuetzung | HEC, S2S, Kafka, S3, Azure, und weitere | Nur S2S an Splunk-Indexer |
| Vendor Lock-in | Gering (Daten koennen an verschiedene Ziele geliefert werden) | Hoch (nur Splunk als Ziel) |
| Lizenzierung | Eigene Lizenz (Cribl), reduziert Splunk-Lizenzvolumen durch Datenreduktion | Kostenfrei, aber gesamtes Datenvolumen zaehlt zur Splunk-Lizenz |
| MITRE-Anreicherung | Ja (in Pipelines konfigurierbar) | Nein (erst in Splunk Enterprise Security) |
| Edge-Deployment | Cribl Edge: Leichtgewichtiger Agent fuer Endpoints | UF: Etablierter Agent, breite Plattformunterstuetzung |
| Management | Zentrale UI (Cribl Stream), Fleet Management fuer Edge Nodes | Deployment Server, Splunk Cloud Gateway |
| Ressourcenverbrauch | Stream: Mittel (Server). Edge: Gering (Agent) | Gering (Agent) |
Die Migration von bestehenden Splunk Universal Forwarders (UF) zu Cribl Edge erfolgt schrittweise nach dem Blue-Green-Prinzip:
| UF-Konfiguration | Cribl-Aequivalent | Hinweis |
|---|---|---|
inputs.conf (monitor://) | File Monitor Source | Pfade 1:1 uebernehmen |
outputs.conf | Destination (HEC/S2S) | Ziel-Server uebernehmen |
props.conf (Sourcetype) | Route + Pipeline | Sourcetype in Cribl setzen |
transforms.conf | Pipeline Functions | Regex in Cribl-Functions uebersetzen |
serverclass.conf | Fleet Management | Gruppen und Policies migrieren |
# Event-Count-Vergleich: UF vs. Cribl (letzten 24h)
index=* host=migrierter_host
| eval source_system=if(isnotnull(cribl_pipeline),"Cribl","UF")
| stats count by source_system, sourcetype
| sort sourcetype
| Symptom | Ursache | Loesung |
|---|---|---|
| Cribl HEC Output: Health "Green", aber keine Events in Splunk | HEC-Token in Cribl stimmt nicht mit dem in Splunk angelegten Token ueberein | Token in Cribl pruefen: Manage → Destinations → splunk_hec. Muss identisch mit dem Token in .env und in Splunk sein.
|
| Cribl HEC Output: Health "Red" | Splunk HEC-Port (8088) nicht erreichbar oder HEC Global Settings deaktiviert |
|
| Events kommen an, aber im falschen Index | HEC-Token hat keine Berechtigung fuer den Ziel-Index, oder der Index fehlt in "Allowed Indexes" | In Splunk: Settings → Data Inputs → HTTP Event Collector → Token bearbeiten → alle benoetigten Indexes unter "Allowed Indexes" hinzufuegen. |
| Events kommen an, aber Felder fehlen | Benoetigtes TA ist nicht installiert | Pruefen, ob alle Pflicht-Apps installiert sind (siehe Abschnitt 6). Insbesondere Splunk_TA_nix fuer linux_secure. |
| Cribl S2S Output: Health "Red" | Splunk Receiving Port (9997) nicht konfiguriert oder Firewall blockiert |
|
sourcetype wird als httpevent angezeigt |
Cribl setzt den Sourcetype nicht im HEC-Payload | In der Cribl-Pipeline sicherstellen, dass das Feld sourcetype gesetzt wird (z.B. ueber eval-Funktion: sourcetype = 'linux_secure') |
# === Cribl-seitig ===
# Alle Output-Health-Status
TOKEN=$(curl -s -X POST "http://10.10.0.100:9000/api/v1/auth/login" \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"***"}' | jq -r '.token')
curl -s -H "Authorization: Bearer $TOKEN" \
"http://10.10.0.100:9000/api/v1/system/outputs" \
| jq '.items[] | {id, type, health: .status.health, sent: .status.metrics.sentCount}'
# === Splunk-seitig ===
# Letzte 15 Minuten: Events pro Index zaehlen
curl -sk -u admin:<password> "https://10.10.0.66:8089/services/search/jobs/export" \
-d 'search=search index=* earliest=-15m | stats count by index, sourcetype' \
-d output_mode=json
# HEC-Token-Status pruefen
curl -sk -u admin:<password> \
"https://10.10.0.66:8089/services/data/inputs/http" \
| python3 -c "import sys,json; [print(f'{e[\"name\"]}: disabled={e[\"content\"][\"disabled\"]}') for e in json.load(sys.stdin)[\"entry\"]]"
# Index-Groesse pruefen
curl -sk -u admin:<password> \
"https://10.10.0.66:8089/services/data/indexes?output_mode=json&count=0" \
| jq '.entry[] | select(.content.totalEventCount != "0") | {name: .name, events: .content.totalEventCount, size_mb: .content.currentDBSizeMB}'
http:// verwenden, nicht https://)