Key Takeaways
- Expect noise on day one: a new Wazuh deployment commonly runs 30 to 50 percent false positives until rules meet the realities of your environment. The goal is under 20 percent within 90 days.
- Never edit stock rules: all tuning belongs in
/var/ossec/etc/rules/local_rules.xmland decoders inlocal_decoder.xmlso upgrades do not overwrite your work. - Three core levers: adjust the alert level, add field-based exclusions with
<field>and negation, and build allowlists for known-good IPs, users and hosts via CDB lists. - Baseline before you suppress: profile two to four weeks of normal activity so you tune against evidence, not guesswork. Suppressing blind hides real attacks.
- Track every change: version control local rules, record the reason for each suppression, and review tuning quarterly so the ruleset does not silently rot.
Why a New Wazuh Deployment Is Noisy
Wazuh ships with more than 5000 default rules covering Windows event logs, Linux syslog, web servers, databases, firewalls and cloud services. Those rules are written to fire across the widest possible range of environments, which means they are deliberately broad. When they meet your specific estate for the first time, perfectly normal behaviour trips alerts that were never tuned for your patch schedules, your service accounts, your vulnerability scanners or your backup windows.
The classic culprits are authentication rules firing on expected service-account churn, web rules flagging your own monitoring probes, FIM alerts on directories that legitimately change every deploy, and integrity rules tripping on automated patch runs. None of these are attacks. They are the cost of a generic ruleset meeting a specific reality.
Left untuned, this noise produces alert fatigue. Analysts start ignoring a category of alert, and the one genuine intrusion buried in that category gets ignored with it. Tuning is therefore not cosmetic housekeeping. It is the single highest-leverage activity for making a SOC detection programme actually work.
The Golden Rule: Tune in local_rules.xml, Never the Stock Files
Wazuh stores its shipped ruleset under /var/ossec/ruleset/rules/. You must never edit those files. Every Wazuh upgrade overwrites them, so any change you make there is silently lost on the next update, and your carefully tuned environment regresses to noisy defaults.
All custom tuning belongs in /var/ossec/etc/rules/local_rules.xml and, where you need to reshape parsing, in /var/ossec/etc/decoders/local_decoder.xml. These files are preserved across upgrades. The Wazuh analysis engine loads local rules after the stock ruleset, so your local rules can override, extend or suppress the defaults.
To override an existing rule you reference it with <rule id="5710" level="0" overwrite="yes">, keeping the same id and supplying your changes. To layer a more specific rule on top, you write a child rule with <if_sid> pointing at the parent. Either way the change is isolated, reversible and upgrade-safe.
Need a Managed SOC Running Wazuh?
Codesecure operates Managed SOC for SMBs and enterprises across India, Singapore, UAE and Malaysia using Wazuh, TheHive, n8n, Cortex and MISP. 24x7 named analysts, fixed monthly retainer, no licensing fees. ISO/IEC 27001:2022 certified delivery.
See SOC for SMBs →Lever One: Rule Level Adjustment
Wazuh alert levels run from 0 to 16. Level 0 means the event is logged but never alerts. Levels 1 to 6 are low severity, 7 to 11 are medium, and 12 and above are high. Your alerting threshold (the <alerts><log_alert_level> in ossec.conf) determines which levels actually generate alerts and forward to the indexer.
The cleanest way to silence an expected-but-noisy rule without deleting detection value is to override it to level 0. The event still flows into the archives for forensic search, but it stops generating an alert. This is preferable to disabling the rule entirely, because you retain the raw record if you ever need to investigate retrospectively.
Conversely, you raise the level of rules that matter more in your environment. A failed login on a public-facing jump host deserves a higher level than the same event on an isolated lab box. Level adjustment lets you encode that context so the alerts that reach analysts are already prioritised by real business risk rather than generic defaults.
Level adjustment also drives downstream routing. Because the level determines whether an event becomes an alert and how it is treated by integrations, you can wire high-level alerts to immediate escalation paths (a page, a TheHive case, a SOAR playbook) while low-level events simply accumulate for trend analysis. Tuning the level is therefore not only about volume control; it is how you map each detection to the right operational response, so that the events demanding human attention are the only ones that ever interrupt an analyst.
Lever Two: Field-Based Exclusions
Blanket-silencing a rule is crude. The precise approach is to suppress only the specific conditions that are false positives while keeping the rule live for everything else. Wazuh lets you match on decoded fields using <field name="..."> with regular expressions, and the negate attribute or a higher-priority override lets you carve out exceptions.
A concrete example: rule 5710 fires on attempted SSH logins for non-existent users. Your internal vulnerability scanner trips it constantly. Rather than killing 5710, you write a child rule with <if_sid>5710</if_sid> that matches <srcip> equal to the scanner's address and sets level 0. Genuine attacker probes from any other source still alert at full severity; only the scanner is excused.
The same pattern handles noisy web rules (exclude your uptime monitor's user-agent), noisy process rules (exclude a known automation account by <dstuser>) and noisy FIM rules (exclude a directory by path). Field-based exclusions are surgical: they remove the specific false positive without blinding you to the broader threat the rule was written to catch.
Lever Three: Allowlists and CDB Lists
When the same set of known-good values recurs across many rules (a list of scanner IPs, a set of admin jump hosts, a roster of service accounts) inline exclusions become unmanageable. Wazuh solves this with Constant Database (CDB) lists: a simple key-value file you reference from rules with <list> and match against using the lookup condition.
You maintain the allowlist in one place, for example etc/lists/known-scanners, compile it with ossec-makelists, and reference it from any rule that needs it. Adding a new approved scanner means editing one file rather than hunting through dozens of inline exclusions. This is the scalable way to manage allowlists across a growing estate.
CDB lists also drive the opposite use case: blocklists of known-bad indicators. The same mechanism that excuses good traffic can elevate or alert on bad traffic, which is how threat-intelligence-driven detection (covered when you integrate MISP) plugs into the rule engine. Allowlists and blocklists are two faces of the same CDB capability.
One operational caution: a CDB list is only as trustworthy as its change control. Because a single entry can silence detection across many rules, an allowlist is an attractive target and an easy place for a well-meaning engineer to over-broaden an exception. Keep the list files in version control alongside the rules, require review for additions, and audit them on the same quarterly cadence as the rest of your tuning. A stale or sloppily-maintained allowlist quietly erodes detection coverage in a way that is hard to notice until an incident exposes it.
Want Help Tuning or Deploying Wazuh?
Whether you need a fresh Wazuh deployment, a rule tuning sprint, or a full managed service, our SOC engineers are available for a 30-minute free scoping call. We deploy, tune, hand over or operate on your behalf.
Talk to a SOC Engineer →Baseline First, Then Operationalise Tuning
The discipline that separates a tuned SOC from a guessing one is baselining. Before you suppress anything, run Wazuh in observation mode for two to four weeks and profile what 'normal' looks like for your environment: which rules fire most, from which sources, at which times. Tuning decisions then rest on evidence rather than hunches, and you avoid the catastrophic mistake of suppressing a rule that was actually catching a slow intrusion.
Operationally, build a feedback loop. Every false positive an analyst closes should carry a tuning note. Once a week, the SOC lead reviews the highest-volume false positives and writes the corresponding local rule. This converts triage effort into permanent noise reduction rather than the same alert being dismissed a thousand times.
Finally, version-control local_rules.xml and local_decoder.xml in Git, record the reason for each change in the commit, and review the full tuning set quarterly. Environments drift: new applications appear, old exclusions become stale, and an exclusion written for a decommissioned scanner can become an attacker's blind spot. Codesecure runs this exact cadence as part of every managed SOC engagement so the ruleset stays both quiet and trustworthy.
Frequently Asked Questions
How long does it take to tune Wazuh to an acceptable false positive rate?
Expect 30 to 50 percent false positives in the first weeks. With a disciplined weekly tuning loop, most environments drop under 20 percent within 90 days and continue improving. The pace depends on estate size and how varied your applications and log sources are. Tuning never fully ends because environments keep changing.
Should I disable a noisy rule or set it to level 0?
Almost always set it to level 0 rather than disabling it. A level-0 rule stops generating alerts but still archives the event, so the record exists for later forensic search. A disabled rule produces no record at all, which can leave a gap in an incident timeline. Reserve full disabling for rules that are genuinely irrelevant to your platform.
Where exactly do I put custom tuning so upgrades do not wipe it?
All custom rules go in /var/ossec/etc/rules/local_rules.xml and custom decoders in /var/ossec/etc/decoders/local_decoder.xml. These files are preserved across Wazuh upgrades. Never edit the shipped files under /var/ossec/ruleset/, because every upgrade overwrites them and you lose your tuning.
What is a CDB list and when should I use one?
A Constant Database (CDB) list is a key-value file Wazuh can look up from rules. Use one whenever the same set of known-good or known-bad values (scanner IPs, service accounts, admin hosts, threat indicators) recurs across many rules. Maintaining one list is far more manageable than scattering inline exclusions across dozens of rules.
Is it dangerous to suppress alerts? Could I hide a real attack?
Yes, which is why you baseline before suppressing and use surgical field-based exclusions rather than blanket disabling. Suppress only the specific known-good condition (a particular source IP or service account) and keep the rule live for everything else. Review exclusions quarterly so a stale allowlist does not become an attacker's blind spot.
Can Codesecure tune our existing Wazuh deployment?
Yes. Codesecure runs Wazuh tuning as a standalone sprint or as part of a managed SOC engagement. We baseline your environment, build upgrade-safe local rules, set up CDB allowlists, and establish a weekly tuning loop with version-controlled rules. ISO/IEC 27001:2022 certified delivery with named OSCP, CEH and CISSP consultants.
Make Your Wazuh Alerts Trustworthy Again
Codesecure tunes Wazuh deployments and runs managed SOC for businesses across India, Singapore, UAE and Malaysia. Upgrade-safe local rules, CDB allowlists, weekly tuning loops and 24x7 analyst coverage. ISO/IEC 27001:2022 certified delivery, no expensive licensing.

