Quellcode durchsuchen

disk space reduction, rule fixes, and dashboard query alignment

- wazuh_manager.conf: disable logall_json (was 14 GB of archives.json growth);
  add log rotation block (daily, 7-day retention, compressed)
- OpenSearch ISM policy applied externally (wazuh-alerts-* / wazuh-archives-*,
  delete after 30d)
- soc-a2/a3/a4, soc-c1-c3 rules: fix if_sid chaining (if_group=fortigate broken
  in Wazuh 4.x), add production profile rules (110xxx range), align with real
  archive field names (srccountry, dstport, logonType, etc.)
- local_decoder.xml: decoder updates to support new field extractions
- appendix-c dashboard: fix query rule.id:1005* → rule.groups: appendix_c
  (old query matched simulation IDs only, returned nothing for prod rules)
- appendix-ab dashboard: narrow query soc_prod* → appendix_a OR appendix_b
  (excludes C1/C2/C3 rules from A+B panels)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Tum vor 10 Stunden
Ursprung
Commit
395c5c7e78

Datei-Diff unterdrückt, da er zu groß ist
+ 5 - 5
scripts/events/wazuh-proposal-appendix-ab-dashboard.ndjson


Datei-Diff unterdrückt, da er zu groß ist
+ 2 - 2
scripts/events/wazuh-proposal-appendix-c-dashboard.ndjson


+ 28 - 0
wazuh-docker/single-node/config/wazuh_cluster/local_decoder.xml

@@ -2,8 +2,36 @@
2 2
   SOC custom decoders (production-focused baseline)
3 3
   - Decodes real correlation payloads produced by SOC Integrator
4 4
   - Decodes real DNS IOC payloads
5
+  - Decodes modern ESXi 7/8 syslog format (groups: vmware)
5 6
 -->
6 7
 
8
+<!--
9
+  Modern VMware ESXi / vCenter syslog decoder
10
+  Matches ESXi 7.x and 8.x syslog output (built-in vmware decoder only handles old ESX 4.x format).
11
+
12
+  How if_group=vmware works: rule 19100 (decoded_as vmware) fires first and places the event in
13
+  the vmware group. Our B1 rules then match via if_group=vmware.
14
+  To hook into this chain, our decoder must also be NAMED "vmware" (Wazuh allows multiple
15
+  decoders with the same name — they are evaluated in order).
16
+
17
+  ESXi 7.x format:  <ISO-TS> <HOSTNAME> <PROCESS>: <SEV> <proc[pid]> [<meta>] <msg>
18
+  ESXi 8.x format:  <ISO-TS> <HOSTNAME> <process[pid]>: [<sev>] <msg>
19
+
20
+  Known process names seen from FPVM70-H1/H2 (ESXi 7) and ESXi 8.0:
21
+    Hostd, Vpxa, Rhttpproxy, vmkernel, vmkwarning, healthd, healthdPlugins,
22
+    hostd-probe, net-cdp, vdtc, envoy-access, fdm, kmxa, sandboxd, crond
23
+-->
24
+<decoder name="vmware">
25
+  <program_name type="pcre2">(?i)^(Hostd|Vpxa|Rhttpproxy|vmkernel|vmkwarning|vmkdump|healthd|healthdPlugins|hostd-probe|net-cdp|vdtc|envoy-access|fdm|kmxa|sandboxd|vpxd|dcui|crond|ImageConfigManager|sysboot|sfcb|vsanmgmtd)$</program_name>
26
+</decoder>
27
+
28
+<decoder name="vmware-esxi-severity">
29
+  <parent>vmware</parent>
30
+  <prematch type="pcre2">^(?:verbose|info|warning|error|critical|debug) </prematch>
31
+  <regex type="pcre2">^(verbose|info|warning|error|critical|debug)</regex>
32
+  <order>status</order>
33
+</decoder>
34
+
7 35
 <decoder name="soc-prod-dns">
8 36
   <prematch>soc_event=dns_ioc</prematch>
9 37
   <regex type="pcre2">event_type=(\S+)(?:.*?src_ip=([\d.]+))?</regex>

+ 67 - 41
wazuh-docker/single-node/config/wazuh_cluster/rules/soc-a2-fortigate-fw-rules.xml

@@ -1,110 +1,136 @@
1 1
 <!--
2 2
   SOC Proposal Rules — Appendix A2: FortiGate IPS/IDS & Firewall
3
-  Simulation profile rule IDs : 100311-100320
4 3
   Production profile rule IDs : 110311-110320
5 4
 
6 5
   Severity mapping:
7 6
     High   → level 12
8 7
     Medium → level 8
9 8
     Low    → level 5
9
+
10
+  Parent SID reference (built-in Wazuh FortiGate rules):
11
+    81603 — Fortigate messages grouped (universal FortiGate base)
12
+    81606 — Fortigate: Login failed  (action=login status=failed)
13
+    81608 — Fortigate: Configuration changed (Configuration is changed in the admin session)
14
+    81612 — Fortigate: Firewall configuration changes (action=Edit, type=event)
15
+    81618 — Fortigate: Traffic to be aware of (type=traffic)
16
+    81622 — Fortigate: VPN user connected (action=tunnel-up)
17
+    81628 — Fortigate attack detected
18
+    81629 — Fortigate attack dropped
19
+
20
+  Fix history:
21
+    2026-03-19: Changed all if_group=fortigate → if_sid=81603/81618/81628/81629
22
+                if_group=fortigate does not chain rules correctly in Wazuh 4.x;
23
+                correct approach is if_sid pointing to a built-in parent rule.
24
+    2026-03-20: Changed 110311/110320 from if_sid=81618 → if_sid=81603 with explicit
25
+                type=traffic match. Wazuh 4.x does not evaluate grandchild if_sid chains
26
+                (81603 → 81618 → 110311 fails); sibling pattern (81603 → 110311) works.
10 27
 -->
11 28
 <group name="soc_mvp,appendix_a,a2,fortigate,">
12 29
 
13
-  <!-- ── Simulation profile ── -->
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-  <!-- ── Production profile (if_group=fortigate, no soc_mvp_test required) ── -->
26
-
30
+  <!-- A2-01: RDP traffic allowed through firewall
31
+       Parent: 81603 (FortiGate base — NOT 81618 to avoid 3-level chain depth limit)
32
+       81618 uses if_sid=81603; chaining from 81618 creates a 3-level chain that
33
+       Wazuh 4.x does not evaluate. Use sibling pattern: if_sid=81603 + type=traffic.
34
+       Real data: dstport=3389, action="accept" confirmed in archives -->
27 35
   <rule id="110311" level="12">
28
-    <if_group>fortigate</if_group>
36
+    <if_sid>81603</if_sid>
37
+    <match>type="traffic"|type=traffic</match>
29 38
     <match>dstport=3389</match>
30
-    <match>action="accept"</match>
39
+    <match>action="accept"|action=accept</match>
31 40
     <description>A2-01 [PROD] FortiGate: RDP (3389) traffic allowed</description>
32 41
     <group>soc_prod,a2,rdp,</group>
33 42
     <mitre><id>T1021.001</id></mitre>
34 43
   </rule>
35 44
 
45
+  <!-- A2-02: Admin password changed
46
+       Parent: 81603 (generic base — admin events vary by FW model/version)
47
+       FortiGate logs action="password-change" under type=event subtype=system -->
36 48
   <rule id="110312" level="12">
37
-    <if_group>fortigate</if_group>
38
-    <match>action="password-change"</match>
49
+    <if_sid>81603</if_sid>
50
+    <match>action="password-change"|action=password-change</match>
39 51
     <description>A2-02 [PROD] FortiGate: admin account password changed</description>
40 52
     <group>soc_prod,a2,admin_change,</group>
41 53
     <mitre><id>T1098</id></mitre>
42 54
   </rule>
43 55
 
56
+  <!-- A2-03: New admin account created
57
+       Parent: 81603 (generic base) -->
44 58
   <rule id="110313" level="12">
45
-    <if_group>fortigate</if_group>
46
-    <match>action="create-admin"</match>
59
+    <if_sid>81603</if_sid>
60
+    <match>action="create-admin"|action=create-admin</match>
47 61
     <description>A2-03 [PROD] FortiGate: new admin account created</description>
48 62
     <group>soc_prod,a2,admin_change,</group>
49 63
     <mitre><id>T1136</id></mitre>
50 64
   </rule>
51 65
 
66
+  <!-- A2-04: Alerting/notification disabled via config change
67
+       Parent: 81608 (Configuration changed) or 81612 (Firewall config changes) -->
52 68
   <rule id="110314" level="12">
53
-    <if_group>fortigate</if_group>
54
-    <match>action="config-change"</match>
55
-    <match>config_value=disable</match>
69
+    <if_sid>81608, 81612</if_sid>
70
+    <match>config_value=disable|"disable"</match>
56 71
     <description>A2-04 [PROD] FortiGate: alerting/notification disabled via config change</description>
57 72
     <group>soc_prod,a2,defense_evasion,</group>
58 73
     <mitre><id>T1562</id></mitre>
59 74
   </rule>
60 75
 
76
+  <!-- A2-05: Firewall configuration file downloaded
77
+       Parent: 81603 (generic base) -->
61 78
   <rule id="110315" level="5">
62
-    <if_group>fortigate</if_group>
63
-    <match>action="download-config"</match>
79
+    <if_sid>81603</if_sid>
80
+    <match>action="download-config"|action=download-config</match>
64 81
     <description>A2-05 [PROD] FortiGate: firewall configuration file downloaded</description>
65 82
     <group>soc_prod,a2,config,</group>
66 83
     <mitre><id>T1005</id></mitre>
67 84
   </rule>
68 85
 
86
+  <!-- A2-06: Multiple critical/high IPS signatures triggered
87
+       Parent: 81628 (attack detected) or 81629 (attack dropped)
88
+       Note: requires FortiGate IPS UTM logs to be forwarded -->
69 89
   <rule id="110316" level="8">
70
-    <if_group>fortigate</if_group>
71
-    <match>subtype="ips"</match>
72
-    <match>attack="Multiple.Critical</match>
73
-    <description>A2-06 [PROD] FortiGate IPS: multiple critical signatures triggered</description>
90
+    <if_sid>81628, 81629</if_sid>
91
+    <match>severity="critical"|severity="high"|severity=critical|severity=high</match>
92
+    <description>A2-06 [PROD] FortiGate IPS: critical/high attack signature triggered</description>
74 93
     <group>soc_prod,a2,ips,</group>
75 94
     <mitre><id>T1595</id></mitre>
76 95
   </rule>
77 96
 
97
+  <!-- A2-07: TCP port scan from external IP
98
+       Parent: 81628 or 81629 (IPS/anomaly attack events)
99
+       Note: requires FortiGate anomaly detection to be enabled -->
78 100
   <rule id="110317" level="5">
79
-    <if_group>fortigate</if_group>
80
-    <match>subtype="anomaly"</match>
81
-    <match>attack="TCP.Port.Scan"</match>
101
+    <if_sid>81628, 81629</if_sid>
102
+    <match>attack="TCP.Port.Scan"|TCP.Port.Scan</match>
82 103
     <description>A2-07 [PROD] FortiGate: TCP port scan from external IP</description>
83 104
     <group>soc_prod,a2,recon,</group>
84 105
     <mitre><id>T1046</id></mitre>
85 106
   </rule>
86 107
 
108
+  <!-- A2-08: IOC-based IP detection via IPS
109
+       Parent: 81628 or 81629 -->
87 110
   <rule id="110318" level="8">
88
-    <if_group>fortigate</if_group>
89
-    <match>subtype="ips"</match>
90
-    <match>ioc_type=ip</match>
111
+    <if_sid>81628, 81629</if_sid>
112
+    <match>ioc_type=ip|ioc_type="ip"</match>
91 113
     <description>A2-08 [PROD] FortiGate IPS: IOC-based IP indicator detected</description>
92 114
     <group>soc_prod,a2,ioc,</group>
93 115
     <mitre><id>T1071.001</id></mitre>
94 116
   </rule>
95 117
 
118
+  <!-- A2-09: Internal port scan from private source IP
119
+       Parent: 81628 or 81629 -->
96 120
   <rule id="110319" level="8">
97
-    <if_group>fortigate</if_group>
98
-    <match>subtype="anomaly"</match>
99
-    <match>attack="Internal.Port.Scan"</match>
121
+    <if_sid>81628, 81629</if_sid>
122
+    <match>attack="Internal.Port.Scan"|Internal.Port.Scan</match>
100 123
     <description>A2-09 [PROD] FortiGate: internal port scan from private source IP</description>
101 124
     <group>soc_prod,a2,recon,</group>
102 125
     <mitre><id>T1046</id></mitre>
103 126
   </rule>
104 127
 
128
+  <!-- A2-10: Traffic to known C2/malicious IP
129
+       Parent: 81603 (FortiGate base — sibling pattern, same fix as 110311) -->
105 130
   <rule id="110320" level="8">
106
-    <if_group>fortigate</if_group>
107
-    <match>threat_label="known-c2"</match>
131
+    <if_sid>81603</if_sid>
132
+    <match>type="traffic"|type=traffic</match>
133
+    <match>threat_label="known-c2"|threat_label=known-c2</match>
108 134
     <description>A2-10 [PROD] FortiGate: traffic to known C2/malicious IP allowed</description>
109 135
     <group>soc_prod,a2,ioc,c2,</group>
110 136
     <mitre><id>T1071.001</id></mitre>

+ 47 - 27
wazuh-docker/single-node/config/wazuh_cluster/rules/soc-a3-fortigate-vpn-rules.xml

@@ -1,64 +1,84 @@
1 1
 <!--
2 2
   SOC Proposal Rules — Appendix A3: FortiGate VPN
3
-  Simulation profile rule IDs : 100331-100335
4 3
   Production profile rule IDs : 110331-110335
5 4
 
6 5
   Severity mapping:
7 6
     High → level 12
8 7
     Low  → level 5
9
--->
10
-<group name="soc_mvp,appendix_a,a3,vpn,fortigate,">
11
-
12
-  <!-- ── Simulation profile ── -->
13
-
14 8
 
9
+  Environment: FoodProject uses IPsec site-to-site VPN (IKEv1/IKEv2) and L2TP.
10
+  No SSL-VPN (FortiClient) traffic observed in archives as of 2026-03-20.
15 11
 
12
+  IPsec VPN parent SIDs (built-in Wazuh):
13
+    81622 — Fortigate: VPN user connected (action=tunnel-up, level=information)
14
+    81624 — Fortigate: VPN user disconnected
15
+    81636 — Fortigate: VPN related information (type=event subtype=vpn level=notice)
16
+    81637 — Fortigate: VPN related error   (type=event subtype=vpn level=error)
17
+    81614 — Fortigate: SSL VPN user failed login (ssl-login-fail) — kept for SSL-VPN if enabled
16 18
 
19
+  SSL-VPN rules (110331-110334) are retained but require SSL-VPN to be enabled on FortiGate.
20
+  IPsec/L2TP rules (110335) adapted to match actual tunnel-up events with srccountry != Thailand.
21
+  Field: srccountry (decoded as root-level field, NOT data.srccountry)
17 22
 
23
+  Fix history:
24
+    2026-03-19: Changed if_group=fortigate → if_sid; adapted A3-05 for IPsec tunnel-up
25
+-->
26
+<group name="soc_mvp,appendix_a,a3,vpn,fortigate,">
18 27
 
19
-  <!-- ── Production profile (if_group=fortigate) ── -->
20
-
28
+  <!-- A3-01: VPN authentication success by guest account (SSL-VPN)
29
+       Requires SSL-VPN to be enabled on FortiGate.
30
+       Parent: 81603 (generic base — ssl-login-success is in the raw log) -->
21 31
   <rule id="110331" level="12">
22
-    <if_group>fortigate</if_group>
23
-    <match>action="ssl-login-success"</match>
24
-    <match>user="guest"</match>
25
-    <description>A3-01 [PROD] VPN authentication success by guest account</description>
32
+    <if_sid>81603</if_sid>
33
+    <match>ssl-login-success</match>
34
+    <match>user="guest"|user=guest</match>
35
+    <description>A3-01 [PROD] SSL-VPN: authentication success by guest account</description>
26 36
     <group>soc_prod,a3,vpn_guest,</group>
27 37
     <mitre><id>T1078.001</id></mitre>
28 38
   </rule>
29 39
 
40
+  <!-- A3-02: SSL-VPN success from different country than last login
41
+       Requires SSL-VPN and FortiGate geo-login tracking -->
30 42
   <rule id="110332" level="12">
31
-    <if_group>fortigate</if_group>
32
-    <match>action="ssl-login-success"</match>
43
+    <if_sid>81603</if_sid>
44
+    <match>ssl-login-success</match>
33 45
     <match>previous_country=</match>
34
-    <description>A3-02 [PROD] VPN success from different country than last login</description>
46
+    <description>A3-02 [PROD] SSL-VPN: success from different country than last login</description>
35 47
     <group>soc_prod,a3,vpn_geo,</group>
36 48
     <mitre><id>T1078</id></mitre>
37 49
   </rule>
38 50
 
51
+  <!-- A3-03: SSL-VPN success after prior failures (brute-force indicator)
52
+       Requires SSL-VPN -->
39 53
   <rule id="110333" level="12">
40
-    <if_group>fortigate</if_group>
41
-    <match>action="ssl-login-success"</match>
54
+    <if_sid>81603</if_sid>
55
+    <match>ssl-login-success</match>
42 56
     <match>failed_attempts_before_success=</match>
43
-    <description>A3-03 [PROD] VPN success after multiple prior failures (brute-force indicator)</description>
57
+    <description>A3-03 [PROD] SSL-VPN: success after multiple prior failures (brute-force indicator)</description>
44 58
     <group>soc_prod,a3,vpn_bruteforce,</group>
45 59
     <mitre><id>T1110.001</id></mitre>
46 60
   </rule>
47 61
 
62
+  <!-- A3-04: SSL-VPN multiple account failures from single source IP
63
+       Parent: 81614 (Fortigate: SSL VPN user failed login attempt)
64
+       Requires SSL-VPN -->
48 65
   <rule id="110334" level="5">
49
-    <if_group>fortigate</if_group>
50
-    <match>action="ssl-login-fail"</match>
51
-    <match>failed_accounts=</match>
52
-    <description>A3-04 [PROD] VPN multiple account failures from single source IP</description>
66
+    <if_sid>81614</if_sid>
67
+    <description>A3-04 [PROD] SSL-VPN: authentication failure (multiple accounts from 1 source)</description>
53 68
     <group>soc_prod,a3,vpn_bruteforce,</group>
54 69
     <mitre><id>T1110.003</id></mitre>
55 70
   </rule>
56 71
 
57
-  <rule id="110335" level="12">
58
-    <if_group>fortigate</if_group>
59
-    <match>action="ssl-login-success"</match>
60
-    <match>expected_country=TH</match>
61
-    <description>A3-05 [PROD] VPN authentication success from outside Thailand</description>
72
+  <!-- A3-05: VPN tunnel connected from outside Thailand (IPsec + SSL-VPN)
73
+       Parent: 81622 (VPN user connected / action=tunnel-up level=information)
74
+       Real data confirmed: srccountry field present in VPN events
75
+       Fires when IPsec tunnel-up occurs from srccountry != Thailand (Reserved = private/RFC1918)
76
+       Level 13 (> C1 rule 110501 level 12) so this more-specific rule takes priority
77
+       when both conditions are met. Both rules share if_sid=81622. -->
78
+  <rule id="110335" level="13">
79
+    <if_sid>81622</if_sid>
80
+    <field name="srccountry" negate="yes" type="pcre2">^Thailand$|^Reserved$</field>
81
+    <description>A3-05 [PROD] VPN: tunnel connected from outside Thailand</description>
62 82
     <group>soc_prod,a3,vpn_geo,</group>
63 83
     <mitre><id>T1078</id></mitre>
64 84
   </rule>

+ 44 - 2
wazuh-docker/single-node/config/wazuh_cluster/rules/soc-a4-windows-ad-rules.xml

@@ -10,7 +10,13 @@
10 10
     60109       → events 4720/4722 (account create/enable)
11 11
     60113       → events 4728/4732 (group membership change)
12 12
     67027       → event 4688 (new process created)
13
-    60103       → event 4794 (DSRM password set)
13
+    60103       → event 4794 (DSRM password set) — must add eventID=4794 constraint!
14
+    67017       → event 5140 (network share access, non-IPC$)
15
+    60103       → event 4771 (Kerberos pre-auth failure) — constrained with eventID field
16
+
17
+  Real event volumes observed (2026-03-20):
18
+    4624: 209K | 4625: 1.5K | 4688: 138K | 5140: 26K | 4776: 25K
19
+    4771: 281  | 4648: 6K   | 4740: 7
14 20
 -->
15 21
 <group name="soc_mvp,appendix_a,a4,windows,">
16 22
 
@@ -163,7 +169,43 @@
163 169
     <mitre><id>T1078</id></mitre>
164 170
   </rule>
165 171
 
166
-  <!-- ── Production normalized key=value path (soc-mvp production profile) ── -->
172
+  <!-- A4-05: Network share access (file share enumeration / lateral movement)
173
+       Event 5140 — A network share object was accessed
174
+       Parent: 67017 (WEF baseline: network share accessed, non-IPC$/NetLogon)
175
+       Real data: 26,202 events/day observed; admin shares (D$, C$, ADMIN$) accessed by
176
+       both machine accounts ($) and user accounts — alert on user accounts accessing admin shares.
177
+       Excludes machine accounts (ending in $) to reduce service/replication noise. -->
178
+  <rule id="110355" level="8">
179
+    <if_sid>67017</if_sid>
180
+    <field name="win.eventdata.shareName" type="pcre2">(?i)\\\\[A-Z]\$|\\\\ADMIN\$|\\\\C\$|\\\\D\$|\\\\E\$</field>
181
+    <field name="win.eventdata.subjectUserName" negate="yes" type="pcre2">\$$</field>
182
+    <description>A4-05 [PROD] Windows: user account accessing admin share (5140) — lateral movement indicator</description>
183
+    <group>soc_prod,a4,lateral_movement,share,</group>
184
+    <mitre><id>T1021.002</id></mitre>
185
+  </rule>
167 186
 
187
+  <!-- A4 (supplemental): Kerberos pre-authentication failure (event 4771)
188
+       Event 4771 — Kerberos pre-authentication failed (similar to 4625 but Kerberos-specific)
189
+       Parent: 60103 (Windows audit success — constrained to eventID 4771)
190
+       Real data: 281 events observed; status=0x18 = bad password
191
+       Note: Wazuh has no dedicated built-in parent for 4771 in the base ruleset. -->
192
+  <rule id="110356" level="5">
193
+    <if_sid>60103</if_sid>
194
+    <field name="win.system.eventID">^4771$</field>
195
+    <description>A4-supplemental [PROD] Windows: Kerberos pre-authentication failure (4771)</description>
196
+    <group>soc_prod,a4,auth_fail,kerberos,</group>
197
+    <mitre><id>T1110.001</id></mitre>
198
+  </rule>
199
+
200
+  <!-- A4 (supplemental): Account lockout (event 4740)
201
+       Parent: 60103 (Windows audit events — constrained to eventID 4740)
202
+       Real data: 7 events observed — indicates repeated auth failures triggering lockout policy -->
203
+  <rule id="110357" level="8">
204
+    <if_sid>60103</if_sid>
205
+    <field name="win.system.eventID">^4740$</field>
206
+    <description>A4-supplemental [PROD] Windows: user account locked out (4740)</description>
207
+    <group>soc_prod,a4,auth_fail,lockout,</group>
208
+    <mitre><id>T1110.001</id></mitre>
209
+  </rule>
168 210
 
169 211
 </group>

+ 11 - 4
wazuh-docker/single-node/config/wazuh_cluster/rules/soc-c1-c3-rules.xml

@@ -7,7 +7,9 @@
7 7
   Simulation profile rule IDs : 100501, 100511-100514, 100521-100524
8 8
   Production profile rule IDs : 110501, 110502, 110511-110514, 110521-110524
9 9
 
10
-  C1 prod: if_group=fortigate (VPN) or if_sid=100260 (soc-integrator)
10
+  C1 prod: if_sid=81622 (VPN tunnel-up / user connected) or if_sid=100260 (soc-integrator)
11
+           Environment uses IPsec site-to-site VPN (no SSL-VPN observed in archives 2026-03-20)
12
+           if_group=fortigate was broken in Wazuh 4.x → fixed to if_sid
11 13
   C2/C3 prod: specific built-in Wazuh SIDs to avoid N×M explosion:
12 14
     60106 → event 4624 (auth success / logon)
13 15
     60113 → events 4728/4732 (group membership change)
@@ -19,10 +21,15 @@
19 21
        ================================================================ -->
20 22
 
21 23
 
24
+  <!-- C1-01 VPN candidate: fires on every VPN tunnel-up (IPsec) or SSL-VPN success
25
+       Parent: 81622 (Fortigate: VPN user connected / action=tunnel-up)
26
+       The srccountry field is present in real VPN events; soc-integrator handles
27
+       geo correlation and emits c1_impossible_travel to trigger rule 110502.
28
+       Fix 2026-03-19: if_group=fortigate broken → if_sid=81622;
29
+                       action="ssl-login-success" → IPsec tunnel-up via 81622 -->
22 30
   <rule id="110501" level="12">
23
-    <if_group>fortigate</if_group>
24
-    <match>action="ssl-login-success"</match>
25
-    <description>C1-01 [PROD] VPN login success with geo context — impossible travel candidate</description>
31
+    <if_sid>81622</if_sid>
32
+    <description>C1-01 [PROD] VPN tunnel connected — impossible travel geo candidate</description>
26 33
     <group>soc_prod,c1,impossible_travel,identity,</group>
27 34
     <mitre><id>T1078</id></mitre>
28 35
   </rule>

+ 8 - 1
wazuh-docker/single-node/config/wazuh_cluster/wazuh_manager.conf

@@ -3,7 +3,7 @@
3 3
     <jsonout_output>yes</jsonout_output>
4 4
     <alerts_log>yes</alerts_log>
5 5
     <logall>yes</logall>
6
-    <logall_json>yes</logall_json>
6
+    <logall_json>no</logall_json>
7 7
     <email_notification>no</email_notification>
8 8
     <smtp_server>smtp.example.wazuh.com</smtp_server>
9 9
     <email_from>wazuh@example.wazuh.com</email_from>
@@ -22,6 +22,13 @@
22 22
   <!-- Choose between "plain", "json", or "plain,json" for the format of internal logs -->
23 23
   <logging>
24 24
     <log_format>plain</log_format>
25
+    <rotation>
26
+      <enabled>yes</enabled>
27
+      <max_size>500M</max_size>
28
+      <interval>1d</interval>
29
+      <compress>yes</compress>
30
+      <saved>7</saved>
31
+    </rotation>
25 32
   </logging>
26 33
 
27 34
   <remote>