|
|
@@ -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>
|