<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title><![CDATA[Mike Paquette - Elastic Security Labs]]></title>
    <description><![CDATA[Trusted security news & research from the team at Elastic.]]></description>
    <copyright><![CDATA[© 2026. Elasticsearch B.V. All Rights Reserved]]></copyright>
    <image>
      <title><![CDATA[Mike Paquette - Elastic Security Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte2c6b841aff36df4/6a88d9784acc96e3f324863d/security-labs-thumbnail.png</url>
      <link>https://www.elastic.co/security-labs/author/mike-paquette</link>
    </image>
    <link>https://www.elastic.co/security-labs/author/mike-paquette</link>
    <atom:link href="https://www.elastic.co/security-labs/rss/author/mike-paquette.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[en]]></language>
    <lastBuildDate>Thu, 24 Sep 2026 18:02:36 GMT</lastBuildDate>
  <item>
    <title><![CDATA[How a team of entity maintainers monitors, connects and scores entities in Elastic Security]]></title>
    <description><![CDATA[Inside Elastic Security, background jobs called maintainers each own one piece of every user, host and service record, from building entities out of raw logs to resolving identities and scoring risk.]]></description>
    <content:encoded><![CDATA[<p>Open the entity analytics (EA) graph in Elastic Security and you'll see a user wired to the hosts they log in to and the devices they own, along with scattered accounts that turn out to be the same user. While interesting on its own, it provides a critical piece of context during a threat hunting or incident investigation. This post gives an overview of EA fundamentals and opens the hood to see how edges are drawn and accounts are resolved. Why is that important? Well, everything downstream, including baselines, risk, and AI reasoning, is only as good as the entity records underneath it.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta456ecc712e7bbc6/6a8e952a1106e8de8d9c4b0d/image1.png" alt="Figure 1: Entity graph surfacing relationships." title="Figure 1: Entity graph surfacing relationships." /></p>
<p>Before we go deeper, let's set some context. Many SIEMs treat entities as flat records, a snapshot of what's true right now, rebuilt on demand from raw logs. That works until you need to know how the environment got here, what changed, what was resolved, how a risk score compounded over time. Elastic's Entity Store is architected differently. Every entity is a living record, continuously enriched by background jobs called <em>maintainers</em>, each responsible for one facet of the entity. Maintainers establish relationships, perform identity resolution, and calculate risk scoring. These are all composed onto the record over time, all inspectable, and all correctable. A companion post on <a href="https://www.elastic.co/security-labs/ueba-entity-record-quality-analytics">entity record quality</a> explains why this matters.</p>
<p>Going one level deeper, this piece explores <em>how</em> records are built and connected in the first place, along with <em>how</em> their risk scores are updated, relationships are tracked, and identities are resolved. The short answer is a single abstraction. Entity store v2, introduced in Elastic v9.4, is built on maintainers. Each maintainer runs on its own clock, continuously updating the record you eventually query. The entity store is the result of a set of maintainers enriching each entity based on the raw or derived signal around it, not an append-only index you simply write entities into.</p>
<p>Let's build that picture from the engine up.</p>
<h2 id="whattheentitystoredoesandwhyitrunsonesql">What the entity store does and why it runs on ES|QL</h2>
<p>The Entity Store is the layer that turns your telemetry (for example endpoint, identity provider, and cloud logs), identity and asset inventories, and threat detections into one queryable profile per user, host, and service. This means analysts can pivot on information and insights gained from an enriched entity record, instead of reconstructing it from raw logs every time.</p>
<p>Entity store Version 1 did that with <a href="https://www.elastic.co/docs/explore-analyze/transforms/transform-overview">Elasticsearch transforms</a>.</p>
<p>Version 2 rebuilds the engine on <a href="https://www.elastic.co/docs/reference/query-languages/esql">Elasticsearch Query Language (ES|QL)</a>. Each entity extraction cycle runs a query that filters the relevant logs and aggregates them. In the next crucial step, the cycle performs a <code>LOOKUP JOIN</code> back against the existing entity index to carry forward previously observed entity attributes and behaviors.</p>
<pre><code>FROM logs-*
  | WHERE ...                                          // logs for this entity type + window
  | STATS ... BY entity.id                             // collapse many events into one record
  | LOOKUP JOIN .entities.v2.latest.security_default-00001
      ON entity.id                                     // field retention against the store itself
  | EVAL ...                                            // keep-latest / keep-first retention
</code></pre>
<p>ES|QL provides query flexibility and coverage for the fields and field types that the schema needs. It also provides a pipeline that you can reason about and extend, with retention and merge logic expressed directly, instead of through the limited flexibility and operational choreography needed with transforms.</p>
<h3 id="howanentityrecordisbuiltfromrawsignaltoresolvedidentity">How an entity record is built, from raw signal to resolved identity</h3>
<p>Here's the part that's usually glossed over. Let's take a look at the entity extraction and building process by following one host from its raw event to its finished record.</p>
<ul>
<li><p><strong>Step 1: The raw signal ingested to Elasticsearch.</strong> Your endpoint detection and response (EDR) agent and identity provider write events into data streams that are matched by a <code>logs-*</code> index pattern, as do your cloud integrations. There isn’t anything entity-shaped yet, just events with fields like <code>user.name</code>, <code>host.name</code>, and <code>event.category</code>.</p></li>
<li><p><strong>Step 2: Extraction collapses events into a record.</strong> During its run cycle, the ES|QL query above filters the logs relevant to an entity definition, and then <code>STATS ... BY entity.id</code> collapses potentially thousands of events into one entity store row/record per entity, keeping the first-seen and latest entity lifecycle values that matter. The <code>LOOKUP JOIN</code> merges that fresh row with the entity's existing record, so nothing observed outside the window is lost. The output is a single, denormalized document in the latest index: the entity's base identity and lifecycle, in addition to its attributes.</p></li>
<li><p><strong>Step 3: Identity is keyed deliberately.</strong> Which entity a row belongs to is the highest-stakes decision in the whole system. Key it wrong and you can blend several distinct users into one entity, or split one user across many. So the store doesn't guess. It derives a deterministic identifier, the entity unique ID (EUID), from the fields that actually identify the entity.</p></li>
<li><p><strong>Step 4. Maintainers compose the rest.</strong> The entity record is there, but it doesn’t yet know who it talks to (relationships) or what behaviors it exhibits. It also doesn’t yet know which various account entities are used by the same user or how risky the entity is. Those facets are layered onto the entity record by maintainers, and that's the heart of Entity Analytics.</p></li>
</ul>
<h3 id="thekeytobuildingentityrelationshipsthedeterministicentityid">The key to building entity relationships - the deterministic entity ID</h3>
<p>The Entity Store currently supports three primary, schema-backed entity types: <strong>users, hosts, and services</strong>. Alongside these sits a fourth, polymorphic category known as <em>generic</em> entities.<br />
The <em>generic</em> entity type isn’t constrained to a fixed schema, but rather provides an extensibility layer for the entity store platform. For example, by leveraging cloud and orchestrator fields, it represents resources like <strong>EC2 instances, S3 buckets, and Kubernetes clusters</strong> as first-class entities today. This flexibility allows the entity store to encompass a broad spectrum of assets without the architectural overhead of defining a new entity type for every resource class.</p>
<p>Everything the entity store does, including merging today's events onto the current entity record and linking two accounts into one resolved user, hinges on one field: <code>entity.id</code>, the EUID.</p>
<p>The EUID is a deterministic, human-readable string (a type prefix and then the fields that actually identify the entity, joined with <code>@</code>), rather than a random universally unique identifier (UUID) or a hash. Note the addition of a user entity <em>namespace</em> at the end of the user EUID. We’ll explain the role that plays below.</p>
<pre><code>user:jane.doe@example.com@okta
host:9f86d081-1e0c-4b3f-8a2d-2c1e7bed425e
service:api-gateway
</code></pre>
<p><strong>How is the EUID derived?</strong> For each entity, the store walks an ordered list of candidate identity fields and takes the first <em>complete</em> one. If a field a candidate needs is missing, that candidate is skipped and the next is tried, so a partial observation never produces a malformed ID.</p>
<p><strong>Why do we need a namespace for user entities?</strong> While host and service entities rely on sufficiently unique keys like <code>host.id</code> or <code>service.name</code>, a user's identity, for example an email address, can be observed in many different log sources, but is authoritative only within its issuing domain. The namespace provides the necessary disambiguation, resolving the specific collision challenges unique to user identity records.</p>
<p>| Entity type              | ID fields (priority order)                                      | Example EUID                                           | Namespace                                                      |
| :----------------------- | :-------------------------------------------------------------- | :----------------------------------------------------- | :------------------------------------------------------------- |
| Host                     | host.id, then host.name, then host.hostname                     | <code>host:9f86d081-1e0c-4b3f-8a2d-2c1e7bed425e</code>            | (none)                                                         |
| Service                  | service.name                                                    | <code>service:api-gateway</code>                                  | (none)                                                         |
| User (identity provider) | user.email, then user.id, then user.name@domain, then user.name | <code>user:jane.doe@elastic.com@okta</code>                       | Provider name: okta, entra_id, microsoft_365, active_directory |
| User (local/endpoint)    | user.name scoped to host.id                                     | <code>user:jdoe@9f86d081-1e0c-4b3f-8a2d-2c1e7bed425e@local</code> | local                                                          |</p>
<ul>
<li><strong>Host:</strong> The first present of <code>host.id</code>, <code>host.name</code>, <code>host.hostname</code>, giving <code>host:&lt;value&gt;</code>.</li>
<li><strong>Service:</strong> <code>service.name</code>, giving <code>service:&lt;name&gt;</code>.</li>
<li><strong>User:</strong> This is the interesting one, because a user's identity depends on <em>where their activity was observed.</em></li>
</ul>
<p><strong>Users: Identity provider versus the local host.</strong> A user's EUID always ends in a <em>namespace</em>, the last <code>@</code>-delimited segment, and that segment is what stops two accounts that merely <em>look</em> alike from colliding.</p>
<p>When a user comes from an identity provider, the namespace is that provider (<code>okta</code>, <code>entra_id</code>, <code>microsoft_365</code>, <code>active_directory</code>) and the store keys on the most authoritative identifier it has: email, then user id, then <code>name@domain</code>, and then name.</p>
<pre><code>user:jane.doe@elastic.com@okta
</code></pre>
<p>The same user's Entra ID account becomes <code>…@entra_id</code>, a <em>different</em> EUID, on purpose. They’re two authoritative accounts until resolution ties them together. We are going to see how resolution achieves this later in the blog.</p>
<p>When a user is seen only through endpoint or host telemetry, with no authoritative directory account behind them, the store scopes them to the machine and suffix the ID as <code>local</code>:</p>
<pre><code>user:jdoe@9f86d081-1e0c-4b3f-8a2d-2c1e7bed425e@local
</code></pre>
<p>The middle segment is the host's <em>durable</em> identifier (<code>host.id</code>) and not its renamable hostname, so <code>jdoe</code> on a laptop stays distinct from <code>jdoe</code> on a shared bastion host, and the identity survives a machine being renamed or reimaged. The <code>local</code> namespace is an explicit signal: <em>This is activity on this box, not a verified global identity.</em> (Note the host in the example above and this local user share the same <code>host.id</code>. That's how the Entity Store knows they belong together.)</p>
<h3 id="whatmakesanentitysource_authoritative_andhowtoconstructone">What makes an entity source <em>authoritative</em> and how to construct one</h3>
<p>The EUID logic leans on a word that deserves a precise definition: <em>authoritative</em>. When an identity-provider-backed user earns a real namespace (<code>okta</code> or <code>entra_id</code>, among others) and high-confidence treatment, it's because the incoming events cleared a specific bar. Here's the bar and how to clear it with your own integrations.</p>
<p><strong>What qualifies as authoritative identity data.</strong> The store treats an event as an authoritative identity signal when either of these is true:</p>
<p>| Classification path                     | Required ECS fields                                       | Confidence | Resulting namespace                  |
| :-------------------------------------- | :-------------------------------------------------------- | :--------- | :----------------------------------- |
| Asset inventory                         | event.kind: asset                                         | High       | Provider name (okta, entra_id, etc.) |
| Endpoint-observed (neither bar cleared) | user.name + host.id present, but no authoritative signal | Medium     | local (scoped to host)               |
| Unclassifiable                          | None of the above                                         | N/A        | No entity created                    |</p>
<ul>
<li>The event is an <em>asset / inventory document</em> with <code>event.kind: asset</code>. This is how Elastic's identity integrations (Okta, Entra ID, Active Directory, and the cloud asset sources) publish their user and account inventories.</li>
</ul>
<p>Clear either bar and the user becomes a first-class, identity-provider-backed entity at <em>high</em> confidence, and the preferred canonical record when identities are later resolved. Miss both, but carry a <code>user.name</code> and a <code>host.id</code>, and the user is instead scoped to that host in the <code>local</code> namespace at <em>medium</em> confidence. If both of these conditions are false and no host exists to associate the event with, no entity is created at all. That last case is deliberate restraint, not a gap; the store would rather create nothing than manufacture a noisy identity from an ambiguous event.</p>
<p>Two filters apply before any of this runs: The event's <code>event.outcome</code> must not be <code>failure</code> (a failed login isn’t evidence that an account exists), and it must carry at least one of <code>user.email</code>, <code>user.id</code>, or <code>user.name</code>.</p>
<p><strong>Which namespace you get.</strong> Once an event qualifies, the namespace is derived from its source, the first non-empty of <code>event.module</code> or the leading segment of <code>data_stream.dataset</code>.</p>
<p>An authoritative event from an <em>unrecognized</em> source still creates a real entity. It just lands in the <code>unknown</code> namespace and you lose provider-level disambiguation (identical usernames from two namespaces can collide) and clean grouping. So, for a custom integration, the goal isn't only to <em>qualify</em> as authoritative, it's to be <em>recognized</em>.</p>
<p><strong>How to accommodate a custom integration or pipeline.</strong> If you ingest identity data through a custom Fleet integration, a Logstash pipeline, or an Elasticsearch ingest pipeline, set these Elastic Common Schema (ECS) fields so the store classifies your entities the way you intend:</p>
<ol>
<li><strong>Mark the shape.</strong> For an account inventory, such as a local directory service, or configuration management database (CMDB), set <code>event.kind: asset</code>.</li>
<li><strong>Provide an identity.</strong> Populate at least one of <code>user.email</code> (this is best, since it's the top priority), <code>user.id</code>, or <code>user.name</code>, plus <code>user.domain</code> where you have it.</li>
<li><strong>Name your source.</strong> Set <code>event.module</code> (or the leading segment of <code>data_stream.dataset</code>) to a value the store maps. If you're feeding one of the known providers, reuse its naming so you inherit the right namespace. If your source is genuinely new, expect <code>unknown</code> until a mapping is added.</li>
<li><strong>Don't let real identities look local.</strong> The <code>local</code> classification triggers when an identity event carries both <code>user.name</code> and <code>host.id</code> but <em>doesn't</em> clear the authoritative bar. If you're publishing directory data, don't attach a <code>host.id</code> to it. That field is the signal that says "endpoint-observed, scope it to this box." Reserve it for genuinely host-local activity.</li>
<li><strong>Skip the noise.</strong> Don't emit <code>failure</code> outcomes as identity evidence. Note, too, that the store already excludes common shared and service account names (<code>root</code>, <code>jenkins</code>, <code>deploy</code>, <code>postgres</code>, <code>admin</code>, and similar) from the <code>local</code> namespace, so they never become per-host user entities.</li>
</ol>
<p>Get these right, and your custom source behaves exactly like a built-in one: Authoritative users resolve and score at full fidelity, and endpoint-observed users stay correctly host-scoped. Plus, nothing downstream has to special-case where the data came from.</p>
<h2 id="howmaintainersaddentityresolutionrelationshipsandriskscoringtoentities">How maintainers add entity resolution, relationships, and risk scoring to entities</h2>
<p>As discussed at the start of this post, the entity store is updated by dedicated background tasks called maintainers. Each of these has a specific job: building relationships between entities and resolving identities, along with updating risk scores.</p>
<p>The framework gives every maintainer its lifecycle, scheduling, and health reporting for free, making the entity store <em>extensible by design.</em> Any new entity enrichment capability ships as a new maintainer on the same rails, without re-architecting the entity store or breaking backward compatibility. Several maintainers already run in the current version, and recent additions, such as entity relationships derived from observed entity behaviors, have been added exactly this way. Even entity risk scoring, one of the most impactful risk-centric capabilities in the product, is implemented as just another maintainer composing one more facet of the entity record.</p>
<h3 id="maintainersdiscoverandstoreentityrelationships">Maintainers discover and store entity relationships</h3>
<p>Let’s take a look at one of the relationship maintainers. Once a day, the <code>accesses_frequently</code> / <code>accesses_infrequently</code> maintainer runs an ES|QL query over relevant telemetry and, for each actor→target pair, counts successful accesses over a 30-day window. If the count is:</p>
<ul>
<li>greater than or equal to an Elastic-defined threshold, the relationship becomes <code>accesses_frequently</code>.</li>
<li>less than the threshold, the relationship becomes <code>accesses_infrequently</code>.</li>
</ul>
<p>Today, it reads from Elastic Defend (endpoint logins), AWS CloudTrail (<code>StartSession</code> / <code>SendSSHPublicKey</code>), system auth (SSH logins), and system security (Windows events <code>4624</code>/<code>4648</code>). A sibling, <code>communicates_with</code>, builds communication links from Elastic Defend, system auth, system security, Jamf Pro, and AWS CloudTrail.</p>
<p>The relationships are written straight onto the entity record as arrays of target IDs:</p>
<pre><code>// a user entity in .entities.v2.latest.security_default-00001
"entity": {
  "id": "user-abc…",
  "relationships": {
    "accesses_frequently": { "ids": ["host-def…", "host-ghi…"] },
    "communicates_with":   { "ids": ["service-jkl…"] }
  }
}
</code></pre>
<h3 id="amaintainerperformsentityresolution">A maintainer performs entity resolution</h3>
<p>The resolution maintainer links fragmented accounts, the Okta <code>jdoe</code>, the Entra ID <code>jdoe</code>, and the on-prem Active Directory <code>jdoe</code>, into one resolved user. The risk maintainer then scores the resolved user, so the risky service token and the benign laptop login that both belong to John Doe are scored as John Doe: one record, not three that an analyst has to reconcile in their head.</p>
<p>Resolution happens two ways. Most of it is automatic: a background task runs every five minutes and links user entities that share the same <code>user.email</code>, so accounts converge on their own as the data arrives. When you need to step in, you can link or unlink manually from the entity flyout in the UI, or call the API directly.</p>
<pre><code>POST /api/security/entity_store/resolution/link
{
  "target_id": "user:jane.doe@elastic.com@okta",
  "entity_ids": ["user:jane.doe@elastic.com@entra_id"]
}
</code></pre>
<pre><code>POST /api/security/entity_store/resolution/unlink
{
  "entity_ids": ["user:jane.doe@elastic.com@entra_id"]
}
</code></pre>
<p>The near-term plan is to expand the out-of-the-box matching logic so more identities link automatically without anyone manually creating the links.</p>
<h3 id="amaintainercalculatesandupdatesentityriskscores">A maintainer calculates and updates entity risk scores</h3>
<p>The risk score maintainer runs hourly by default. On each run, it queries the detection alerts over a configurable rolling time window (past 30 days by default) and for each entity those alerts touch, aggregates the alert risk scores into a single normalized entity risk score and risk level.</p>
<p>Entity risk scoring also extends across resolved identities. First the risk scoring maintainer calculates an entity risk score for each user entity (one per account) based on any detection alerts related to that account. Next it calculates a distinct entity risk score for the <em>resolved</em> user across all of their linked accounts. For example, a malicious service token alert on one account, and an excessive laptop login rate alert from a different account, where both accounts belong to John Doe, roll up into a single user entity risk score for the resolved John Doe. That holistic view is possible because the resolution maintainer ran first, then the risk scoring maintainer reads the graph (set of linked accounts) that the resolution maintainer produced, and is able to assign a risk score to the user, not only the constituent accounts If an analyst or AI agent decides to investigate the provenance of a resolved user risk score, the answer is easily obtained.</p>
<h2 id="everyentitystoredecisionisinspectableandcorrectable">Every entity store decision is inspectable and correctable</h2>
<p>The store's engine and its relationship maintainers are built on ES|QL, the same query language that Elastic users already employ, so what a maintainer reads,computes, and writes is inspectable, rather than proprietary magic. Every entity lives as a document in an Elasticsearch index, so its full state is there to read, including the relationships that were drawn and the accounts that were resolved into one user, plus the signals behind a risk score.</p>
<p>Entity data is wrong sometimes; that's the reality of identity data. Because the state is represented as Elasticsearch documents, you can correct them through APIs. When resolution gets it wrong, two people merged or one user split across two records, you can link or unlink identities right through the UI, and the risk score maintainer rescores the corrected resolved user on its next run. When you need to pull an entity into scope or set its criticality, <a href="https://www.elastic.co/docs/solutions/security/advanced-entity-analytics/watchlists">watchlists</a> let you say so directly. <a href="https://www.elastic.co/security-labs/entity-analytics-agent-builder">With Elastic Agent Builder</a>, an AI agent can walk you through an entity's data and make those corrections for you, without leaving the Elastic UI.</p>
<h2 id="whatentitymaintainersmeanforsecurityanalysts">What entity maintainers mean for security analysts</h2>
<p>With entity resolution, relationship mapping, and risk scoring running as automated maintainers, human analysts and AI agents gain efficient access to the entity context they need to perform investigations. The entity store is extensible, so entities continue gaining relationships and enrichments as new maintainers ship or new data sources are ingested, with no migration or re-architecture. Nothing is hidden, so every risk score traces back to the alerts and other factors (for example, asset criticality, watchlist membership) that produced it, and a finding becomes something you can explain using the Agent Builder chat with the entity analytics tools and skills rather than a black box you have to trust.</p>
<p>In addition, wrong data doesn't have to stay wrong; a bad resolution link takes one API call or Agent Builder action to fix. What you're left with is a single queryable record per entity, host, and service that can evolve over time.</p>
<h2 id="whatscomingnextintheentityanalyticsroadmap">What’s coming next in the Entity Analytics Roadmap</h2>
<p>The science of entity analytics is ongoing. One area we’re digging into is integrating non-human identities (NHI) as entities. AI agents, service accounts, and agentic workloads are among the fastest-growing concerns across today’s attack surface. While this research continues, the core objectives involve finding an optimal way to link an AI agent's sessions to existing entities by tracking its utilized Service accounts or connected devices and services, as well as assessing the risk of AI agent behavior</p>
<p>Also under the hood, we're reworking log extraction to split the work by data source confidence, so authoritative identities and lower-confidence enrichment are handled separately.<br />
Additionally, we’re exploring enhancing the <a href="https://www.elastic.co/security-labs/proactive-threat-hunting-ai-generated-leads">agentic UEBA capabilities</a> to reason about an entity, connect the dots, and suggest relevant leads for the analyst to explore.</p>
<p>Entity risk scoring is getting continued attention too. Currently, a detection alert carries one static alert risk score that affects the entity risk score of every entity it involves, so the actor and the target can come out looking equally risky. The direction is towards a dynamic, entity-centric risk score that gives each entity its own contribution based on the role it played in the observed interaction, and its own context.</p>
<p>For practitioners with their hands on the Elastic Security UI, the entity analytics overview experience is due for a refresh, with risky entities shown more simply and clearer actions to investigate them.</p>
<p>Entity analytics is available in Elastic Security. Learn more about <a href="https://www.elastic.co/docs/solutions/security/advanced-entity-analytics">entity analytics</a>.</p>]]></content:encoded>
    <link>https://www.elastic.co/security-labs/blog/entity-resolution-identity-scoring-elastic-security</link>
    <guid isPermaLink="false">entity-resolution-identity-scoring-elastic-security</guid>
    <category><![CDATA[Security Operations]]></category>
    <dc:creator><![CDATA[Uri Weisman,Mike Paquette]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta456ecc712e7bbc6/6a8e952a1106e8de8d9c4b0d/image1.png" length="0" type="image/png"/>
    <pubDate>Mon, 24 Aug 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Your UEBA is lying to you: Why entity record quality decides everything]]></title>
    <description><![CDATA[Most entity analytics systems are confidently wrong. They track users who do not exist, generate risk scores built on noise, and call it behavioral analytics. Learn why the entities records you don't create matter as much as the ones you do and how a confidence-tiered model changes the game.]]></description>
    <content:encoded><![CDATA[<p>There's an uncomfortable truth in security analytics that nobody talks about at conferences: The quality of your detections, alerts, and investigations is only as good as the entity records that represent the users, hosts, and services in your environment.</p>
<p>Not the machine learning models. Not the anomaly detection algorithms. Not the risk scoring engine. The <em>entities</em>: the foundations to teach your system about the data and protect it.</p>
<p>Get the entities wrong, and everything downstream is contaminated, including AI. Your baselines are fiction. Your risk scores are noise. Your analysts are chasing ghosts. And the worst part? Most user and entity behavior analytics (UEBA) implementations get the entities wrong from day one. This blog explains why the entities you <em>don't</em> create matter and how a confidence-tiered model helps.</p>
<p>A note on terminology before we go further: in this piece we’ll distinguish between the real-world thing — a person, a host, a service — and the entity record Elastic Security creates to represent it. The argument that follows is about which records are worth creating, not about which things exist. We’ll use “entity record” when the distinction matters.</p>
<h2 id="oneusernamehundredsofidentities">One username, hundreds of identities</h2>
<p>Consider the simplest possible approach to creating a user entity record: Take a <code>user.name</code> field from an event log and call it an entity. A username like <code>deploy</code> appears in your telemetry, so you create a <code>deploy</code> entity record and start building a behavioral baseline.</p>
<p>The problem is immediate and severe. That <code>deploy</code> username might exist on 200 servers. It might be used by 12 engineers and a continuous integration and continuous deployment (CI/CD) pipeline. The behavioral baseline you're building is a smoothie blended from hundreds of different machines, used by different people, for completely different purposes. The system is treating a string match as an identity, barely one step above random.</p>
<p>When this entity record inevitably generates elevated risk scores, analysts investigate, only to discover that the "anomaly" was just a different engineer using the same shared account in a slightly different way. Multiply this across every common username in a large environment and you've built a system that generates investigative busywork at industrial scale.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta4511e63df7e9ea1/6a7d863fc2cc09e5442466f5/risk-table.png" alt="" /></p>
<p>The opposite mistake: An empty dashboard</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf8a5bc2932323a8e/6a7d86413ce8e22f2dcf26fe/risk-dashboard.png" alt="" /></p>
<p>Some security vendors recognize the problem and swing to the other extreme. They decide (correctly, in principle) that only identity-provider-backed entity records are trustworthy enough for behavioral analytics. If you can't tie an entity record to an authoritative account in a directory like Okta, Entra ID, or Active Directory, don't create one at all.</p>
<p>The engineering reasoning is defensible. The product experience is catastrophic.</p>
<p>A customer rolls out endpoint agents across their fleet, opens the security analytics dashboard, and sees nothing. Zero entities. The feature looks broken. The SOC analyst has no idea why no users are showing up, and worse, has no visibility into the activity happening on those endpoints right now. A purist entity data model has produced a blind spot. </p>
<h2 id="themissingmiddlehostscopedidentity">The missing middle: Host-scoped identity</h2>
<p>Most vendors building UEBA have historically picked between two unsatisfying defaults, bare usernames that blend everyone into noise, or IdP-only entities that leave most deployments with nothing. But without explicit governance over which signals come from which source, the noise still leaks through.What's missing is a middle layer: entities derived from endpoint telemetry that are tightly scoped enough to be meaningful but carefully governed enough to avoid the noise problem.</p>
<p>The instinct might be to simply pair a username with a host and call it an entity record. But without guardrails, this just moves the noise problem down one level. <code>deploy</code> on <code>prod-web-03</code> is still five engineers' blended activity. <code>root</code> on a shared bastion host is still everyone and no one. You've reduced the blast radius from "all servers" to "one server," but the behavioral baseline is still a fiction if the underlying account is shared, automated, or observed only through a failed brute-force attempt that never actually succeeded.</p>
<p>The real question isn't whether to create local host-scoped entity records. It's <em>which</em> host-scoped entity records are worth creating and with what governance over how they participate in risk scoring and identity resolution downstream.</p>
<h2 id="theelasticapproachtwokindsofentitiesgoverneddifferently">The Elastic approach: Two kinds of entities, governed differently</h2>
<p>One answer is to recognize that not all record sources are equal and to build that distinction into the architecture itself, governing how each record is created, enriched, scored, and resolved.</p>
<p>This is the approach Elastic Security takes. Instead of treating all entity records as interchangeable, the system draws a clear line between <strong>identity-provider-backed entities</strong> and <strong>endpoint-observed local host entities</strong> and governs each category differently under the hood.</p>
<p><strong>Identity-provider-backed entities</strong> are created only by authoritative identity systems: Okta, Entra ID, Google Workspace, Active Directory, and other identity-provider namespaces across identity and access management (IAM), cloud platforms, software as a service (SaaS), and privileged access management (PAM) systems. These entity records represent verified accounts in systems that own and manage those accounts. They get the full analytical treatment, that is, rich behavioral baselines, cross-platform enrichment from 120+ security integrations, and full participation in person-level risk scoring.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9cc53c92cf193f2c/6a7d86446693f850c666111e/entity-panel.png" alt="" /></p>
<p><strong>Endpoint-observed entities</strong> are created from endpoint telemetry: Your endpoint detection and response (EDR) agent observes <code>jdoe</code> active on a specific host and creates a host-scoped entity record tied to that local machine. These entity records are real and useful, but the system knows they carry less identity certainty, and it governs them accordingly. </p>
<p>Analysts don't need to think about any of this machinery. What they see is an entity store that's populated from day one with more accurate user entity records. The governance happens in the architecture so it doesn't have to happen in the analyst's head.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd7521418124d9690/6a7d864805b7b506d3188bf5/entities.png" alt="" /></p>
<p>(An endpoint-observed entity for sarah.chen active on her corporate MacBook. The entity name (sarah.chen\@CORP-MAC-SC-2024) uses the human-readable hostname for readability. The entity ID (user:sarah.chen\@b92f1e3a-7d4c-4a8b-9f2e-1c3d5e7f9012\@local) uses the machine's hardware UUID instead of its hostname — this is intentional. Hostnames change when a device is renamed or reimaged; the hardware UUID is permanent. The @local suffix identifies this as an endpoint-observed entity: it represents sarah.chen's activity on this specific machine, not sarah.chen as a verified identity across your organization.)</p>
<h2 id="fromfragmentedaccountstoaunifiedusergroupnbsp">From fragmented accounts to a Unified User Group. </h2>
<p>Even when you get entity record creation right, you’re still left with a fragmentation problem no amount of per-entity discipline can solve alone.</p>
<p>Consider John Doe in a large enterprise. He has an Okta account for SaaS access, an Entra ID account tied to his corporate laptop, and an Active Directory account for on-prem systems. Each is a legitimate, authoritative entity record by every standard described above, and yet they’re three separate records for the same human being, each with its own risk history, each generating signals in isolation.</p>
<p>When John’s Entra account shows a lateral movement indicator the same day his Okta account flags a suspicious login from an anomalous location, those signals may never connect. They exist as separate entities, investigated in isolation, by analysts who have no automated way to know they belong to the same person. The cross-surface campaign that entity analytics is supposed to catch hides in plain sight between identity providers.</p>
<p>Elastic Security solves this through automatic entity resolution: consolidating a user’s fragmented digital footprint across Okta, Entra ID, Active Directory, and more into a single unified identity. John Doe becomes a first-class citizen in the entity store: one primary record, all associated accounts grouped together, one aggregated risk score that reflects everything happening across every identity surface he touches. Resolution runs continuously as new integrations come online, without manual curation.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta31e28764908c987/6a7d864a6c6eac9ac8f11401/entity-sources.png" alt="" /></p>
<p>In the image above, we've created one entity record per user account and grouped them together, so when an analyst reviews the record, all related identities appear in one place.</p>
<h2 id="whatthischangesforanalysts">What this changes for analysts</h2>
<p>For the security operations center (SOC) analyst working a 2 a.m. alerted by their Elastic agentic workflow, these two architectural decisions (confidence-tiered entity governance and unified identity resolution) change the investigation fundamentally.</p>
<p>Instead of opening four separate entity cards for the same person, they open one. Cross-provider risk signals are aggregated into a single score, and attack narratives that span identity systems are visible as narratives, not as disconnected data points buried in separate views.</p>
<p>Compare this to investigating a bare deploy entity record with a risk score of 70 that’s actually an artifact of 12 people’s blended activity across 200 servers. One investigation leads somewhere. The other erodes trust in the entire capability, which is the real cost of noisy entity records. Not just the false positive itself, but the analyst who learns to ignore entity risk scores entirely.</p>
<h2 id="theentitiesrecordsyoudontcreate">The entities records you don't create</h2>
<p>Perhaps the most underappreciated aspect of entity analytics design is restraint. Every entity record you create has a cost: Compute for baselining, storage for history, analyst attention when it generates alerts, and potential for noise propagation into the broader analytical model.</p>
<p>The discipline to <em>not</em> create an entity record (to require a minimum evidence threshold) is what separates an entity analytics system that gets more useful over time from one that slowly drowns its operators in noise.</p>
<p>In practice, this means maintaining a configurable exclusion list for common service and shared accounts: <em>root</em>, <em>jenkins</em>, <em>deploy</em>, <em>postgres</em>, and others like them. These accounts exist on hundreds of machines, are used by automated processes and multiple humans interchangeably, and would produce baselines that mean nothing. Elastic Security ships a default list covering the most common offenders. Today the list operates at the username level — root is excluded uniformly regardless of which host it appears on — and is fixed. Future iterations will make it configurable, letting teams add their own environment-specific service accounts and, eventually, specify compound patterns that combine username and host. That would allow excluding root globally on shared infrastructure while still creating a host-scoped entity when that account appears on a personal workstation where the activity is attributable to a specific person. The architecture is already built for it: because endpoint-observed entities are keyed as <code>{user.name}@{host}</code>, compound rules are a coherent extension, not a redesign.</p>
<p>The higher-fidelity approach we've described directly mitigates the broader noise problem. When entity records are created from any username string in a log, your ML models end up baselining service accounts, typo'd logins, and shared kiosk accounts as if they were people — a 2 a.m. backup job looks anomalous against a human baseline, and a one-event typo'd login never accumulates enough data to baseline at all. When entity records are anchored to authoritative identity sources and resolved across their various login forms, the model learns patterns for actual humans doing actual work. Anomalies become meaningful because the baseline is meaningful.</p>
<p>The best entity analytics isn't the one that creates the most entities. It's the one that creates the <em>right</em> entities, governs them by what it actually knows about their source and scope, and builds its analytical investment proportionally. Everything else (risk scoring, behavioral baselines, entity resolution, anomaly detection, and AI skills) is downstream of that foundational decision. Get the entity records right, and the analytics follow. Get them wrong, and no amount of machine learning or AI can save you.</p>
<p><em>Entity analytics is available in Elastic Security.</em><a href="https://www.elastic.co/docs/solutions/security/advanced-entity-analytics/entity-store"> <em>Learn more about advanced entity analytics and how the entity store governs user entities.</em></a></p>]]></content:encoded>
    <link>https://www.elastic.co/security-labs/blog/ueba-entity-record-quality-analytics</link>
    <guid isPermaLink="false">ueba-entity-record-quality-analytics</guid>
    <category><![CDATA[SOC]]></category>
    <dc:creator><![CDATA[Erik Huang,Mike Paquette]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0b8b55a6f64587d3/6a7d864e437e0f03f7dd8651/header.png" length="0" type="image/png"/>
    <pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[AI-generated hunting leads: The hunt starts before you ask the question]]></title>
    <description><![CDATA[Introducing AI-generated hunting leads, proactive, environment-aware threat hypotheses powered by Elastic Entity analytics and integrated AI reasoning.]]></description>
    <content:encoded><![CDATA[<p>Threat hunting has always been a human art; a practitioner staring at logs, forming a hypothesis, and patiently chasing it down. What if the hardest part of the hunt (knowing where to look) could be done for you, automatically, in milliseconds, and tuned specifically to your environment? This is where AI-generated hunting leads come in, allowing you to shift from reactive alerting to proactive defense with entity-centric, risk-based threat hunting tailored specifically to your environment's unique behavioral patterns.</p>
<h2 id="thehuntinggapnoonetalksabout">The hunting gap no one talks about</h2>
<p>Ask any threat hunter what slows them down, and you'll hear the same answer: it’s not the querying or the pivoting; it's the blank page. The moment before the hypothesis is formed. Most analysts know that somewhere in their telemetry there are patterns that signal compromise, lateral movement, or abuse; they just don’t know where to start.</p>
<p>Modern AI agents have a discovery problem: they’re brilliant at answering questions but useless if you don’t know what to ask. This "curiosity gap" traps security teams in a cycle of reactive hunting. Whether it’s waiting for a vendor threat intelligence report to drop, an alert to scream, or a CISO to grill the team during a QBR, the damage is often already done. While analysts wait for a hypothesis, AI-powered adversaries are moving at machine speed—widening an already dangerous window of opportunity.</p>
<p>The industry has tried to close this gap through detection rules, threat intel feeds, and user and entity behavior analytics (UEBA)  scoring. These are necessary, but they're static frames applied to a dynamic reality. A UEBA anomaly tells you something is unusual. It doesn't tell you why it matters in your environment today.</p>
<h3 id="thecoreproblem">The core problem</h3>
<p>Detection rules tell you what to look for that’s very specific. Threat intel tells you what others found. Neither one tells you what your environment is uniquely at risk for right now, because neither one actually knows your environment.</p>
<h2 id="buildingthefoundationtheentitystore">Building the foundation: The entity store</h2>
<p>Solving the hunting gap required us to first solve a data problem. Hunting leads are only as effective as their context; and in security, context is the sum of everything true about an entity over time.</p>
<p>We built the Elastic entity store as a purpose-built ontology for exactly this. Unlike Elastic Common Schema (ECS), which captures the state of a field at event time, the entity store is a longitudinal record, a living profile of characteristics of every user, host, and service in your environment. It tracks four dimensions that matter for security reasoning:</p>
<pre><code>// Entity Store Schema — Core Characteristics

entity.attributes // Who/what the entity IS
  mfa_enabled: false // From AWS integration
  privileged_groups: ["Domain Admins"] // From AD
  asset_criticality: "high"

entity.lifecycle // Temporal facts
  first_seen: "2024-09-14T08:22:00Z"
  last_active: "2025-03-31T23:47:00Z"
  dormancy_detected: true // Inactive 47 days, now active

entity.behavior // Anomalous signals (rolling window)
  brute_force_victim: true
  unusual_login_hours: true
  new_geo_access: "DE" // First access from Germany

entity.risk // Scored risk aggregation
  calculated_level: "Critical"
  score: 94.2
</code></pre>
<p>This schema isn’t just storage; it's also a reasoning substrate. Each field represents a signal that, in combination with others, tells a coherent story about an entity's current threat posture. A user who was dormant for 47 days, is now active outside business hours, logged in from a new country, and doesn't have multifactor authentication (MFA) is not just risky in isolation; that combination is a hunting lead.</p>
<h2 id="reasoningoverentitydata">Reasoning over entity data</h2>
<p>With the entity store providing rich context, we built <a href="https://www.elastic.co/docs/solutions/security/advanced-entity-analytics">Entity analytics AI-hunting leads</a>. These reasoning modules traverse entity profiles and correlate data across users and hosts to surface patterns that human analysts would find meaningful, if they had the time to look everywhere at once.</p>
<p>These AI-generated hunting leads are automatically surfaced on our Entity analytics home page, ingesting the entity store state to identify combinations that constitute a threat hypothesis. This isn't a simple rule match; it’s a narrative hypothesis grounded in your actual environment.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbe36134c2b153902/6a7d83a5e88c6525810089a8/image1.png" alt="Threat gap" title="Three-step diagram, showing entity store snapshots, cross-entity correlation, and hypothesis generation used to identify potential threat scenarios in an environment." /></p>
<h2 id="whatmakesthisdifferent">What makes this different</h2>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt28b07d78967db1a8/6a7d83a86c6eac06aaf1139d/image2.png" alt="Alert dashboard" title="Dashboard titled Entity Analytics, showing high\‑severity alert cards for DataStore, Slack, and Zoom; entity risk level counts; recent anomaly scores with user listings; and a threat summary panel analyzing an alert volume spike for the DataStore service." /></p>
<p>Proactive hunting assistance tools are emerging across the industry. Many are useful tools, but they share a fundamental constraint: They reason over threat intelligence reported information plus event telemetry, not over accumulated entity knowledge.</p>
<p>The difference matters. A query-based approach can find events that match a pattern. An entity-aware approach can find entities that, given everything we know about them, are likely to be involved in something worth investigating. That's a fundamentally richer signal source, and it's one that gets sharper over time as entity history accumulates for what’s been missing in retrohunt features in modern security information and event management (SIEM).</p>
<h2 id="huntingasacontinuousdiscipline">Hunting as a continuous discipline</h2>
<p>The promise of proactive security is stopping attackers before they reach their objective. Traditionally, the barrier has been analyst capacity. With the rise of AI-driven attacks, this is becoming an impossible task for humans alone.</p>
<p>Entity analytics AI-generated hunting leads don't replace hunters; they multiply them. A senior analyst no longer spends hours figuring out where to look. Instead, they start their shift with a prioritized set of hypotheses that the AI-generated hunting leads already curated. Their time is preserved for what only humans can do: validation, decision, escalation, and response.</p>
<h2 id="whatsnext">What's next</h2>
<p>Entity analytics AI-generated hunting leads are the first production expression of a broader capability roadmap: an Elastic Security that doesn't wait for you to ask a question. As Entity analytics matures, with expanded entity types such as tracking AI agents, the reasoning surface expands accordingly.</p>
<hr />
<p><em>Entity analytics is available in Elastic Security. <a href="https://www.elastic.co/docs/solutions/security/advanced-entity-analytics/overview">Learn more about advanced entity analytics, AI-hunting leads and how the entity store governs user entities.</a></em></p>]]></content:encoded>
    <link>https://www.elastic.co/security-labs/blog/proactive-threat-hunting-ai-generated-leads</link>
    <guid isPermaLink="false">proactive-threat-hunting-ai-generated-leads</guid>
    <category><![CDATA[AI & Automation]]></category>
    <dc:creator><![CDATA[Erik Huang,Mike Paquette]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta9f64025af0097a8/6a7d83ab498caf4db301eeb8/proactive-threat-hunting-ai-generated-leads.webp" length="0" type="image/webp"/>
    <pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>