<?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[Chuddy Park - 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[Chuddy Park - 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/chuddy-park</link>
    </image>
    <link>https://www.elastic.co/security-labs/author/chuddy-park</link>
    <atom:link href="https://www.elastic.co/security-labs/rss/author/chuddy-park.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[en]]></language>
    <lastBuildDate>Fri, 18 Sep 2026 19:15:59 GMT</lastBuildDate>
  <item>
    <title><![CDATA[One SOC, 100 projects: running centralized alert triage on Elastic Security Serverless]]></title>
    <description><![CDATA[We linked one Elastic Security project to 100 others and ran the full prebuilt detection catalog from the origin, with all the ingest landing in the linked projects. It held up, and where it deliberately does not reach is the interesting part.]]></description>
    <content:encoded><![CDATA[<p>Run security operations for more than one team, region, or customer, and you inherit a familiar tradeoff. One giant deployment gives you a single view but costs you tenant isolation, while separate environments preserve isolation and scatter your analysts across contexts, with detection rules drifting into 12 slightly different copies along the way. <a href="https://www.elastic.co/blog/cross-project-search-elastic-serverless-ga">Cross-project search (CPS)</a> on Elastic Cloud Serverless is built to end that tradeoff. One Elastic Security project runs detection and triage, along with investigation, across every linked project, and each environment keeps its own data, isolation, and lifecycle. <a href="https://www.elastic.co/docs/explore-analyze/cross-cluster-search">Cross-cluster search (CCS)</a> has played this role on Elastic Cloud Hosted for years; CPS brings a similar model to Serverless, adapted to projects instead of clusters.</p><p>To make sure that holds under real security operations center (SOC) load, we linked one Elastic Security project to 100 others and pointed all the ingest at the linked projects (that's how real central SOCs are shaped). We ran roughly <a href="https://github.com/elastic/detection-rules">2,100 prebuilt detection rules</a> from the origin. The search layer held up. Most of what we learned was about how to run the model well; that is, which query shapes stay fast at that scale and how to size your rule set. We also learned where the project boundary is doing its job on purpose.</p><p>This post covers how the central SOC model works with CPS, the analyst workflow we validated end to end, the <a href="https://www.elastic.co/docs/explore-analyze/discover/try-esql">Elasticsearch Query Language (ES|QL)</a> patterns we recommend, and the limitations. </p><h2>How centralized alert triage works with cross-project search</h2><p>CPS lets one Serverless project (the <em>origin</em>) search data in other projects in your organization (<em>linked</em> projects). For Security, that enables the central SOC pattern. Detection rules live and run on the origin, and their index patterns resolve across linked projects, so one rule covers every linked project with no duplication. The alerts that those rules generate land on the origin, which means that the SOC works a single queue. And the data itself never moves; each linked project keeps its own.</p><p></p><p>CPS reads across linked projects but never writes into them. Everything that a rule produces (alerts, cases, investigations) lives on the origin. That boundary is deliberate. It also shapes every section below, so keep it in mind.</p><h2>The analyst workflow: detect, triage, investigate, respond</h2><p>Say the cloud team's linked project shows repeated failed AWS console logins. Here's the flow we tested.</p><h3>Detect: one rule set covering every linked project</h3><p>A query rule on the origin targets <code>logs-*</code>. The pattern fans out to every linked project, matches the CloudTrail events, and generates alerts on the origin.</p><h3>Triage: a single alert queue on the origin</h3><p>Because every rule runs on the origin, the alert queue is already consolidated. Analysts triage in the Alerts page the way they always have: severity, tags, assignment, and status all work normally, because these are origin-local alerts. There’s no project hopping, and there are no duplicate alerts from per-project rule copies.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf178293fa93f008b/6aac10932156611452800dba/image3.png" alt="Elastic Security Alerts page showing an origin alert with kibana.alert.ancestors.index pointing to a linked project" /><h3>Investigate: following the chain across linked projects</h3><p>The cross-project reach that powered detection now becomes visible to the analyst. The alert flyout renders source-event context from the linked project, and Timeline search spans linked projects, so you can follow the chain (failed logins, password reset, privilege escalation, access key creation) without leaving the origin. When you need to go wider, Discover is the CPS surface, for broad sweeps across every linked project or targeted queries against one. Examples are below.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt645345ae1ab84e85/6aac120b5653207ecca07706/image1.png" alt="Timeline showing failed console logins then AttachUserPolicy and CreateAccessKey from linked-project CloudTrail data" /><p></p><h3>Respond: triage centrally, act locally</h3><p>The same boundary applies to response. Closing an alert, isolating a host, or running osquery happens in the project that owns the data, because CPS doesn't write across a project boundary. That's what keeps one tenant's response from reaching into another's. Write it into your runbook as "triage centrally, act locally."</p><h2>How to hunt and investigate across linked projects with ES|QL</h2><p>Three query shapes cover most of what an analyst needs from the origin. The inline comments call out the parts that matter.</p><h3>Cross-tenant threat hunting: search every linked project at once</h3><p>An unqualified <code>FROM</code> fans out to the origin plus every linked project (<em>flat world</em>), which makes it the right shape for hunting one entity's activity across every linked project at once. It's also what makes the scope dynamic; projects linked tomorrow are covered by the same query with no edits. </p><p></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt37553e2c0cf84c3c/6aac10eb1a380e4040847299/image4.png" alt="ES|QL query in Discover returning rows from two linked projects, with the _index prefix showing tenant attribution" /><p></p><h3>Alert counts by project and severity</h3><p>For situational awareness, roll activity up per project by deriving the project from the index name:</p><p></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt787f0bd7ccda12d7/6aac1143bf410793962fc2ce/image6.png" alt="ES|QL rollup at the origin showing alert counts by project and severity across origin and linked projects" /><p>In our test environment, rollups like this stayed interactive across all 100 linked projects.</p><h3>Which surfaces honour the cross-project scope</h3><p>Discover and non-managed dashboards honor the full cross-project scope. Security's managed pages show the CPS scope selector as read-only, so analysts can see which projects are in scope while admins set the defaults per space.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5053ed055a72b6d3/6aac116cb15ff95d5ecc65be/image5.png" alt="Change project scope panel in Elastic Security listing the origin and two linked projects for cross-project search" /><h2>What we learned running centralized alert triage across 100 projects</h2><p>Anyone can publish a benchmark with a friendly workload, so we built ours like an actual SOC. Ingest flowed only into the linked projects, with the full prebuilt detection rule catalog (~2,100 rules) enabled at the origin. Analyst-persona queries ran on schedules that mirror real behavior: 10-minute triage sweeps, weekly reviews, 30-day incident response (IR) lookbacks.</p><p>The headline is that the central SOC model holds at that scale. A single origin ran the entire detection catalog against the data from 100 linked projects. Alerts landed in one queue, and analyst query patterns stayed interactive. Along the way, the test results turned into sizing guidance that you can use:</p><ul><li><p>Linked project count isn’t your cost driver. Query cost scales with per-project data volume and query shape far more than with the number of linked projects. Quiet projects are close to free, which is exactly what makes 100 of them practical.</p></li><li><p>Project your columns. Full <code>_source</code> retrieval at depth is dramatically slower than <code>KEEP</code>-projected queries. Interactive triage and hunting queries should always project; save full documents for exports.</p></li><li><p>Treat rule count times schedule as a sizing input, the same way that you treat ingest. Running the full ~2,100 prebuilt detection rule catalog from one origin is an extreme case, and we did it to find the envelope; plenty of those rules had no matching data in linked projects, and the noisiest ones were the first things we disabled. The practical guidance that came out of it is simple: enable the rules that you'll actually triage, and lean on alert suppression for the noisy frontline ones.</p></li></ul><h2>What cross-project search doesn't do across the project boundary</h2><p>We'd rather you design around these than discover them mid-incident.</p><p></p><p><strong>Capability</strong></p><p><strong>Works across linked projects?</strong></p><p><strong>Where it runs / what to do</strong></p><p>Alerts from origin rules</p><p>Yes</p><p>Generated on the origin from linked-project data. Fully actionable.</p><p>Alerts a linked project generates itself</p><p>No</p><p>Never enter the origin queue. Readable in Discover only.</p><p><a href="https://www.elastic.co/docs/solutions/security/ai/attack-discovery">Attack Discovery</a></p><p>No</p><p>Origin-generated alerts only, same as the Alerts page.</p><p>Response actions (close alert, isolate host, osquery), case attachments, workflow updates</p><p>No</p><p>Run in the project that owns the data. Triage centrally, act locally.</p><p>Timeline, Analyzer, Correlations</p><p>Yes, read-only</p><p>Linked-project alerts appear as context. Analysts can read but not act.</p><p>Session View</p><p>No</p><p>Not available for linked projects.</p><p>CSPM, KSPM, CNVM findings</p><p>No</p><p>Produced in the project where the integrations run. Review posture there.</p><p>SIEM Readiness and Value reports</p><p>No</p><p>Origin-scoped.</p><p>Entity store</p><p>Partial</p><p>Origin profiles include entities from every linked project, but each project computes its own risk score. A host in two projects is not merged.</p><p>Machine learning anomaly detection</p><p>Partial</p><p>Datafeeds read linked-project data. Jobs and results are stored on the origin. Plan ML capacity there.</p><p>Three more constraints sit outside that table.</p><ul><li><p>Rules target all linked projects by design. That default is what keeps detection coverage automatic as projects are linked and unlinked, so there's deliberately no per-rule project picker in the rule form. When you do need a rule scoped to a subset, use project routing at the API level. One related behavior worth knowing: a rule searches only the linked projects that its last editor can access, so create and update rules with an identity that spans your projects. </p></li><li><p>All projects must share one Elastic Cloud organization, and an origin can link up to 100 projects by default; higher limits are available by working with Elastic.</p></li><li><p>Know your alert cap. The max alerts per run limit applies across everything in the rule's scope, so at 100 linked projects, a chatty rule can hit it. Suppression and per-rule tuning matter more at this scale. </p></li></ul><h2>When a centralized SOC platform fits (and when it doesn't)</h2><p>Good candidates share four traits:</p><ol><li><p>Multiple environments (teams, regions, customers) that need independent data ownership but shared security operations.</p></li><li><p>A detection strategy that you're willing to centralize on the origin: one rule set, one alert queue.</p></li><li><p>Triage workflows that are read-heavy at the center, with response actions executable per tenant.</p></li><li><p>Analysts comfortable in Discover and ES|QL for cross-tenant sweeps.</p></li></ol><p></p><p>Poor candidates look like the opposite. If your workflow depends on centrally <em>acting</em> on remote alerts and endpoints today, if you have hard requirements for unified cross-project risk scoring, or if your tenants are spread across multiple Elastic Cloud organizations, wait or plan a hybrid.</p><h2>How to set up centralized alert triage across linked projects</h2><ol><li><p>Run all detection rules on the origin. Splitting rule execution across projects buys you duplicate alerts and confusing side effects.</p></li><li><p>Tag your projects at link time (region, tier, customer). Tags are how you'll scope and group later.</p></li><li><p>Build hunting queries with <code>METADATA _index</code> and <code>KEEP</code> from day one.</p></li><li><p>Keep Kibana space names distinct across projects.</p></li><li><p>Size your rule set to your link count, and write the "act locally" half of your runbook before you need it.</p></li></ol><p>CPS for Security is generally available on Elastic Cloud Serverless. Try it against your own multi-project topology, and if you hit something we didn't cover here, tell us.</p><p>A consolidated queue is also a foundation to build on. For a look at where triage goes from here, see how an agentic SOC<a href="https://www.elastic.co/security-labs/blog/agentic-soc-alert-triage-alertzero"> handles alert triage with Alert Zero</a>. </p><p>Don't have a Serverless project yet? Start an <a href="https://cloud.elastic.co/registration">Elastic Cloud free trial</a>. It takes about a minute to get a fully configured environment.</p>]]></content:encoded>
    <link>https://www.elastic.co/security-labs/blog/centralized-alert-triage-cross-project-search</link>
    <guid isPermaLink="false">centralized-alert-triage-cross-project-search</guid>
    <category><![CDATA[SOC]]></category>
    <category><![CDATA[Security Operations]]></category>
    <category><![CDATA[Threat Hunting]]></category>
    <dc:creator><![CDATA[Chuddy Park]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0cc05d514cc69660/6aac10632433e26e21d7ea5a/image2.jpg" length="0" type="image/jpeg"/>
    <pubDate>Fri, 18 Sep 2026 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>