Aegis Console

The platform

Detection you can read, argue with, and take with you.

Four signal domains, one schema, 412 correlation patterns held in your own Git repository. Every situation arrives with the rule that matched, the raw events that matched it, and the query you can re-run yourself. This page is the detail.

  • 412 patterns
  • OCSF 1.3
  • 3 clouds
  • 38s median page

What it watches

Four domains, because that is where the evidence lives

Configuration scanning tells you what could go wrong. These four tell you what is going wrong, which is a much smaller and much more urgent set.

Identity

Who did it, and have they ever done it that way before

Every authentication, role assumption, token exchange and permission change is attributed to a principal and compared against ninety days of that principal's own behaviour — source ASN, source region, hour of week, target service, session duration.

Sources
CloudTrail, Entra ID, Okta, Workspace
Patterns
104 of 412
Baseline window
90 days, per principal
Typical p50 latency
19s (CloudTrail-bound)
Runtime

What the process actually did, from inside the kernel

An eBPF sensor on your nodes reports process execution, binary provenance, connection establishment and per-socket byte volume. It runs at 0.7% node CPU at p50 on a typical HTTP service — and we publish the p99 and the two workload shapes where we tell you not to deploy it.

Sources
eBPF sensor · 22 programs
Patterns
138 of 412
Baseline window
40 days, per workload, per hour of week
Typical p50 latency
0.4s
Egress

What left, where it went, and whether that is normal for this workload

Byte volume is accumulated in kernel per socket and emitted on a one-second tick, then compared against the workload's own forty-day profile. Destinations are resolved to organisation and first-seen date, so a bucket created ninety minutes ago is a fact, not a guess.

Sources
eBPF, VPC/VNet flow, DNS
Patterns
76 of 412
Baseline window
40 days, per workload
Typical p50 latency
1.2s (eBPF), 48s (flow logs)
Control plane

What changed in the account, and what it opened up

IAM policy edits, trust-policy changes, security group and firewall rules, KMS key policies, logging configuration. Each change is evaluated for reach — the set of workloads, identities and data stores it newly exposes — computed from your live policy graph.

Sources
CloudTrail, EventBridge, Azure Activity, GCP Audit
Patterns
94 of 412
Baseline window
n/a — evaluated on reach
Typical p50 latency
12s (EventBridge: 2.1s)

The pipeline

From event to page, with the clock running

Every stage below is measured and published. The first one is not ours, and we say so rather than quietly measuring from the point the event reaches us.

  1. 01

    Arrive

    Control-plane logs land on your provider's schedule; runtime and egress arrive on ours in under a second. Where EventBridge carries an event, we take it and reconcile against CloudTrail later.

    11.4s p50 provider-bound
  2. 02

    Normalise

    Everything becomes OCSF 1.3. One schema across AWS, GCP and Azure, so a detection written once applies to all three and a query written once does not need three dialects.

    4.1s p50
  3. 03

    Enrich

    Identities resolve to humans and pipelines, workloads to owning teams, principals to their IAM reach. Destinations resolve to organisation and first-seen date.

    2.8s p50
  4. 04

    Correlate

    Signals hold in a window — typically ten seconds, up to fifteen minutes for slow chains — waiting for their siblings. Partial matches are visible asforming from the first condition.

    9.6s p50 deliberate
  5. 05

    Page

    One situation, one notification, everything attached. Slack thread, PagerDuty incident, Opsgenie alert or a signed webhook into whatever you actually use.

    1.9s p50

Median end to end: 38s. Ninety-ninth percentile six minutes four seconds, almost all of it waiting for CloudTrail.

The console

What you see when a situation opens

Four panes and no score. Sorting is by reach, novelty and motion — three facts you can each interrogate.

  • Pattern

    The named correlation pattern, its conditions, which matched and which did not, and a link to the exact line in your Git repository. Partial matches are shown, not hidden — a situation that reached three of four conditions tells you something.

  • Evidence

    Every normalised event that matched, in full. Not a summary, not a sampled subset. Alongside each one, the history that made it unusual: if the pattern fired on an unseen ASN, you get the ninety-day ASN distribution that justifies the word 'unseen'.

  • Query

    The literal query that produced the evidence, in a copyable box. Change the window, change a condition, run it against the last six months. The detection engine and the ad-hoc query engine are the same engine, which is why this works.

  • Reach

    What the involved principal could touch, walked from your live IAM graph: workloads, buckets, databases, secrets, and the other principals it can assume. This is the number that should decide what you open first.

Detections as code

412 YAML files, in a repository with your name on it

We fork our detection library into a repo you own on day one. You review changes the way you review any other code — pull request, diff, approval — and the console links every situation back to the exact line that fired.

  • Sync is one-directional by default: your repo is the source of truthOur upstream lands as a PR you can reject
  • Every detection carries its own test fixturesRun them in your CI before merging
  • Disabled detections stay in the repo with a reason fieldA muted rule is undocumented; a disabled one is reviewable
  • Leaving takes an afternoonYour rules and your OCSF history are already yours
detections/identity/credential-use-anomaly.ymlv4.2 · 6 authors
name: credential-use-anomaly
severity_inputs: [reach, novelty, motion]
window: 15s
require: 3

conditions:
  - id: unseen_asn
    expr: source.asn not in principal.asn_history(90d)
    min_observations: 50

  - id: orientation_pass
    expr: api_sequence matches sequences.orientation

  - id: stale_credential
    expr: credential.age > policy.max_age

  - id: protected_write
    expr: outcome == "success"
       and target.tags contains "protected"

suppress_when:
  - principal.tags contains "break-glass"
    and change_ticket.exists

Integrations

Read-only in, your systems out

Nothing in the inbound list needs write access. Nothing in the outbound list is a proprietary format.

Clouds

  • AWS (Organizations, CloudTrail, EventBridge, GuardDuty findings)
  • Google Cloud (Audit Logs, SCC findings)
  • Azure (Activity Log, Defender findings)

Compute

  • Kubernetes 1.27+ (eBPF DaemonSet)
  • EKS, GKE, AKS, self-managed
  • ECS Fargate (task metadata + flow)
  • Plain EC2 / Compute Engine / VMs

Identity

  • Okta
  • Microsoft Entra ID
  • Google Workspace
  • AWS IAM Identity Center
  • HashiCorp Vault audit device

Source & delivery

  • GitHub / GitHub Actions
  • GitLab CI
  • Terraform Cloud (run + drift events)
  • Argo CD

Response

  • Slack (situation threads, two-way)
  • PagerDuty
  • Opsgenie
  • Microsoft Teams
  • Generic signed webhook

Downstream

  • S3 / GCS / Azure Blob export in OCSF
  • Splunk HEC
  • Snowflake
  • Datadog (metrics only)
  • Jira / ServiceNow ticket creation

Scope

Five things this is not

  • Endpoint detection on employee laptops and phones. Different product, different consent model, not ours.
  • General log archival. We keep security-relevant events. Your application logs belong somewhere cheaper.
  • A managed SOC. We page your team; we do not staff a room of analysts to receive it for you.
  • Vulnerability scanning and SBOM analysis. We watch what runs, not what might be wrong with it before it runs.
  • Blocking by default. Automated containment exists, is opt-in per namespace, and we will argue with you about enabling it everywhere.

Thirty minutes

Open the detections first. Decide afterwards.

We start every demo in the rule repository, not the dashboard. If the 412 patterns do not describe threats you actually have, the next twenty minutes are not worth either of our time.