Changes between Version 1 and Version 2 of AdvancedReports
- Timestamp:
- 08/23/26 20:11:43 (4 days ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
AdvancedReports
v1 v2 1 1 = Advanced Reports = 2 2 3 == Извештај 1: Детален извештај: Top outbound конекции по процес (по tenant/env и период) == 3 Забелешка: SQL-от е напишан за официјалната PostgreSQL '''project''' шема (v04). 4 Параметрите (?) се временски граници / tenant / env / прагови. 5 За SQLite прототипот важат ситни разлики: resolved = false -> resolved = 0, 6 to_char(...) -> strftime(...), а ::numeric cast-овите не се потребни. 7 8 == Извештај 1: Top outbound конекции по процес (по tenant/env и период) == 4 9 5 10 Извештај кој ги прикажува процесите кои воспоставуваат најмногу излезни мрежни конекции во рамките на одреден tenant и environment, за зададен временски период. Корисен за откривање на сомнителни или необично активни процеси на мрежно ниво. … … 15 20 nc.remote_address, 16 21 nc.timestamp 17 FROM network_connections nc22 FROM network_connections_history nc 18 23 WHERE nc.timestamp BETWEEN ? AND ? 19 24 ), … … 53 58 γ computer_id, process_name, pid; 54 59 COUNT(*)→total_connections, COUNT(DISTINCT remote_address)→unique_remotes, MAX(timestamp)→last_seen_connection ( 55 σ timestamp≥T1 ∧ timestamp≤T2 (network_connections )60 σ timestamp≥T1 ∧ timestamp≤T2 (network_connections_history) 56 61 ) 57 62 ⋈ computer_id=id … … 82 87 computer_id, 83 88 COUNT(*) AS total_alerts, 84 SUM(CASE WHEN resolved = 0THEN 1 ELSE 0 END) AS unresolved_alerts,89 SUM(CASE WHEN resolved = false THEN 1 ELSE 0 END) AS unresolved_alerts, 85 90 SUM(CASE WHEN LOWER(severity) = 'critical' THEN 1 ELSE 0 END) AS sev_critical, 86 91 SUM(CASE WHEN LOWER(severity) = 'high' THEN 1 ELSE 0 END) AS sev_high, … … 116 121 γ computer_id; 117 122 COUNT(*)→total_alerts, 118 COUNT(σ resolved= 0)→unresolved_alerts,123 COUNT(σ resolved=false)→unresolved_alerts, 119 124 COUNT(σ severity='critical')→sev_critical, 120 125 COUNT(σ severity='high')→sev_high, … … 133 138 == Извештај 3: Resource hotspots (CPU/RAM/DISK) по компјутер со прагови == 134 139 135 Извештај кој ги идентификува компјутерите со критично висока просечна или максимална потрошувачка на CPU, RAM или диск во з adadен период. Корисен за планирање на капацитети и откривање на преоптоварени машини.140 Извештај кој ги идентификува компјутерите со критично висока просечна или максимална потрошувачка на CPU, RAM или диск во зададен период. Корисен за планирање на капацитети и откривање на преоптоварени машини. 136 141 137 142 === Solution SQL === … … 151 156 SELECT 152 157 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,158 ROUND(AVG(cpu_usage)::numeric, 2) AS avg_cpu, 159 ROUND(MAX(cpu_usage)::numeric, 2) AS max_cpu, 160 ROUND(AVG(ram_usage)::numeric, 2) AS avg_ram, 161 ROUND(MAX(ram_usage)::numeric, 2) AS max_ram, 162 ROUND(AVG(disk_usage)::numeric, 2) AS avg_disk, 163 ROUND(MAX(disk_usage)::numeric, 2) AS max_disk, 159 164 MAX(timestamp) AS last_sample 160 165 FROM filtered … … 221 226 process_name, 222 227 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,228 ROUND(AVG(cpu_percent)::numeric, 2) AS avg_cpu, 229 ROUND(MAX(cpu_percent)::numeric, 2) AS max_cpu, 230 ROUND(AVG(memory_mb)::numeric, 2) AS avg_mem_mb, 231 ROUND(MAX(memory_mb)::numeric, 2) AS max_mem_mb, 227 232 COUNT(*) AS samples, 228 233 MAX(timestamp) AS last_seen … … 320 325 ---- 321 326 322 == Извештај 6: Детекција на компјутери со аномално висок број наSysmon настани во споредба со просекот на environment-от ==323 324 Овој извештај ги открива компјутерите чиј број на Sysmon настани значително го надминува просекот за целиот environment во зададен период. Служи за долгорочно откривање на машини со невообичаено однесување — потенцијални жртви на малициозен софтвер, неправилно конфигурирани апликации или напади.327 == Извештај 6: Детекција на компјутери со аномално висок број Sysmon настани во споредба со просекот на environment-от == 328 329 Овој извештај ги открива компјутерите чиј број на Sysmon настани значително го надминува просекот за целиот environment во зададен период. Служи за долгорочно откривање на машини со невообичаено однесување. 325 330 326 331 === Solution SQL === … … 340 345 env_stats AS ( 341 346 SELECT 342 AVG(total_events) AS avg_events, 343 MAX(total_events) AS max_events, 344 MIN(total_events) AS min_events 347 AVG(total_events) AS avg_events 345 348 FROM event_counts 346 349 ), … … 359 362 c.name AS computer_name, 360 363 c.ip AS computer_ip, 361 c. userAS computer_user,364 c."user" AS computer_user, 362 365 a.total_events, 363 366 ROUND(a.avg_events, 2) AS env_avg_events, … … 393 396 ---- 394 397 395 == Извештај 7: Корелација помеѓу висока ресурсна потрошувачка и pojavaна security alerts (по компјутер и период) ==396 397 Овој извештај ги идентификува компјутерите каде периодите на висока CPU/RAM потрошувачка хронолошки се поклопуваат со зголемен број на безбедносни предупредувања. Тоа може да укаже на малициозни процеси кои истовремено трошат ресурси и предизвикуваат безбедносни настани. Корисен за квартални и годишни безбедносни анализи.398 == Извештај 7: Корелација помеѓу висока ресурсна потрошувачка и појава на security alerts (по компјутер и период) == 399 400 Овој извештај ги идентификува компјутерите каде периодите на висока CPU/RAM потрошувачка хронолошки се поклопуваат со зголемен број безбедносни предупредувања. Корисен за квартални и годишни безбедносни анализи. 398 401 399 402 === Solution SQL === … … 403 406 SELECT 404 407 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_ram408 to_char(ch.timestamp, 'YYYY-MM-DD"T"HH24') AS hour_bucket, 409 ROUND(AVG(ch.cpu_usage)::numeric, 2) AS avg_cpu, 410 ROUND(AVG(ch.ram_usage)::numeric, 2) AS avg_ram 408 411 FROM computer_history ch 409 412 JOIN computers c ON c.id = ch.computer_id … … 411 414 AND c.env_name = ? 412 415 AND ch.timestamp BETWEEN ? AND ? 413 GROUP BY ch.computer_id, hour_bucket416 GROUP BY ch.computer_id, to_char(ch.timestamp, 'YYYY-MM-DD"T"HH24') 414 417 HAVING AVG(ch.cpu_usage) >= ? OR AVG(ch.ram_usage) >= ? 415 418 ), … … 417 420 SELECT 418 421 sa.computer_id, 419 STRFTIME('%Y-%m-%dT%H', sa.timestamp) AS hour_bucket,422 to_char(sa.timestamp, 'YYYY-MM-DD"T"HH24') AS hour_bucket, 420 423 COUNT(*) AS alerts_in_hour, 421 424 SUM(CASE WHEN LOWER(sa.severity) IN ('critical','high') THEN 1 ELSE 0 END) AS high_sev_alerts … … 425 428 AND c.env_name = ? 426 429 AND sa.timestamp BETWEEN ? AND ? 427 GROUP BY sa.computer_id, hour_bucket430 GROUP BY sa.computer_id, to_char(sa.timestamp, 'YYYY-MM-DD"T"HH24') 428 431 ), 429 432 correlated AS ( … … 446 449 SUM(alerts_in_hour) AS total_alerts_during_peaks, 447 450 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_peaks451 ROUND(AVG(avg_cpu)::numeric, 2) AS mean_cpu_during_peaks, 452 ROUND(AVG(avg_ram)::numeric, 2) AS mean_ram_during_peaks 450 453 FROM correlated 451 454 GROUP BY computer_id … … 461 464 s.total_high_sev_during_peaks, 462 465 ROUND( 463 CAST(s.total_alerts_during_peaks AS REAL)/ NULLIF(s.peak_hours, 0),466 s.total_alerts_during_peaks::numeric / NULLIF(s.peak_hours, 0), 464 467 2 465 468 ) AS avg_alerts_per_peak_hour … … 473 476 474 477 {{{ 475 -- Чекор 1: Временски зафати (peak часови)со висока CPU/RAM478 -- Чекор 1: Peak часови со висока CPU/RAM 476 479 RP ← σ avg_cpu≥TCPU ∨ avg_ram≥TRAM ( 477 480 γ computer_id, hour_bucket; … … 511 514 ) 512 515 }}} 516 517 ---- 518 519 == Извештај 8 (напреден): Достапност (uptime) на мрежни сервиси по компјутер == 520 521 Извештај кој за секој мрежен сервис (порта/протокол) што го изложуваат компјутерите пресметува процент на достапност (uptime %) и просечно време на одговор во зададен период. Ги користи напредните табели network_services и service_availability. Корисен за откривање на нестабилни или недостапни сервиси. 522 523 === Solution SQL === 524 525 {{{ 526 WITH checks AS ( 527 SELECT 528 ns.computer_id, 529 ns.service_name, 530 ns.port, 531 ns.protocol, 532 sa.is_available, 533 sa.response_time_ms 534 FROM network_services ns 535 JOIN service_availability sa ON sa.service_id = ns.id 536 WHERE sa.timestamp BETWEEN ? AND ? 537 ), 538 agg AS ( 539 SELECT 540 computer_id, 541 service_name, 542 port, 543 protocol, 544 COUNT(*) AS total_checks, 545 SUM(CASE WHEN is_available THEN 1 ELSE 0 END) AS up_checks, 546 ROUND(100.0 * SUM(CASE WHEN is_available THEN 1 ELSE 0 END) / COUNT(*), 2) AS uptime_pct, 547 ROUND(AVG(response_time_ms)::numeric, 2) AS avg_response_ms 548 FROM checks 549 GROUP BY computer_id, service_name, port, protocol 550 ) 551 SELECT 552 c.id AS computer_id, 553 c.name AS computer_name, 554 a.service_name, 555 a.port, 556 a.protocol, 557 a.total_checks, 558 a.up_checks, 559 a.uptime_pct, 560 a.avg_response_ms 561 FROM agg a 562 JOIN computers c ON c.id = a.computer_id 563 WHERE c.tenant_id = ? 564 AND c.env_name = ? 565 ORDER BY a.uptime_pct ASC, a.avg_response_ms DESC; 566 }}} 567 568 === Solution Relational Algebra === 569 570 {{{ 571 π computer_id, computer_name, service_name, port, protocol, 572 total_checks, up_checks, uptime_pct, avg_response_ms ( 573 574 γ computer_id, service_name, port, protocol; 575 COUNT(*)→total_checks, 576 COUNT(σ is_available=true)→up_checks, 577 AVG(response_time_ms)→avg_response_ms ( 578 network_services ⋈ id=service_id ( 579 σ timestamp≥T1 ∧ timestamp≤T2 (service_availability) 580 ) 581 ) 582 ⋈ computer_id=id 583 σ tenant_id=TID ∧ env_name=ENV (computers) 584 ) 585 586 -- uptime_pct = 100 * up_checks / total_checks (изведено во проекцијата) 587 }}}
