= Entity-Relationship Model v.04 = == Diagram == [[Image("ERModel_v04.png", width=100%)]] == Data requirements == === Entities === ==== Tenants ==== Претставува логички изолирана организација (tenant). Сите останати податоци се партиционираат по tenant, така што податоците на една организација се одвоени од друга. Моделиран е со сурогат клуч бидејќи ниту едно природно поле не е гарантирано единствено и непроменливо. * ''Candidate keys:'' {id}. Полињата ''name''/''owner_email'' не се доволно единствени, па е избран сурогат ''id''. * ''Атрибути:'' * ''id'' — numeric (integer); задолжителен; примарен клуч, автоинкремент. * ''name'' — text; задолжителен (NOT NULL). * ''owner_email'' — text; задолжителен (NOT NULL); формат на е-пошта. * ''created_at'' — date (datetime); опционален. ==== Users ==== Корисник автентициран преку Google OAuth. Потребен за најавување и поврзување со tenants преку членства. Моделиран одделно бидејќи ист корисник може да членува во повеќе tenants. * ''Candidate keys:'' {id} и {email} (email е UNIQUE). Избран е {id} бидејќи е стабилен сурогат; е-поштата може да се промени. * ''Атрибути:'' * ''id'' — numeric (integer); задолжителен; примарен клуч, автоинкремент. * ''email'' — text; задолжителен (NOT NULL, UNIQUE); формат на е-пошта. * ''name'' — text; опционален. * ''picture'' — text; опционален; URL до сликата од профилот. * ''created_at'' — date (datetime); опционален. ==== Memberships ==== Асоцијативен ентитет кој ја реализира M:N релацијата меѓу Users и Tenants и ја дефинира улогата на корисникот во даден tenant. Моделиран е како ентитет затоа што носи сопствен атрибут (''role''). * ''Candidate keys:'' композитен клуч формиран од учеството во релациите ''includes'' (Users) и ''belongs_to'' (Tenants), т.е. {user, tenant}. * ''Атрибути:'' * ''role'' — text; задолжителен; DEFAULT 'admin'. * ''created_at'' — date (datetime); опционален. ==== Environments ==== Логичка околина во рамки на еден tenant (пр. default, staging, prod). Компјутерите, токените, мрежите и поставките припаѓаат на околина. * ''Candidate keys:'' {id} и {tenant, name} (името е единствено во рамки на tenant). Избран е {id}; композитниот природен клуч е задржан како ограничување за единственост. * ''Атрибути:'' * ''id'' — numeric (integer); задолжителен; примарен клуч, автоинкремент. * ''name'' — text; задолжителен (NOT NULL); единствено во рамки на еден tenant. * ''created_at'' — date (datetime); опционален. ==== ENV_Tokens ==== Токени за пристап на клиентските агенти во конкретна околина. Секој агент носи токен наместо кориснички податоци. Одделен ентитет затоа што една околина може да има повеќе токени со различни рокови. * ''Candidate keys:'' {id} и {token} (UNIQUE). Избран е {id}; ''token'' се задржува како единствен алтернативен клуч за автентикација. * ''Атрибути:'' * ''id'' — numeric (integer); задолжителен; примарен клуч, автоинкремент. * ''token'' — text; задолжителен (NOT NULL, UNIQUE). * ''created_at'' — date (datetime); опционален. * ''expires_at'' — date (datetime); опционален; рок на важност. ==== Computers ==== Клиентските компјутери што испраќаат логови. Централен ентитет — сите видови следење се врзани за компјутер. * ''Candidate keys:'' {id} и {tenant, name}. Избран е {id} бидејќи компјутерот може да се преименува; композитот е задржан како ограничување за единственост. * ''Атрибути:'' * ''id'' — numeric (integer); задолжителен; примарен клуч, автоинкремент. * ''name'' — text; задолжителен (NOT NULL); единствено во рамки на tenant. * ''user'' — text; опционален; најавен корисник. * ''ip'' — text; опционален; IP адреса. * ''os'' — text; опционален; оперативен систем. * ''first_seen'' — date (datetime); опционален; прв контакт. * ''last_seen'' — date (datetime); опционален; последен контакт. * ''sysmon_available'' — numeric (boolean 0/1); задолжителен; DEFAULT 0. ==== Computer_history_current ==== Последен снимок на перформансни метрики (искористеност на ресурси) за секој компјутер. При секој извештај, претходниот запис за компјутерот се препишува, така што табелата секогаш го држи само моменталното мерење. * ''Candidate keys:'' {id} (сурогат). Природен клуч не постои. * ''Атрибути:'' * ''id'' — numeric (integer); задолжителен; примарен клуч, автоинкремент. * ''cpu_usage'' — numeric (real); опционален; процент 0–100. * ''ram_usage'' — numeric (real); опционален; процент 0–100. * ''disk_usage'' — numeric (real); опционален; процент 0–100. * ''network_sent_mb'' — numeric (real); опционален; ≥ 0. * ''network_recv_mb'' — numeric (real); опционален; ≥ 0. * ''timestamp'' — date (datetime); опционален. ==== Computer_history ==== Историски (трајни) перформансни метрики. Записите се додаваат (append) и се чуваат подолго; запишувањето се контролира преку ''save_metrics_history'' во Env_settings. * ''Candidate keys:'' {id} (сурогат). * ''Атрибути:'' исти како Computer_history_current (id, cpu_usage, ram_usage, disk_usage, network_sent_mb, network_recv_mb, timestamp). ==== Computer_processes_current ==== Тековен снимок на процеси по компјутер. При секој извештај претходната состојба се брише и се запишува новата. * ''Candidate keys:'' {id} (сурогат). ''pid'' не е стабилен (се реупотребува). * ''Атрибути:'' * ''id'' — numeric (integer); задолжителен; примарен клуч, автоинкремент. * ''pid'' — numeric (integer); опционален. * ''name'' — text; опционален. * ''cpu_percent'' — numeric (real); опционален; ≥ 0. * ''memory_mb'' — numeric (real); опционален; ≥ 0. * ''username'' — text; опционален. * ''cmdline'' — text; опционален. * ''timestamp'' — date (datetime); опционален. ==== Computer_processes_history ==== Историски (трајни) записи за процеси. Append; се контролира преку ''save_process_history'' во Env_settings; старите записи периодично се бришат. * ''Candidate keys:'' {id} (сурогат). * ''Атрибути:'' исти како Computer_processes_current. ==== Network_connections_current ==== Тековен снимок на активни мрежни конекции по компјутер. При секој извештај се препишува. * ''Candidate keys:'' {id} (сурогат). * ''Атрибути:'' * ''id'' — numeric (integer); задолжителен; примарен клуч, автоинкремент. * ''pid'' — numeric (integer); опционален. * ''local_address'' — text; опционален; локална адреса:порта. * ''remote_address'' — text; опционален; далечна адреса:порта. * ''status'' — text; опционален; пр. ESTABLISHED, LISTEN. * ''process_name'' — text; опционален. * ''timestamp'' — date (datetime); опционален. ==== Network_connections_history ==== Историски (трајни) записи за мрежни конекции. Append; се контролира преку ''save_network_history'' во Env_settings. * ''Candidate keys:'' {id} (сурогат). * ''Атрибути:'' исти како Network_connections_current. ==== Sysmon_events ==== Sysmon и безбедносни настани испратени од клиентите (append лог). * ''Candidate keys:'' {id} (сурогат). ''event_id'' е тип на настан, не идентификатор. * ''Атрибути:'' * ''id'' — numeric (integer); задолжителен; примарен клуч, автоинкремент. * ''event_id'' — numeric (integer); опционален; Sysmon Event ID. * ''event_type'' — text; опционален. * ''message'' — text; опционален. * ''timestamp'' — date (datetime); опционален. * ''details'' — text; опционален; JSON како стринг. ==== Security_alerts ==== Аларми за потенцијални безбедносни инциденти детектирани на компјутер. * ''Candidate keys:'' {id} (сурогат). * ''Атрибути:'' * ''id'' — numeric (integer); задолжителен; примарен клуч, автоинкремент. * ''alert_type'' — text; опционален. * ''severity'' — text; опционален; пр. low/medium/high/critical. * ''description'' — text; опционален. * ''timestamp'' — date (datetime); опционален. * ''resolved'' — numeric (boolean 0/1); задолжителен; DEFAULT 0. ==== Env_settings ==== Конфигурации по околина — политика за чување историја за секој вид следење (процеси, метрики, мрежни конекции). * ''Candidate keys:'' идентификуван преку релацијата ''configured_by'' со Environments (1:1); во релациска шема клучот е {tenant_id, env_name}. * ''Атрибути:'' * ''save_process_history'' — numeric (boolean 0/1); задолжителен; DEFAULT 0. * ''save_metrics_history'' — numeric (boolean 0/1); задолжителен; DEFAULT 0. * ''save_network_history'' — numeric (boolean 0/1); задолжителен; DEFAULT 0. * ''created_at'' — date (datetime); опционален. * ''updated_at'' — date (datetime); опционален. ==== Networks ==== Мрежни сегменти/подмрежи во рамки на околина. Потребен за моделирање на мрежната инфраструктура и групирање на компјутери и уреди по подмрежа. * ''Candidate keys:'' {id} и {cidr} (единствен во рамки на околина). Избран е {id}. * ''Атрибути:'' * ''id'' — numeric (integer); задолжителен; примарен клуч, автоинкремент. * ''name'' — text; задолжителен. * ''cidr'' — text; задолжителен; формат CIDR (пр. 192.168.1.0/24). * ''gateway_ip'' — text; опционален; IP на портата. * ''vlan'' — numeric (integer); опционален. ==== Network_devices ==== Мрежни уреди што не се компјутери (рутери, свичеви, пристапни точки, firewall). Потребен за следење на мрежната инфраструктура. * ''Candidate keys:'' {id} и {mac} (MAC е единствен). Избран е {id}. * ''Атрибути:'' * ''id'' — numeric (integer); задолжителен; примарен клуч, автоинкремент. * ''name'' — text; задолжителен. * ''device_type'' — text; задолжителен; пр. router/switch/ap/firewall. * ''ip'' — text; опционален. * ''mac'' — text; опционален; MAC адреса. * ''status'' — text; опционален; up/down. ==== Network_services ==== Активни мрежни сервиси/порти што ги изложува компјутер. Потребен за следење на достапни сервиси. * ''Candidate keys:'' {id} и {computer, port, protocol}. Избран е {id}. * ''Атрибути:'' * ''id'' — numeric (integer); задолжителен; примарен клуч, автоинкремент. * ''service_name'' — text; опционален; пр. SSH, HTTP. * ''port'' — numeric (integer); задолжителен; интервал 1–65535. * ''protocol'' — text; задолжителен; TCP/UDP. * ''status'' — text; опционален; listening/open/closed. * ''last_checked'' — date (datetime); опционален. ==== Service_availability ==== Историја на достапност (up/down проверки) на мрежен сервис. Потребен за следење на достапноста низ време. * ''Candidate keys:'' {id} (сурогат). * ''Атрибути:'' * ''id'' — numeric (integer); задолжителен; примарен клуч, автоинкремент. * ''is_available'' — numeric (boolean 0/1); задолжителен. * ''response_time_ms'' — numeric (integer); опционален; ≥ 0. * ''timestamp'' — date (datetime); задолжителен. ==== Computer_groups ==== Организациска структура на компјутери (оддели/локации/тимови) со поддршка за хиерархија преку рекурзивна релација. Потребен за организациско групирање на машините. * ''Candidate keys:'' {id} и {name} (во рамки на tenant). Избран е {id}; хиерархијата се изразува преку релацијата ''parent_of'' (наместо атрибут-клуч). * ''Атрибути:'' * ''id'' — numeric (integer); задолжителен; примарен клуч, автоинкремент. * ''name'' — text; задолжителен. * ''description'' — text; опционален. === Relationships === Поврзаноста меѓу ентитетите е изразена преку именувани релации; надворешните клучеви што ги реализираат се воведуваат при преминот кон релациска шема (види долу). * '''has''' — Tenants (1) : Environments (N). Tenant поседува околини. * '''includes''' — Memberships (N) : Users (1). Членството се однесува на еден корисник. * '''belongs_to''' — Memberships (N) : Tenants (1). Членството припаѓа на еден tenant. (includes + belongs_to заедно ја реализираат M:N меѓу Users и Tenants.) * '''issues''' — Environments (1) : ENV_Tokens (N). Околина издава токени за агенти. * '''contains''' — Environments (1) : Computers (N). Околина логички содржи компјутери. * '''configured_by''' — Environments (1) : Env_settings (1). Секоја околина има точно еден запис со поставки. * '''has_networks''' — Environments (1) : Networks (N). Околина содржи мрежни сегменти. * '''contains_devices''' — Networks (1) : Network_devices (N). Подмрежа содржи мрежни уреди. * '''on_network''' — Networks (1) : Computers (N). Компјутер е поврзан на подмрежа. * '''records_current''' — Computers (1) : Computer_history_current (N). Последни перформансни метрики. * '''records_history''' — Computers (1) : Computer_history (N). Историски перформансни метрики. * '''runs''' — Computers (1) : Computer_processes_current (N). Тековни процеси. * '''logs''' — Computers (1) : Computer_processes_history (N). Историски процеси. * '''opens_current''' — Computers (1) : Network_connections_current (N). Тековни мрежни конекции. * '''opens_history''' — Computers (1) : Network_connections_history (N). Историски мрежни конекции. * '''generates''' — Computers (1) : Sysmon_events (N). Безбедносни/Sysmon настани. * '''triggers''' — Computers (1) : Security_alerts (N). Безбедносни аларми. * '''exposes''' — Computers (1) : Network_services (N). Компјутер изложува мрежни сервиси. * '''monitored_by''' — Network_services (1) : Service_availability (N). Сервисот се проверува за достапност низ време. * '''belongs_to_group''' — Computers (N) : Computer_groups (1). Компјутер припаѓа на организациска група. * '''parent_of''' — Computer_groups (1) : Computer_groups (N). Рекурзивна релација за хиерархија на групи (една група има подгрупи). === Релациска шема (надворешни клучеви) === * Memberships(''user_id'' → Users.id, ''tenant_id'' → Tenants.id), PK(user_id, tenant_id) * Environments(''tenant_id'' → Tenants.id), UNIQUE(tenant_id, name) * ENV_Tokens(''tenant_id'' → Tenants.id, ''env_name'') * Computers(''tenant_id'' → Tenants.id, ''env_name''), UNIQUE(tenant_id, name) * Env_settings(''tenant_id'' → Tenants.id, ''env_name''), PK(tenant_id, env_name) * Networks(''tenant_id'' → Tenants.id, ''env_name'') * Network_devices(''network_id'' → Networks.id) * Network_services(''computer_id'' → Computers.id) * Service_availability(''service_id'' → Network_services.id) * Computer_groups(''tenant_id'' → Tenants.id, ''parent_id'' → Computer_groups.id) * Computer_history_current / Computer_history(''computer_id'' → Computers.id) * Computer_processes_current / Computer_processes_history(''computer_id'' → Computers.id) * Network_connections_current / Network_connections_history(''computer_id'' → Computers.id) * Computers(''group_id'' → Computer_groups.id), ''network_id'' → Networks.id * Sysmon_events / Security_alerts(''computer_id'' → Computers.id) == Entity-Relationship Model History == * '''v.01''' — Иницијална верзија со основните ентитети. * '''v.02''' — Додадени Env_settings, Computer_processes_current и Computer_processes_history за избор помеѓу трајно и тековно чување процеси. * '''v.03''' — Формална исправка: отстранета табелата Computer_processes; сите врски претворени во именувани релации со кардиналности; надворешните клучеви извадени од дијаграмот; исправени имиња (tenants, process). * '''v.04''' — Напредни проширувања: раздвојување тековна/историска состојба за сите видови следење (Computer_history и Network_connections добиваат _current/_history, со нови знамиња save_metrics_history и save_network_history); следење активни мрежни сервиси и достапност (Network_services, Service_availability); мрежна инфраструктура (Networks, Network_devices); организациска структура на компјутери со хиерархија (Computer_groups со рекурзивна parent_of).