Changes between Version 1 and Version 2 of AdvancedDatabaseDevelopment


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

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedDatabaseDevelopment

    v1 v2  
    11= Advanced Database Development =
    22
     3Забелешка: наменето за PostgreSQL '''project''' шемата (v04). Во v04:
     4security_alerts.id е INTEGER IDENTITY (не се внесува рачно), computer_id е INTEGER,
     5timestamp е TIMESTAMP, resolved е BOOLEAN. Затоа INSERT-ите не внесуваат id,
     6користат NOW() (не текст) и false (не 'false').
     7
    38== Автоматска детекција и пријавување на безбедносни аномалии ==
    49
    5 Системот треба автоматски да детектира невообичаено однесување на компјутерите и да генерира безбедносни предупредувања без рачна интервенција. Ова вклучува ситуации кога одреден компјутер генерира голем број Sysmon настани во краток период, или кога ресурсната потрошувачка (CPU, RAM) ги надминува критичните прагови. Без автоматска детекција, администраторите мора рачно да ги прегледуваат логовите, што е неефикасно и бавно.
     10Системот треба автоматски да детектира невообичаено однесување на компјутерите и да генерира безбедносни предупредувања без рачна интервенција. Ова вклучува ситуации кога одреден компјутер генерира голем број Sysmon настани во краток период, или кога ресурсната потрошувачка (CPU, RAM) ги надминува критичните прагови.
    611
    712=== Implementation ===
     
    1924  IF NEW.cpu_usage > 90 THEN
    2025    INSERT INTO security_alerts(
    21       id, computer_id, alert_type, severity,
     26      computer_id, alert_type, severity,
    2227      description, timestamp, resolved
    2328    )
    2429    VALUES (
    25       gen_random_uuid()::text,
    26       NEW.computer_id::text,
     30      NEW.computer_id,
    2731      'High CPU Usage',
    2832      'HIGH',
    2933      'CPU usage exceeded 90%',
    30       NOW()::text,
    31       'false'
     34      NOW(),
     35      false
    3236    );
    3337  END IF;
     
    3640$$ LANGUAGE plpgsql;
    3741
     42DROP TRIGGER IF EXISTS cpu_alert_trigger ON computer_history;
    3843CREATE TRIGGER cpu_alert_trigger
    3944AFTER INSERT ON computer_history
     
    5257  IF NEW.ram_usage > 90 THEN
    5358    INSERT INTO security_alerts(
    54       id, computer_id, alert_type, severity,
     59      computer_id, alert_type, severity,
    5560      description, timestamp, resolved
    5661    )
    5762    VALUES (
    58       gen_random_uuid()::text,
    59       NEW.computer_id::text,
     63      NEW.computer_id,
    6064      'High RAM Usage',
    6165      'HIGH',
    6266      'RAM usage exceeded 90%',
    63       NOW()::text,
    64       'false'
     67      NOW(),
     68      false
    6569    );
    6670  END IF;
     
    6973$$ LANGUAGE plpgsql;
    7074
     75DROP TRIGGER IF EXISTS ram_alert_trigger ON computer_history;
    7176CREATE TRIGGER ram_alert_trigger
    7277AFTER INSERT ON computer_history
     
    7883
    7984Процедура за детекција на сомнителна активност врз основа на Sysmon настани.
    80 Ако еден компјутер генерирал повеќе од 50 Sysmon настани во последниот час, автоматски се внесува безбедносно предупредување. Оваа процедура може да се извршува периодично (на пр. преку `pg_cron`):
     85Ако еден компјутер генерирал повеќе од 50 Sysmon настани во последниот час, автоматски се внесува безбедносно предупредување. Може да се извршува периодично (на пр. преку `pg_cron`):
    8186
    8287{{{
     
    8691BEGIN
    8792  INSERT INTO security_alerts(
    88     id, computer_id, alert_type, severity,
     93    computer_id, alert_type, severity,
    8994    description, timestamp, resolved
    9095  )
    9196  SELECT
    92     gen_random_uuid()::text,
    93     computer_id::text,
     97    computer_id,
    9498    'Suspicious Activity',
    9599    'HIGH',
    96100    'More than 50 Sysmon events in the last hour',
    97     NOW()::text,
    98     'false'
     101    NOW(),
     102    false
    99103  FROM sysmon_events
    100   WHERE CAST(timestamp AS timestamp) > NOW() - INTERVAL '1 hour'
     104  WHERE timestamp > NOW() - INTERVAL '1 hour'
    101105  GROUP BY computer_id
    102106  HAVING COUNT(*) > 50;
     
    108112
    109113Поглед за безбедносен преглед на системот.
    110 Обезбедува брз преглед на вкупниот број Sysmon настани по компјутер, корисен за администраторите при секојдневен мониторинг:
    111 
    112 {{{
    113 CREATE VIEW security_summary_view AS
     114Обезбедува брз преглед на вкупниот број Sysmon настани по компјутер:
     115
     116{{{
     117CREATE OR REPLACE VIEW security_summary_view AS
    114118SELECT
    115119  c.name,
     
    124128== Автоматско одржување и чистење на историски податоци ==
    125129
    126 Со текот на времето, табелите со историски податоци (`sysmon_events`, `computer_history`) акумулираат голем број записи кои ги успоруваат пребарувањата и ја зголемуваат потрошувачката на дисковен простор. Потребен е механизам за автоматско бришење на застарени записи без рачна интервенција, со цел одржување на перформансите на системот на долг рок.
     130Со текот на времето, историските табели (`sysmon_events`, `computer_history`, `computer_processes_history`, `network_connections_history`) акумулираат голем број записи кои ги успоруваат пребарувањата и го зголемуваат дисковниот простор. Потребен е механизам за автоматско бришење застарени записи.
    127131
    128132=== Implementation ===
     
    130134==== Stored Procedures/Functions ====
    131135
    132 Процедура за автоматско отстранување на стари Sysmon логови (постари од 90 дена):
     136Процедура за отстранување стари Sysmon логови (постари од 90 дена):
    133137
    134138{{{
     
    138142BEGIN
    139143  DELETE FROM sysmon_events
    140   WHERE CAST(timestamp AS timestamp) < NOW() - INTERVAL '90 days';
    141 END;
    142 $$;
    143 }}}
    144 
    145 Процедура за автоматско отстранување на стари записи од `computer_history` (постари од 180 дена):
     144  WHERE timestamp < NOW() - INTERVAL '90 days';
     145END;
     146$$;
     147}}}
     148
     149Процедура за отстранување стари записи од `computer_history` (постари од 180 дена):
    146150
    147151{{{
     
    151155BEGIN
    152156  DELETE FROM computer_history
    153   WHERE CAST(timestamp AS timestamp) < NOW() - INTERVAL '180 days';
    154 END;
    155 $$;
    156 }}}
    157 
    158 Двете процедури може да се закажат за периодично извршување преку `pg_cron`:
    159 
    160 {{{
    161 -- Извршување секој ден во полноќ
     157  WHERE timestamp < NOW() - INTERVAL '180 days';
     158END;
     159$$;
     160}}}
     161
     162Процедура за чистење на историските табели за процеси и мрежни конекции (v04), постари од 90 дена:
     163
     164{{{
     165CREATE OR REPLACE PROCEDURE cleanup_old_history()
     166LANGUAGE plpgsql AS
     167$$
     168BEGIN
     169  DELETE FROM computer_processes_history
     170  WHERE timestamp < NOW() - INTERVAL '90 days';
     171
     172  DELETE FROM network_connections_history
     173  WHERE timestamp < NOW() - INTERVAL '90 days';
     174END;
     175$$;
     176}}}
     177
     178Процедурите може да се закажат за периодично извршување преку `pg_cron`:
     179
     180{{{
     181-- Извршување секој ден во раните утрински часови
    162182SELECT cron.schedule('0 0 * * *', $$CALL cleanup_old_sysmon_events()$$);
    163183SELECT cron.schedule('0 1 * * *', $$CALL cleanup_old_computer_history()$$);
     184SELECT cron.schedule('0 2 * * *', $$CALL cleanup_old_history()$$);
    164185}}}
    165186
     
    168189== Аналитички погледи за брз пристап до системски информации ==
    169190
    170 Администраторите и апликацијата честопати бараат консолидирани информации за состојбата на компјутерите и нивната активност. Директното пресметување на овие информации при секое барање е бавно кога базата содржи голем број записи. Погледите и материјализираните погледи овозможуваат побрз пристап до вакви статистики.
     191Администраторите и апликацијата честопати бараат консолидирани информации за состојбата на компјутерите. Директното пресметување при секое барање е бавно кога базата содржи голем број записи. Погледите и материјализираните погледи овозможуваат побрз пристап.
    171192
    172193=== Implementation ===
     
    175196
    176197Детален поглед на компјутерите.
    177 Консолидиран приказ на основните информации за сите компјутери во системот, без потреба од повторување на JOIN логиката во апликацијата:
    178 
    179 {{{
    180 CREATE VIEW computer_details_view AS
     198Консолидиран приказ на основните информации за сите компјутери:
     199
     200{{{
     201CREATE OR REPLACE VIEW computer_details_view AS
    181202SELECT
    182203  name,
     
    190211
    191212Поглед за активни (online) компјутери.
    192 Прикажува само компјутери кои биле активни во последните 5 минути, корисен за real-time dashboard:
    193 
    194 {{{
    195 CREATE VIEW active_computers_view AS
     213Прикажува само компјутери активни во последните 5 минути, корисен за real-time dashboard:
     214
     215{{{
     216CREATE OR REPLACE VIEW active_computers_view AS
    196217SELECT
    197218  c.id,
     
    201222  c.last_seen
    202223FROM computers c
    203 WHERE CAST(c.last_seen AS timestamp) >= NOW() - INTERVAL '5 minutes';
     224WHERE c.last_seen >= NOW() - INTERVAL '5 minutes';
    204225}}}
    205226
     
    207228
    208229Материјализиран поглед за најактивни компјутери.
    209 За разлика од обичните погледи, резултатите се физички зачувани, што овозможува значително побрзо извршување на аналитички пребарувања врз голем број историски записи:
    210 
    211 {{{
    212 CREATE MATERIALIZED VIEW most_active_computers AS
     230Резултатите се физички зачувани, што овозможува побрзо извршување на аналитички пребарувања врз голем број историски записи:
     231
     232{{{
     233CREATE MATERIALIZED VIEW IF NOT EXISTS most_active_computers AS
    213234SELECT
    214235  c.id,
     
    220241}}}
    221242
    222 Рачно освежување на материјализираниот поглед (може да се закаже периодично):
     243Рачно (или закажано) освежување на материјализираниот поглед:
    223244
    224245{{{
     
    230251== Статистички извештаи по околини (environments) ==
    231252
    232 Администраторите треба да имаат увид во тоа колку компјутери се регистрирани во секоја околина, со цел следење на растот на системот и планирање на капацитети. Оваа информација е корисна за квартални извештаи и при носење одлуки за скалирање.
     253Администраторите треба увид во тоа колку компјутери се регистрирани во секоја околина, за следење на растот и планирање капацитети.
    233254
    234255=== Implementation ===
     
    236257==== Stored Procedures/Functions ====
    237258
    238 Процедура за генерирање статистика по околини.
    239 Ја пресметува и ја испечатува (RAISE NOTICE) распределбата на компјутери по секоја околина:
     259Процедура за генерирање статистика по околини (RAISE NOTICE):
    240260
    241261{{{
     
    258278}}}
    259279
    260 Функција која враќа статистика по околини во форма на табела (погодна за употреба во апликацијата):
     280Функција која враќа статистика по околини во форма на табела (погодна за апликацијата):
    261281
    262282{{{