Detection content management for Wazuh

Understand what your Wazuh detects.
Change it without holding your breath.

SOCsimple sits over the rules, decoders and lists your Wazuh managers run. Connect a manager, and it reads everything, shows you what needs a person, and gives your team one safe, recorded path to change it. Wazuh stays the engine.

Request access Follow one change through Private beta, by invitation · Read-only until an admin says otherwise · Wazuh 4.x over the API · nothing installed on the manager
What lives on the manager What your team sees
Deployed rule 100520 · level 7 → 9 14:02
Dan K. · reason "Tighten sudo-to-root per CR-3312" · proved with the sample
Acme Corp/acme-prod/rule 100511 Drifted

Someone raised this rule's alert level from 5 → 10, directly on the manager. What it detects is unchanged. Two local rules depend on it. Caught on the 09:12 sync.

Fires onSSH auth events, via built-in rule 5700
Dependents100512 · 100530
Restore woulddeploy your version back, proved with a sample
Restore intendedAdopt observedShow diff
Adopt writes nothing and records the decision. Restore goes through the gate, reason required.
Why it gets hard

The XML that decides what becomes an alert is not, on its own, a versioned or reviewable change system — it’s files on a manager, edited in place. The manager is the deploy target, not the source of truth.

  • The files outgrow anyone's memory.Hundreds of local rules, decoders that chain by name, IDs reused by accident. Reading XML is not the same as understanding it.local_rules.xml · 4,118 lines
  • The manager changes behind your back.An SSH edit during an incident, a "temporary" comment-out. Nothing records it; the next person inherits a mystery.no version control · no audit trail
  • Deploying is a held breath.One malformed rule and analysisd refuses the whole ruleset. The usual safety net is a shell history and a restart.ERROR (1226) · restart · hope
  • The noise is a guess.You know something is loud. Which field to key on, what the change would remove, whether it worked — that's archaeology across two systems.8,120 alerts from one signature
One change, end to end

Connect a manager. Then follow a single change from “what’s there?” to “deployed, proved, recorded.”

This is the core workflow, in the order your team actually experiences it — shown with one environment's real shape.

01
Connect

One screen, one button. Not a tour of Settings.

Name the environment, point at the manager's API, Test and save. A failed probe stores nothing. A successful one stores exactly what was verified — version, capabilities — and starts the first sync on its own. Read-only from the first second.

The Manager tells SOCsimple what runs. The Indexer shows what it produces. Connect the Indexer when you want noise analysis, firing patterns and measured change outcomes.

Verified · Wazuh 4.14.0 · first sync started
Set up your first environmentSOCsimple/
Environment
acme-prodEurope/Berlin
Manager
https://wazuh-prod.acme.internal:55000
socsimple-ro••••••••••••
Test and saveIndexer optional — add it later for Insights.
Manager verified. Wazuh 4.14.0 · file write · hot reload. First detection sync started automatically.
02
Sync

What you have becomes the baseline — automatically, once.

The first sync reads every rule, decoder, CDB list and file, the way Wazuh loads them. Your existing local content is adopted as the baseline on the spot: no weeks of defining "correct" before drift detection means anything. Built-in content is indexed, never claimed.

Then it keeps going: scheduled synchronization, connection health that wears its age, and Sync now whenever you need it.

48 seconds · 273 rules and 565 decoders now managed
First sync completeSynced · just now
273
local rules · now managed
565
local decoders · now managed
4,511
built-in rules · indexed
6
CDB lists · 11 files monitored
Adopted as the intended baseline. Every later sync compares the live bytes with this, by stable identity — a reorder or comment edit doesn't alarm; a level change does.
03
See what SOCsimple found

The Overview says what needs a person — calmly.

Not a stats page. Findings computed from your synced content — two definitions fighting over one identity, broken dependencies, rules that never load — plus anything drifted and, with an indexer connected, which rules are shouting. Ranked by what it affects, and separated from Wazuh structure that's probably deliberate.

3 need review · 1 drifted · 1 loud rule
Acme Corp/acme-prod/OverviewContent synced 6 min ago
Needs review · 3
Rule ID 100500 needs one clear definition · 2 occurrences · 5 dependentslocal_rules.xml
Rule 100511 changed on the manager · level 5 → 10Drifted
Rule 100530 references 100499 — not foundsshd_custom.xml
Noise highlights · indexer connected
5710 sshd: non-existent user · 8,120 from one /2465% of the rule
Context · 1
Same-name decoder chain in cisco_local.xml — valid Wazuh structurenot a failure
04
Decide

Every issue answers three questions, and hands you the next verb.

Observed. Why it matters. Next step. A duplicate-ID card says which definition Wazuh actually keeps, what differs, and who depends on it — then lets you decide right there: keep this one, and renumber, remove or comment out the other. The decision becomes a staged draft, opened on the diff.

Underneath is a rule SOCsimple holds everywhere: one rule identity, one intended definition, one history — through edits, renames, moves between files, and redeploys. A collision becomes a decision instead of a winner silently chosen by load order, and new content is admitted with a safe identity before anything ships.

Keep line 212 · renumber line 88 → 100523
acme-prod/Issues/Rule ID 100500Needs review
Rule ID 100500 needs one clear definition
ObservedTwo enabled definitions in local_rules.xml — levels 6 (line 88) and 9 (line 212). Wazuh keeps the first one it loads and warns (7612): line 88 wins; the level-9 block silently never fires.
Why it matters5 local rules reference 100500. The stricter level-9 version is the one silently dead — and which block wins changes with a reorder.
Next stepChoose the keeper. SOCsimple stages the other as renumbered, removed or commented out.
Keep line 212 · level 9if_sid 5710 · duplicated — warned (7612), never fires today
Keep line 88 · level 6 wins todayif_sid 5710 · loaded first · what the 5 dependents get now
Renumber the other → 100523RemoveComment outMark as intended…
05
Change

A Draft is the working version. Not deployed, and your team can pick it up.

Edit a rule, a decoder or a CDB list, tune a loud built-in into a local suppression, or edit a whole file with a side-by-side diff. Or start from evidence: paste a real log into the Lab, see what matches, and turn the result into a draft — even a new decoder, seeded from what your sample actually contains.

Saving validates the change right then and marks the target Staged. Nothing touches the manager. A colleague can continue the draft; it records its author and its last editor separately.

Before deploy, you make one choice: what should the deploy prove? The recommended answer is a sample log that must fire — before and after the reload.

Draft — not deployed · Maya R., continued by Dan K.
acme-prod/Content/local_rules.xmlStaged
Draft — not deployed. Keep editing, validate it, or continue later; deploy when it's ready. Author Maya R. · last edited Dan K., 12 min ago.
··· 18 unchanged lines - <rule id="100520" level="7"> + <rule id="100520" level="9"> <if_sid>5402</if_sid> ··· 6 unchanged lines - <rule id="100500" level="6"> + <rule id="100523" level="6"> ··· 11 unchanged lines
Deploy check
Prove this change with the sample recommendedSOCsimple will verify that this change behaves as expected before completing deployment.
Structure & reload onlyWazuh accepts and reloads the change; its behaviour is not proven.
Aug 19 13:58:02 web-01 sudo: svc-deploy : TTY=pts/0 ; USER=root ; COMMAND=/bin/bash
Why this change? (recorded on the deploy)
DeployContinue editingDiscard…
Deploy

One gate. Every write goes through it. Any failure goes back.

An operator gives the reason and presses Deploy. For a sample-proven deploy, SOCsimple takes a fresh snapshot, splices in only what you changed, runs the manager's own check, fires your sample against the staged content, reloads without a restart, fires it again live, verifies the bytes, and commits. If any step fails, the manager is restored byte-for-byte and the failure is recorded honestly.

Then it's in Activity — who, why, how it was proved — and in the append-only, hash-chained audit trail underneath.

Deployed · proved with the sample · rule 100520 now reads Synced
Deploying local_rules.xmlenvironment lock held · acme-prod
Reason captured"Tighten sudo-to-root per CR-3312"
Fresh snapshot of the target filerollback baseline
Write — only the changed blocks spliced inevery other byte kept
Manager configuration checkinformational
Sample fires against staged contentthe gate
Ruleset reload · analysisd healthyno restart
Sample fires against the live rulesetproved
Verify bytes · commit change recordSynced
Deployed rule 100520 · level 7 → 9. Dan K. · 14:02 · proved with the sample · audit entry #8412 · chain intact.
Had the sample not fired, the pre-write bytes would be back on the manager before the engine ever reloaded, and the Draft would still be here.
48h
Two days later

And then — did it work?

With an indexer connected, the change keeps reporting back. The impact you predicted was frozen into the draft; Insights measures what really happened and says so plainly — a confirmed drop, or honestly not confirmed yet.

That’s what the loop buys. Tuning stops being a guess you revisit and becomes a decision you close — and the same clarity runs through the rest: what changed, whether it was safe, whether it worked. The hours that went into that archaeology go back into running Wazuh, not excavating it.

Confirmed drop −61% · decision closed
acme-prod/Insights/rule 571048 hours after deploy
Changesuppress srcip 203.0.113.0/24 · child of 5710
Predicted−8,120 / week
MeasuredConfirmed drop −61%
Events that moved to child rule 100601 don’t count as reduction. Without an indexer, this page says so — no placeholder numbers.
Four states

Every artifact carries one state — and every state has its verb.

Synced

Live matches intent.

→ nothing to do
Drifted

Someone worked on the manager directly — allowed, and noticed. Surfaced calmly, with the diff.

→ restore or adopt
Staged

A draft is open, touching nothing.

→ deploy or discard
Not managed

Present, with no recorded intent.

→ adopt or leave
Simple on top. Serious underneath.

Your team makes one plain choice. SOCsimple carries the machinery.

The point is not to hide how Wazuh works — it's to stop making every analyst re-derive it. The surface stays in operator words: Draft, Deploy, Prove this change, Restore, Adopt. The complexity lives one layer down, where it is enforced rather than remembered.

Every path that can touch the manager — an edit, a restore, a removal, a tuning rule — runs the same spine. There is no "just this once".

  • Deploys are off until an admin turns them on — per environment, audited. Everything up to deploy still works read-only.
  • One writer per environment. Sync and deploy share a lock; a second deploy waits and re-submits itself instead of racing.
  • The manager's config check is never the gate. It can say "valid" for a rule that references a missing list. When you choose proof, your sample firing is the gate.
  • Lab-verified against live Wazuh managers, rollback included — not simulated.
Deploy checkAcme Corp/acme-prod/local_rules.xml
Prove this change with the sample recommendedSOCsimple will verify that this change behaves as expected before completing deployment.
Structure & reload onlyWazuh accepts and reloads the change; its behaviour is not proven.
DeployOperator role · reason required
What you get

Six surfaces. Each one does a job your team already has.

Organised by the question you walked in with — not by data type, and not as a feature catalogue.

Content Inspector

Read your ruleset the way Wazuh loads it — and have it explained.

Local and built-in rules, decoders and CDB lists, file by file. Pick anything: what it fires on, what it alerts at, what depends on it, whether it passes its checks. For local content, the XML is the bytes on the manager — never rewritten; built-ins are shown from the stock ruleset matching your Wazuh version.

Fires onevery syslog-type event, via rule 1Dependents · 2 local rulesChecks · passing
Issues

One queue for what needs a decision, with the verb attached.

Findings, drift, open drafts and failed deploys, folded into decisions. Needs review is separated from context; red is reserved for genuine failure. Dismissals need a written reason and stay exact.

100500 needs one definitionInspect → 100530 → missing 100499Fix in draft →
Insights · needs the indexer

See what your rules actually produce, then tune the loud ones through the same gate.

Find the loud rule and see which signature or field is driving it. The tuning builder stages the change, records what you expect it to reduce, ships it through the same gated deploy — then measures what actually happened.

5710 · suppress srcip 203.0.113.0/24predicted −8,120 / weekconfirmed −61%
Drafts · Lab

Rules, decoders, CDB lists and whole files — edited through one controlled draft workflow.

New rules get a safe identity and a destination file. Decoders can be added, renamed as a declared move, or removed with dependents listed first. CDB lists are edited and deployed through the same recorded change workflow. One open working copy per file — and for rules and decoders, the Lab can turn a real log into a starting point.

Draft — not deployedMaya R. → Dan K.validated at saveparents resolve
Activity · Audit

What happened here — and proof it happened that way.

A day-grouped timeline of syncs, manager changes, drafts, deploys, rollbacks and decisions — with actor and reason where applicable. Beneath it, an append-only, hash-chained audit log: alter one record and the chain breaks visibly.

Deployed 100520 · Dan K. · "per CR-3312"provedaudit #8412 · prev-hash 3f9c…a1e0chain intact
Environments · Portfolio

One environment, or every client's — with the scope always on screen.

Each Wazuh deployment is an environment with its own content, drift, drafts and history. Two or more clients get a portfolio: connection health, sync age and open work per environment — the "which of my 30 needs me today" screen. A per-client Library holds reusable detection content, deployed into any of that client's environments through the same gate.

Northgate / Acme Corp / acme-prod / rule 100520confirmed before every manager write
Control & teams

Built for teams that answer to someone.

Collaboration is the intended mode. Silent editing was the bug. Every consequential action has a role that may take it, a scope it is confined to, and a record it leaves.

Roles
Access is granted per environment, on a ladder. Readers read, analysts draft and adopt, operators deploy and restore, admins run the switches.
readeranalystoperatoradmin
Scope
The client is the tenant and the hard isolation line. Tenant-scoped data paths are constrained to the organization boundary and covered by cross-tenant isolation tests. The write scope is confirmed before every manager write. Northgate/Acme Corp/acme-prod/rule 100520 → local_rules.xml
Reasons
Deploy, restore, adopt, dismiss, discard — each takes a written reason and lands in Activity attributed to a person. A draft records its author and its last editor separately.
Defaults
Read-only sync. Deploys off per environment until an admin enables them. Nothing installed on the manager; you provision the API credentials, so the access level is in your hands. Your team can still sign in to Wazuh and work directly — sync notices, and you decide what it means.
Proof
Append-only, hash-chained audit. Each entry references the previous hash. "We have logs" becomes "we have proof" — the difference an auditor notices.
One team, one Wazuh

Prod, dev and DR under one roof.

You want to know the live ruleset matches what the team agreed on, ship rule changes without a nervous SSH session, and answer "who bumped this to level 10?" without a meeting.

"Was that on purpose?"

An MSSP, many clients

Thirty managers, several people, strict lines.

One workspace, a portfolio of what needs attention — and the target client and environment stay explicit, with scope confirmed before a manager write. A client's failed read shows as unknown — never as a smaller, healthier fleet.

"Which of ours needs someone today?"

Anyone who has to evidence it

Every change to authentication rules this quarter, please.

Who, what, when, why, and whether it worked — a tamper-evident record instead of a folder of tickets and shell history.

Where the edges are

Wazuh 4.x over the standard manager API for read-only visibility; deployments use the ruleset hot-reload introduced in Wazuh 4.13, so the deployment path supports 4.13 and later. Not built yet, and not pretended: stored test results, promote-to-N-environments, notifications. Not a SIEM: SOCsimple doesn't store your alerts, own retention or run response — Wazuh does detection; SOCsimple manages the content it runs.

Straight answers

The questions a security team actually asks.

Does SOCsimple need write access to my Wazuh manager?

Not for its core job. Sync — reading rules, decoders, CDB lists and files — is read-only, and deployments are off for every environment until an admin enables them, an audited switch. When on, writes happen only through the deploy channel: operator role, a written reason, the full test-and-rollback pipeline. You provision the API credentials, so the access level is in your hands.

Can we still sign in and manage Wazuh directly?

Yes — and that’s a designed-for mode, not a workaround. SOCsimple doesn’t replace the Wazuh dashboard, fence off SSH, or move your content into a proprietary store: your rules, decoders and lists stay in Wazuh’s own files, on your manager. Change something directly and the next sync surfaces it calmly as Drifted, with the diff — adopt it as the new intent, or restore your version through the gate. And if you ever stop using SOCsimple, your manager is exactly as the last deploy left it.

Can a bad deploy take down my manager?

This is the scenario the write path is built around. On a sample-proven deploy, a change that fails its staged log test never triggers a reload — the running ruleset is untouched. If a later step fails, SOCsimple restores its pre-write snapshot of the target file and records exactly what happened. The gated deployment path is lab-verified against live Wazuh managers, and one lock per environment means two deploys can’t race the same manager.

Which Wazuh versions are supported?

SOCsimple works with Wazuh 4.x over the standard manager API, with nothing installed on the manager host. Deployments use the ruleset hot-reload capability introduced in Wazuh 4.13, so the deployment path supports Wazuh 4.13 and later — lab-verified against live managers, and every manager’s version and capabilities are checked at connect time before deploys are allowed. Support for future major versions will be listed when it is ready and verified.

How is client data isolated in an MSSP setup?

Each client is its own organization — the hard isolation boundary — and access is granted per environment, on a role ladder. Tenant-scoped data paths are constrained to the organization boundary and covered by cross-tenant isolation tests. The scope path is on screen at all times, and every deploy confirms it before writing.

Is my detection content pooled, shared, or used to train anything?

No. Your detection content is not pooled into a shared SOCsimple catalog or used for model training. Content is shared across your own environments only when you deliberately promote or upload it to your organization’s Library and deploy it from there.

SOCsimple/

Connect a manager.
See what it finds.
Change it on purpose.

Read-only from the first sync. Your existing content becomes the baseline automatically. Turn on deploys when you're ready — not before.

Private beta. Access is by invitation, and Request access is how you ask for one — every request is reviewed by hand.

Environment readinessReady
ManagerVerified · Wazuh 4.14.0
ReachableConnected · checked 4m ago
ContentSynced 6 min ago · 273 rules managed
DeploymentsOff · admin switch, audited
Needs review3 · Issues
Everything up to deploy works while deployments are off — authoring, drafts, validation, testing.