Changes between Version 1 and Version 2 of AdvancedReports


Ignore:
Timestamp:
08/23/26 20:11:43 (4 days ago)
Author:
231118
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedReports

    v1 v2  
    11= Advanced Reports =
    22
    3 == Извештај 1: Детален извештај: Top outbound конекции по процес (по tenant/env и период) ==
     3Забелешка: SQL-от е напишан за официјалната PostgreSQL '''project''' шема (v04).
     4Параметрите (?) се временски граници / tenant / env / прагови.
     5За SQLite прототипот важат ситни разлики: resolved = false -> resolved = 0,
     6to_char(...) -> strftime(...), а ::numeric cast-овите не се потребни.
     7
     8== Извештај 1: Top outbound конекции по процес (по tenant/env и период) ==
    49
    510Извештај кој ги прикажува процесите кои воспоставуваат најмногу излезни мрежни конекции во рамките на одреден tenant и environment, за зададен временски период. Корисен за откривање на сомнителни или необично активни процеси на мрежно ниво.
     
    1520    nc.remote_address,
    1621    nc.timestamp
    17   FROM network_connections nc
     22  FROM network_connections_history nc
    1823  WHERE nc.timestamp BETWEEN ? AND ?
    1924),
     
    5358  γ computer_id, process_name, pid;
    5459    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)
    5661    )
    5762  ⋈ computer_id=id
     
    8287    computer_id,
    8388    COUNT(*) AS total_alerts,
    84     SUM(CASE WHEN resolved = 0 THEN 1 ELSE 0 END) AS unresolved_alerts,
     89    SUM(CASE WHEN resolved = false THEN 1 ELSE 0 END) AS unresolved_alerts,
    8590    SUM(CASE WHEN LOWER(severity) = 'critical' THEN 1 ELSE 0 END) AS sev_critical,
    8691    SUM(CASE WHEN LOWER(severity) = 'high' THEN 1 ELSE 0 END) AS sev_high,
     
    116121  γ computer_id;
    117122    COUNT(*)→total_alerts,
    118     COUNT(σ resolved=0)→unresolved_alerts,
     123    COUNT(σ resolved=false)→unresolved_alerts,
    119124    COUNT(σ severity='critical')→sev_critical,
    120125    COUNT(σ severity='high')→sev_high,
     
    133138== Извештај 3: Resource hotspots (CPU/RAM/DISK) по компјутер со прагови ==
    134139
    135 Извештај кој ги идентификува компјутерите со критично висока просечна или максимална потрошувачка на CPU, RAM или диск во зadadен период. Корисен за планирање на капацитети и откривање на преоптоварени машини.
     140Извештај кој ги идентификува компјутерите со критично висока просечна или максимална потрошувачка на CPU, RAM или диск во зададен период. Корисен за планирање на капацитети и откривање на преоптоварени машини.
    136141
    137142=== Solution SQL ===
     
    151156  SELECT
    152157    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,
    159164    MAX(timestamp) AS last_sample
    160165  FROM filtered
     
    221226    process_name,
    222227    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,
    227232    COUNT(*) AS samples,
    228233    MAX(timestamp) AS last_seen
     
    320325----
    321326
    322 == Извештај 6: Детекција на компјутери со аномално висок број на Sysmon настани во споредба со просекот на environment-от ==
    323 
    324 Овој извештај ги открива компјутерите чиј број на Sysmon настани значително го надминува просекот за целиот environment во зададен период. Служи за долгорочно откривање на машини со невообичаено однесување — потенцијални жртви на малициозен софтвер, неправилно конфигурирани апликации или напади.
     327== Извештај 6: Детекција на компјутери со аномално висок број Sysmon настани во споредба со просекот на environment-от ==
     328
     329Овој извештај ги открива компјутерите чиј број на Sysmon настани значително го надминува просекот за целиот environment во зададен период. Служи за долгорочно откривање на машини со невообичаено однесување.
    325330
    326331=== Solution SQL ===
     
    340345env_stats AS (
    341346  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
    345348  FROM event_counts
    346349),
     
    359362  c.name AS computer_name,
    360363  c.ip AS computer_ip,
    361   c.user AS computer_user,
     364  c."user" AS computer_user,
    362365  a.total_events,
    363366  ROUND(a.avg_events, 2) AS env_avg_events,
     
    393396----
    394397
    395 == Извештај 7: Корелација помеѓу висока ресурсна потрошувачка и pojava на security alerts (по компјутер и период) ==
    396 
    397 Овој извештај ги идентификува компјутерите каде периодите на висока CPU/RAM потрошувачка хронолошки се поклопуваат со зголемен број на безбедносни предупредувања. Тоа може да укаже на малициозни процеси кои истовремено трошат ресурси и предизвикуваат безбедносни настани. Корисен за квартални и годишни безбедносни анализи.
     398== Извештај 7: Корелација помеѓу висока ресурсна потрошувачка и појава на security alerts (по компјутер и период) ==
     399
     400Овој извештај ги идентификува компјутерите каде периодите на висока CPU/RAM потрошувачка хронолошки се поклопуваат со зголемен број безбедносни предупредувања. Корисен за квартални и годишни безбедносни анализи.
    398401
    399402=== Solution SQL ===
     
    403406  SELECT
    404407    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    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
    408411  FROM computer_history ch
    409412  JOIN computers c ON c.id = ch.computer_id
     
    411414    AND c.env_name = ?
    412415    AND ch.timestamp BETWEEN ? AND ?
    413   GROUP BY ch.computer_id, hour_bucket
     416  GROUP BY ch.computer_id, to_char(ch.timestamp, 'YYYY-MM-DD"T"HH24')
    414417  HAVING AVG(ch.cpu_usage) >= ? OR AVG(ch.ram_usage) >= ?
    415418),
     
    417420  SELECT
    418421    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,
    420423    COUNT(*)                              AS alerts_in_hour,
    421424    SUM(CASE WHEN LOWER(sa.severity) IN ('critical','high') THEN 1 ELSE 0 END) AS high_sev_alerts
     
    425428    AND c.env_name = ?
    426429    AND sa.timestamp BETWEEN ? AND ?
    427   GROUP BY sa.computer_id, hour_bucket
     430  GROUP BY sa.computer_id, to_char(sa.timestamp, 'YYYY-MM-DD"T"HH24')
    428431),
    429432correlated AS (
     
    446449    SUM(alerts_in_hour)             AS total_alerts_during_peaks,
    447450    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
     451    ROUND(AVG(avg_cpu)::numeric, 2) AS mean_cpu_during_peaks,
     452    ROUND(AVG(avg_ram)::numeric, 2) AS mean_ram_during_peaks
    450453  FROM correlated
    451454  GROUP BY computer_id
     
    461464  s.total_high_sev_during_peaks,
    462465  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),
    464467    2
    465468  ) AS avg_alerts_per_peak_hour
     
    473476
    474477{{{
    475 -- Чекор 1: Временски зафати (peak часови) со висока CPU/RAM
     478-- Чекор 1: Peak часови со висока CPU/RAM
    476479RP ← σ avg_cpu≥TCPU ∨ avg_ram≥TRAM (
    477480  γ computer_id, hour_bucket;
     
    511514)
    512515}}}
     516
     517----
     518
     519== Извештај 8 (напреден): Достапност (uptime) на мрежни сервиси по компјутер ==
     520
     521Извештај кој за секој мрежен сервис (порта/протокол) што го изложуваат компјутерите пресметува процент на достапност (uptime %) и просечно време на одговор во зададен период. Ги користи напредните табели network_services и service_availability. Корисен за откривање на нестабилни или недостапни сервиси.
     522
     523=== Solution SQL ===
     524
     525{{{
     526WITH 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),
     538agg 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)
     551SELECT
     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
     561FROM agg a
     562JOIN computers c ON c.id = a.computer_id
     563WHERE c.tenant_id = ?
     564  AND c.env_name = ?
     565ORDER 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}}}