CR-2026-02-26: Wazuh SIEM Network Integration
Change Summary
CR ID |
CR-2026-02-26-001 |
Date |
2026-02-26 |
Priority |
P1 |
Type |
SIEM Integration |
Status |
In Progress |
Objective
Integrate all network infrastructure with Wazuh SIEM for centralized security monitoring, compliance logging, and incident response.
Scope
Network Infrastructure (Syslog)
| Device | Type | IP | Status |
|---|---|---|---|
pfSense-01 |
Firewall |
10.50.1.1 |
SENDING |
ISE-01 |
NAC |
10.50.1.20 |
PENDING |
9800-WLC |
Wireless |
10.50.1.40 |
PENDING |
C9300-01 |
Core Switch |
10.50.1.11 |
PENDING |
3560CX-01 |
Access Switch |
10.50.1.10 |
PENDING |
bind-01 |
DNS |
10.50.1.90 |
PENDING |
Servers (Wazuh Agent)
-
vault-01, kvm-01, ipa-01, keycloak-01, k3s-master-01, home-dc01, nas-01
Workstations (Wazuh Agent)
-
modestus-razer, modestus-aw, modestus-p50
Key Blocker Identified
|
Archives not indexing in OpenSearch Data reaches |
CLI Mastery: Wazuh Diagnostics
Full Diagnostic One-Liner
dsource d000 dev/observability && \
echo "=== CLUSTER ===" && netapi wazuh health | jq -r '.status' && \
echo "=== ARCHIVES ===" && netapi wazuh indices --raw 2>/dev/null | \
jq -r '.[] | select(.index | contains("archives")) | "\(.index): \(.docs.count) docs"' && \
echo "=== PROCESSES ===" && ssh k3s-master-01 "kubectl exec -n wazuh wazuh-manager-master-0 -- pgrep -a filebeat" 2>/dev/null | head -1 && \
echo "=== ARCHIVE LOG ===" && ssh k3s-master-01 "kubectl exec -n wazuh wazuh-manager-master-0 -- wc -l /var/ossec/logs/archives/archives.log 2>/dev/null"
Process Check with awk
ssh k3s-master-01 "kubectl exec -n wazuh wazuh-manager-master-0 -- ps aux" | \
awk '/filebeat|logcollector|analysisd/ {printf "%-20s PID:%-6s CPU:%-5s MEM:%-5s\n", $11, $2, $3, $4}'
Filebeat Error Extraction
ssh k3s-master-01 "kubectl exec -n wazuh wazuh-manager-master-0 -- cat /var/log/filebeat/filebeat* 2>/dev/null" | \
grep -iE 'error|failed|refused|timeout' | tail -20 | \
awk '{gsub(/T/, " "); print}' | cut -c1-120
ossec.conf Archives Settings
ssh k3s-master-01 "kubectl exec -n wazuh wazuh-manager-master-0 -- cat /var/ossec/etc/ossec.conf" | \
awk '/<global>/,/<\/global>/' | grep -E 'logall|jsonout|archives'
# Expected (for archives to work):
# <logall>yes</logall>
# <logall_json>yes</logall_json>
CLI Mastery: Syslog Configuration
pfSense Syslog
# Enable
netapi pfsense syslog enable --server 10.50.1.134 --categories filter,system
# Verify
netapi pfsense syslog show
IOS-XE Syslog (WLC, C9300)
netapi wlc config \
"logging host 10.50.1.134" \
"logging trap informational" \
"logging source-interface Loopback0" \
"logging origin-id hostname" \
--save
ISE Syslog Target
netapi ise api-call ers POST '/config/externalSyslogTarget' --data '{
"ExternalSyslogTarget": {
"name": "Wazuh-SIEM",
"description": "Wazuh SIEM syslog collector",
"host": "10.50.1.134",
"port": 514,
"protocol": "UDP"
}
}'
CLI Mastery: jq + awk Patterns
Pattern 1: API → jq → awk Table
<api_call> | jq -r '.items[] | "\(.field1)\t\(.field2)"' | \
awk -F'\t' 'BEGIN {printf "%-20s %s\n", "COL1", "COL2"} {printf "%-20s %s\n", $1, $2}'
Pattern 2: awk Histogram
<data> | awk '{bar=""; for(i=0;i<$1/10;i++) bar=bar"█"; printf "%6d %s %s\n", $1, bar, $2}'
Pattern 3: xargs Chain (No Temp Vars)
<get_id> | jq -r '.id' | xargs -I{} <use_id_{}>
Pattern 4: Conditional jq Output
<command> | jq -r 'if .status == "success" then "✓ \(.message)" else "✗ \(.error)" end'
Key Lessons
| Issue | Solution |
|---|---|
pfSense REST API lacks syslog |
Use SSH-based PHP execution via netapi |
Archives not indexing |
Check |
VyOS lacks Cisco DHCP Option 43 |
Use DNS CAPWAP discovery for WLC |
jq + awk combination |
jq for JSON parsing, awk for tabular formatting |