ESC
> PressHaven alpha
Home › Docs › Observability

Observability

How the honeypot system provides observability into adversary activities

Observability has one job here: turn an ephemeral request decision into evidence that survives the session. Every scoring result, routing decision and network alert can leave the edge as structured data, and the SIEM side is designed so a missing Kibana never affects detection.

Observability Layers

  • Log Ingestion: Structured logs from the reverse proxy, Lua engines, and Suricata are centralized for SIEM consumption via Nginx error/security logs and Vector forwarding — over mutual TLS — to Elasticsearch/Kibana. See Transport & mTLS.
  • SIEM Dashboards: High-level operational views of IDS alerts, threat overview, and web traffic.
  • Kibana Visualizations: Interactive dashboards and pattern report timelines.
  • Alerting & Reporting: AbuseIPDB reporting and reputation-based alerting.

The whole SIEM side is fail-open with respect to detection: it turns an ephemeral request decision into durable evidence, but nothing in the request path waits for it, so a SIEM outage never affects routing or scoring.

Telemetry Sources

Security Event Logging

_G.utils.log_security_event(event_type, details) appends one structured JSON line per event to the Nginx error log, prefixed with SECURITY_EVENT. Vector reads these lines and forwards them to Elasticsearch; the rules they must follow (JSON lines, empty tables encoded as [], retries never blocking the edge) are the Pipeline Contracts. The shared dictionaries that cache state between requests are listed in Lua Internals.

The logger (init.lua) and a typical call from router.lua:

local log_entry = {
    timestamp = ngx.time(),
    event_type = event_type,
    details = details,
    server_time = os.date("%Y-%m-%d %H:%M:%S")
}
ngx.log(ngx.WARN, "SECURITY_EVENT: ", cjson.encode(log_entry))
_G.utils.log_security_event("routing_to_honeypot", {
    reason = "high_risk_score",
    score = pattern_result.score,
    ip = remote_ip,
    pool = routing_decision.session_data.honeypot_pool,
    session_id = session_data.id
})

To watch them live: docker compose logs -f reverse_proxy | grep SECURITY_EVENT.

Suricata Log Ingestion

init_worker.lua reads new eve.json alerts every 30 seconds, drops private and loopback sources, and stores a severity-graded score per IP in threat_ips, decayed when read. The scoring functions are on Suricata Network IDS, and the reader's resume and size limits on Lua Internals.

Honest Assessment

Strengths: Multi-layer observability, structured security events, empty-table fix, Suricata integration, offline dashboard generation.

Limitations: Dashboard drift, timeline capture fragility, no automated health monitoring, Vector complexity, same-host testing gap.