A dashboard is only useful if someone acts on it. Most security dashboards fail not because the data is missing but because they show everything equally, alert on noise, and end up ignored. We build monitoring that answers a specific question for a specific person — and that stays trustworthy as the environment changes.
What a Security Dashboard Should Answer
Before any tooling decision, the useful exercise is naming the questions the dashboard exists to answer, and who is asking them. They are rarely the same person:
- An operator, right now: is anything happening that I need to act on in the next ten minutes?
- An analyst, investigating: what happened around this account, this host, this time window?
- An engineering lead, weekly: where are we accumulating risk — unpatched systems, failed builds, expiring certificates?
- An executive, monthly: is our exposure trending up or down, and where is the budget going?
A single screen that tries to serve all four serves none. Separate views, built from the same underlying data, is the pattern that survives contact with real use.
Getting the Data Right First
Dashboards are downstream of log collection, and this is where most of the engineering effort actually goes. The recurring problems are mundane:
- Gaps in coverage. Systems that were never onboarded, or that stopped sending months ago without anyone noticing. Monitoring the monitoring is not optional.
- Clocks that disagree. Correlating events across systems with drifting time sources produces timelines that are subtly wrong and very hard to debug.
- Inconsistent identity. The same person appearing as three different identifiers across systems makes user-centric investigation nearly impossible.
- Retention that does not match the requirement. Incidents are frequently discovered long after they began. Retention should be set against how far back you might need to look, not against storage cost alone.
- Volume without value. Ingesting everything is expensive and slows queries. Decide what earns its place.
Detection Rules That Do Not Cry Wolf
Out-of-the-box detection rules are written for a generic environment, not yours. Deployed untuned, they generate volume that teams learn to dismiss — and an alert that is routinely dismissed is worse than no alert, because it creates the appearance of coverage.
Tuning is ongoing work, not a launch task: establishing what normal looks like in your environment, suppressing the known-benign, and making sure every rule that fires has a documented response. A rule with no answer to “what should someone do when this fires?” should not be firing.
What We Build
- Log and telemetry pipelines — collection, normalisation and routing from applications, infrastructure, cloud services and, where relevant, operational technology.
- Detection engineering — rules written and tuned against your environment, with a documented response for each.
- Dashboards — separate views for operators, analysts and management, built around the questions each actually asks.
- Alert routing — getting the right signal to the right person through the channel they already watch, with escalation that works out of hours.
- Application-level security telemetry — instrumenting your own software to emit events worth monitoring, which off-the-shelf tooling cannot do for you.
- Integration with existing tooling — we work with the SIEM, cloud-native tooling or observability platform you already run rather than insisting on a replacement.
Do You Need a SIEM?
Not always, and the honest answer depends on scale and obligation. A small estate on a single cloud provider can get a long way with that provider’s native tooling plus disciplined log retention, at a fraction of the cost and complexity. A SIEM earns its keep when you have genuine heterogeneity, a compliance requirement that specifies centralised logging, or an incident-response function that needs to correlate across many sources quickly.
Buying a platform before establishing what questions it must answer is the most common and most expensive mistake in this area. We will tell you when the tooling you already own is sufficient.
Monitoring and Incident Response Are the Same Programme
Detection without a response plan produces alerts nobody owns. Response without detection means you find out from a customer. The two are scoped together: what we monitor is driven by what we would need to know during an incident, and the response plan is written against the visibility we actually have — not the visibility we wish we had.
How Engagements Work
Typically a short assessment of current visibility and its gaps, an agreed set of questions the monitoring must answer, then implementation in stages with the highest-value coverage first. Any work touching production systems is scoped, scheduled and authorised in writing before it starts.
We do not claim certifications we do not hold. Methods, tooling experience and sample reporting are shared during scoping so you can judge the fit.
Related Services
Incident response and digital forensics · OT and ICS security assessment · DevSecOps · security compliance readiness · penetration testing.
Tell us what you can and cannot see today and we will scope from there.
Where Log Data Is Lost Between the Source and the Index
A source that never appears, or that stops appearing entirely, shows up in an inventory check. The losses that are harder to find happen after the source is configured correctly and sending: they are partial, intermittent, and leave the source looking healthy while the data behind an investigation is quietly incomplete.
The diagnostic that separates these from a genuine absence of activity is a synthetic event. Emit a known record from each source class on a fixed interval and alert when it does not turn up as searchable in the index within an expected time. Volume-based health checks miss the parsing and quota cases entirely, because in those cases the events do arrive; only confirming that a specific expected record can be found catches them.
- Transport with no acknowledgment. Classic syslog over UDP on port 514 has no delivery confirmation and no retransmission, so a dropped datagram produces no error at either end. Syslog over TCP, or over TLS on 6514, gives you a connection that fails visibly, which is the behavior you want.
- Agent buffers that wrap. Most forwarders spool to local disk when the destination is unreachable and then overwrite the oldest entries once the spool is full. An outage longer than the buffer produces a hole covering exactly the period you most want to read. Buffer size and the queue-full behavior, block or drop, are both configurable and both worth setting deliberately rather than inheriting.
- Quota and rate limits. Ingest licenses and cloud API limits enforce a ceiling per day or per second. When it is reached, events are throttled or discarded, and the notice usually lands in the platform's own internal log rather than in anyone's alert path.
- Parsing failures after a format change. A software update changes a log line, the event still arrives, but it lands unparsed with no fields extracted. It is present in a raw text search and absent from every rule and dashboard built on those fields.
- Multi-line events split into fragments. Stack traces and Windows event XML span many lines. A collector configured for one line per event turns a single record into twenty pieces, none of which matches a rule.
- Certificates expiring on the collector. Forwarders stop shipping the moment the TLS handshake fails. Whether that is loud or silent depends entirely on whether anything is watching forwarder connection counts.
Two Timestamps, and Why Both Belong on Every Record
Every record should carry two times: the time the source says the event occurred, and the time the platform received it. Most platforms store both, but rules and dashboards are often built on whichever one the search language defaults to, which is not always the one the question needs. Search on event time when reconstructing what happened. Search on ingest time when checking whether collection is working, because a source that stopped sending an hour ago still has yesterday's events sitting at yesterday's event time, and a coverage check built on event time will call that healthy.
The gap between the two is a signal in its own right. A steady lag of a few seconds is normal. A lag that jumps to hours points at a queue backing up or a buffer draining after an outage. A negative lag, events arriving stamped in the future, points at a host whose clock is ahead. Alerting on the distribution of that gap per source catches problems that no volume check will see.
Format is part of the problem. The older BSD syslog format described in RFC 3164 carries a timestamp of the form Mmm dd hh:mm:ss with no year and no time zone, so the collector supplies both by assumption; an event forwarded across a zone boundary, or held in a buffer across a year end, is placed wrongly and nothing reports an error. RFC 5424 replaced that with a full RFC 3339 timestamp including offset and optional fractional seconds. Where the source lets you choose, choose that, store UTC, and render local time in the interface rather than baking it into the data.
Drift also breaks correlation silently. A rule that looks for a failed authentication followed by a success within thirty seconds returns nothing when the two sources are a minute apart, and an empty result looks exactly like no relationship. Before writing any time-bounded correlation, measure the real spread between the sources involved rather than assuming the window.
Detection Rules Belong in Version Control
Because tuning never finishes, rules need the handling that any other continuously edited logic gets. A rule edited in a console has no history, no reviewer and no author. Six months later nobody can say why a condition excludes one subnet, so it stays, and the exclusion outlives the reason for it. Keeping rules as text in a repository, changed through review and deployed from that repository rather than by hand, is what makes the tuning record readable later.
Writing rules in a portable format such as Sigma and converting them to the platform's query language keeps the investment separable from the platform. It also makes test fixtures possible: each rule ships with a handful of sample events that must trigger it and near-miss events that must not, and continuous integration runs them on every change, so a regression is caught before deployment instead of during an incident.
- Response steps in the same file as the query. Held in a separate wiki, the query and the runbook drift apart, and the one found at three in the morning is the stale one.
- Two delivery tiers. Every rule still carries its documented response; what differs is whether it pages a person immediately or lands in a queue worked through each shift. Separating delivery urgency from the response requirement keeps detections that are real but not worth waking someone for out of the paging path, without letting anything fire that nobody knows how to handle.
- A named owner, a team rather than an individual. A rule whose author has left is a rule whose alerts have no destination.
- The data the rule depends on, listed explicitly: which sources and which fields. A pipeline change then breaks the rule visibly instead of quietly turning it into a rule that can never fire.
- A review date. Rules written for a specific migration, a specific vulnerability or a specific vendor incident should be reconsidered and removed rather than accumulating.
Making Identity Consistent Across Systems
The fix for the same person appearing under several identifiers is to pick one canonical identifier and map to it during ingest, not at query time. The identity provider's immutable subject identifier is usually the right anchor, because email addresses change with name changes and usernames get reassigned. Doing the mapping in the pipeline costs complexity there, but it means every rule, dashboard and investigation downstream sees one field instead of each analyst reinventing the join.
Some sources cannot be mapped that way, because the identity simply is not in the record. Those need a deliberate decision rather than a best effort:
- AWS role assumption. CloudTrail attributes an action to the assumed role session, not the person behind it. If everyone assumes the same role and no session name is set, every event names the same actor. Passing a per-user role session name, or sourceIdentity, at AssumeRole time is what preserves attribution downstream.
- Kubernetes. The audit log records the service account or certificate subject presented to the API server. When access runs through a shared kubeconfig or a proxy, the human identity exists only in the proxy's log, and the two have to be joined on time and source address.
- Databases behind connection pools. The application connects with one account for every user it serves. Without an application-level audit event carrying the end user, the database log can only tell you that the application did something.
- Shared and machine accounts. Service accounts, CI runners and API keys are identities too, and each needs a named human or team recorded as owner. Without that mapping there is no basis for judging whether an action should have happened.
When Monitoring Is Not the Next Thing to Build
A monitoring build assumes several things already exist, and when they do not, the honest sequencing is to fix those first. You cannot measure coverage gaps without an asset inventory, because gaps are a fraction and you have no denominator. Alert routing has nowhere to route to without an on-call arrangement, and a rota that exists on paper but has never been tested is the same thing as no rota. Neither is a tooling problem and neither is solved by ingesting more data.
The third prerequisite is the application itself. If your software emits only HTTP status codes and stack traces, no amount of pipeline work will produce security-relevant events, because the events were never generated. Authentication outcomes with reason codes, authorization denials, privilege and role changes, credential and MFA changes, export volumes and any crossing of a tenant boundary all have to be added in the code. That is application engineering work, which is why it sits with secure development rather than with collection.
There is also a timing question worth naming. If what prompted the conversation is something that already happened and you need to know what it was, that is investigative work on the evidence that exists today. Standing up a monitoring program does not answer it, takes months, and competes for the same people. The monitoring build is what stops the next one being investigated with the same limited evidence.
Frequently Asked Questions
Is a dashboard always the right output?
No. A question asked once a month is served better by a scheduled report or a saved query than by a screen someone has to maintain continuously. Some views are worth building for a defined window rather than permanently, such as a release, a migration or an active incident, and then retiring rather than leaving to rot. Where a question does need a live operator view, the alert and the view are complements rather than alternatives: the alert is what initiates the action, and the view is where the person works once they have been paged.
How long should logs be kept?
PCI DSS requires a year of audit log history with three months immediately available for analysis, and that split is a reasonable shape even outside card environments. Keep a hot tier sized to the window you genuinely query interactively, commonly 30 to 90 days, and age the rest into object storage that can be rehydrated on demand. The archive should be write-once and held in a separate account or subscription from the systems it records, so that administrative access to the estate does not also grant the ability to delete the record of what was done with it. Different sources justify different periods, with authentication and administrative activity usually worth the longest retention and high-volume network flow data the shortest.
What does security monitoring not cover?
It is detection and visibility, not prevention and not remediation. Monitoring will tell you that a storage bucket became publicly readable; it does not stop that happening and it does not close it. Prevention belongs in the build pipeline and in platform configuration, and containment belongs to the response plan. Monitoring also does not tell you whether your controls hold up under attack, which is a testing question rather than a visibility one.
What has to be in place before implementation starts?
Access to the log sources, someone who can authorize changes on the systems being instrumented, and a decision about where the data will live. The last one is usually the long pole, because data residency, which account or subscription owns the platform, and who carries the ingest cost are organizational questions rather than technical ones. It also helps to have a list of the systems you consider in scope with a named owner against each, since a source with no owner is a source nobody will fix when it stops sending.
How does integration with an existing SIEM or observability platform actually proceed?
Read first. We query what is already there to establish what the existing data can and cannot answer before adding a single new source, because that usually changes the plan. New collection then goes in one source class at a time, each with its own health check and synthetic event, so a break is attributable to the change that caused it rather than to the whole rollout. New rules run in a monitor-only mode long enough to observe their real firing rate against your traffic before they are wired to a paging path.
Can you monitor systems that are not allowed to send data out to a cloud platform?
Yes, though the architecture is different. Segmented or isolated environments typically use a collector inside the boundary that forwards a filtered subset through a controlled or one-way path, rather than an agent on every host talking outbound to the internet. Some equipment, particularly older operational technology, cannot run an agent at all and has to be observed indirectly through a span port, a network tap, or the controller that talks to it. What is permitted to leave the boundary is your decision, and it directly constrains which detections are possible, so it is worth settling early rather than discovering it during implementation.
Can alerts just go to email?
Email is fine for anything that can wait until the next working day and unsuitable for anything that cannot. Where a response is needed within minutes, the channel has to support delivery acknowledgment and escalation when nobody acknowledges, which in practice means a paging tool rather than a mailbox. The usual failure with email alerting is not delivery but filtering: a mail rule that files security alerts into a folder nobody opens makes them invisible while the sending side still shows every one as delivered.