tum 2 nedēļas atpakaļ
vecāks
revīzija
8800d39110
3 mainītis faili ar 107 papildinājumiem un 52 dzēšanām
  1. 23 0
      overall.md
  2. 51 52
      progress-update.md
  3. 33 0
      scripts/README.md

+ 23 - 0
overall.md

@@ -4,6 +4,7 @@ Reference: `Security Detection & Threat Intelligence Enhancement Proposal-revise
4 4
 Updated: March 4, 2026
5 5
 
6 6
 Legend:
7
+
7 8
 - `[x]` Completed
8 9
 - `[~]` Partially completed / in progress
9 10
 - `[ ]` Not started
@@ -28,6 +29,7 @@ Note: Proposal mentions DFIRTrack in architecture section; current implementatio
28 29
 ### 2.1 Create & Tune New Detection Rules / Use Cases
29 30
 
30 31
 - [x] Baseline rules/decoders for proposal use cases added
32
+  
31 33
   - Evidence:
32 34
     - `wazuh-docker/single-node/config/wazuh_cluster/local_decoder.xml`
33 35
     - `wazuh-docker/single-node/config/wazuh_cluster/local_rules.xml`
@@ -35,27 +37,41 @@ Note: Proposal mentions DFIRTrack in architecture section; current implementatio
35 37
     - `wazuh-docker/single-node/config/wazuh_cluster/rules/soc-a2-fortigate-fw-rules.xml`
36 38
     - `wazuh-docker/single-node/config/wazuh_cluster/rules/soc-a3-fortigate-vpn-rules.xml`
37 39
     - `wazuh-docker/single-node/config/wazuh_cluster/rules/soc-a4-windows-ad-rules.xml`
40
+
38 41
 - [~] Tuning against real production traffic
42
+  
39 43
   - Status: simulator/UAT-oriented tuning done; production false-positive tuning remains
40 44
 
41 45
 ### 2.2 IOC Detection (DNS / Firewall / IDS-IPS)
42 46
 
43 47
 - [x] IOC enrichment/evaluation APIs implemented
48
+  
44 49
   - Evidence: `soc-integrator/app/main.py` (`/ioc/enrich`, `/ioc/evaluate`, `/ioc/history`)
50
+
45 51
 - [x] VirusTotal and AbuseIPDB integrations implemented
52
+  
46 53
   - Evidence: `soc-integrator/app/adapters/virustotal.py`, `soc-integrator/app/adapters/abuseipdb.py`
54
+
47 55
 - [x] IOC trace persistence implemented
56
+  
48 57
   - Evidence: `soc-integrator/app/repositories/mvp_repo.py` (`ioc_trace` methods)
58
+
49 59
 - [~] Scheduled IOC feed lifecycle hardening for production
60
+  
50 61
   - Status: core IOC workflow exists; production feed governance/SLAs still to finalize
51 62
 
52 63
 ### 2.3 VPN Authentication Success from Outside Thailand
53 64
 
54 65
 - [x] MVP VPN evaluate flow implemented
66
+  
55 67
   - Evidence: `soc-integrator/app/routes/mvp.py` (`/mvp/vpn/evaluate`), `soc-integrator/app/services/mvp_service.py`
68
+
56 69
 - [x] GeoIP enrichment capability implemented
70
+  
57 71
   - Evidence: `soc-integrator/app/adapters/geoip.py`, `soc-integrator/app/main.py` (`/geoip/{ip}`)
72
+
58 73
 - [~] Production exception list and policy hardening
74
+  
59 75
   - Status: policy framework exists; enterprise exception governance pending
60 76
 
61 77
 ## 3) End-to-End Workflow & Integration Deliverables (Section 4 / 4.1)
@@ -126,17 +142,24 @@ Note: Proposal mentions DFIRTrack in architecture section; current implementatio
126 142
 ## 8.1) Latest Incremental Updates (March 4, 2026)
127 143
 
128 144
 - [x] Added production-profile simulator mode for proposal scripts
145
+  
129 146
   - Evidence:
130 147
     - `scripts/send-wazuh-proposal-required-events.sh` (`--profile=production`)
131 148
     - `scripts/send-wazuh-proposal-appendix-b-events.sh` (`--profile=production`)
149
+
132 150
 - [x] Expanded normalization test support in SOC Integrator
151
+  
133 152
   - Evidence:
134 153
     - `soc-integrator/app/main.py` (`GET /ingest/wazuh-alert/samples`)
135 154
     - `soc-integrator/app/main.py` (`POST /ingest/wazuh-alert` now includes `normalized_event`)
155
+
136 156
 - [x] C1 normalization aligned to production log characteristics
157
+  
137 158
   - Evidence:
138 159
     - `soc-integrator/app/services/mvp_service.py` (production-first C1 event typing)
160
+
139 161
 - [~] Production rule validation in Wazuh (`110xxx`) currently constrained by manager runtime instability during lab restarts
162
+  
140 163
   - Status: ingestion works; deterministic decoder/rule verification requires stable manager window.
141 164
 
142 165
 ## 9) Quick Status Summary

+ 51 - 52
progress-update.md

@@ -323,6 +323,7 @@ flowchart LR
323 323
     C3 --> G
324 324
     G --> H[Optional Incident Pipeline<br/>IRIS case + Shuffle + PagerDuty stub]
325 325
 ```
326
+
326 327
 - `scripts/send-wazuh-endpoint-agent-test-events.sh`
327 328
 - additional simulation scripts under `scripts/` for firewall and endpoint scenarios with continuous mode enabled
328 329
 
@@ -497,44 +498,44 @@ sequenceDiagram
497 498
 
498 499
 ### 11) SOC Integrator API Inventory
499 500
 
500
-| Group | Method | Endpoint | Notes |
501
-|---|---|---|---|
502
-| Core | GET | `/health` | Service health and target configuration |
503
-| Core | POST | `/ingest/wazuh-alert` | Normalize inbound Wazuh alert payload |
504
-| Core | POST | `/action/create-incident` | Create PagerDuty incident |
505
-| Core | POST | `/action/trigger-shuffle` | Trigger Shuffle workflow execution |
506
-| Core | POST | `/action/create-iris-case` | Create IRIS case (legacy action endpoint) |
507
-| IRIS | POST | `/iris/tickets` | Create IRIS ticket/case via soc-integrator |
508
-| IRIS | GET | `/iris/tickets` | List/query IRIS tickets/cases |
509
-| IOC | POST | `/ioc/enrich` | IOC enrichment from configured intel sources |
510
-| IOC | POST | `/ioc/evaluate` | IOC decisioning/verdict |
511
-| IOC | POST | `/ioc/upload-file` | Upload file to IOC backend (VirusTotal flow) |
512
-| IOC | GET | `/ioc/analysis/{analysis_id}` | Retrieve IOC analysis status/result |
513
-| IOC | POST | `/ioc/evaluate-file` | Evaluate file indicator or uploaded sample |
514
-| IOC | GET | `/ioc/history` | Retrieve stored IOC trace history |
515
-| Shuffle | GET | `/shuffle/health` | Shuffle service reachability check |
516
-| Shuffle | GET | `/shuffle/auth-test` | Validate Shuffle API key access |
517
-| Shuffle | POST | `/shuffle/login` | Login against Shuffle API |
518
-| Shuffle | POST | `/shuffle/generate-apikey` | Generate Shuffle API key from credentials |
519
-| Shuffle | GET | `/shuffle/workflows` | List workflows |
520
-| Shuffle | GET | `/shuffle/workflows/{workflow_id}` | Get workflow detail |
521
-| Shuffle | POST | `/shuffle/workflows/{workflow_id}/execute` | Execute specific workflow |
522
-| Shuffle | GET | `/shuffle/apps` | List installed/available Shuffle apps |
523
-| Shuffle | POST | `/shuffle/proxy` | Generic proxy request to Shuffle API |
524
-| Wazuh | GET | `/sync/wazuh-version` | Fetch Wazuh version information |
525
-| Wazuh | GET | `/wazuh/auth-test` | Validate Wazuh API authentication |
526
-| Wazuh | GET | `/wazuh/manager-info` | Manager information |
527
-| Wazuh | GET | `/wazuh/agents` | List Wazuh agents |
528
-| Wazuh | GET | `/wazuh/alerts` | Query recent Wazuh alerts |
529
-| Wazuh | GET | `/wazuh/manager-logs` | Read manager logs |
530
-| Wazuh | POST | `/wazuh/sync-to-mvp` | Sync Wazuh alerts into MVP pipeline |
531
-| Wazuh | GET | `/wazuh/auto-sync/status` | Auto-sync loop status |
532
-| MVP | POST | `/mvp/incidents/ingest` | Ingest incident into MVP flow |
533
-| MVP | POST | `/mvp/ioc/evaluate` | Evaluate IOC under MVP policy |
534
-| MVP | POST | `/mvp/vpn/evaluate` | Evaluate VPN event under MVP policy |
535
-| MVP | GET | `/mvp/config/policies` | Read MVP policy configuration |
536
-| MVP | PUT | `/mvp/config/policies` | Update MVP policy configuration |
537
-| MVP | GET | `/mvp/health/dependencies` | Dependency health snapshot |
501
+| Group   | Method | Endpoint                                   | Notes                                        |
502
+| ------- | ------ | ------------------------------------------ | -------------------------------------------- |
503
+| Core    | GET    | `/health`                                  | Service health and target configuration      |
504
+| Core    | POST   | `/ingest/wazuh-alert`                      | Normalize inbound Wazuh alert payload        |
505
+| Core    | POST   | `/action/create-incident`                  | Create PagerDuty incident                    |
506
+| Core    | POST   | `/action/trigger-shuffle`                  | Trigger Shuffle workflow execution           |
507
+| Core    | POST   | `/action/create-iris-case`                 | Create IRIS case (legacy action endpoint)    |
508
+| IRIS    | POST   | `/iris/tickets`                            | Create IRIS ticket/case via soc-integrator   |
509
+| IRIS    | GET    | `/iris/tickets`                            | List/query IRIS tickets/cases                |
510
+| IOC     | POST   | `/ioc/enrich`                              | IOC enrichment from configured intel sources |
511
+| IOC     | POST   | `/ioc/evaluate`                            | IOC decisioning/verdict                      |
512
+| IOC     | POST   | `/ioc/upload-file`                         | Upload file to IOC backend (VirusTotal flow) |
513
+| IOC     | GET    | `/ioc/analysis/{analysis_id}`              | Retrieve IOC analysis status/result          |
514
+| IOC     | POST   | `/ioc/evaluate-file`                       | Evaluate file indicator or uploaded sample   |
515
+| IOC     | GET    | `/ioc/history`                             | Retrieve stored IOC trace history            |
516
+| Shuffle | GET    | `/shuffle/health`                          | Shuffle service reachability check           |
517
+| Shuffle | GET    | `/shuffle/auth-test`                       | Validate Shuffle API key access              |
518
+| Shuffle | POST   | `/shuffle/login`                           | Login against Shuffle API                    |
519
+| Shuffle | POST   | `/shuffle/generate-apikey`                 | Generate Shuffle API key from credentials    |
520
+| Shuffle | GET    | `/shuffle/workflows`                       | List workflows                               |
521
+| Shuffle | GET    | `/shuffle/workflows/{workflow_id}`         | Get workflow detail                          |
522
+| Shuffle | POST   | `/shuffle/workflows/{workflow_id}/execute` | Execute specific workflow                    |
523
+| Shuffle | GET    | `/shuffle/apps`                            | List installed/available Shuffle apps        |
524
+| Shuffle | POST   | `/shuffle/proxy`                           | Generic proxy request to Shuffle API         |
525
+| Wazuh   | GET    | `/sync/wazuh-version`                      | Fetch Wazuh version information              |
526
+| Wazuh   | GET    | `/wazuh/auth-test`                         | Validate Wazuh API authentication            |
527
+| Wazuh   | GET    | `/wazuh/manager-info`                      | Manager information                          |
528
+| Wazuh   | GET    | `/wazuh/agents`                            | List Wazuh agents                            |
529
+| Wazuh   | GET    | `/wazuh/alerts`                            | Query recent Wazuh alerts                    |
530
+| Wazuh   | GET    | `/wazuh/manager-logs`                      | Read manager logs                            |
531
+| Wazuh   | POST   | `/wazuh/sync-to-mvp`                       | Sync Wazuh alerts into MVP pipeline          |
532
+| Wazuh   | GET    | `/wazuh/auto-sync/status`                  | Auto-sync loop status                        |
533
+| MVP     | POST   | `/mvp/incidents/ingest`                    | Ingest incident into MVP flow                |
534
+| MVP     | POST   | `/mvp/ioc/evaluate`                        | Evaluate IOC under MVP policy                |
535
+| MVP     | POST   | `/mvp/vpn/evaluate`                        | Evaluate VPN event under MVP policy          |
536
+| MVP     | GET    | `/mvp/config/policies`                     | Read MVP policy configuration                |
537
+| MVP     | PUT    | `/mvp/config/policies`                     | Update MVP policy configuration              |
538
+| MVP     | GET    | `/mvp/health/dependencies`                 | Dependency health snapshot                   |
538 539
 
539 540
 Additional FastAPI-generated endpoints:
540 541
 
@@ -619,15 +620,15 @@ This update documents production log sources and required fields for Appendix C
619 620
 
620 621
 ### Appendix C Production Data Onboarding Checklist
621 622
 
622
-| Source | Log Path / Channel | Must-Have Fields | Use Cases | Verification Query (Wazuh/Indexer) |
623
-|---|---|---|---|---|
624
-| VPN Gateway (FortiGate/SSL-VPN) | Syslog export from firewall/VPN device | `timestamp`, `user`, `src_ip`, `action/result`, `event_id` (if mapped), `country` (optional) | C1, C2 | `full_log:*vpn* AND full_log:*user=*` |
625
-| Active Directory / Windows DC | Windows Security Event Log (agent/forwarder) | `event_id`, `timestamp`, `user/account`, `src_ip` (where present), `logon_type`, `success/failure` | C1, C2, C3 | `rule.id:* AND (data.win.system.eventID:4624 OR full_log:*event_id=4624*)` |
626
-| Cloud IdP (Entra/Okta/Google) | API export / SIEM connector -> syslog/json | `user`, `src_ip`, `event_time`, `outcome`, `geo.country` (if available), `app/service` | C1, C2 | `full_log:*source=*idp* OR full_log:*okta* OR full_log:*entra*` |
627
-| Windows Endpoints/Servers | Wazuh agent + Sysmon/Security logs | `event_id`, `user`, `src_ip`, `dst_host`, `dst_port`, `process/action` | C2, C3 | `full_log:*source=windows* AND rule.id:*` |
628
-| Linux Servers | auth.log / secure / sudo / sshd | `timestamp`, `user`, `src_ip`, `action`, `success` | C2, C3 | `full_log:*sshd* OR full_log:*sudo*` |
629
-| East-West Firewall | Internal traffic logs (allow/deny/flow) | `src_ip`, `dst_ip/dst_host`, `dst_port`, `action`, `timestamp` | C3 | `full_log:*src_ip=* AND full_log:*dst_port=*` |
630
-| IDS/NDR | IDS alerts / network detection logs | `src_ip`, `dst_ip/dst_host`, `dst_port`, `signature/category`, `timestamp` | C3 | `full_log:*scan* OR full_log:*lateral* OR full_log:*enumeration*` |
623
+| Source                          | Log Path / Channel                           | Must-Have Fields                                                                                   | Use Cases  | Verification Query (Wazuh/Indexer)                                         |
624
+| ------------------------------- | -------------------------------------------- | -------------------------------------------------------------------------------------------------- | ---------- | -------------------------------------------------------------------------- |
625
+| VPN Gateway (FortiGate/SSL-VPN) | Syslog export from firewall/VPN device       | `timestamp`, `user`, `src_ip`, `action/result`, `event_id` (if mapped), `country` (optional)       | C1, C2     | `full_log:*vpn* AND full_log:*user=*`                                      |
626
+| Active Directory / Windows DC   | Windows Security Event Log (agent/forwarder) | `event_id`, `timestamp`, `user/account`, `src_ip` (where present), `logon_type`, `success/failure` | C1, C2, C3 | `rule.id:* AND (data.win.system.eventID:4624 OR full_log:*event_id=4624*)` |
627
+| Cloud IdP (Entra/Okta/Google)   | API export / SIEM connector -> syslog/json   | `user`, `src_ip`, `event_time`, `outcome`, `geo.country` (if available), `app/service`             | C1, C2     | `full_log:*source=*idp* OR full_log:*okta* OR full_log:*entra*`            |
628
+| Windows Endpoints/Servers       | Wazuh agent + Sysmon/Security logs           | `event_id`, `user`, `src_ip`, `dst_host`, `dst_port`, `process/action`                             | C2, C3     | `full_log:*source=windows* AND rule.id:*`                                  |
629
+| Linux Servers                   | auth.log / secure / sudo / sshd              | `timestamp`, `user`, `src_ip`, `action`, `success`                                                 | C2, C3     | `full_log:*sshd* OR full_log:*sudo*`                                       |
630
+| East-West Firewall              | Internal traffic logs (allow/deny/flow)      | `src_ip`, `dst_ip/dst_host`, `dst_port`, `action`, `timestamp`                                     | C3         | `full_log:*src_ip=* AND full_log:*dst_port=*`                              |
631
+| IDS/NDR                         | IDS alerts / network detection logs          | `src_ip`, `dst_ip/dst_host`, `dst_port`, `signature/category`, `timestamp`                         | C3         | `full_log:*scan* OR full_log:*lateral* OR full_log:*enumeration*`          |
631 632
 
632 633
 #### Acceptance Checklist (Per Source)
633 634
 
@@ -653,7 +654,6 @@ Project: FoodProject SOC Platform (Wazuh + Shuffle + IRIS-web + SOC Integrator)
653 654
 ### Major Progress Areas
654 655
 
655 656
 1. SOC Integrator Expansion
656
-
657 657
 - Added full admin UI stack:
658 658
   - `soc-integrator/app/ui/index.html`
659 659
   - `soc-integrator/app/ui/assets/app.js`
@@ -666,9 +666,7 @@ Project: FoodProject SOC Platform (Wazuh + Shuffle + IRIS-web + SOC Integrator)
666 666
   - `soc-integrator/app/repositories/mvp_repo.py`
667 667
 - Added GeoIP adapter integration:
668 668
   - `soc-integrator/app/adapters/geoip.py`
669
-
670 669
 2. Wazuh Simulation and Dashboard Delivery
671
-
672 670
 - Added Appendix-specific event generators:
673 671
   - `scripts/send-wazuh-proposal-appendix-b-events.sh`
674 672
   - `scripts/send-wazuh-proposal-appendix-c-events.sh`
@@ -683,9 +681,11 @@ Project: FoodProject SOC Platform (Wazuh + Shuffle + IRIS-web + SOC Integrator)
683 681
 ### Wazuh Custom Rules Added (Current Active Set)
684 682
 
685 683
 Active custom rules are currently defined in:
684
+
686 685
 - `wazuh-docker/single-node/config/wazuh_cluster/local_rules.xml`
687 686
 
688 687
 Rule groups/ranges implemented:
688
+
689 689
 - Base and appendix classifiers:
690 690
   - `100200`: base marker for synthetic SOC events (`soc_mvp_test=true`)
691 691
   - `100210`: Appendix A classifier
@@ -706,10 +706,9 @@ Rule groups/ranges implemented:
706 706
   - `C3` Lateral movement/internal recon: `100521-100524`
707 707
 
708 708
 Operational note:
709
-- Split rule files under `wazuh_cluster/rules/soc-*.xml` exist as staging artifacts in this workspace; active detection content is loaded from `local_rules.xml`.
710 709
 
710
+- Split rule files under `wazuh_cluster/rules/soc-*.xml` exist as staging artifacts in this workspace; active detection content is loaded from `local_rules.xml`.
711 711
 3. Operations and Runtime Hardening
712
-
713 712
 - Updated orchestration and runtime configuration:
714 713
   - `run-combined-stack.sh`
715 714
   - `compose-overrides/soc-integrator.yml`

+ 33 - 0
scripts/README.md

@@ -22,9 +22,11 @@ scripts/send-wazuh-test-events.sh [scenario] [count] [delay_seconds]
22 22
 ```
23 23
 
24 24
 Optional flag:
25
+
25 26
 - `--forever` (ignore `count` and run continuously until Ctrl+C)
26 27
 
27 28
 Scenarios:
29
+
28 30
 - `ioc_dns`
29 31
 - `ioc_ips`
30 32
 - `vpn_outside_th`
@@ -41,6 +43,7 @@ scripts/send-wazuh-test-events.sh all 1 2 --forever
41 43
 ```
42 44
 
43 45
 Environment overrides:
46
+
44 47
 - `WAZUH_SYSLOG_HOST` (default `127.0.0.1`)
45 48
 - `WAZUH_SYSLOG_PORT` (default `514`)
46 49
 - `WAZUH_TEST_SRC_IP`
@@ -48,6 +51,7 @@ Environment overrides:
48 51
 - `WAZUH_TEST_USER`
49 52
 
50 53
 Transport notes:
54
+
51 55
 - Uses `nc` if available.
52 56
 - Falls back to Bash UDP redirection (`/dev/udp/host/port`) when `nc` is unavailable.
53 57
 
@@ -60,9 +64,11 @@ scripts/send-wazuh-cisco-test-events.sh [scenario] [count] [delay_seconds]
60 64
 ```
61 65
 
62 66
 Optional flag:
67
+
63 68
 - `--forever` (ignore `count` and run continuously until Ctrl+C)
64 69
 
65 70
 Scenarios:
71
+
66 72
 - `asa_acl_deny`
67 73
 - `asa_vpn_auth_fail`
68 74
 - `ios_login_fail`
@@ -79,6 +85,7 @@ scripts/send-wazuh-cisco-test-events.sh all 1 2 --forever
79 85
 ```
80 86
 
81 87
 Environment overrides:
88
+
82 89
 - `WAZUH_SYSLOG_HOST` (default `127.0.0.1`)
83 90
 - `WAZUH_SYSLOG_PORT` (default `514`)
84 91
 - `CISCO_DEVICE_HOST`
@@ -96,9 +103,11 @@ scripts/send-wazuh-fortigate-test-events.sh [model] [count] [delay_seconds]
96 103
 ```
97 104
 
98 105
 Optional flag:
106
+
99 107
 - `--forever` (ignore `count` and run continuously until Ctrl+C)
100 108
 
101 109
 Models:
110
+
102 111
 - `501E`
103 112
 - `80F`
104 113
 - `60F`
@@ -115,6 +124,7 @@ scripts/send-wazuh-fortigate-test-events.sh all 1 2 --forever
115 124
 ```
116 125
 
117 126
 Environment overrides:
127
+
118 128
 - `WAZUH_SYSLOG_HOST` (default `127.0.0.1`)
119 129
 - `WAZUH_SYSLOG_PORT` (default `514`)
120 130
 - `FGT_SRC_IP`
@@ -131,11 +141,13 @@ scripts/send-wazuh-fortigate-continuous.sh [profile] [models] [base_delay_second
131 141
 ```
132 142
 
133 143
 Profiles:
144
+
134 145
 - `normal` (mostly allowed traffic, occasional admin/vpn/webfilter)
135 146
 - `incident` (higher IPS/webfilter/vpn anomalies)
136 147
 - `mixed` (balanced baseline + anomalies)
137 148
 
138 149
 Models:
150
+
139 151
 - `501E`
140 152
 - `80F`
141 153
 - `60F`
@@ -151,6 +163,7 @@ SIM_MAX_EVENTS=200 scripts/send-wazuh-fortigate-continuous.sh normal 501E 1.0
151 163
 ```
152 164
 
153 165
 Environment overrides:
166
+
154 167
 - `WAZUH_SYSLOG_HOST` (default `127.0.0.1`)
155 168
 - `WAZUH_SYSLOG_PORT` (default `514`)
156 169
 - `SIM_MAX_EVENTS` (default `0`, which means run forever)
@@ -168,9 +181,11 @@ scripts/send-wazuh-proposal-required-events.sh [selector] [count] [delay_seconds
168 181
 ```
169 182
 
170 183
 Optional flag:
184
+
171 185
 - `--forever` (ignore `count` and run continuously until Ctrl+C)
172 186
 
173 187
 Selectors:
188
+
174 189
 - `all` (all Appendix A use cases)
175 190
 - `a1`, `a2`, `a3`, `a4` (by section)
176 191
 - specific use case id, e.g. `A2-01`, `A3-05`, `A4-24`
@@ -186,6 +201,7 @@ scripts/send-wazuh-proposal-required-events.sh a2 1 2 --forever
186 201
 ```
187 202
 
188 203
 Environment overrides:
204
+
189 205
 - `WAZUH_SYSLOG_HOST` (default `127.0.0.1`)
190 206
 - `WAZUH_SYSLOG_PORT` (default `514`)
191 207
 - `EVENT_DELAY` (default `0.05`)
@@ -204,9 +220,11 @@ scripts/send-wazuh-proposal-appendix-b-events.sh [selector] [count] [delay_secon
204 220
 ```
205 221
 
206 222
 Optional flag:
223
+
207 224
 - `--forever` (ignore `count` and run continuously until Ctrl+C)
208 225
 
209 226
 Selectors:
227
+
210 228
 - `all` (all Appendix B use cases)
211 229
 - `b1`, `b2`, `b3` (by section)
212 230
 - specific use case id, e.g. `B1-01`, `B2-01`, `B3-06`
@@ -222,6 +240,7 @@ scripts/send-wazuh-proposal-appendix-b-events.sh b1 1 2 --forever
222 240
 ```
223 241
 
224 242
 Environment overrides:
243
+
225 244
 - `WAZUH_SYSLOG_HOST` (default `127.0.0.1`)
226 245
 - `WAZUH_SYSLOG_PORT` (default `514`)
227 246
 - `EVENT_DELAY` (default `0.05`)
@@ -239,9 +258,11 @@ scripts/send-wazuh-proposal-appendix-c-events.sh [selector] [count] [delay_secon
239 258
 ```
240 259
 
241 260
 Optional flag:
261
+
242 262
 - `--forever` (ignore `count` and run continuously until Ctrl+C)
243 263
 
244 264
 Selectors:
265
+
245 266
 - `all` (all Appendix C use cases)
246 267
 - `c1`, `c2`, `c3` (by section)
247 268
 - specific use case id, e.g. `C1-01`, `C2-03`, `C3-04`
@@ -257,6 +278,7 @@ scripts/send-wazuh-proposal-appendix-c-events.sh c2 1 2 --forever
257 278
 ```
258 279
 
259 280
 Environment overrides:
281
+
260 282
 - `WAZUH_SYSLOG_HOST` (default `127.0.0.1`)
261 283
 - `WAZUH_SYSLOG_PORT` (default `514`)
262 284
 - `EVENT_DELAY` (default `0.05`)
@@ -273,15 +295,18 @@ scripts/send-wazuh-endpoint-agent-test-events.sh [platform] [scenario] [count] [
273 295
 ```
274 296
 
275 297
 Optional flag:
298
+
276 299
 - `--forever` (ignore `count` and run continuously until Ctrl+C)
277 300
 
278 301
 Platforms:
302
+
279 303
 - `windows`
280 304
 - `mac`
281 305
 - `linux`
282 306
 - `all`
283 307
 
284 308
 Scenarios:
309
+
285 310
 - `auth`
286 311
 - `process`
287 312
 - `persistence`
@@ -299,6 +324,7 @@ scripts/send-wazuh-endpoint-agent-test-events.sh all auth 1 2 --forever
299 324
 ```
300 325
 
301 326
 Environment overrides:
327
+
302 328
 - `WAZUH_SYSLOG_HOST` (default `127.0.0.1`)
303 329
 - `WAZUH_SYSLOG_PORT` (default `514`)
304 330
 - `DRY_RUN` (default `0`)
@@ -328,6 +354,7 @@ SHUFFLE_API_KEY=<your_key> scripts/create-shuffle-mvp-workflows.sh
328 354
 ```
329 355
 
330 356
 This creates:
357
+
331 358
 - `MVP - IOC Enrichment and Case Routing`
332 359
 - `MVP - VPN Geo Anomaly Triage`
333 360
 
@@ -361,21 +388,25 @@ After import, open dashboard:
361 388
 Dashboard saved objects are stored in `scripts/events/*.ndjson`.
362 389
 
363 390
 - `scripts/events/wazuh-fortigate-sim-dashboard.ndjson`
391
+  
364 392
   - Title: `SOC FortiGate Simulation Overview`
365 393
   - Purpose: FortiGate simulation visibility (events over time, top devices, top event types, severity).
366 394
   - Typical data source: `scripts/send-wazuh-fortigate-test-events.sh`
367 395
 
368 396
 - `scripts/events/wazuh-client-agents-dashboard.ndjson`
397
+  
369 398
   - Title: `SOC Client Agent Simulation Overview`
370 399
   - Purpose: Endpoint simulation visibility for Windows/macOS/Linux agent logs.
371 400
   - Typical data source: `scripts/send-wazuh-endpoint-agent-test-events.sh`
372 401
 
373 402
 - `scripts/events/wazuh-proposal-required-dashboard.ndjson`
403
+  
374 404
   - Title: `SOC Proposal Required Logs Overview`
375 405
   - Purpose: Appendix A required-scope logs (A1-A4).
376 406
   - Typical data source: `scripts/send-wazuh-proposal-required-events.sh`
377 407
 
378 408
 - `scripts/events/wazuh-proposal-appendix-ab-dashboard.ndjson`
409
+  
379 410
   - Title: `SOC Proposal Appendix A+B Overview`
380 411
   - Purpose: Combined Appendix A and B overview, including use-case table.
381 412
   - Typical data sources:
@@ -383,11 +414,13 @@ Dashboard saved objects are stored in `scripts/events/*.ndjson`.
383 414
     - `scripts/send-wazuh-proposal-appendix-b-events.sh`
384 415
 
385 416
 - `scripts/events/wazuh-proposal-appendix-c-dashboard.ndjson`
417
+  
386 418
   - Title: `SOC Proposal Appendix C Overview`
387 419
   - Purpose: Appendix C MVP scope visibility (currently C1-C3 coverage).
388 420
   - Typical data source: `scripts/send-wazuh-proposal-appendix-c-events.sh`
389 421
 
390 422
 - `scripts/events/wazuh-proposal-custom-rules-dashboard.ndjson`
423
+  
391 424
   - Title: `SOC Proposal Custom Rules Overview`
392 425
   - Purpose: Monitor custom proposal rules (e.g., 1003xx/1004xx families), severity, and top descriptions.
393 426
   - Typical data source: Any simulation script that triggers proposal custom rules.