Server Health OPT
Most Recent Alerts
IP Reputation (ipsum)
Firewall Blocks (24h)
Agent Coverage
CVE Exposure
Alerts
Live query against alerts-* — Sigma, Suricata, and correlated detections. Last 24h by default; pick dates below to search further back.
A ×N badge means one rule matched N events on that host in a single detection pass — a burst of near-identical hits collapsed into one row so it reads as one incident rather than N. Hover it to see what differed between them. Nothing is discarded: the count is exact and every underlying event remains searchable.
Alert trends
By severity
Most-alerted agents
By source
Top accounts
ATT&CK tactics
Top processes
Top IP addresses
Top triggered rules
field:value with AND, OR, NOT and ranges like dest_port:[1 TO 1023].
Connections
The busiest alert rules and everything linked to them, live: the agents, processes, accounts and IP addresses their alerts name, and the process starts, connections, DNS lookups, logons, firewall blocks and service installs around those. Moving dots are the last five minutes of activity, and a rule flashes when a new alert arrives. Click anything for its links; double-click it, or type it below, to focus on it.
Network Map
Every device on this network, found by scanning it from the Console, and the alerts about each. A device's ring takes the colour of its worst alert, and alerts between devices, or with the internet, run along the lines between them. An alert is matched to a device by its address, by the EasySIEM agent on it, or by any name it answers to. Click a device for its details.
Leave Ranges empty to scan the Console's own network, or list up to four private ranges (10.x, 172.16–31.x or 192.168.x), each a /22 or smaller. A scan connects once to each address and to a few common ports on the devices that answer, then asks each device its name. Firewalls may log it; the alerts it causes are set aside on this map.
Authentication
Successful and failed sign-ins on every agent: Windows logons (Security events 4624 and 4625 — successes are people's logons, not Windows' own service and machine accounts), SSH on Linux, OPNsense and OpenWRT, and sudo or su on Linux. For Windows logon patterns — new sources, remote logons, bursts — see Logon Anomalies.
Password guessing that got in
A sign-in that succeeded right after a run of failed ones from the same placeOver time
By agent
Select a row for its accounts, sources and sign-in methodsFirewall Blocks
OPNsense pf filterlog, OpenWRT fw4/nftables, Linux iptables/nftables, and Windows Filtering Platform — normalized onto one action:"block" field, over the window you pick.
Blocks over time
Top source IPs
Top destination ports
Protocols
Firewall rules
Interfaces
Blocks by platform
Recent Blocks
| Time | Platform | Source | Destination | Protocol | Interface | Rule | Reputation | |
|---|---|---|---|---|---|---|---|---|
| Loading blocks… | ||||||||
Geo IP
Where the IPs seen across your traffic in the window you pick below are located — both ends of each flow, since behind NAT the geo-locatable party is usually the destination — nothing here is ever sent to a third party. The database ships in place already; re-run scripts\install-geoip-db.ps1 (Windows) or install-geoip-db.sh (Linux) any time to refresh it to a newer release.
Traffic by location
Top IPs by country
↗ Sort IPs by alertsLogs
Raw log search over every ingested event, as plain text, straight from the same OpenSearch store the rest of the Console reads — nothing extra to install. The box above matches plain text; for regular expressions, Lucene field queries like EventID:4625, excluding noise, or combining several conditions, click ⚙ Advanced.
Event volume
Top Event IDs
Top hosts
Events by agent
regex, or to exclude noise?
⚙ Advanced
matches regex: fail(ed|ure). \d \w \b work; IP addresses: \b([0-9]{1,3}\.){3}[0-9]{1,3}\b.Lucene query searches the event's own fields instead of the raw line, which is the only way to ask for one exactly:
EventID:4625, EventID:(4624 OR 4625), Channel:"Security" AND agent.os:windows, _exists_:TargetUserName. Same syntax as the Custom Rules page. An unqualified word searches every indexed field; for the whole line use contains or raw:*text*. Field names and values are case-sensitive. The box below shows what actually ran.
Agent Health
Live roster from agent-heartbeat — one document per agent.id, updated on every check-in. In "Processes & Services," a row shown in red has a matching alert for that agent in the last 24h.
Remote Agents
How each agent reached this server — the address ingest-api observed, not one the agent reports about itself| Agent ID | Platform | IP | Status | Last check‑in | Events (1h) | OS Patch Level | Updates | Software | |
|---|---|---|---|---|---|---|---|---|---|
| Loading agents… | |||||||||
Agent Resources
What each monitored machine is doing to itself — reported by its own agent on every heartbeat, so roughly every 30 seconds, with network traffic averaged over that interval. Busiest first, because the one worth seeing is the one in trouble.
Agent Alerts
Alerts about the endpoints themselves: one that stops reporting, whose CPU, memory or network bandwidth stays high, or that someone signs in to. Choose them once for every endpoint, then give any endpoint settings of its own. Each agent reports its CPU, memory, disk and network traffic on every heartbeat, about every 30 seconds, and its sign-ins from the machine's own logs — SSH on Linux, OPNsense and OpenWRT, and Windows remote desktop, keyboard sign-ins and unlocks. The Console checks them once a minute.
These are ordinary alerts: they appear on the Alerts page, and reach Pushover or SMS through Alert Notifications like any other, at the severity you choose for each condition. Nothing is sent until you switch a condition on.
Every endpoint
Unless an endpoint below has settings of its ownEndpoints
Agent Keys
Provisions a new agent identity the same way bin\genkey.exe -agent-id <id> -restart does — wires it into ingest-api's config.json and restarts the service so it's live. The key is shown once, right after you generate it, and never again.
New agents can verify this server's identity with its TLS certificate as ca_cert_path — optional but recommended: without it, an agent has to set insecure_skip_verify instead, which makes it trust any certificate a server presents, not just this one.
The Linux and OPNsense agent installers fetch this certificate themselves and show you its fingerprint to confirm. It must match this one exactly: if it does not, something between that machine and this server handed it a different certificate.
Server address for agents
What to type into an agent's “server hostname or IP”Local agent
For an agent on this networkFor machines that can already reach this server directly — same LAN, or over your own VPN. The agent is given this key and the server’s address. For anything outside your network, use Remote agents above instead: those reach the relay outbound and need no open port.
Configured identities
| Agent ID | Platform | Key | |
|---|---|---|---|
| Loading… | |||
Paired Phones
A phone paired here can read this SIEM from anywhere — alerts, agent health, agent resources — and can change nothing. Scanning the code below is the whole of it: the phone never needs to be on this network, and the relay that carries the pairing cannot read it, forge it or complete it.
Pair a phone
Scan it from anywherePaired devices
Custom Rules
Detections beyond the bundled SigmaHQ set — each one runs through the exact same engine every compiled Sigma rule does (server/detect's own poll loop), on the same schedule, producing alerts tagged custom so they're easy to tell apart on the Alerts page. A rule's query is a raw OpenSearch query_string (Lucene syntax) against events-*, e.g. CommandLine:*mimikatz* or EventID:4720 AND Channel:"Security".
Bundled SigmaHQ ruleset
Rules
| Rule | Level | Logsource | Status | |
|---|---|---|---|---|
| Loading… | ||||
Allow List
Activity you have checked and know to be fine — a backup job, a remote-support tool, a helper your browser starts — so it stops raising alerts. Each entry describes the events to leave out, and can be limited to one rule and one endpoint and given a last day. It applies to Sigma and custom rules; EasySIEM already leaves out its own components.
An entry silences whatever it matches, including an attacker who imitates it, so keep it as narrow as the activity allows: a full path rather than a file name, one rule rather than every rule. The quickest start is Allow… on the alert itself, which drafts an entry from that alert’s own event.
Entries
CVE Watch
Cross-references every agent's own reported installed software against a CVE feed (optional, off by default -- see docs/SETUP.md §4b). A match raises a real alert tagged cve-watch on the Alerts page. Runs on its own schedule (12h by default) -- use Scan Now below to check right away instead of waiting.
The CVE list keeps itself current: newly published CVEs are pulled from the CVE Program's own delta feed every few hours and merged into the index — only what actually changed, never a re-download. No feed checkout or manual refresh needed. The tile below shows how current it is.
On-demand scan
Requests an immediate check against the currently-built index (fast -- seconds, not the ~15-30 minute full feed rebuild) instead of waiting for detect-engine's own scheduled interval. detect-engine picks this up on its next poll pass (default every 60s).
Alert settings
Controls the ONE standing "Check CVE Watch for reported vulnerabilities" alert on the Overview and Alerts pages (not this page's own detailed table below, which always shows everything, whether this is on or off). Only issued when something at or above the chosen severity is currently found, not before the chosen time of day, and no more often than the chosen repeat interval. It goes out at the alert severity you choose: medium by default, or the worst finding's severity.
Vulnerabilities Found
Score is the CVE's own CVSS rating — how bad it would be if exploited. EPSS is a separate number from FIRST.org — the estimated probability this specific CVE is actually exploited in the wild in the next 30 days, updated daily. The two often disagree: a "medium" CVSS score with a high EPSS is a real vulnerability being actively used by attackers right now, easy to miss if you sort by severity alone. A CVE FIRST hasn't scored yet shows "—", not 0%. For Debian/Ubuntu hosts, rows come from the distro's own security tracker (via OSV.dev), one row per source package: Severity there is the distro's own priority for its package (NVD's rating is in the cell's tooltip), each CVE carries its fix status — update available means the host is simply behind on updates — and open-but-unfixed CVEs the distro rates below high are hidden by default; tick Show hidden to see them.
| Host | Application | CVE | Severity | Score | EPSS ⓘ | Last Seen |
|---|---|---|---|---|---|---|
| Loading… | ||||||
Alert Notifications
Sends a message to your phone when alerts land, using your own account — the same bring-your-own-credential bargain as the AI providers. Pushover is the quickest to set up, free at this volume, and the only one that can keep alerting until you acknowledge it. SMS through Twilio is optional and billed per message — switch it on only if you want texts as well.
Nothing sends until you switch it on. Each channel has its own on/off switch, so you can run Pushover alone, SMS alone, or both. When to notify below decides what is worth a message at all; each channel's own test button sends one real notification so you can prove the path works before anything depends on it.
If you do turn SMS on: Twilio bills per 160-character segment (70 if the text contains non-GSM characters), and US numbers need A2P 10DLC registration before delivery is reliable — an approval process on Twilio's side, not a setting here, and an unregistered sender is the usual reason a message is accepted and then never arrives.
On your phone OPT
Android app — no account, nothing billedEasySIEM has an Android app that reads this SIEM from anywhere — alerts, agent health and agent resources — and can tell you about alerts without any of the channels above. No Twilio account, no Pushover, nothing billed per message.
Your phone asks; nothing is pushed to it. It checks your server on a schedule and raises the notification itself, so no push service is ever told that an alert fired, or that your phone exists. The trade is timing: minutes rather than seconds, and longer on an idle phone. You choose the severity it tells you about in the app, separately from When to notify above, which governs only the channels on this page.
Two steps to set it up. Download the app from easysiem.com — it installs from there rather than from Google Play — then open Paired Phones in the sidebar and scan the code it shows you. Pairing travels over the EasySIEM relay, the same path remote agents use, and that page says so if this Console is not connected to one yet. The phone never needs to be on this network, and it can read your data and change nothing, so a lost phone costs you visibility, not control.
When to notify
Pushover
- Sign in at pushover.net and copy your User Key from the dashboard.
- Create an application at pushover.net/apps/build and copy its API Token — a token is not created with your account, and every send needs one.
- Install the Pushover app on the phone that key belongs to. Pushover on Google Play ↗ · Pushover on the App Store ↗
SMS through Twilio OPT
- Sign in at console.twilio.com, or create an account.
- Copy the Account SID — it starts with
AC. - Reveal and copy the Auth Token beside it.
- Paste both below and click Save.
+ and the country code, like +15551234567. The From number must be one you own in Twilio; recipients can be any number that accepts SMS. Several recipients, separated by commas, because a single one is a pager that stops working the moment that person is away.
Data Retention
How long events-* (raw telemetry) and alerts-* (Sigma/Suricata detections) are kept before OpenSearch automatically deletes them — the same two ISM policies apply-retention-policy.ps1/.sh manage, so a change made here or from a script are both reading and writing the exact same settings.
Current settings
Shortening a retention period doesn't delete anything immediately — OpenSearch's own background job checks index ages on its usual schedule, which can lag the change by up to roughly 20 minutes. Lengthening a period only affects data going forward; nothing already deleted comes back.
Server Health
This box's CPU, memory, disk and network, via Prometheus + windows_exporter/node_exporter (optional), and the SIEM itself on every install: OpenSearch, ingest, storage runway and the detection engine.
OpenSearch
…Ingest
…Storage runway
…Detection engine
…CPU / Memory / Disk Usage Over Time
Network I/O
Hunting Rules
SigmaHQ maintains a separate
rules-threat-hunting tree it publishes for periodic review rather than real-time
alerting — deliberately broader and noisier than the rules that page your phone. EasySIEM compiles and
runs it like any other ruleset, but tags every result rule.source: sigma-hunting so it never
mixes into the Alerts feed. This is where to read it. Grouped by rule and
host rather than listed as individual alerts: the question here is which broad patterns each machine
shows, not what happened at 14:03. A rule firing on two hosts is two rows, because that is two
investigations — the same scheduled task created on a domain controller and on a laptop are not the
same finding.
Click a rule, a host or an ATT&CK technique for where it leads: the alerts behind it, and for a host its profile, its log lines, the Graph and the other hunting pages.
SigmaHQ threat-hunting ruleset
| Rule | Host | Level | Alerts | First | Last seen |
|---|---|---|---|---|---|
| Loading… | |||||
Rarity
Least frequency analysis, or stack counting: group every value of one field and read the bottom of the distribution instead of the top. Almost every intrusion is rare before anyone knows to describe it, which is exactly what a signature cannot help with — so “ran once, on one host” is a better first question than any rule. Expect ordinary noise in the results: installer temp files and one-off updaters are genuinely rare too. The list is a place to start reading, not a list of findings.
Counts are indicative rather than exact. Ascending-order aggregation is approximate when a query spans shards, and any multi-day window spans several daily indices.
Rarity — least frequency analysis
| Value | Seen | Hosts | First | Last |
|---|---|---|---|---|
| Loading… | ||||
Process Pairs
Rarity asked of a relationship rather than a
value. Single-field stacking misses the most useful shape in process telemetry: cmd.exe is never
rare and neither is winword.exe, but winword.exe spawning cmd.exe is most of a
macro-dropper detection. The pair carries a signal neither member does.
Parents recorded as - are excluded. Sysmon writes that for processes whose parent it did not
capture — overwhelmingly services started by the service control manager at boot — and left in,
they fill the whole first page with one-off pairs sharing a parent that isn’t one.
Rarest parent → child pairs
| Parent → child | Seen | Hosts | Last |
|---|---|---|---|
| Loading… | |||
Process Ancestry
Process Pairs stacks one link. This stacks the whole
chain. The shape worth finding is often one where every individual link is ordinary and only the
sequence is not: winword.exe → cmd.exe is suspicious on its own, but
explorer.exe → cmd.exe → powershell.exe → rundll32.exe is four links that each
occur thousands of times a day. Pair-stacking buries that chain; chain-stacking surfaces it.
Chains are rebuilt from Sysmon’s own ProcessGuid/ParentProcessGuid
linkage, so they follow the real parent, not a matching program name. Consecutive repeats of one program are
folded — a shell that re-execs itself five times is shown as bash.exe ×5, one shape
rather than five levels — and a leading … means the oldest ancestor started before
the window, which on a short window is normal rather than a finding.
Rarest ancestry chains
| Chain (oldest ancestor first) | Seen | Hosts | Last |
|---|---|---|---|
| Loading… | |||
Linux Rarity
Least-frequency analysis over auditd. Order a term aggregation ascending and the tail of the distribution comes back first — the values that occurred once, on one host, which is what almost every intrusion looks like before anyone knows what to search for.
Separate from the Windows page because the two cannot share a dimension list. Every Windows dimension is gated on a Sysmon event ID; auditd sets none, and offers fields Sysmon has no equivalent for — full argv, the working directory a process ran from, the systemd unit that produced a log line.
Counts are indicative rather than exact. Ascending _count order on a terms aggregation is
approximate when a query spans shards, and any multi-day window spans several daily indices.
Rarest values
| Value | Seen | Hosts | User | First | Last |
|---|---|---|---|---|---|
| Loading… | |||||
Linux Process Pairs
The same pair-rarity question asked of
auditd rather than Sysmon. It needs its own view because the two sources do not share a
selector: Sysmon process creation is event ID 1, while auditd sets no event ID at all and is
identified by EventType: process_creation. The Windows page therefore cannot see a Linux host,
however much process telemetry it is sending.
What auditd adds is full argv. A bare pair like bash → chmod says
nothing; chmod 600 /etc/easysiem/agent.json says all of it — so the command line is a
column here rather than a drill-down. The filter offered is the user rather than a host count,
because on a Linux fleet the uid a process ran under is what separates routine package machinery from
someone at a shell.
Rarest parent → child pairs
| Parent | Child | Command line | Seen | User | Last |
|---|---|---|---|---|---|
| Loading… | |||||
Disguised Commands
What a command line gives away about itself, in two
lists. The first is the tricks that keep a command from reading as what it is: PowerShell’s
-EncodedCommand — decoded here, so you read what it says; code fetched from the
internet and run in one line; escape characters sprinkled through words and commands assembled from fragments;
and the Windows programs that fetch or run code for someone else — certutil,
bitsadmin, mshta, rundll32, regsvr32. On Linux: decoding
something and piping it into a shell, a download piped into a shell, and reverse shells.
The second is the longest command lines, stacked by program. A thousand characters and more is where encoded payloads hide — and where build tools, browsers and scripts that pass long argument lists live every day, so it is a list to read by program and parent, not a finding in itself.
Every check belongs to one program. A caret is cmd.exe’s escape
character and part of every grep pattern; -e is PowerShell’s encoded command and
bash’s exit-on-error. And findings are stacked by machine, program, parent, account and what was found,
because the same script runs the same way many times: a tool that starts PowerShell with an encoded command
hundreds of times a week is one row, decoded, with that tool as its parent.
Disguised, or fetching code
| Program | Command | Parent | Host | Runs | Last |
|---|---|---|---|---|---|
| Loading… | |||||
The longest command lines, by program
| Program | Longest | Lines | Parents | Hosts | The longest one begins |
|---|---|---|---|---|---|
| Loading… | |||||
Registry Persistence
Sysmon records every registry key and value written (events 12, 13 and 14), and nothing in this Console read them until now — which is awkward, because the registry is where persistence lives.
Plain rarity does not work here. The rarest registry keys on a healthy Windows machine are file associations and shell context-menu handlers — thousands of one-off entries that bury anything real. So this page is scoped to a catalogue of auto-start extensibility points, and “all” means the union of those rather than every write.
The path alone is not enough either. Most traffic under Image File Execution Options is
MitigationOptions and AuditLevel — Office and Defender hardening config,
written in bulk by installers — while Debugger, the value that actually hijacks a
binary, should be rare or absent. Same story under \Services\, where
ImagePath changes constantly and ServiceDll almost never does. So the
value name is its own column, and a deliberately narrow set of names that are seldom written
legitimately carries a check badge. The count beside each location in the
picker is what that location holds over the window selected.
Writes to auto-start locations
| Value / key | Written by | Host | Writes | Last |
|---|---|---|---|---|
| Loading… | ||||
Process Injection
Sysmon event 8 records one process starting a thread inside another — the mechanism behind most classic injection. It is a remarkably quiet event type, which is what makes it worth reading in full: this page shows every distinct source → target pair it finds rather than a sample.
Ordered rarest-first, because the volume leader is legitimate. On a Windows desktop the compositor
(dwm.exe) starts threads in csrss.exe constantly and will dominate any
count-ordered list; the rows worth your attention are the ones that happened once.
A source of <unknown process> is kept rather than filtered out. Sysmon writes that
when the source exited before it could be named — a thread injected by something that immediately
vanished is not the less interesting kind.
Service shutdowns are hidden by default. Windows delivers a stop signal by creating a
thread running CtrlRoutine in KERNELBASE.dll inside the target, which Sysmon
reports as a remote thread from an unnamed source — identical in shape to injection, and entirely
routine. They are recognised by their entry point, KERNELBASE!CtrlRoutine, rather than by
which process they target, so nothing is hidden on the basis of its name. The count of what was hidden is
shown above the table. Switch them back on if you are investigating a service that died unexpectedly
— or if you want to check that every one of them really was a shutdown.
Remote threads created
| Source | Target | Host | Entry point | As user | Seen | Last |
|---|---|---|---|---|---|---|
| Loading… | ||||||
Timestomping
Moving a file’s creation date into the past is an anti-forensic move: it drops the file out of the window an investigator is looking at. Sysmon event 2 records the change, and keeps the old value alongside the new one, so the direction is knowable.
Direction is the whole filter. Most event 2 records rewrite the timestamp to the value it already had — a copy, a save, an unpack — and carry no signal at all. This page shows only the ones that move the clock backwards, and reports how far.
The honest baseline is small and dull: Windows Update restoring original timestamps on component files, and the occasional installer. That is the point. A program you do not recognise appearing in this list, or a familiar one reaching much further back than usual, is the finding.
Files backdated
| Program | Host | Files | Events | Furthest back | Example file | Last |
|---|---|---|---|---|---|---|
| Loading… | ||||||
Software
The same rarity question asked of what is installed rather than what ran. Every agent already reports its full software inventory on its own hourly schedule, so this needs no extra collection — and software present on exactly one machine in a managed estate is worth a look, whether it arrived with an attacker or just with someone who installed their own tools.
Unlike the other hunts this has no time window: a heartbeat carries current state, not history. It answers “what is on the fleet now”, not “what appeared this week”.
Software by how few hosts carry it
| Software | Version(s) | Hosts |
|---|---|---|
| Loading… | ||
Beaconing
A Sigma rule asks whether traffic looks suspicious. This asks whether it arrives too regularly to be a person. Destinations are ranked by jitter — the coefficient of variation of the gaps between connections. Someone browsing produces wildly uneven gaps and a jitter near or above 1; something calling home on a timer produces a jitter near 0 whatever its interval happens to be, which is why the interval is shown but never used as a threshold. A 12-hour beacon is as much a beacon as a 60-second one.
Expect legitimate software at the top. Update checkers and long-poll clients are, correctly, the most regular things on a healthy network, and an editor or IDE polling its own API can sit at the very top of this list. The ranking is a reading order, not a verdict.
Two sources, and they are not equivalent. Sysmon’s network-connection event is the cleaner record — it names the binary by its real path — but the shipped SwiftOnSecurity config filters it hard for disk-volume reasons, so it sees a fraction of what the machine does. The Windows Filtering Platform’s event 5156 sees essentially every permitted outbound connection. It names the binary by device path rather than drive letter, but that costs you nothing here: the Console resolves it back by matching against Sysmon’s process record of the same binary on the same host — a different event from the network one filtered above, and one that is normally left on. Where there is nothing to resolve against, the device path is shown as recorded rather than guessed at. On most installs the coverage gap is large, which is why 5156 is the default — but you do not have to take that on trust: switch between the two sources and compare the connections scanned figure below.
Beaconing — connection regularity
| Destination | Process | Conns | Interval | Jitter | Host |
|---|---|---|---|---|---|
| Loading… | |||||
Odd DNS Names
Every name a Windows machine looked up (Sysmon event 22),
read for the shapes malware leaves in DNS and people do not: a random-looking domain, made up
by malware that generates its own; many different names under one domain, which is how a DNS
tunnel carries data out; a domain one letter away from a well-known one, or from one this
fleet uses every day — micros0ft, paypa1 — and international (punycode)
names; a free dynamic DNS or tunnel service, where anyone can have a name in seconds; and a
program other than a browser that keeps asking for names that do not exist, which is what
made-up domains look like from the machine.
Beside each name, the programs that looked it up: rundll32 resolving a random name is not the
browser doing it.
What is left out on purpose. Clouds and CDNs name things randomly by design — a
CloudFront distribution, an Azure key, a Chrome extension’s id — so names under them are never
called random. A random-looking subdomain on its own is not flagged either: software vendors put
customer ids in them all day, so subdomains only count toward a tunnel. A browser’s failed lookups are
ad and tracker blocking, not a program guessing. Names no public DNS answers — wpad,
.local, a single word — are skipped.
An empty table is the usual answer on a healthy fleet. Only Windows machines running Sysmon record their lookups.
Names worth a second look
| Name | Looked up by | Hosts | Lookups | First seen | Last |
|---|---|---|---|---|---|
| Loading… | |||||
Agent Silence
Every other page on this list asks what the telemetry shows. This one asks whether it is still arriving — because a source that has stopped reporting produces no findings anywhere else, and looks exactly like a quiet estate.
Two different failures, and they need different evidence. An agent can stop talking altogether, which the heartbeat shows. Or it can keep heartbeating, keep sending, and quietly stop reporting one source — the shape a stopped Sysmon service or a disabled log channel makes. The second is the one worth hunting: on the roster that host looks perfectly healthy, because it is. Only the missing channel gives it away.
A source counts as having a baseline only if it was reporting on at least three separate days, at a median of 50 events a day or more. The median is deliberate — one busy day of service restarts would otherwise set a bar that nothing normal could clear, and every quiet day afterwards would read as a collapse.
Agents — time since last heartbeat
| Agent | OS | Quiet for | Last heartbeat | Last event | Events in window | Status |
|---|---|---|---|---|---|---|
| Loading… | ||||||
Sources that stopped reporting
| Agent | Source | Normally | In window | Last event | Status |
|---|---|---|---|---|---|
| Loading… | |||||
Downloaded & Run
The shape almost every phishing and drive-by
infection takes: a file arrives from the internet, and then something runs it. Sysmon event 15 records the
Zone.Identifier stream a browser writes beside a download — including the address it came
from — and this page joins those downloads to the process starts that later executed them on the same
host.
Only file types that run code, install something, or carry something that does are followed. Explorer marks every file it unpacks from a downloaded archive the same way a browser marks the archive itself, so without that filter a single unpacked archive can write hundreds of thousands of marks — nearly all of them ordinary data files — and bury every download worth looking at.
A program runs as its own process image. A script, installer or shortcut runs through another
program — msiexec, powershell, wscript, rundll32
— which names it on its command line, so both are checked and the ran via column says which.
A run is credited only on the same host and no earlier than the download.
What this cannot see. The join is on the file’s path, so a download renamed or moved before it ran is not matched, and neither is code run from inside an archive that was never extracted. A file that ran is not by itself a finding — people download and run installers all day. The reading order is: an unfamiliar source, a script or shortcut rather than an installer, and a delay measured in seconds.
Risky downloads, and what ran them
| File | Came from | Host | Downloaded | Ran | After | Ran via |
|---|---|---|---|---|---|---|
| Loading… | ||||||
Suspicious Processes
What is running right now on each Windows endpoint, with anything that should not be there first. Every Windows agent lists its running processes about once an hour; each one is matched to its own start in the last week for its command line, then checked the way the other hunting pages check what they find: a Windows name in the wrong folder or under the wrong parent, a system account running a program any user could have replaced, a name one letter off a Windows one outside the Windows and program folders, a file name dressed up as a document, a command line disguised the way Disguised Commands looks for, and an interpreter started by a document or a browser.
Red flags mark what should not be running at all, and amber ones what is worth a look. The alerts column counts the alerts that named each program on that endpoint in the last week — context rather than a flag, because a busy program collects alerts all day. Linux, OPNsense and OpenWrt agents do not list their running processes yet.
Running now
| Process | Host | Account | Parent | Started | Alerts (7d) |
|---|---|---|---|---|---|
| Loading… | |||||
New to the Fleet
Rarity asks what is rare in a window. This asks what had never been seen before it. A binary that has run on one host every week for a month is rare and dull; one that first appeared an hour ago is worth reading, however often it has run since.
Every value in the window is checked against the 30 days before it, and only the ones that baseline never saw are listed. That makes the baseline’s own extent part of the answer: on a new install, or with a short retention, “absent for 30 days” can only mean “absent since collection started”. The date it actually reaches back to is printed under the picker, and where there is no baseline at all the page says so rather than presenting a first week of collection as a fleet full of findings.
Eight things to watch, and they answer different questions. Executables is by path; file hashes is by content, so a familiar name with new content behind it shows there and not under executables. Parent → child needs neither program to be new — Word starting a command prompt is two ordinary programs in an order that never happened before. Outbound addresses is per machine rather than fleet-wide: a server talks to the same few places, so its first connection to a new one stands out whoever else has been there. Clouds hand out addresses from inside their ranges all day, so an address in a network (a /24) the machine had already used is counted under the table instead of listed.
New to the fleet
| Value | Hosts | Seen | First seen | Last |
|---|---|---|---|---|
| Loading… | ||||
Logon Anomalies
Six questions on one page. Two are asked of every platform — Windows, and SSH on Linux, OPNsense and OpenWRT: where a run of failed sign-ins ended in a successful one, the moment a guessed password works; and which accounts signed in at an hour they almost never use. The other four are about Windows logons: which accounts signed in from somewhere they never had before, who logged on over the network or by remote desktop, which programs used explicitly entered credentials, and where failed logons arrived in bursts.
Windows logs on as itself constantly, and on a typical machine the overwhelming majority of successful
logons are the SYSTEM account with most of the remainder services — so those, and
machine accounts ending in $, are set aside in the first two tables to keep a person’s
logon from being buried under them.
The source of a logon is the remote address where the event carries one, else the workstation name the
logon gave, else local. Both are supplied by the other end and neither is proof of anything
— a workstation name is whatever the client claimed. They are how you spot a change, not an
identity.
Counts are indicative rather than exact. The network and explicit-credential tables order by ascending count, which is approximate when a query spans shards, and any multi-day window spans several daily indices.
Password guessing that got in
| Signed in | Account | From | Host | Failures first | Accounts tried | Alert |
|---|---|---|---|---|---|---|
| Loading… | ||||||
Accounts logging on from a new source
| Account | From | Hosts | Logon types | Count | First seen | Last |
|---|---|---|---|---|---|---|
| Loading… | ||||||
Sign-ins at unusual hours
| Account | Signed in | Its usual hours | Host | Unusual |
|---|---|---|---|---|
| Loading… | ||||
Network & remote desktop logons
| Account | From | Host | Type | Count | First seen | Last |
|---|---|---|---|---|---|---|
| Loading… | ||||||
Explicitly entered credentials
| Process | Account | Used credentials of | Target | Host | Count | Last |
|---|---|---|---|---|---|---|
| Loading… | ||||||
Failed logons
| Account | From | Host | Why it failed | Busiest 10 min | Count | Last |
|---|---|---|---|---|---|---|
| Loading… | ||||||
Credential Access
Two Windows audit events that record an intruder’s first moves after landing: reading stored credentials (event 5379), and listing who belongs to which group (events 4798 and 4799). Ordinary software does both all day, in tens of thousands of events a month on a single quiet machine, so both tables run rarest-first and flag what is out of shape rather than raising everything.
The reader is often unnamed, and that is honest rather than broken. Event 5379 identifies the reading process only by ID and start time, never by path. The name shown here is recovered by matching that against Sysmon’s own record of a process starting on the same host at the same moment. Where Sysmon never recorded the start — a process older than the retained data, or one its configuration does not capture — the row is left unnamed instead of guessed at. Expect most rows to be unnamed; the count of how many could be resolved is printed above the table.
An empty table is not proof of a quiet estate. Both event types depend on their audit subcategory being switched on, and on a host where it is off nothing is written at all.
Counts are indicative rather than exact. Both tables order by ascending count, which is approximate when a query spans shards, and any multi-day window spans several daily indices.
Stored credentials read
| Reader | As account | Credential | Operation | Reads | Host | Last |
|---|---|---|---|---|---|---|
| Loading… | ||||||
Group and membership listings
| Process | Listed | Distinct | For example | Host | Count | Last |
|---|---|---|---|---|---|---|
| Loading… | ||||||
Recon Bursts
Someone who has just landed on a machine asks it where they
are: whoami, net user, ipconfig, systeminfo,
nltest on Windows; id, uname, ip, ps,
who on Linux. Each of those runs all day for ordinary reasons, one at a time — which is why
a rule for each one fires on any machine being administered — but several different ones from
one account within ten minutes is a person, or a script, taking stock.
So this counts different tools, not runs: uname three times over is one tool. A burst
is a run of these by one account on one machine with no gap longer than ten minutes, and its size is the most
different tools any ten minutes of it held. Windows bursts of three and up are listed, and Linux bursts of
four and up — every SSH login to an Ubuntu machine runs uname, id and
who through its login messages, so three there is a login.
Flagged in red: five or more different tools; the domain-mapping tools
(nltest, dsquery, adfind, setspn); and a parent with no
business running them — Office, a script host, a program in a user-writable folder, or a web server,
which is what a web shell looks like. The rest are worth a glance: an administrator at work looks exactly the
same, and only you know who that was.
Bursts of reconnaissance
| Began | Host | Tools | Run by | Commands | Lasted |
|---|---|---|---|---|---|
| Loading… | |||||
Services & Drivers
The two ways code arranges to run as SYSTEM, or inside the kernel, and to keep doing so after a reboot: a service installed to start with Windows (event 7045), and a driver loaded into the kernel (Sysmon event 6).
Both are rare on a settled machine — a month of installs and loads usually fits on a single screen, with every driver validly signed — so every row is shown rather than sampled, with what makes one unusual carried as a flag and sorted to the top. For a service: running from a folder an ordinary user can write to, an unquoted path whose executable name contains a space (which lets anyone able to write an earlier name run as the service’s account), launching a shell or script host rather than a program of its own, a driver registered outside the driver folders, or running as a named account rather than one of Windows’ own. For a driver: unsigned, a signature that will not validate, or loading from outside the driver folders.
The flags are shape, not verdict. Plenty of legitimate software installs a service that runs as a named
service account, and a driver can sit outside System32\drivers for dull reasons. What makes a
row worth pulling is a flag on something you cannot account for — especially a driver loading on
exactly one host out of many.
Services installed
| Service | Runs | As account | Start | Host | Installed |
|---|---|---|---|---|---|
| Loading… | |||||
Drivers loaded
| Driver | Signature | Signer | Hosts with it | Host | Last |
|---|---|---|---|---|---|
| Loading… | |||||
System Impostors
Windows starts a small, fixed set of processes from a
small, fixed set of folders, and most have exactly one honest parent: svchost.exe lives in
System32 and is started by services.exe; lsass.exe lives in
System32 and is started by wininit.exe. Malware borrows those names precisely
because nobody looks twice at them — but a svchost.exe in a temp folder, or one started
by Word, is not the one Windows shipped.
Every process carrying one of these names is listed, not only the odd ones, so a page with nothing flagged cannot be mistaken for a broken query: the note above the table says how many shapes were found and how many were unexpected. None unexpected is the healthy answer, and the usual one.
Anything suspicious is marked in red. The whole row takes a red edge and tint, and each reason appears as a red tag beside the process name — not in its Windows folder, unexpected parent, user-writable folder. A row with no red matched expectations exactly; those are listed anyway so that a page with nothing to report cannot be mistaken for a broken query.
A parent nobody recorded reads as unknown, never as wrong — Sysmon does not always capture one, and
flagging those would invent an intrusion out of a missing field. Names with many legitimate parents
(rundll32, msiexec, regsvr32, schtasks,
dllhost, conhost) are checked on location alone. Both the 64- and 32-bit folders
count as correct wherever Windows ships both.
Processes using a Windows system name
| Process | Parent | Host | User | Starts | Last |
|---|---|---|---|---|---|
| Loading… | |||||
Tampering
What an intruder does to stop being watched: clearing logs, stopping the event log service or Sysmon, changing what gets audited, disabling services, and moving the clock.
Every one of these also happens for entirely dull reasons, and in far greater numbers. A clean shutdown stops the event log service; Windows Update rewrites the auditing settings on thousands of system files; the time service nudges the clock. On a healthy machine essentially every event of each kind has one of those explanations — the audit-setting changes alone run to tens of thousands a month. Those are recognised and counted out by default — a stop is called routine only when a shutdown marker sits within ten minutes of it on the same host, and a clock change only when the time service moved it less than five minutes. The count of what was set aside is printed above the table, and the picker brings it all back as low-severity rows.
One honest gap. When a log is cleared (event 1102 or 104) the agent does not record which log was cleared or by whom — that detail travels in a part of the event it does not read — so the host and the time are the whole finding. It is still the loudest row on this page: clearing the Security log destroys the audit trail every other page here depends on.
Tampering signals
| Severity | Signal | Host | Detail | By | Count | Last |
|---|---|---|---|---|---|---|
| Loading… | ||||||
Scheduled Tasks & Cron
Persistence that survives a reboot without touching a service or a Run key: a scheduled task on Windows, a crontab line on Linux. Both are ordinary administration, which is exactly what makes them good hiding places — one more task among hundreds, named like something the operating system ships.
Two tables, because they answer different questions. Schedule changes is who created, altered or removed a schedule, and is where an intrusion shows up as it happens. What cron is running is the work the schedules are actually doing, which is how persistence planted before this window — or before EasySIEM was installed at all — still gets found.
Read the evidence sources first. Every source on this page can be switched off, and a silent one produces an empty table that looks exactly like a quiet estate — so the first table below reports what actually reached this console, measured on your own fleet over the window you pick.
The distinction that matters most is between the two Windows sources. Process creation only catches a
schedule change when somebody typed a command, so it sees schtasks.exe, at.exe and
the PowerShell scheduled-task cmdlets. Task registration also catches a task created through the COM API,
where there is no command line to observe — which is how installers and intruders alike tend to create
them. If only the process source is arriving here, read this page as a partial view rather than an
all-clear.
Evidence sources
| Source | Reaching this console | What it gives you |
|---|---|---|
| Loading… | ||
Schedule changes
| Change | What | Host | By | Activity | Last |
|---|---|---|---|---|---|
| Loading… | |||||
What cron is running
| Command | Host | Runs as | Activity | Last |
|---|---|---|---|---|
| Loading… | ||||
ATT&CK Reference
Techniques seen in alerts over the window you pick, each linking to EasySIEM's own generated reference page.
AI Security Review
Sends a digest of whatever window you pick below to an AI model for an on-demand read on real threats and misconfigurations — either a server-health review (KPI overview, agent roster and resource health — deliberately no alert or firewall lists, so it never grows with alert volume), or a deep review of one agent (its alerts and rules, logons, rare executables, services, event sources, firewall blocks, installed software and CVE matches). Nothing runs automatically — this only happens when you click Run. Pick who answers under Model below: with Claude, Groq, OpenAI or DeepSeek, each click is one real API call to that provider using your own key; with Ollama, a model on hardware you choose answers instead — this machine by default, where the digest never leaves it.
Model
- Click Get an API key below — it opens Anthropic's console in a new tab.
- Sign in, or create a free account if you don't have one yet.
- Click Create Key, give it any name, and copy the key it shows you — it's only ever shown once.
- Paste it into the box below and click Save.
- Click Get an API key below — it opens Groq's console in a new tab.
- Sign in, or create an account if you don't have one.
- Create a key and copy it — it's only shown once.
- Paste it into the box below and click Save.
- Click Get an API key below — it opens OpenAI's platform in a new tab.
- Sign in, or create an account if you don't have one.
- Create a secret key and copy it — it's only shown once.
- Paste it into the box below and click Save.
- Click Get an API key below — it opens DeepSeek's platform in a new tab.
- Sign in, or create an account if you don't have one.
- Create a key and copy it — it's only shown once.
- Paste it into the box below and click Save.
- Click Get an API key below — it opens Google AI Studio in a new tab.
- Sign in with a Google account.
- Create a key and copy it.
- Paste it into the box below and click Save.
-contributor are cheaper because Meta may train on your prompts and completions. For a security digest that means your own hostnames, IPs and usernames. The Standard-tier ids — muse-spark-1.3 and the rest without that suffix — are not trained on, and are what this Console defaults to.
- Click Get an API key below — it opens Meta's developer portal in a new tab.
- Sign in, or create an account if you don't have one.
- Create a key and copy it.
- Paste it into the box below and click Save.
ollama pull llama3.1:8b, then save its address here. A local model is far smaller than Claude: expect a shallower read that can misjudge what it sees, and on a CPU expect a review to take minutes rather than seconds, with that machine's processor busy the whole time. The digest goes only to the address saved here — this machine unless you change it — and to another computer it crosses your network unencrypted unless the address starts with https://.