Changes between Initial Version and Version 1 of AdvancedDatabaseDevelopment


Ignore:
Timestamp:
07/07/26 18:50:47 (6 hours ago)
Author:
231118
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedDatabaseDevelopment

    v1 v1  
     1= Advanced Database Development =
     2
     3== Автоматска детекција и пријавување на безбедносни аномалии ==
     4
     5Системот треба автоматски да детектира невообичаено однесување на компјутерите и да генерира безбедносни предупредувања без рачна интервенција. Ова вклучува ситуации кога одреден компјутер генерира голем број Sysmon настани во краток период, или кога ресурсната потрошувачка (CPU, RAM) ги надминува критичните прагови. Без автоматска детекција, администраторите мора рачно да ги прегледуваат логовите, што е неефикасно и бавно.
     6
     7=== Implementation ===
     8
     9==== Triggers ====
     10
     11Тригер за автоматско предупредување при висока искористеност на процесорот.
     12Кога во `computer_history` се вметнува нов запис со CPU > 90%, автоматски се креира запис во `security_alerts`:
     13
     14{{{
     15CREATE OR REPLACE FUNCTION create_cpu_alert()
     16RETURNS TRIGGER AS
     17$$
     18BEGIN
     19  IF NEW.cpu_usage > 90 THEN
     20    INSERT INTO security_alerts(
     21      id, computer_id, alert_type, severity,
     22      description, timestamp, resolved
     23    )
     24    VALUES (
     25      gen_random_uuid()::text,
     26      NEW.computer_id::text,
     27      'High CPU Usage',
     28      'HIGH',
     29      'CPU usage exceeded 90%',
     30      NOW()::text,
     31      'false'
     32    );
     33  END IF;
     34  RETURN NEW;
     35END;
     36$$ LANGUAGE plpgsql;
     37
     38CREATE TRIGGER cpu_alert_trigger
     39AFTER INSERT ON computer_history
     40FOR EACH ROW
     41EXECUTE FUNCTION create_cpu_alert();
     42}}}
     43
     44Тригер за автоматско предупредување при висока искористеност на RAM меморијата.
     45Кога во `computer_history` се вметнува нов запис со RAM > 90%, автоматски се креира запис во `security_alerts`:
     46
     47{{{
     48CREATE OR REPLACE FUNCTION create_ram_alert()
     49RETURNS TRIGGER AS
     50$$
     51BEGIN
     52  IF NEW.ram_usage > 90 THEN
     53    INSERT INTO security_alerts(
     54      id, computer_id, alert_type, severity,
     55      description, timestamp, resolved
     56    )
     57    VALUES (
     58      gen_random_uuid()::text,
     59      NEW.computer_id::text,
     60      'High RAM Usage',
     61      'HIGH',
     62      'RAM usage exceeded 90%',
     63      NOW()::text,
     64      'false'
     65    );
     66  END IF;
     67  RETURN NEW;
     68END;
     69$$ LANGUAGE plpgsql;
     70
     71CREATE TRIGGER ram_alert_trigger
     72AFTER INSERT ON computer_history
     73FOR EACH ROW
     74EXECUTE FUNCTION create_ram_alert();
     75}}}
     76
     77==== Stored Procedures/Functions ====
     78
     79Процедура за детекција на сомнителна активност врз основа на Sysmon настани.
     80Ако еден компјутер генерирал повеќе од 50 Sysmon настани во последниот час, автоматски се внесува безбедносно предупредување. Оваа процедура може да се извршува периодично (на пр. преку `pg_cron`):
     81
     82{{{
     83CREATE OR REPLACE PROCEDURE detect_security_anomalies()
     84LANGUAGE plpgsql AS
     85$$
     86BEGIN
     87  INSERT INTO security_alerts(
     88    id, computer_id, alert_type, severity,
     89    description, timestamp, resolved
     90  )
     91  SELECT
     92    gen_random_uuid()::text,
     93    computer_id::text,
     94    'Suspicious Activity',
     95    'HIGH',
     96    'More than 50 Sysmon events in the last hour',
     97    NOW()::text,
     98    'false'
     99  FROM sysmon_events
     100  WHERE CAST(timestamp AS timestamp) > NOW() - INTERVAL '1 hour'
     101  GROUP BY computer_id
     102  HAVING COUNT(*) > 50;
     103END;
     104$$;
     105}}}
     106
     107==== Views ====
     108
     109Поглед за безбедносен преглед на системот.
     110Обезбедува брз преглед на вкупниот број Sysmon настани по компјутер, корисен за администраторите при секојдневен мониторинг:
     111
     112{{{
     113CREATE VIEW security_summary_view AS
     114SELECT
     115  c.name,
     116  COUNT(s.id) AS total_events
     117FROM computers c
     118LEFT JOIN sysmon_events s ON c.id = s.computer_id
     119GROUP BY c.name;
     120}}}
     121
     122----
     123
     124== Автоматско одржување и чистење на историски податоци ==
     125
     126Со текот на времето, табелите со историски податоци (`sysmon_events`, `computer_history`) акумулираат голем број записи кои ги успоруваат пребарувањата и ја зголемуваат потрошувачката на дисковен простор. Потребен е механизам за автоматско бришење на застарени записи без рачна интервенција, со цел одржување на перформансите на системот на долг рок.
     127
     128=== Implementation ===
     129
     130==== Stored Procedures/Functions ====
     131
     132Процедура за автоматско отстранување на стари Sysmon логови (постари од 90 дена):
     133
     134{{{
     135CREATE OR REPLACE PROCEDURE cleanup_old_sysmon_events()
     136LANGUAGE plpgsql AS
     137$$
     138BEGIN
     139  DELETE FROM sysmon_events
     140  WHERE CAST(timestamp AS timestamp) < NOW() - INTERVAL '90 days';
     141END;
     142$$;
     143}}}
     144
     145Процедура за автоматско отстранување на стари записи од `computer_history` (постари од 180 дена):
     146
     147{{{
     148CREATE OR REPLACE PROCEDURE cleanup_old_computer_history()
     149LANGUAGE plpgsql AS
     150$$
     151BEGIN
     152  DELETE FROM computer_history
     153  WHERE CAST(timestamp AS timestamp) < NOW() - INTERVAL '180 days';
     154END;
     155$$;
     156}}}
     157
     158Двете процедури може да се закажат за периодично извршување преку `pg_cron`:
     159
     160{{{
     161-- Извршување секој ден во полноќ
     162SELECT cron.schedule('0 0 * * *', $$CALL cleanup_old_sysmon_events()$$);
     163SELECT cron.schedule('0 1 * * *', $$CALL cleanup_old_computer_history()$$);
     164}}}
     165
     166----
     167
     168== Аналитички погледи за брз пристап до системски информации ==
     169
     170Администраторите и апликацијата честопати бараат консолидирани информации за состојбата на компјутерите и нивната активност. Директното пресметување на овие информации при секое барање е бавно кога базата содржи голем број записи. Погледите и материјализираните погледи овозможуваат побрз пристап до вакви статистики.
     171
     172=== Implementation ===
     173
     174==== Views ====
     175
     176Детален поглед на компјутерите.
     177Консолидиран приказ на основните информации за сите компјутери во системот, без потреба од повторување на JOIN логиката во апликацијата:
     178
     179{{{
     180CREATE VIEW computer_details_view AS
     181SELECT
     182  name,
     183  "user",
     184  ip,
     185  os,
     186  env_name,
     187  last_seen
     188FROM computers;
     189}}}
     190
     191Поглед за активни (online) компјутери.
     192Прикажува само компјутери кои биле активни во последните 5 минути, корисен за real-time dashboard:
     193
     194{{{
     195CREATE VIEW active_computers_view AS
     196SELECT
     197  c.id,
     198  c.name,
     199  c.ip,
     200  c.env_name,
     201  c.last_seen
     202FROM computers c
     203WHERE CAST(c.last_seen AS timestamp) >= NOW() - INTERVAL '5 minutes';
     204}}}
     205
     206==== Materialized Views ====
     207
     208Материјализиран поглед за најактивни компјутери.
     209За разлика од обичните погледи, резултатите се физички зачувани, што овозможува значително побрзо извршување на аналитички пребарувања врз голем број историски записи:
     210
     211{{{
     212CREATE MATERIALIZED VIEW most_active_computers AS
     213SELECT
     214  c.id,
     215  c.name,
     216  COUNT(h.id) AS total_logs
     217FROM computers c
     218JOIN computer_history h ON c.id = h.computer_id
     219GROUP BY c.id, c.name;
     220}}}
     221
     222Рачно освежување на материјализираниот поглед (може да се закаже периодично):
     223
     224{{{
     225REFRESH MATERIALIZED VIEW most_active_computers;
     226}}}
     227
     228----
     229
     230== Статистички извештаи по околини (environments) ==
     231
     232Администраторите треба да имаат увид во тоа колку компјутери се регистрирани во секоја околина, со цел следење на растот на системот и планирање на капацитети. Оваа информација е корисна за квартални извештаи и при носење одлуки за скалирање.
     233
     234=== Implementation ===
     235
     236==== Stored Procedures/Functions ====
     237
     238Процедура за генерирање статистика по околини.
     239Ја пресметува и ја испечатува (RAISE NOTICE) распределбата на компјутери по секоја околина:
     240
     241{{{
     242CREATE OR REPLACE PROCEDURE environment_statistics()
     243LANGUAGE plpgsql AS
     244$$
     245DECLARE
     246  r RECORD;
     247BEGIN
     248  FOR r IN (
     249    SELECT env_name, COUNT(*) AS total
     250    FROM computers
     251    GROUP BY env_name
     252  )
     253  LOOP
     254    RAISE NOTICE 'Environment: %, Computers: %', r.env_name, r.total;
     255  END LOOP;
     256END;
     257$$;
     258}}}
     259
     260Функција која враќа статистика по околини во форма на табела (погодна за употреба во апликацијата):
     261
     262{{{
     263CREATE OR REPLACE FUNCTION get_environment_statistics()
     264RETURNS TABLE(env_name TEXT, total_computers BIGINT)
     265LANGUAGE plpgsql AS
     266$$
     267BEGIN
     268  RETURN QUERY
     269  SELECT
     270    c.env_name,
     271    COUNT(*)::BIGINT AS total_computers
     272  FROM computers c
     273  GROUP BY c.env_name
     274  ORDER BY total_computers DESC;
     275END;
     276$$;
     277}}}
     278
     279Повикување на функцијата:
     280
     281{{{
     282SELECT * FROM get_environment_statistics();
     283}}}