Wazuh EDR SIEM deployment - KernelOpsConsulting/kopsc-infra GitHub Wiki
This guide installs the Wazuh **server + indexer + dashboard** on Kali 2025 using the official installer, then applies a known‑good `ossec.conf` (the one we validated).
- Hostname: `test-wazuh-server`
sudo apt update sudo apt install -y curl gnupg apt-transport-https lsb-release unzip auditd sudo systemctl enable --now auditd
Kali isn’t a listed supported OS; use the ignore flag.
cd ~ curl -sO https://packages.wazuh.com/4.7/wazuh-install.sh chmod +x wazuh-install.sh sudo bash wazuh-install.sh --all-in-one --ignore-check
Notes:
- The installer prints the **dashboard URL**, **user** (`admin`), and a **generated password** at the end.
'''System Info''' * Target Host: `test-wazuh-server` * OS: Kali Linux 2025 * Wazuh Version Installed: 4.7.5 * Web UI URL: [https://test-wazuh-server:443] * Default User: `admin` * Default Password: `IX?JU1unf+4pzMdjMAt*M53+.Z*9gqJV`
Back up, replace with the validated config, validate XML, restart.
sudo cp /var/ossec/etc/ossec.conf /var/ossec/etc/ossec.conf.bak.08032025 sudo vi /var/ossec/etc/ossec.conf
Paste the complete, working config below (replace the file contents):
<ossec_config> <global> <jsonout_output>yes</jsonout_output> <alerts_log>yes</alerts_log> <logall>no</logall> <logall_json>no</logall_json> <email_notification>no</email_notification> <smtp_server>smtp.example.wazuh.com</smtp_server> <email_from>[email protected]</email_from> <email_to>[email protected]</email_to> <email_maxperhour>12</email_maxperhour> <email_log_source>alerts.log</email_log_source> <agents_disconnection_time>10m</agents_disconnection_time> <agents_disconnection_alert_time>0</agents_disconnection_alert_time> </global> <alerts> <log_alert_level>3</log_alert_level> <email_alert_level>12</email_alert_level> </alerts> <logging> <log_format>plain</log_format> </logging> <remote> <connection>secure</connection> <port>1514</port> <protocol>tcp</protocol> <queue_size>131072</queue_size> </remote> <rootcheck> <disabled>no</disabled> <check_files>yes</check_files> <check_trojans>yes</check_trojans> <check_dev>yes</check_dev> <check_sys>yes</check_sys> <check_pids>yes</check_pids> <check_ports>yes</check_ports> <check_if>yes</check_if> <frequency>43200</frequency> <rootkit_files>etc/rootcheck/rootkit_files.txt</rootkit_files> <rootkit_trojans>etc/rootcheck/rootkit_trojans.txt</rootkit_trojans> <skip_nfs>yes</skip_nfs> </rootcheck> <wodle name="cis-cat"> <disabled>yes</disabled> <timeout>1800</timeout> <interval>1d</interval> <scan-on-start>yes</scan-on-start> <java_path>wodles/java</java_path> <ciscat_path>wodles/ciscat</ciscat_path> </wodle> <wodle name="osquery"> <disabled>yes</disabled> <run_daemon>yes</run_daemon> <log_path>/var/log/osquery/osqueryd.results.log</log_path> <config_path>/etc/osquery/osquery.conf</config_path> <add_labels>yes</add_labels> </wodle> <wodle name="syscollector"> <disabled>no</disabled> <interval>1h</interval> <scan_on_start>yes</scan_on_start> <hardware>yes</hardware> <os>yes</os> <network>yes</network> <packages>yes</packages> <ports all="no">yes</ports> <processes>yes</processes> <synchronization> <max_eps>10</max_eps> </synchronization> </wodle> <sca> <enabled>yes</enabled> <scan_on_start>yes</scan_on_start> <interval>12h</interval> <skip_nfs>yes</skip_nfs> </sca> <vulnerability-detector> <enabled>no</enabled> <interval>5m</interval> <min_full_scan_interval>6h</min_full_scan_interval> <run_on_start>yes</run_on_start> <provider name="canonical"> <enabled>no</enabled> <os>trusty</os> <os>xenial</os> <os>bionic</os> <os>focal</os> <os>jammy</os> <update_interval>1h</update_interval> </provider> <provider name="debian"> <enabled>no</enabled> <os>buster</os> <os>bullseye</os> <os>bookworm</os> <update_interval>1h</update_interval> </provider> <provider name="redhat"> <enabled>no</enabled> <os>5</os> <os>6</os> <os>7</os> <os>8</os> <os>9</os> <update_interval>1h</update_interval> </provider> <provider name="alas"> <enabled>no</enabled> <os>amazon-linux</os> <os>amazon-linux-2</os> <os>amazon-linux-2022</os> <os>amazon-linux-2023</os> <update_interval>1h</update_interval> </provider> <provider name="suse"> <enabled>no</enabled> <os>11-server</os> <os>11-desktop</os> <os>12-server</os> <os>12-desktop</os> <os>15-server</os> <os>15-desktop</os> <update_interval>1h</update_interval> </provider> <provider name="arch"> <enabled>no</enabled> <update_interval>1h</update_interval> </provider> <provider name="almalinux"> <enabled>no</enabled> <os>8</os> <os>9</os> <update_interval>1h</update_interval> </provider> <provider name="msu"> <enabled>yes</enabled> <update_interval>1h</update_interval> </provider> <provider name="nvd"> <enabled>yes</enabled> <update_interval>1h</update_interval> </provider> </vulnerability-detector> <syscheck> <disabled>no</disabled> <frequency>43200</frequency> <scan_on_start>yes</scan_on_start> <alert_new_files>yes</alert_new_files> <auto_ignore frequency="10" timeframe="3600">no</auto_ignore> <directories>/etc,/usr/bin,/usr/sbin</directories> <directories>/bin,/sbin,/boot</directories> <ignore>/etc/mtab</ignore> <ignore>/etc/hosts.deny</ignore> <ignore>/etc/mail/statistics</ignore> <ignore>/etc/random-seed</ignore> <ignore>/etc/random.seed</ignore> <ignore>/etc/adjtime</ignore> <ignore>/etc/httpd/logs</ignore> <ignore>/etc/utmpx</ignore> <ignore>/etc/wtmpx</ignore> <ignore>/etc/cups/certs</ignore> <ignore>/etc/dumpdates</ignore> <ignore>/etc/svc/volatile</ignore> <ignore type="sregex">.log$|.swp$</ignore> <nodiff>/etc/ssl/private.key</nodiff> <skip_nfs>yes</skip_nfs> <skip_dev>yes</skip_dev> <skip_proc>yes</skip_proc> <skip_sys>yes</skip_sys> <process_priority>10</process_priority> <max_eps>50</max_eps> <synchronization> <enabled>yes</enabled> <interval>5m</interval> <max_eps>10</max_eps> </synchronization> </syscheck> <global> <white_list>127.0.0.1</white_list> <white_list>^localhost.localdomain$</white_list> <white_list>10.5.5.1</white_list> </global> <command> <name>disable-account</name> <executable>disable-account</executable> <timeout_allowed>yes</timeout_allowed> </command> <command> <name>restart-wazuh</name> <executable>restart-wazuh</executable> </command> <command> <name>firewall-drop</name> <executable>firewall-drop</executable> <timeout_allowed>yes</timeout_allowed> </command> <command> <name>host-deny</name> <executable>host-deny</executable> <timeout_allowed>yes</timeout_allowed> </command> <command> <name>route-null</name> <executable>route-null</executable> <timeout_allowed>yes</timeout_allowed> </command> <command> <name>win_route-null</name> <executable>route-null.exe</executable> <timeout_allowed>yes</timeout_allowed> </command> <command> <name>netsh</name> <executable>netsh.exe</executable> <timeout_allowed>yes</timeout_allowed> </command> <localfile> <log_format>command</log_format> <command>df -P</command> <frequency>360</frequency> </localfile> <localfile> <log_format>full_command</log_format> <command>netstat -tulpn | sed 's/\([[:alnum:]]\+\)\ \+[[:digit:]]\+\ \+[[:digit:]]\+\ \+\(.*\):\([[:digit:]]*\)\ \+\([0-9\.\:\*]\+\).\+\ \([[:digit:]]*\/[[:alnum:]\-]*\).*/\1 \2 == \3 == \4 \5/' | sort -k 4 -g | sed 's/ == \(.*\) ==/:\1/' | sed 1,2d</command> <alias>netstat listening ports</alias> <frequency>360</frequency> </localfile> <localfile> <log_format>full_command</log_format> <command>last -n 20</command> <frequency>360</frequency> </localfile> <localfile> <log_format>apache</log_format> <location>/var/log/nginx/access.log</location> </localfile> <localfile> <log_format>apache</log_format> <location>/var/log/nginx/error.log</location> </localfile> <localfile> <log_format>apache</log_format> <location>/var/log/apache2/error.log</location> </localfile> <localfile> <log_format>apache</log_format> <location>/var/log/apache2/access.log</location> </localfile> <localfile> <log_format>syslog</log_format> <location>/var/ossec/logs/active-responses.log</location> </localfile> <localfile> <log_format>syslog</log_format> <location>/var/log/dpkg.log</location> </localfile> <localfile> <log_format>audit</log_format> <location>/var/log/audit/audit.log</location> </localfile> <ruleset> <decoder_dir>ruleset/decoders</decoder_dir> <rule_dir>ruleset/rules</rule_dir> <rule_exclude>0215-policy_rules.xml</rule_exclude> <list>etc/lists/audit-keys</list> <list>etc/lists/amazon/aws-eventnames</list> <list>etc/lists/security-eventchannel</list> <decoder_dir>etc/decoders</decoder_dir> <rule_dir>etc/rules</rule_dir> </ruleset> <rule_test> <enabled>yes</enabled> <threads>1</threads> <max_sessions>64</max_sessions> <session_timeout>15m</session_timeout> </rule_test> <auth> <disabled>no</disabled> <port>1515</port> <use_source_ip>no</use_source_ip> <purge>yes</purge> <use_password>no</use_password> <ciphers>HIGH:!ADH:!EXP:!MD5:!RC4:!3DES:!CAMELLIA:@STRENGTH</ciphers> <ssl_verify_host>no</ssl_verify_host> <ssl_manager_cert>etc/sslmanager.cert</ssl_manager_cert> <ssl_manager_key>etc/sslmanager.key</ssl_manager_key> <ssl_auto_negotiate>no</ssl_auto_negotiate> </auth> <cluster> <name>wazuh</name> <node_name>node01</node_name> <node_type>master</node_type> <key></key> <port>1516</port> <bind_addr>0.0.0.0</bind_addr> <nodes> <node>NODE_IP</node> </nodes> <hidden>no</hidden> <disabled>yes</disabled> </cluster> </ossec_config>
Validate and restart:
sudo apt -y install libxml2-utils >/dev/null 2>&1 || true sudo xmllint --noout /var/ossec/etc/ossec.conf sudo systemctl restart wazuh-manager sudo systemctl status wazuh-manager --no-pager
Dashboard (self‑signed TLS):
https://test-wazuh-server:443
CLI checks:
sudo tail -n 50 /var/ossec/logs/ossec.log sudo journalctl -u wazuh-manager -n 100 --no-pager curl -kv https://localhost
- No extra per‑file `<include></include>` rules are required. The default ruleset directories already load the built‑ins.
- Keep **one** root XML element: a single
\<ossec\_config> ... \</ossec\_config>
block.
- **Manager fails to start:** validate XML.
sudo xmllint --noout /var/ossec/etc/ossec.conf
- **500 error in dashboard during startup:** give the services 1–2 minutes after a config change.
- **Forgotten admin password:** search the install log.
grep -i password /var/log/wazuh-install.log
- Add OpenVAS integration (local) and nightly report ingestion.
- Add CIS/STIG content via CIS‑CAT (kept disabled above; enable explicitly when content is in place).