Changes between Initial Version and Version 1 of AdvancedReports


Ignore:
Timestamp:
07/07/26 18:49:42 (6 hours ago)
Author:
231118
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedReports

    v1 v1  
     1= Advanced Reports =
     2
     3== Извештај 1: Детален извештај: Top outbound конекции по процес (по tenant/env и период) ==
     4
     5Извештај кој ги прикажува процесите кои воспоставуваат најмногу излезни мрежни конекции во рамките на одреден tenant и environment, за зададен временски период. Корисен за откривање на сомнителни или необично активни процеси на мрежно ниво.
     6
     7=== Solution SQL ===
     8
     9{{{
     10WITH 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),
     20agg 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)
     31SELECT
     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
     41FROM agg a
     42JOIN computers c ON c.id = a.computer_id
     43WHERE c.tenant_id = ?
     44  AND c.env_name = ?
     45ORDER BY a.total_connections DESC
     46LIMIT ?;
     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{{{
     71WITH 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),
     80agg 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)
     93SELECT
     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
     103FROM agg a
     104JOIN computers c ON c.id = a.computer_id
     105WHERE c.tenant_id = ?
     106  AND c.env_name = ?
     107ORDER 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{{{
     140WITH 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),
     150stats 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)
     163SELECT
     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
     170FROM stats s
     171JOIN computers c ON c.id = s.computer_id
     172WHERE c.tenant_id = ?
     173  AND c.env_name = ?
     174  AND (s.max_cpu >= ? OR s.max_ram >= ? OR s.max_disk >= ?)
     175ORDER 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{{{
     207WITH 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),
     218proc_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)
     232SELECT
     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
     241FROM proc_stats p
     242JOIN computers c ON c.id = p.computer_id
     243WHERE c.tenant_id = ?
     244  AND c.env_name = ?
     245ORDER BY p.avg_cpu DESC
     246LIMIT ?;
     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{{{
     275WITH 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),
     283agg 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)
     292SELECT
     293  c.id AS computer_id,
     294  c.name AS computer_name,
     295  a.event_type,
     296  a.event_count,
     297  a.last_event
     298FROM agg a
     299JOIN computers c ON c.id = a.computer_id
     300WHERE c.tenant_id = ?
     301  AND c.env_name = ?
     302ORDER BY a.event_count DESC
     303LIMIT ?;
     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{{{
     329WITH 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),
     340env_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),
     347anomalies 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)
     357SELECT
     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
     365FROM anomalies a
     366JOIN computers c ON c.id = a.computer_id
     367ORDER BY a.pct_above_avg DESC;
     368}}}
     369
     370=== Solution Relational Algebra ===
     371
     372{{{
     373-- Чекор 1: Броење на настани по компјутер
     374EC ← γ 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
     381ES ← γ ; AVG(total_events)→avg_events (EC)
     382
     383-- Чекор 3: Крос производ и филтрирање на аномалии
     384ANOMALIES ← σ 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{{{
     402WITH 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),
     416alert_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),
     429correlated 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),
     442summary 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)
     453SELECT
     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
     466FROM summary s
     467JOIN computers c ON c.id = s.computer_id
     468ORDER 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
     476RP ← σ 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: Алерти агрегирани по час
     486AC ← γ 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 часови со алерти
     495CORR ← RP ⟕ (computer_id=computer_id ∧ hour_bucket=hour_bucket) AC
     496
     497-- Чекор 4: Сумаризација по компјутер
     498SUM ← γ 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}}}