Console Guide

A field-by-field reference for every page, tab, and modal in the Echidra OSS console — what each control does, when it takes effect, and how the pieces connect.

Screenshot: Overview page Full-page capture showing the metric cards, Global Threat Map, and Recent Security Events panel together.

What's on this page

SectionShows
Metric cardsActive Threats, Low Risk Sessions, Warnings, and Total Events — all counted over the reporting window.
Global Threat MapOne dot per unique source IP, colored by that IP's highest observed risk tier (see Risk levels). Because geolocation only resolves to a country (not a precise coordinate), same-country dots get a small deterministic offset so they don't stack exactly on top of each other — click a dot for IP, country, and duration.
Recent Security EventsOne entry per unique source IP (most recent session for repeat visitors) — IP, country, session duration, and risk badge. Click through to Sessions for the full, filterable, per-session table.
i
This page auto-refreshes roughly every 30 seconds. If you're actively testing (e.g. SSHing into the honeypot yourself), give it a few seconds after disconnecting — a session is only logged and classified once the connection actually closes, not while it's still open.
Screenshot: Sessions table The table with a few rows visible, plus an expanded row showing the command timeline.

Table columns

ColumnMeaning
TimeWhen the session started.
Source IPThe connecting peer's address.
SessionsHow many times this exact pattern — same source IP, same Actor, same Intent — repeated within the selected date range. Rows are collapsed on that combination, not on IP alone: if the same IP's behavior changes (e.g. escalates from reconnaissance to credential theft), it gets its own separate row instead of being folded away.
CountryGeolocated from the source IP.
PersonaWhich honeypot identity the session hit (see Personas).
Protocoltcp_shell (SSH-style), http, ftp, or telnet.
ActorThe classifier's best-guess label for who/what this was (see Actor labels).
RiskCombined risk score bucketed into a level (see Risk levels).
IntentThe classifier's read on what the session was trying to do — reconnaissance, credential theft, persistence, etc.

Filtering and paging

  • Risk level filter — narrows the table to one risk tier at a time.
  • Row click — expands the row's representative session to show its full command log and any decoy files it touched. If a row's Sessions count is greater than 1, this shows only the most recent occurrence's transcript — the others aren't individually viewable in the table, only reflected in the count.
  • Pagination — 10 rows per page; Prev/Next controls appear once there's more than one page's worth.

Export

Export CSV and Export XLSX both download the currently filtered/date-ranged table using the same (IP + Actor + Intent) grouping as the table itself — keeping the most recent matching session as the representative row, with the Sessions column showing the real repeat count. XLSX adds a bold header row and auto-sized columns; CSV stays available for quick imports or scripting. Filenames include the active date range.

i
A session only appears here once it ends (disconnect, timeout, or logout) — a still-open connection in another terminal won't show up yet, and that's expected, not a bug.
Screenshot: Analytics page The Intent Breakdown metric cards plus the Attacks By Hour and Risk Trend charts.

Time range control

A "From date/hour" → "To date/hour" range picker in the top-right sets the reporting window; click Apply to recalculate every chart and metric against it. The picker won't let you select an inverted range (the calendar and hour dropdowns constrain each other automatically).

i
The Risk Trend chart automatically rolls up into coarser buckets on wider ranges — daily for up to 31 days, weekly up to 180 days, monthly beyond that — so a multi-month look-back still renders as a readable handful of bars instead of 90+ daily slivers. The chart's own title updates to say which bucket size is active.

Charts & panels

PanelShows
Sessions by IntentFour metric cards — Credential Access, Reconnaissance, Data Access, Interactive Operation — counted over the selected range.
Attacks By HourA bar chart of session start times bucketed by hour-of-day (0–23), summed across every day in the selected range.
Risk TrendStacked High/Medium/Low bars over time — day, week, or month buckets depending on range width (see above).
Protocol BreakdownWhich listener protocols (SSH, HTTP, FTP, Telnet) attackers connected to, ranked by session count.
Top CommandsThe most frequently typed shell commands across all captured sessions, ranked with a proportional bar.
Top PersonasWhich persona(s) attracted the most sessions in range — meaningful even though only one persona runs at a time, since it reflects every persona that's been active across the selected window, not just the current one.
Top CountriesSource geography by session count, same ranked-bar treatment.

Export

Export Full Report (CSV) downloads a ZIP file containing one clean, flat CSV per panel above (e.g. Attacks_by_Hour_of_Day.csv, Protocol_Breakdown.csv) — no combined multi-table file to parse apart. Export Full Report (XLSX) downloads a single workbook with the same data, one sheet per panel, bold header rows, and auto-sized columns. Both filenames include the active date range.

Screenshot: Intelligence page The issues table with a row expanded to show Evidence / Recommended Fix / Impact.

Table columns

ColumnMeaning
EventA short title for the pattern, drawn from a built-in playbook keyed on the actor/technique pair.
SeverityHigh / Medium / Low (see Risk levels — Critical folds into High here).
MITRE TechniquesThe ATT&CK technique ID(s) and name(s) this issue represents.
Session CountHow many distinct sessions have contributed to this issue.
Persona CountHow many different personas have seen this pattern.
StatusOpen / Closed — click to toggle. Purely an analyst bookkeeping flag; it doesn't change scoring or alerting.

Row detail

Click a row to expand it: Evidence (why the classifier flagged this), Recommended Fix, and Impact — all pulled from the same built-in playbook as the title.

i
Re-running classification refreshes counts on existing issues instead of duplicating them — closing an issue here persists across future syncs until you reopen it.

Paging

10 issues per page, same Prev/Next pattern as Sessions. The page auto-refreshes roughly every 30 seconds, but pauses while you have a row expanded so it doesn't collapse mid-read.

Screenshot: Personas page The persona table on the Configuration tab.
Configuration Analytics

Two tabs, same pattern used on the Alerts page's Email/Slack toggle.

Configuration tab

A table of every persona — presets and any customized ones — with hostname, open ports, and a Customize / Edit Config action. + Create New Persona starts a brand-new one from a slug ID instead of overriding a preset.

Persona modal — Identity section

Screenshot: Persona modal — Identity section Display Name, Hostname, OS Banner, SSH Banner, and Internal Notes fields.
FieldDescription
Display NameLabel shown in the dashboard only — not visible to attackers.
HostnameWhat hostname, the shell prompt, and login banners present.
OS BannerThe uname-style string shown to the attacker.
SSH BannerThe SSH server version string presented before authentication.
Internal NotesAnalyst-only scratch space — never shown to attackers, not used by scoring.

Persona modal — Deception section

Screenshot: Persona modal — Deception section Fake Users, Running Processes, HTTP Server Type, and Decoy Files fields.
FieldDescription
Fake UsersOne username per line — shown in /etc/passwd-style output and similar enumeration commands.
Running ProcessesOne process name per line — what a fake ps/process listing shows.
HTTP Server TypeWhich fake web server the HTTP listener presents (nginx / Apache / BusyBox), or None to reject all HTTP requests for this persona outright.
Decoy FilesPath + content pairs. When an attacker reads one of these paths (e.g. cat /etc/passwd), this content is what comes back. Also drives the "decoy files surfaced" evidence used in scoring.

Persona modal — Alerting section

Screenshot: Persona modal — Alerting section Alert Routing, Min Risk Level, Recipient Email, and Slack Webhook fields.
FieldDescription
Alert RoutingNone / Email / Slack / Both — which channel(s) fire for sessions on this persona. Setting this to a value that excludes a channel automatically disables that channel's destination field below (it can't take effect either way).
Min Risk LevelThe risk floor for this persona's alerts. Leave on "Use global default" to inherit the site-wide threshold set on the Alerts page; set explicitly to override it — this can loosen the bar (e.g. alert on Low) as well as tighten it.
Recipient EmailWhere this persona's email alerts go. Only editable when Alert Routing includes Email.
Slack WebhookAn https://hooks.slack.com/… incoming webhook URL. Only editable when Alert Routing includes Slack. Test it from the Alerts page's Slack tab before saving.
!
Not yet configurable per-persona: real login identity, SUID binaries, and decoy credentials stay fixed at the underlying persona's defaults — the config schema doesn't capture them yet.

Analytics tab

Screenshot: Personas page — Analytics tab The persona dropdown plus the scoped cards, trend chart, and ranked-bar panels below.

Pick a persona from the dropdown to see stats scoped to that persona only:

Card / ChartShows
Sessions CapturedTotal sessions against this persona.
High / Critical SessionsHow many of those sessions scored High or Critical risk.
Unique TechniquesDistinct MITRE technique count observed.
Sessions (30 days)A daily trend chart.
Peak Attack HoursSame hour-of-day breakdown as the Analytics page's Attacks By Hour chart, scoped to this persona.
Risk DistributionRanked bar list of sessions per risk level.
Common IntentRanked bar list of classified intents.
Top Source CountriesSame ranked-bar format as the site-wide Analytics page.
Top MITRE TechniquesTechnique ID and name combined (e.g. T1110 · Brute Force), ranked by how often each was observed.
Screenshot: Alerts page The Email tab's SMTP configuration form, plus the Alert History table below it. Use a demo SMTP account/From Email here, not a real personal inbox.
Email Slack

Email tab — SMTP configuration

FieldDescription
Enable email alertsMaster switch. Off means no email sends regardless of any persona's routing. Saves immediately when toggled — no need to also click Save Configuration for this field.
SMTP Host / Port / Username / Email App PasswordYour mail provider's SMTP credentials. Most providers (Gmail, Outlook, etc.) require a per-app password here rather than your real account password. It's encrypted at rest and never re-displayed — leave it blank on a re-save to keep the existing one.
All fields aboveDisabled whenever Enable email alerts is off, since nothing will send regardless of what's filled in.
From EmailThe sending address shown to recipients.
Use TLS (STARTTLS)Leave on unless your provider explicitly requires plaintext.
Global minimum risk levelThe site-wide default alert threshold. Any persona that hasn't set its own Min Risk Level override inherits this value.

Send Test Email fires a real send using the currently saved configuration (requires Enable email alerts to be on, plus SMTP Host and From Email set) — a quick way to verify credentials before relying on them. Its result message appears next to the button itself, separate from Save Configuration's own status message.

Slack tab

Screenshot: Alerts page — Slack tab The webhook URL field and Send Test Message button.

Slack routing is per-persona (see Personas → Alerting section), not global — this tab exists purely to test a webhook URL before you paste it into a persona's config. Paste the webhook, click Send Test Message, and check the channel. Only https://hooks.slack.com/… URLs are accepted.

i
Both email and Slack alert messages include the session's Country (geolocated from Peer IP) alongside Risk Level, Actor, Behavior, Intent, Peer IP, Session ID, and MITRE tags.

Alert History

Screenshot: Alerts page — Alert History The metric cards and the delivered/failed alert table below them. Set the persona's Recipient Email to a demo address (e.g. demo@example.com) before generating these alerts — the Recipient column will show whatever real address was configured at send time.
ColumnMeaning
TimeWhen the alert was dispatched.
SessionA truncated session ID (hover for the full value) — cross-reference it against the Sessions page to pull up that session's full transcript.
PersonaWhich persona's session triggered it.
RiskThe triggering session's risk level.
ActorThe classifier's actor label for that session.
ChannelEmail or Slack.
RecipientThe persona's Recipient Email, where applicable.
StatusDelivered or Failed — hover a failed row for the error detail.

Metric cards above the table summarize Total Alerts, Last 24h, Delivered, and Failed counts. 10 rows per page.

Why an alert might not fire

  1. Global Enable email alerts is off (email only — Slack has no separate global switch).
  2. The persona's Alert Routing is none, or doesn't include the channel you expected.
  3. The session's risk level doesn't meet the effective threshold (persona override, or the global default if none is set).
  4. The destination field (Recipient Email / Slack Webhook) is empty for the channel that's supposed to fire.
LevelScore range
Critical85–100
High65–84
Medium40–64
Low1–39
None0 — no rule matched
i
Risk badges use only four visual tiers — Critical folds into the High badge style everywhere in the UI, since there's no separate "critical" color treatment.
  • brute_force_bot — a completed username+password submission, or repeated connections from the same source IP. This is the most common label; the honeypot has no way to distinguish your own manual testing from a real attacker.
  • script_kiddie — recognizable off-the-shelf tool names typed at the shell.
  • skilled_human_operator — timing and command patterns consistent with a real person working interactively, not a script.
  • Others are added via classifier/rules/default_rules.yaml — new patterns don't require touching scoring code.
TermMeaning
PersonaThe fake machine identity a connection sees — see Personas.
SessionOne connected client's full interaction, start to end.
ClassificationTurning a raw session into an actor label, risk score, and MITRE tags.
IssueA recurring (actor, technique) pattern rolled up across sessions — see Intelligence.
Decoy fileFake file content served to an attacker who reads a specific path.
Alert routingPer-persona choice of which channel(s) — email, Slack, both, or none — get notified.