| | 1 | = Advanced Reports = |
| | 2 | |
| | 3 | == Извештај 1: Детален извештај: Top outbound конекции по процес (по tenant/env и период) == |
| | 4 | |
| | 5 | Извештај кој ги прикажува процесите кои воспоставуваат најмногу излезни мрежни конекции во рамките на одреден tenant и environment, за зададен временски период. Корисен за откривање на сомнителни или необично активни процеси на мрежно ниво. |
| | 6 | |
| | 7 | === Solution SQL === |
| | 8 | |
| | 9 | {{{ |
| | 10 | WITH filtered AS ( |
| | 11 | SELECT |
| | 12 | nc.computer_id, |
| | 13 | nc.process_name, |
| | 14 | nc.pid, |
| | 15 | nc.remote_address, |
| | 16 | nc.timestamp |
| | 17 | FROM network_connections nc |
| | 18 | WHERE nc.timestamp BETWEEN ? AND ? |
| | 19 | ), |
| | 20 | agg AS ( |
| | 21 | SELECT |
| | 22 | computer_id, |
| | 23 | process_name, |
| | 24 | pid, |
| | 25 | COUNT(*) AS total_connections, |
| | 26 | COUNT(DISTINCT remote_address) AS unique_remotes, |
| | 27 | MAX(timestamp) AS last_seen_connection |
| | 28 | FROM filtered |
| | 29 | GROUP BY computer_id, process_name, pid |
| | 30 | ) |
| | 31 | SELECT |
| | 32 | c.tenant_id, |
| | 33 | c.env_name, |
| | 34 | c.id AS computer_id, |
| | 35 | c.name AS computer_name, |
| | 36 | a.process_name, |
| | 37 | a.pid, |
| | 38 | a.total_connections, |
| | 39 | a.unique_remotes, |
| | 40 | a.last_seen_connection |
| | 41 | FROM agg a |
| | 42 | JOIN computers c ON c.id = a.computer_id |
| | 43 | WHERE c.tenant_id = ? |
| | 44 | AND c.env_name = ? |
| | 45 | ORDER BY a.total_connections DESC |
| | 46 | LIMIT ?; |
| | 47 | }}} |
| | 48 | |
| | 49 | === Solution Relational Algebra === |
| | 50 | |
| | 51 | {{{ |
| | 52 | π tenant_id, env_name, computer_id, computer_name, process_name, pid, total_connections, unique_remotes, last_seen_connection ( |
| | 53 | γ computer_id, process_name, pid; |
| | 54 | COUNT(*)→total_connections, COUNT(DISTINCT remote_address)→unique_remotes, MAX(timestamp)→last_seen_connection ( |
| | 55 | σ timestamp≥T1 ∧ timestamp≤T2 (network_connections) |
| | 56 | ) |
| | 57 | ⋈ computer_id=id |
| | 58 | σ tenant_id=TID ∧ env_name=ENV (computers) |
| | 59 | ) |
| | 60 | }}} |
| | 61 | |
| | 62 | ---- |
| | 63 | |
| | 64 | == Извештај 2: Нерешени security alerts + распределба по severity (по компјутер) == |
| | 65 | |
| | 66 | Извештај кој за секој компјутер во рамките на tenant/env ги прикажува вкупниот број на безбедносни предупредувања, бројот на нерешени, и нивната распределба по тежина (critical, high, medium, low). Служи за брзо идентификување на најзагрозените машини. |
| | 67 | |
| | 68 | === Solution SQL === |
| | 69 | |
| | 70 | {{{ |
| | 71 | WITH filtered AS ( |
| | 72 | SELECT |
| | 73 | sa.computer_id, |
| | 74 | sa.severity, |
| | 75 | sa.resolved, |
| | 76 | sa.timestamp |
| | 77 | FROM security_alerts sa |
| | 78 | WHERE sa.timestamp BETWEEN ? AND ? |
| | 79 | ), |
| | 80 | agg AS ( |
| | 81 | SELECT |
| | 82 | computer_id, |
| | 83 | COUNT(*) AS total_alerts, |
| | 84 | SUM(CASE WHEN resolved = 0 THEN 1 ELSE 0 END) AS unresolved_alerts, |
| | 85 | SUM(CASE WHEN LOWER(severity) = 'critical' THEN 1 ELSE 0 END) AS sev_critical, |
| | 86 | SUM(CASE WHEN LOWER(severity) = 'high' THEN 1 ELSE 0 END) AS sev_high, |
| | 87 | SUM(CASE WHEN LOWER(severity) = 'medium' THEN 1 ELSE 0 END) AS sev_medium, |
| | 88 | SUM(CASE WHEN LOWER(severity) = 'low' THEN 1 ELSE 0 END) AS sev_low, |
| | 89 | MAX(timestamp) AS last_alert_time |
| | 90 | FROM filtered |
| | 91 | GROUP BY computer_id |
| | 92 | ) |
| | 93 | SELECT |
| | 94 | c.id AS computer_id, |
| | 95 | c.name AS computer_name, |
| | 96 | a.total_alerts, |
| | 97 | a.unresolved_alerts, |
| | 98 | a.sev_critical, |
| | 99 | a.sev_high, |
| | 100 | a.sev_medium, |
| | 101 | a.sev_low, |
| | 102 | a.last_alert_time |
| | 103 | FROM agg a |
| | 104 | JOIN computers c ON c.id = a.computer_id |
| | 105 | WHERE c.tenant_id = ? |
| | 106 | AND c.env_name = ? |
| | 107 | ORDER BY a.unresolved_alerts DESC, a.sev_critical DESC, a.last_alert_time DESC; |
| | 108 | }}} |
| | 109 | |
| | 110 | === Solution Relational Algebra === |
| | 111 | |
| | 112 | {{{ |
| | 113 | π computer_id, computer_name, total_alerts, unresolved_alerts, |
| | 114 | sev_critical, sev_high, sev_medium, sev_low, last_alert_time ( |
| | 115 | |
| | 116 | γ computer_id; |
| | 117 | COUNT(*)→total_alerts, |
| | 118 | COUNT(σ resolved=0)→unresolved_alerts, |
| | 119 | COUNT(σ severity='critical')→sev_critical, |
| | 120 | COUNT(σ severity='high')→sev_high, |
| | 121 | COUNT(σ severity='medium')→sev_medium, |
| | 122 | COUNT(σ severity='low')→sev_low, |
| | 123 | MAX(timestamp)→last_alert_time ( |
| | 124 | σ timestamp≥T1 ∧ timestamp≤T2 (security_alerts) |
| | 125 | ) |
| | 126 | ⋈ computer_id=id |
| | 127 | σ tenant_id=TID ∧ env_name=ENV (computers) |
| | 128 | ) |
| | 129 | }}} |
| | 130 | |
| | 131 | ---- |
| | 132 | |
| | 133 | == Извештај 3: Resource hotspots (CPU/RAM/DISK) по компјутер со прагови == |
| | 134 | |
| | 135 | Извештај кој ги идентификува компјутерите со критично висока просечна или максимална потрошувачка на CPU, RAM или диск во зadadен период. Корисен за планирање на капацитети и откривање на преоптоварени машини. |
| | 136 | |
| | 137 | === Solution SQL === |
| | 138 | |
| | 139 | {{{ |
| | 140 | WITH filtered AS ( |
| | 141 | SELECT |
| | 142 | ch.computer_id, |
| | 143 | ch.cpu_usage, |
| | 144 | ch.ram_usage, |
| | 145 | ch.disk_usage, |
| | 146 | ch.timestamp |
| | 147 | FROM computer_history ch |
| | 148 | WHERE ch.timestamp BETWEEN ? AND ? |
| | 149 | ), |
| | 150 | stats AS ( |
| | 151 | SELECT |
| | 152 | computer_id, |
| | 153 | ROUND(AVG(cpu_usage), 2) AS avg_cpu, |
| | 154 | ROUND(MAX(cpu_usage), 2) AS max_cpu, |
| | 155 | ROUND(AVG(ram_usage), 2) AS avg_ram, |
| | 156 | ROUND(MAX(ram_usage), 2) AS max_ram, |
| | 157 | ROUND(AVG(disk_usage), 2) AS avg_disk, |
| | 158 | ROUND(MAX(disk_usage), 2) AS max_disk, |
| | 159 | MAX(timestamp) AS last_sample |
| | 160 | FROM filtered |
| | 161 | GROUP BY computer_id |
| | 162 | ) |
| | 163 | SELECT |
| | 164 | c.id AS computer_id, |
| | 165 | c.name AS computer_name, |
| | 166 | s.avg_cpu, s.max_cpu, |
| | 167 | s.avg_ram, s.max_ram, |
| | 168 | s.avg_disk, s.max_disk, |
| | 169 | s.last_sample |
| | 170 | FROM stats s |
| | 171 | JOIN computers c ON c.id = s.computer_id |
| | 172 | WHERE c.tenant_id = ? |
| | 173 | AND c.env_name = ? |
| | 174 | AND (s.max_cpu >= ? OR s.max_ram >= ? OR s.max_disk >= ?) |
| | 175 | ORDER BY (s.max_cpu + s.max_ram + s.max_disk) DESC; |
| | 176 | }}} |
| | 177 | |
| | 178 | === Solution Relational Algebra === |
| | 179 | |
| | 180 | {{{ |
| | 181 | π computer_id, computer_name, avg_cpu, max_cpu, avg_ram, max_ram, avg_disk, max_disk, last_sample ( |
| | 182 | |
| | 183 | σ max_cpu≥TCPU ∨ max_ram≥TRAM ∨ max_disk≥TDISK ( |
| | 184 | |
| | 185 | γ computer_id; |
| | 186 | AVG(cpu_usage)→avg_cpu, MAX(cpu_usage)→max_cpu, |
| | 187 | AVG(ram_usage)→avg_ram, MAX(ram_usage)→max_ram, |
| | 188 | AVG(disk_usage)→avg_disk, MAX(disk_usage)→max_disk, |
| | 189 | MAX(timestamp)→last_sample ( |
| | 190 | σ timestamp≥T1 ∧ timestamp≤T2 (computer_history) |
| | 191 | ) |
| | 192 | ) |
| | 193 | ⋈ computer_id=id |
| | 194 | σ tenant_id=TID ∧ env_name=ENV (computers) |
| | 195 | ) |
| | 196 | }}} |
| | 197 | |
| | 198 | ---- |
| | 199 | |
| | 200 | == Извештај 4: Top процеси по просечен CPU / MEM (history) == |
| | 201 | |
| | 202 | Извештај кој ги прикажува процесите со највисока просечна потрошувачка на процесор или меморија во историски период, групирани по компјутер и корисник. Корисен за откривање на ресурсно интензивни апликации на долг рок. |
| | 203 | |
| | 204 | === Solution SQL === |
| | 205 | |
| | 206 | {{{ |
| | 207 | WITH filtered AS ( |
| | 208 | SELECT |
| | 209 | ph.computer_id, |
| | 210 | ph.name AS process_name, |
| | 211 | ph.username, |
| | 212 | ph.cpu_percent, |
| | 213 | ph.memory_mb, |
| | 214 | ph.timestamp |
| | 215 | FROM computer_processes_history ph |
| | 216 | WHERE ph.timestamp BETWEEN ? AND ? |
| | 217 | ), |
| | 218 | proc_stats AS ( |
| | 219 | SELECT |
| | 220 | computer_id, |
| | 221 | process_name, |
| | 222 | username, |
| | 223 | ROUND(AVG(cpu_percent), 2) AS avg_cpu, |
| | 224 | ROUND(MAX(cpu_percent), 2) AS max_cpu, |
| | 225 | ROUND(AVG(memory_mb), 2) AS avg_mem_mb, |
| | 226 | ROUND(MAX(memory_mb), 2) AS max_mem_mb, |
| | 227 | COUNT(*) AS samples, |
| | 228 | MAX(timestamp) AS last_seen |
| | 229 | FROM filtered |
| | 230 | GROUP BY computer_id, process_name, username |
| | 231 | ) |
| | 232 | SELECT |
| | 233 | c.id AS computer_id, |
| | 234 | c.name AS computer_name, |
| | 235 | p.process_name, |
| | 236 | p.username, |
| | 237 | p.avg_cpu, p.max_cpu, |
| | 238 | p.avg_mem_mb, p.max_mem_mb, |
| | 239 | p.samples, |
| | 240 | p.last_seen |
| | 241 | FROM proc_stats p |
| | 242 | JOIN computers c ON c.id = p.computer_id |
| | 243 | WHERE c.tenant_id = ? |
| | 244 | AND c.env_name = ? |
| | 245 | ORDER BY p.avg_cpu DESC |
| | 246 | LIMIT ?; |
| | 247 | }}} |
| | 248 | |
| | 249 | === Solution Relational Algebra === |
| | 250 | |
| | 251 | {{{ |
| | 252 | π computer_id, computer_name, process_name, username, |
| | 253 | avg_cpu, max_cpu, avg_mem_mb, max_mem_mb, samples, last_seen ( |
| | 254 | |
| | 255 | γ computer_id, process_name, username; |
| | 256 | AVG(cpu_percent)→avg_cpu, MAX(cpu_percent)→max_cpu, |
| | 257 | AVG(memory_mb)→avg_mem_mb, MAX(memory_mb)→max_mem_mb, |
| | 258 | COUNT(*)→samples, MAX(timestamp)→last_seen ( |
| | 259 | σ timestamp≥T1 ∧ timestamp≤T2 (computer_processes_history) |
| | 260 | ) |
| | 261 | ⋈ computer_id=id |
| | 262 | σ tenant_id=TID ∧ env_name=ENV (computers) |
| | 263 | ) |
| | 264 | }}} |
| | 265 | |
| | 266 | ---- |
| | 267 | |
| | 268 | == Извештај 5: Sysmon активности (counts по event_type и компјутер) == |
| | 269 | |
| | 270 | Извештај кој ги брои Sysmon настаните по тип и компјутер во одреден период. Корисен за следење на системски активности и откривање на аномалии во однесувањето на машините. |
| | 271 | |
| | 272 | === Solution SQL === |
| | 273 | |
| | 274 | {{{ |
| | 275 | WITH filtered AS ( |
| | 276 | SELECT |
| | 277 | se.computer_id, |
| | 278 | se.event_type, |
| | 279 | se.timestamp |
| | 280 | FROM sysmon_events se |
| | 281 | WHERE se.timestamp BETWEEN ? AND ? |
| | 282 | ), |
| | 283 | agg AS ( |
| | 284 | SELECT |
| | 285 | computer_id, |
| | 286 | event_type, |
| | 287 | COUNT(*) AS event_count, |
| | 288 | MAX(timestamp) AS last_event |
| | 289 | FROM filtered |
| | 290 | GROUP BY computer_id, event_type |
| | 291 | ) |
| | 292 | SELECT |
| | 293 | c.id AS computer_id, |
| | 294 | c.name AS computer_name, |
| | 295 | a.event_type, |
| | 296 | a.event_count, |
| | 297 | a.last_event |
| | 298 | FROM agg a |
| | 299 | JOIN computers c ON c.id = a.computer_id |
| | 300 | WHERE c.tenant_id = ? |
| | 301 | AND c.env_name = ? |
| | 302 | ORDER BY a.event_count DESC |
| | 303 | LIMIT ?; |
| | 304 | }}} |
| | 305 | |
| | 306 | === Solution Relational Algebra === |
| | 307 | |
| | 308 | {{{ |
| | 309 | π computer_id, computer_name, event_type, event_count, last_event ( |
| | 310 | |
| | 311 | γ computer_id, event_type; |
| | 312 | COUNT(*)→event_count, MAX(timestamp)→last_event ( |
| | 313 | σ timestamp≥T1 ∧ timestamp≤T2 (sysmon_events) |
| | 314 | ) |
| | 315 | ⋈ computer_id=id |
| | 316 | σ tenant_id=TID ∧ env_name=ENV (computers) |
| | 317 | ) |
| | 318 | }}} |
| | 319 | |
| | 320 | ---- |
| | 321 | |
| | 322 | == Извештај 6: Детекција на компјутери со аномално висок број на Sysmon настани во споредба со просекот на environment-от == |
| | 323 | |
| | 324 | Овој извештај ги открива компјутерите чиј број на Sysmon настани значително го надминува просекот за целиот environment во зададен период. Служи за долгорочно откривање на машини со невообичаено однесување — потенцијални жртви на малициозен софтвер, неправилно конфигурирани апликации или напади. |
| | 325 | |
| | 326 | === Solution SQL === |
| | 327 | |
| | 328 | {{{ |
| | 329 | WITH event_counts AS ( |
| | 330 | SELECT |
| | 331 | se.computer_id, |
| | 332 | COUNT(*) AS total_events |
| | 333 | FROM sysmon_events se |
| | 334 | JOIN computers c ON c.id = se.computer_id |
| | 335 | WHERE c.tenant_id = ? |
| | 336 | AND c.env_name = ? |
| | 337 | AND se.timestamp BETWEEN ? AND ? |
| | 338 | GROUP BY se.computer_id |
| | 339 | ), |
| | 340 | env_stats AS ( |
| | 341 | SELECT |
| | 342 | AVG(total_events) AS avg_events, |
| | 343 | MAX(total_events) AS max_events, |
| | 344 | MIN(total_events) AS min_events |
| | 345 | FROM event_counts |
| | 346 | ), |
| | 347 | anomalies AS ( |
| | 348 | SELECT |
| | 349 | ec.computer_id, |
| | 350 | ec.total_events, |
| | 351 | es.avg_events, |
| | 352 | ROUND((ec.total_events - es.avg_events) / NULLIF(es.avg_events, 0) * 100, 2) AS pct_above_avg |
| | 353 | FROM event_counts ec |
| | 354 | CROSS JOIN env_stats es |
| | 355 | WHERE ec.total_events > es.avg_events * 1.5 |
| | 356 | ) |
| | 357 | SELECT |
| | 358 | c.id AS computer_id, |
| | 359 | c.name AS computer_name, |
| | 360 | c.ip AS computer_ip, |
| | 361 | c.user AS computer_user, |
| | 362 | a.total_events, |
| | 363 | ROUND(a.avg_events, 2) AS env_avg_events, |
| | 364 | a.pct_above_avg AS percent_above_average |
| | 365 | FROM anomalies a |
| | 366 | JOIN computers c ON c.id = a.computer_id |
| | 367 | ORDER BY a.pct_above_avg DESC; |
| | 368 | }}} |
| | 369 | |
| | 370 | === Solution Relational Algebra === |
| | 371 | |
| | 372 | {{{ |
| | 373 | -- Чекор 1: Броење на настани по компјутер |
| | 374 | EC ← γ computer_id; COUNT(*)→total_events ( |
| | 375 | σ timestamp≥T1 ∧ timestamp≤T2 (sysmon_events) |
| | 376 | ⋈ computer_id=id |
| | 377 | σ tenant_id=TID ∧ env_name=ENV (computers) |
| | 378 | ) |
| | 379 | |
| | 380 | -- Чекор 2: Статистики за целиот environment |
| | 381 | ES ← γ ; AVG(total_events)→avg_events (EC) |
| | 382 | |
| | 383 | -- Чекор 3: Крос производ и филтрирање на аномалии |
| | 384 | ANOMALIES ← σ total_events > avg_events * 1.5 (EC × ES) |
| | 385 | |
| | 386 | -- Чекор 4: Финална проекција со податоци за компјутерот |
| | 387 | π computer_id, computer_name, computer_ip, computer_user, |
| | 388 | total_events, avg_events, pct_above_avg ( |
| | 389 | ANOMALIES ⋈ computer_id=id (computers) |
| | 390 | ) |
| | 391 | }}} |
| | 392 | |
| | 393 | ---- |
| | 394 | |
| | 395 | == Извештај 7: Корелација помеѓу висока ресурсна потрошувачка и pojava на security alerts (по компјутер и период) == |
| | 396 | |
| | 397 | Овој извештај ги идентификува компјутерите каде периодите на висока CPU/RAM потрошувачка хронолошки се поклопуваат со зголемен број на безбедносни предупредувања. Тоа може да укаже на малициозни процеси кои истовремено трошат ресурси и предизвикуваат безбедносни настани. Корисен за квартални и годишни безбедносни анализи. |
| | 398 | |
| | 399 | === Solution SQL === |
| | 400 | |
| | 401 | {{{ |
| | 402 | WITH resource_peaks AS ( |
| | 403 | SELECT |
| | 404 | ch.computer_id, |
| | 405 | STRFTIME('%Y-%m-%dT%H', ch.timestamp) AS hour_bucket, |
| | 406 | ROUND(AVG(ch.cpu_usage), 2) AS avg_cpu, |
| | 407 | ROUND(AVG(ch.ram_usage), 2) AS avg_ram |
| | 408 | FROM computer_history ch |
| | 409 | JOIN computers c ON c.id = ch.computer_id |
| | 410 | WHERE c.tenant_id = ? |
| | 411 | AND c.env_name = ? |
| | 412 | AND ch.timestamp BETWEEN ? AND ? |
| | 413 | GROUP BY ch.computer_id, hour_bucket |
| | 414 | HAVING AVG(ch.cpu_usage) >= ? OR AVG(ch.ram_usage) >= ? |
| | 415 | ), |
| | 416 | alert_counts AS ( |
| | 417 | SELECT |
| | 418 | sa.computer_id, |
| | 419 | STRFTIME('%Y-%m-%dT%H', sa.timestamp) AS hour_bucket, |
| | 420 | COUNT(*) AS alerts_in_hour, |
| | 421 | SUM(CASE WHEN LOWER(sa.severity) IN ('critical','high') THEN 1 ELSE 0 END) AS high_sev_alerts |
| | 422 | FROM security_alerts sa |
| | 423 | JOIN computers c ON c.id = sa.computer_id |
| | 424 | WHERE c.tenant_id = ? |
| | 425 | AND c.env_name = ? |
| | 426 | AND sa.timestamp BETWEEN ? AND ? |
| | 427 | GROUP BY sa.computer_id, hour_bucket |
| | 428 | ), |
| | 429 | correlated AS ( |
| | 430 | SELECT |
| | 431 | rp.computer_id, |
| | 432 | rp.hour_bucket, |
| | 433 | rp.avg_cpu, |
| | 434 | rp.avg_ram, |
| | 435 | COALESCE(ac.alerts_in_hour, 0) AS alerts_in_hour, |
| | 436 | COALESCE(ac.high_sev_alerts, 0) AS high_sev_alerts |
| | 437 | FROM resource_peaks rp |
| | 438 | LEFT JOIN alert_counts ac |
| | 439 | ON ac.computer_id = rp.computer_id |
| | 440 | AND ac.hour_bucket = rp.hour_bucket |
| | 441 | ), |
| | 442 | summary AS ( |
| | 443 | SELECT |
| | 444 | computer_id, |
| | 445 | COUNT(*) AS peak_hours, |
| | 446 | SUM(alerts_in_hour) AS total_alerts_during_peaks, |
| | 447 | SUM(high_sev_alerts) AS total_high_sev_during_peaks, |
| | 448 | ROUND(AVG(avg_cpu), 2) AS mean_cpu_during_peaks, |
| | 449 | ROUND(AVG(avg_ram), 2) AS mean_ram_during_peaks |
| | 450 | FROM correlated |
| | 451 | GROUP BY computer_id |
| | 452 | ) |
| | 453 | SELECT |
| | 454 | c.id AS computer_id, |
| | 455 | c.name AS computer_name, |
| | 456 | c.ip AS computer_ip, |
| | 457 | s.peak_hours, |
| | 458 | s.mean_cpu_during_peaks, |
| | 459 | s.mean_ram_during_peaks, |
| | 460 | s.total_alerts_during_peaks, |
| | 461 | s.total_high_sev_during_peaks, |
| | 462 | ROUND( |
| | 463 | CAST(s.total_alerts_during_peaks AS REAL) / NULLIF(s.peak_hours, 0), |
| | 464 | 2 |
| | 465 | ) AS avg_alerts_per_peak_hour |
| | 466 | FROM summary s |
| | 467 | JOIN computers c ON c.id = s.computer_id |
| | 468 | ORDER BY s.total_high_sev_during_peaks DESC, |
| | 469 | s.total_alerts_during_peaks DESC; |
| | 470 | }}} |
| | 471 | |
| | 472 | === Solution Relational Algebra === |
| | 473 | |
| | 474 | {{{ |
| | 475 | -- Чекор 1: Временски зафати (peak часови) со висока CPU/RAM |
| | 476 | RP ← σ avg_cpu≥TCPU ∨ avg_ram≥TRAM ( |
| | 477 | γ computer_id, hour_bucket; |
| | 478 | AVG(cpu_usage)→avg_cpu, AVG(ram_usage)→avg_ram ( |
| | 479 | σ timestamp≥T1 ∧ timestamp≤T2 (computer_history) |
| | 480 | ⋈ computer_id=id |
| | 481 | σ tenant_id=TID ∧ env_name=ENV (computers) |
| | 482 | ) |
| | 483 | ) |
| | 484 | |
| | 485 | -- Чекор 2: Алерти агрегирани по час |
| | 486 | AC ← γ computer_id, hour_bucket; |
| | 487 | COUNT(*)→alerts_in_hour, |
| | 488 | COUNT(σ severity∈{'critical','high'})→high_sev_alerts ( |
| | 489 | σ timestamp≥T1 ∧ timestamp≤T2 (security_alerts) |
| | 490 | ⋈ computer_id=id |
| | 491 | σ tenant_id=TID ∧ env_name=ENV (computers) |
| | 492 | ) |
| | 493 | |
| | 494 | -- Чекор 3: Left outer join на peak часови со алерти |
| | 495 | CORR ← RP ⟕ (computer_id=computer_id ∧ hour_bucket=hour_bucket) AC |
| | 496 | |
| | 497 | -- Чекор 4: Сумаризација по компјутер |
| | 498 | SUM ← γ computer_id; |
| | 499 | COUNT(*)→peak_hours, |
| | 500 | SUM(alerts_in_hour)→total_alerts_during_peaks, |
| | 501 | SUM(high_sev_alerts)→total_high_sev_during_peaks, |
| | 502 | AVG(avg_cpu)→mean_cpu_during_peaks, |
| | 503 | AVG(avg_ram)→mean_ram_during_peaks (CORR) |
| | 504 | |
| | 505 | -- Чекор 5: Финална проекција |
| | 506 | π computer_id, computer_name, computer_ip, peak_hours, |
| | 507 | mean_cpu_during_peaks, mean_ram_during_peaks, |
| | 508 | total_alerts_during_peaks, total_high_sev_during_peaks, |
| | 509 | avg_alerts_per_peak_hour ( |
| | 510 | SUM ⋈ computer_id=id (computers) |
| | 511 | ) |
| | 512 | }}} |