Ovo je vodič za instalaciju, podešavanje i održavanje Arcivéo Monitor. Odeljci su grupisani: opšti pregled, postavljanje kontrolne table, povezivanje bezbednosnih alata, ugrađeni moduli i dijagnostika. Komande možete kopirati dugmetom sa desne strane.
Instalacija kontrolne table nalazi se na zasebnim stranicama sa uputstvima korak po korak. Izaberite način:
Arcivéo Monitor — kontrolna tabla bezbednosti servera. Prikuplja podatke od instaliranih alata (Fail2ban, UFW, Lynis, ModSecurity, AIDE, ClamAV, Auditd, CrowdSec, Suricata, Falco i dr.) i prikazuje ih u jedinstvenom interfejsu sa kontrolnom tablom, mapom napada i detaljnim stranicama za svaki alat.
Monitor nije aktivno sredstvo zaštite — sam po sebi ne blokira napade. Njegov zadatak je da agregira informacije od već aktivnih alata i prikaže ih na pregledan način.
Monitor radi samo lokalno — mora biti instaliran na istom serveru koji nadzire. Nema nikakvog SSH-a ni udaljenog API-ja.
Sve komande (fail2ban-client, ufw status, ipset list itd.) kontrolna tabla izvršava u ime korisnika veb-servera (obično www-data, na hosting-panelima — nalog sajta) sa uskim skupom prava sudo — samo za konkretne alate, bez opšteg root-pristupa. Rezultati se parsiraju i prikazuju u pregledaču.
Ocena kreće od maksimuma i smanjuje se za svaki otkriveni problem:
PermitRootLogin yes) — −20Rezultat: 80+ = Zaštićen, 60–79 = Pažnja, <60 = Ugrožen.
WebAuthn — standard za autentifikaciju bez lozinke pomoću hardverskog ključa. Podržava YubiKey, Touch ID, Face ID, Windows Hello, Passkey.
Nakon prijave lozinkom sistem traži potvrdu putem registrovanog ključa. Čak i ako lozinka procuri — bez fizičkog ključa ili biometrije prijava nije moguća.
Za podešavanje otvorite WebAuthn ključevi u bočnom meniju i kliknite na „Registruj ključ“. Registrujte odmah dva ključa: ako se jedini ključ izgubi ili pokvari, prijava na kontrolnu tablu njime neće biti moguća.
Kontrolna tabla može da šalje bezbednosni izveštaj na Telegram i na poštu (na klik i po rasporedu). Podešava se u odeljku „Podešavanja“.
Telegram. Potrebni su token bota i chat id:
@BotFather → /newbot → dobićete token oblika 123456:ABC....@userinfobot, ili otvorite https://api.telegram.org/bot<TOKEN>/getUpdates i pronađite "chat":{"id":...}.Email. Dva načina na izbor u „Podešavanja“ → Email:
re_...) i potvrđeni domen pošiljaoca.Status izveštaja: „PAŽNJA“ ili „OK“. Naslov postaje „PAŽNJA“ samo kod stvarnog problema ili radnje na čekanju: pronađena pretnja u ClamAV, izmene fajlova u AIDE, kritični događaji u Falco (Emergency/Alert/Critical u poslednja 24 h), pao servis u Monit, potreban restart, ističe SSL (≤14 dana) ili čekaju bezbednosna ažuriranja. Pozadinski šum — SSH pokušaji botova, IP adrese banovane preko fail2ban, upozorenja Suricata, upozorenja Lynis i već odbijeni zahtevi ModSecurity — ne podiže status, pa takve cifre u izveštaju same po sebi ne znače „PAŽNJA“.
Detaljni moduli za nadzor (Lynis, UFW, ModSecurity, mapa napada, AIDE, ClamAV i dr.) otključavaju se uz važeću licencu. Bez nje kontrolna tabla, podešavanja i nalog rade, a moduli prikazuju karticu „Potrebna je licenca“.
Nakon kupovine u korisničkom nalogu imate kod za aktivaciju u obliku ARCIVEO-XXXX-XXXX-XXXX-XXXX. Njega treba „aktivirati“ za domen vaše kontrolne table — time se kod pretvara u potpisanu datoteku licence (blok [license]) koju ubacujete u kontrolnu tablu.
Kako aktivirati (3 koraka):
my.arciveo.com → odeljak „Licence“ / „Aktivacija licence“ — kopirajte kod ARCIVEO-….monitor.example.com). Kliknite na aktivaciju — sistem će generisati datoteku licence vezanu za taj domen i prikazati je u polju sa dugmetom „Kopiraj“.Kontrolna tabla proverava ključ kriptografski: potpis, vezu za domen i rok važenja.
APP_URL u config.php i unesite samo ime hosta — bez https:// i bez prefiksa www. Aktivacija je jednokratna: kod se pretvara u licencu za uneti domen i ne aktivira se ponovo — ako pogrešite domen, ključ neće odgovarati vašoj kontrolnoj tabli, a kod će biti potrošen. Zato pažljivo unesite domen.
Svi osnovni parametri kontrolne table zadati su u jednoj datoteci config.php u korenu (pored fascikle public/) običnim konstantama define(). Datoteka se kreira pri instalaciji; ručno je menjati potrebno je retko — uglavnom pri promeni domena, prenosu ili povezivanju na drugu bazu. Nakon svake izmene ponovo pokrenite PHP-FPM (u suprotnom se zbog OPcache izmene neće primeniti).
Umetnite svoje vrednosti na istaknuta mesta; ostalo ostavite kako jeste:
Baza podataka. Podaci za povezivanje sa MySQL/MariaDB:
DB_HOST — host baze, gotovo uvek localhost;DB_NAME — ime baze podataka kontrolne table;DB_USER — korisnik baze (pristup samo svojoj bazi);DB_PASS — lozinka tog korisnika;DB_CHARSET — kodiranje veze, ostavite utf8mb4.Aplikacija.
APP_URL — puna adresa kontrolne table (npr. https://monitor.example.com). Mora se poklapati sa domenom za koji je aktivirana licenca — u suprotnom će ključ biti odbijen (vidi odeljak „Licenca“);TIMEZONE — vremenska zona PHP-a: utiče samo na to kako kontrolna tabla prikazuje datume i vreme. Na vreme pokretanja cron-zadataka ne utiče — tamo važi zona sistema (vidi „Svi cron-zadaci“).Trajanje sesije. SESSION_LIFETIME — vreme neaktivnosti sesije u sekundama (klizeće: obnavlja se pri aktivnosti). Podrazumevano 28800 = 8 sati; nakon tog vremena neaktivnosti kontrolna tabla će zatražiti ponovnu prijavu. Na primer, 3600 = 1 sat, 86400 = dan.
Beleženje grešaka. Greške se nikada ne prikazuju posetiocima, već se upisuju u logs/php_errors.log — vide se na stranici „Logovi aplikacije“. Te linije (display_errors=0, log_errors=1, putanju error_log) obično nije potrebno menjati — podešavanja su zadata direktno u datoteci i ne zavise od php.ini.
public/), a kod ove kontrolne table veb-koren (DocumentRoot) — upravo je koren kontrolne table, ne public/. Sama datoteka ne „curi“: u korenskom .htaccess za nju postoji izričita zabrana (Require all denied) — server vraća 403. Čak i bez tog pravila izvorni kôd ne bi iscureo: ovo je PHP — server ga izvršava, a ne isporučuje kao tekst. Za svaki slučaj: ne postavljajte je u javne repozitorijume i ne šaljite podršci sa stvarnom lozinkom. Dozvole na datoteci — 640.
UFW (Uncomplicated Firewall) — jednostavan interfejs za nftables/iptables. Zatvara sve dolazne portove osim izričito dozvoljenih. Stranica „UFW zaštitni zid“ prikazuje status i pravila.
ufw enable obavezno dozvolite SSH (ufw allow OpenSSH), inače ćete izgubiti pristup serveru.
deny ne smatra se dostupnim spolja.
Skipping adding existing rule — nije greška. UFW time javlja da tačno takvo pravilo već postoji i ne dodaje ga ponovo. Pri ponovnom pokretanju automatskog podešavanja (idempotentno je) to je uobičajena poruka — nije potrebno reagovati.
Automatski blokira IP adresu nakon prekoračenja broja neuspešnih pokušaja prijave. Analizira logove SSH, nginx, Apache i drugih servisa.
Osnovna instalacija je gore. Ovde je radna konfiguracija koja daje desetine aktivnih jail-ova i hiljade blokada: opšta podešavanja, ključni jail-ovi i autoban zlonamernih IP adresa sa liste ipsum.
Fajl /etc/fail2ban/jail.local — opšta podešavanja i najvažniji jail-ovi:
ignoreip obavezno upišite svoju IP adresu i pouzdane mreže, u suprotnom možete banovati sami sebe. Nakon izmena: sudo fail2ban-client reload.
Automatsko učitavanje blok-liste ipsum — u root cron (sudo crontab -e): level 1 (100+ hiljada IP adresa) učitava se u skup ipsum, koji se odseca na fajervolu (detaljnije — u odeljku „Blok-lista IPset“):
ipsum — upravo njega čita kontrolna tabla (kartica „IPset ipsum“). Nivoi: levels/1.txt — maksimalni obuhvat, levels/3.txt — preciznije (3+ izvora).
Zašto je „Monitor bezbednosti“ podeljen na dve zone. Zaštita radi na dva nivoa, i kontrolna tabla ih ne meša:
sshd, apache-*, nginx-* itd.) i uporne recidiviste (jail recidive — one koji su već banovani više puta). To su IP adrese koje su vam se stvarno obijale — one su na mapi napada i „Vremenskoj osi“.ipset ipsum, koja se odseca na fajervolu pravilom DROP. Ove adrese uglavnom nisu ni dodirnule vaš server — one se seku unapred; brojač „IPset ipsum“ pokazuje koliko ih je preventivno odsečeno.Razlika je jednostavna: reaktivno — „ovi su napali i dobili ban“, preventivno — „ove smo blokirali još pre pokušaja“. Ranije se u recidive veštački ubacivao list-3 ipsum (otuda stara podela „recidivisti sa liste“); sada je recidive samo pravi recidivisti, a preventiva je u celosti na fajervolu.
ipsum — javna lista zlonamernih IP adresa koja se dnevno ažurira. Monitor prikazuje broj učitanih adresa na kontrolnoj tabli i mapi napada i uračunava ga u Ocenu bezbednosti (−10 ako skup nije učitan).
Minimalna varijanta bez fail2ban-a — poseban skup ipsum sa blokiranjem preko iptables:
@reboot. Uz to, komanda create … -exist zadaje limit maxelem 300000 (podrazumevano 65536 — level 1 ne staje, dobićete „Hash is full“):
ipsum i, ako firewall-om upravlja instaler (svež VPS — profili „Puna“/„Olakšana“), povezuje skup sa UFW pravilom DROP — saobraćaj sa tih IP adresa se stvarno blokira. Pravilo stoji posle ESTABLISHED,RELATED, pa se tekuće veze (uključujući vaš SSH) ne prekidaju — seku se samo nove veze sa liste. Skup se obnavlja pri pokretanju servisa ipsum-load.service pre firewall-a (inače se UFW ne bi podigao) i ažurira cron-om u 04:00. Na već podešenom serveru (kontrolna tabla, sopstveni firewall) instaler ne dira firewall — tamo ipsum ostaje lista za kontrolnu tablu i mapu napada, a pravilo DROP se po želji dodaje ručno (minimalna varijanta sa iptables … --match-set ipsum … -j DROP — gore). Pri automatskoj instalaciji ne treba ništa raditi ručno.
Savremena zamena za Fail2ban sa kolektivnim threat intelligence: blokade od zajednice plus sopstvena pravila. Zahteva poseban bouncer za primenu blokada na firewall.
systemctl is-active crowdsec). Pokretanje: sudo systemctl enable --now crowdsec; kod pada pogledajte sudo journalctl -u crowdsec -n 30. Isto pravilo važi za svaki servis sa statusom „Nije pokrenut“ (Suricata, Falco, Monit, MySQL).
stream halted / blokade se ne primenjuju. To je osiroteli api-ključ: bouncer je uklonjen iz cscli bouncers list, ali je njegov stari ključ ostao u /etc/crowdsec/bouncers/*.yaml. Ponovo registrujte bouncer i upišite svež ključ:
AIDE (Advanced Intrusion Detection Environment) pravi snimak sistema datoteka i pri svakoj proveri prijavljuje izmene u /etc, /bin, /usr. Nakon instalacije obavezna je inicijalizacija baze (aideinit).
aideinit terminal 5–15 minuta stoji na liniji Running aide --init... — to je normalno (heširanje celog sistema datoteka, opterećenje diska). Nemojte prekidati sa Ctrl+C. Ako proces „visi“, ali ništa ne ispisuje — možda čeka odgovor na skriveni upit Overwrite existing aide.db.new [Yn]? (pritisnite Y). Proverite aktivnost iz druge sesije: pgrep -af aide.
aideinit: „21_aide_spamassassin … printf: invalid number“ (return code 20) — poznata greška AIDE konfiguracionog snippet-a u Ubuntu 22.04. Baza se ne kreira. Uklonite neispravan snippet i ponovite:
aideinit nije pokretan, ili je (Ubuntu 24.04) direktorijum /var/lib/aide kreiran u režimu 700 i nedostupan za www-data — rešava se sa sudo chmod 755 /var/lib/aide (vidi blok iznad). „Provera nije obavljena“ = baza postoji, ali provera još nije izvršena — to nije greška. Rezultate monitor čita iz /var/log/aide/aide.log.
/etc/cron.daily/aide na novijim Ubuntu/Debian možda neće upisivati /var/log/aide/aide.log u potrebnom obliku (a aide.wrapper u njima više ne postoji). Pouzdanije je dodati sopstveni cron sa eksplicitnim --config — on upisuje log kao root u režimu 644, i monitor ga čita bez dodatnih grupa:
chmod 755 /var/lib/aide i cron provere u 02:00 — ručno ništa nije potrebno.
sudo aideinit && sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db.
Antivirusni skener za Linux. Naročito koristan za proveru /var/www na PHP šelove i zlonamerni kod.
enable --now? Tri tipična uzroka:
1. U konfiguraciji je ostao red Example — clamd odbija da se pokrene dok on postoji:
2. Nije preuzeta baza potpisa — clamd se ne pokreće bez nje:
3. Jednostavno se učitava — clamd učitava ~8 mil. potpisa u memoriju 30–60 s. Sačekajte i proverite: systemctl is-active clamav-daemon (status activating → još učitava).
sudo journalctl -u clamav-daemon -n 30 --no-pager.
clamd samo drži potpise u memoriji, on sam ništa ne skenira po rasporedu. Kontrolna tabla prikazuje rezultate planiranog skeniranja, pa je potreban cron koji skenira i piše log. Automatska instalacija postavlja omotač /usr/local/bin/clamav-scan.sh i cron u 01:30 — posle prvog pokretanja popuniće se „Proverenih fajlova“ i „Poslednje skeniranje“. Pokrenite odmah, ne čekajući raspored: sudo /usr/local/bin/clamav-scan.sh.
Linux Malware Detect (LMD) — skener zlonamernog softvera za veb-pretnje: PHP shell-ovi, veb-backdoor-i, download-eri. Koristi ClamAV mehanizam i dopunjuje ga sopstvenim potpisima.
maldet --report.
update-rc.d: error: unable to read /etc/init.d/maldet — ona je bezopasna. maldet ne koristi init.d, ažuriranje potpisa i skeniranja se pokreću preko /etc/cron.daily/maldet. Ako se ispod vidi installation completed — sve je instalirano.
apt, već u /usr/local/maldetect, a kada je open_basedir uključen, njegovo prisustvo se proverava preko shell-a — vidi odeljak „Stranica je prazna, iako podaci postoje na serveru“.
Mrežni sistem za otkrivanje upada: analizira saobraćaj na nivou paketa i poznaje hiljade potpisa napada. Dopunjuje ModSecurity (koji radi na HTTP nivou, dok Suricata radi na TCP/IP nivou).
/var/log/suricata/eve.json pod root u režimu 750 na direktorijum, pa veb-server (www-data) ne može da ga pročita. Otvorite direktorijum za prolaz — datoteke unutra ostaju zaštićene:
Presreće sistemske pozive kroz eBPF/kernel module i otkriva anomalije u realnom vremenu: shell iz nginx-a, čitanje /etc/passwd veb-procesom, upis u /bin itd.
journalctl -u falco (bez sudo — preko grupe systemd-journal). Uverite se da je www-data u toj grupi — vidite „Podešavanje sudo“ (tačka 2) na stranici ručne instalacije.
/etc/passwd, upis u sistemske direktorijume). Nula kritičnih za dan na mirnom serveru je zdravo stanje.
journalctl zahteva prava na dnevnik; da bi kontrolna tabla stabilno videla događaje, automatska instalacija uključuje kod Falco file_output → /var/log/falco/falco.log i servisu postavlja UMask=0022 (dnevnik čita veb-server). Na novoj instalaciji ovo nije potrebno podešavati ručno.
ModSecurity — veb-firewall (WAF) za Apache ili Nginx. Blokira napade na nivou aplikacije: SQL injekcije, XSS, prolaz kroz putanje, skenere.
IncludeOptional /etc/modsecurity/*.conf, a paket postavlja samo modsecurity.conf-recommended — pod masku *.conf on ne potpada. Ako ga ne kopirate u modsecurity.conf, SecRuleEngine ostaje Off: modul je učitan, CRS pravila su učitana, ali se saobraćaj ne proverava i audit-log se ne kreira. Prelazni režim DetectionOnly samo upisuje događaje u log, ne blokirajući zahteve — kontrolna tabla ga prikazuje žuto.
Pristup kontrolne table audit-logu. Log /var/log/apache2/modsec_audit.log pripada root-u (prava 640), veb-korisnik ga neće pročitati. Kontrolna tabla uzima podatke preko omotača — kreirajte ga:
SecRuleEngine bez uvlačenja: uvučene linije se nalaze unutar blokova <LocationMatch>/<Directory> (na primer, isključivanje WAF-a za phpMyAdmin) i ne određuju globalni režim.www-data, u HestiaCP pul sajta radi od vlasnika sajta (na primer, admin) — proverite grep -E '^user' /etc/php/*/fpm/pool.d/monitor.example.com.conf.X-Forwarded-For. U statistiku ulaze samo transakcije sa aktiviranim pravilom: direktiva SecAuditLogRelevantStatus upisuje u audit-log bilo koje odgovore 4xx/5xx, pa tamo ulaze i obični 403/500 — kontrolna tabla ih ne smatra WAF događajima.---RULES--- potreban je odeljku „Sva aktivna pravila“ — kontrolna tabla prikazuje ne samo aktivirana, već uopšte sva učitana CRS pravila + prilagođena. Tri putanje u petlji for f in … — tipična mesta za CRS pravila i lokalne dopune; ako imate drugačiji raspored (paket postavlja fajlove u svoj direktorijum, ili se prilagođena pravila ne nalaze u /etc/modsecurity/custom-rules.conf), pronađite realne putanje komandom sudo grep -rl 'IncludeOptional\|^Include ' /etc/apache2/mods-enabled/security2.conf /etc/apache2/conf-enabled/*.conf 2>/dev/null i ubacite ih u listu. Ako je omotač star (bez ovog odeljka) — odeljak će samo prikazati upozorenje „nedostupno“, ostatak stranice radi kao ranije.
Auditd (Linux Audit Daemon) beleži sistemske pozive na nivou jezgra: prijave i odjave, sudo-komande, neuspele pokušaje autentifikacije, izmene fajlova. Monitor prikazuje prijave, neuspele pokušaje i sudo-komande za danas.
ausearch (/usr/sbin/ausearch) i po potrebi iz /var/log/audit/audit.log komandom tail. Oba moraju biti u sudoers.
Prati servise (nginx, php-fpm, mysql itd.) i ponovo ih pokreće kada padnu. Može slati upozorenja na email.
monit status. U /etc/monit/monitrc mora biti uključen HTTP interfejs (blok set httpd sa allow localhost), inače će monit status vratiti grešku.
monitrc je linija set httpd zakomentarisana (podrazumevano ide kao # set httpd port 2812 …). Otkomentarišite blok i dozvolite localhost. (2) Sam uključen httpd ništa ne prati — Monit uzima u obzir samo ono što je opisano check-stancama; bez njih je lista prazna čak i uz aktivan interfejs. Minimalna radna konfiguracija:
conf.d sa httpd na 2812 i skupom provera — na novoj instalaciji nije potrebno ručno podešavanje.
PSAD analizira dnevnik iptables i otkriva skeniranje portova i mrežne napade, dodeljujući svakom izvoru nivo pretnje (1–5). Dopunjuje fail2ban i Suricata.
psad --Status (potreban je u sudoers). Bez logovanja iptables stranica će biti prazna — to je normalno dok nije bilo skeniranja.
Mandatory Access Control ograničava kojim datotekama i resursima program može da pristupi, čak i ako je provaljen. Na Ubuntu/Debian se podrazumevano koristi AppArmor (obično je već instaliran i aktivan).
aa-status (potreban u sudoers). Prikazuje broj profila u režimu enforce/complain i procese bez profila.
„Učitanih profila“ ima više nego enforce + complain — to je normalno. U AppArmor 4.x (Ubuntu 24.04 i noviji) pojavio se režim unconfined: profil je učitan u jezgro, ali ništa ne ograničava. Ubuntu tako označava desetine profila za programe koji koriste user namespaces (pregledači, torent-klijenti i slično). Kada takvi profili postoje, kartica „Učitanih profila“ postaje jantarna i prikazuje njihov broj — na primer unconfined: 90 uz 120 učitanih i 26 u enforce. Stvarnu zaštitu pružaju samo profili u enforce; na Ubuntu 22.04 (AppArmor 3.x) ovog režima nema i brojevi se uvek slažu.
unconfined vredi prebacivati u enforce samo osveštano: nisu isključeni greškom, već zato što bi se inače narušio rad samih programa. Profili u complain su druga priča: tamo su pravila već napisana i samo se ne primenjuju.
debsums proverava da li se datoteke instaliranih paketa poklapaju sa kontrolnim sumama iz repozitorijuma — otkriva zamenjene sistemske binarne datoteke (dopunjuje AIDE). Potpuna provera traje 1–2 minuta, pa se pokreće preko cron-a, a kontrolna tabla čita rezultat iz data/debsums/debsums.log i sama ga razvrstava po kategorijama (bitne su samo binarne datoteke i biblioteke).
Zadatak ide u root-cron (sudo crontab -e). Gotov omotač debsums-scan.sh stavlja se u /usr/local/bin/ (chmod +x; vidi pregled cron-zadataka) i sam upisuje izveštaj u data/debsums/ kontrolne table.
Omotač debsums-scan.sh sam pronalazi data/ kontrolne table — putanju nije potrebno navoditi.
/etc/ (konfiguracije) i /usr/share/ (resursi) na serveru su obično normalne — kontrolna tabla ih označava posebnom bojom. Zabrinjavajuće su izmene binarnih datoteka i biblioteka (/bin, /sbin, /usr/lib itd.) — kartica „Binarne datoteke / biblioteke“ prikazuje upravo njih.
Lynis se pokreće ručno ili preko cron-a. Izveštaj se mora čuvati u folderu data/lynis/ projekta — Monitor čita datoteku lynis-report.dat.
lynis-scan.sh u pozadini direktno iz kontrolne table (bez čekanja na cron): prikazuje „Skeniranje…“ i po završetku samo osvežava izveštaj. Za to je veb-korisniku potrebna sudoers linija za pokretanje skripte — instalater je dodaje automatski u /etc/sudoers.d/monitor. Ako je kontrolna tabla postavljena ručno/ranije, dopišite je istim korisnikom koji je već naveden u datoteci:
Logwatch treba da čuva dnevne izveštaje u fascikli data/logwatch/ projekta u formatu .txt. Monitor prikazuje poslednji izveštaj i arhivu.
Mrežni monitor ne zahteva instalaciju — to je ugrađena stranica kontrolne table. Prikazuje mrežno stanje servera iz lokalnih izvora:
/proc/net/dev;ip;ss;journalctl -k.Prva tri izvora rade bez sudo, pa su interfejsi, saobraćaj, veze i portovi vidljivi odmah. Blok „Događaji jezgra“ koristi journalctl -k — čita se preko grupe systemd-journal („Podešavanje sudo“, t.2), sudo nije potreban. Provera da li je sve dostupno veb-korisniku:
UFW BLOCK ovde se ne prikazuju — oni su na stranicama „Zaštitni zid UFW“ i „Mapa napada“. Prazan blok sa zelenom kvačicom = tokom dana nije bilo mrežnih otkaza.
Ugrađena stranica prikazuje tri stvari:
df); skala postaje crvena pri ≥90%;lsblk), samo stvarni (loop/snap su skriveni);smartctl).Prostor i spisak uređaja rade odmah, bez podešavanja. Za SMART je potreban paket smartmontools. Veb-proces nema direktan pristup disk uređajima, pa se SMART očitava preko crona u datoteku data/disk/smart.txt, a kontrolna tabla je čita.
Zadatak ide u root-cron (sudo crontab -e). Gotov omotač smart-scan.sh stavlja se u /usr/local/bin/ (chmod +x; vidi pregled cron-zadataka) i sam upisuje u data/disk/ kontrolne table.
Omotač smart-scan.sh sam pronalazi data/ kontrolne table — putanju nije potrebno navoditi. Unutar toga lsblk -e7,11 isključuje loop/cdrom.
Stranica prikazuje istoriju opterećenja servera za poslednja 24 sata — Load Average, zauzeće CPU-a i I/O čekanje, RAM/Swap, mrežni saobraćaj (prijem/slanje), disk I/O (čitanje/pisanje), popunjenost diska i inode-ova, otvorene fajl-deskriptore i MySQL veze, plus trenutni broj TCP veza i procesa.
Podatke prikuplja cron/collect_metrics.php — jednom u 5 minuta upisuje jedan „sirov“ snimak brojača (/proc/loadavg, /proc/meminfo, /proc/stat, /proc/net/dev, /proc/diskstats, df/df -i, /proc/sys/fs/file-nr, SHOW GLOBAL STATUS LIKE 'Threads_connected') u tabelu baze system_metrics; procente i brzine stranica računa sama iz razlike između susednih snimaka (popunjenost diska/inode-ova/deskriptora/MySQL veze — trenutne vrednosti, bez preračunavanja). Sudo nije potreban — izvori se čitaju bez root prava. Tačke starije od 24 sata brišu se automatski pri svakom upisu.
Omotač collect-metrics-all.sh (vidi pregled cron-zadataka) sam pronalazi sve instalirane instance kontrolne table na serveru i pokreće cron/collect_metrics.php svake od njih u ime vlasnika sajta.
Obaveštenja o opterećenju (odeljak „Podešavanja“ → „Obaveštenja o opterećenju“) — pri prekoračenju praga CPU/RAM/disk/inode kontrolna tabla šalje obaveštenje na Telegram/Email (isti kanali kao i dnevni izveštaj — nije ih potrebno posebno uključivati za upozorenja), i još jedno — kada se metrika vrati u normalu. Ne spamuje ponovo tokom zadržavanja praga: sledeće obaveštenje stiže tek nakon ciklusa „vraćeno → ponovo prekoračeno“.
collect_metrics.php pri svakom pokretanju (jednom u 5 minuta) — poseban cron nije potreban. Stanje „već obavešteno / još nije“ čuva se u data/alerts_state.json, a pragovi — u podešavanjima kontrolne table.
Stranica „Mapa napada“ određuje državu na osnovu IP adrese pomoću komande geoiplookup. Bez GeoIP paketa države se neće odrediti i tačke se neće pojaviti na mapi:
/usr/share/GeoIP/GeoIP.dat mogu čitati svi, a rezultati se keširaju u tmp/geoip_cache.json. Sama mapa (Leaflet + OpenStreetMap pločice) učitava se u pregledaču — potreban je internet na računaru na kojem je otvorena kontrolna tabla.
Dve ugrađene kartice kontrolne table koje ne prikazuju „uklj./isklj.“ alata, već stvarnu zaštićenost servera. Ne zahtevaju instalaciju, čitaju se lokalno bez sudo.
Spoljna izloženost — koliko servisa sluša sve interfejse (0.0.0.0/[::]) i dostupno je spolja. Osvetljava crvenim ako su spolja izloženi baza podataka ili keš (MySQL, PostgreSQL, Redis, MongoDB, Memcached, Elasticsearch) — to je direktna rupa (−10 na Ocenu bezbednosti). Izvor: ss -tuln.
127.0.0.1 (bind-address u konfiguraciji MySQL/PostgreSQL, bind 127.0.0.1 u Redis) ili zatvorite port u UFW.
127.0.0.1 (loopback) vidljiv je samo samom serveru — spolja mu se ne može pristupiti, čak i ako je port „otvoren“. Zato je Postfix na portu 25, vezan za loopback, bezbedan: automatsko podešavanje postavlja inet_interfaces = loopback-only (plus neutralni smtpd_banner — zatvara napomenu Lynis MAIL-8818 o otkrivanju verzije). Kartica „Spoljna izloženost“ računa kao spoljno samo ono što sluša 0.0.0.0/[::]; loopback servisi tu ne spadaju.
/etc/postfix/main.cf zadajte smtpd_banner = $myhostname ESMTP (bez verzije i OS-a) i inet_interfaces = loopback-only, zatim sudo systemctl restart postfix.
Bezbednosna ažuriranja — koliko bezbednosnih zakrpa čeka instalaciju i da li je potrebno ponovno pokretanje nakon ažuriranja kernela (−5 na Ocenu bezbednosti ako postoje zakrpe). Izvor: /usr/lib/update-notifier/apt-check, fajl /var/run/reboot-required. Detaljan spisak — na stranici „Bezbednosna ažuriranja“.
update-notifier-common). Ako apt-check nedostaje — Monitor računa zakrpe preko apt-get -s upgrade.
Automatska bezbednosna ažuriranja (unattended-upgrades) — na stranici „Bezbednosna ažuriranja“ posebna kartica prikazuje da li je uključena automatska instalacija bezbednosnih zakrpa i kada je poslednji put pokrenuta. Sudo nije potreban — status se čita preko apt-config dump.
Rezervna kopija je glavno osiguranje: gubitak podataka je gori od bilo kakvog upada. Potrebne su dve stvari — rezervna kopija servera/sajtova i posebno rezervna kopija baze kontrolne table (tu su korisnici, WebAuthn ključevi, podešavanja, licenca).
Opcija A — HestiaCP: kartica Backup kod korisnika → dugme za kreiranje rezervne kopije (ili po rasporedu u podešavanjima servera). Rezervna kopija obuhvata sajtove i njihove baze.
Opcija B — ručno (cron): dump baze + arhiva direktorijuma data/ kontrolne table:
Ažuriranje na novu verziju. Prvo napravite rezervnu kopiju. Zatim ponovo otpremite datoteke koda, zadržavši svoje podatke:
public/, includes/, assets/, cron/, database/, kao i korenske .htaccess (front-kontroler — rutiranje se ne sme ostaviti iz stare verzije), manifest.json, sw.js;config.php (podaci BP), data/ (izveštaji), logs/, tmp/ (sesije i keš).SSH_FX_PERMISSION_DENIED — Permission denied. Fajlovi kontrolne table pripadaju korisniku www-data (tako su podešeni pri instalaciji), dok se SFTP klijent povezuje pod vašim sopstvenim korisnikom, koji nema pravo upisa. Predati www-data celu kontrolnu tablu „da bi radilo“ — upravo je to ono što dovodi do ove greške; ispod su tri načina, svaki rešava problem.
data/ (izveštaji), tmp/ (sesije i keš), logs/; oni ostaju u vlasništvu www-data. Ostalo je kôd, a veb-serveru je on potreban samo za čitanje, koje omogućava grupa www-data s pravima 644. Uzgredna korist: uz ranjivost u PHP-u fajlovi kontrolne table se više ne mogu prepisati. Na hosting-kontrolnim tablama (HestiaCP i slične) varijanta A nije potrebna: tamo fajlovi sajta ionako pripadaju nalogu pod kojim se prijavljujete preko SFTP, a veb-server ih čita po grupi.
chmod nad fajlovima resetuje ACL-masku i pristup neprimetno nestaje. Ako se posle „sređivanja prava“ otpremanje ponovo zaustavi na Permission denied — ponovite obe komande setfacl.
2 u varijanti C je setgid: fajlovi otpremljeni preko SFTP ostaju u grupi www-data, inače kontrolna tabla ne može da ih prepiše. Posle varijante C povežite se ponovo u FileZilli — nova grupa važi tek pri novoj prijavi. Provera: id deploy (mora da se pojavi grupa www-data) i ls -ld /path/to/monitor (drwxrwsr-x — slovo s znači da je setgid postavljen).
Migracija na drugi server:
config.php, data/.mysqldump na starom → uvoz na novom; ispravite podatke BP u config.php.adm, cron zadatke.Ako ne možete da se prijavite — sve se popravlja direktno u bazi sa servera. Otvorite bazu (ime — iz config.php):
Izgubljen WebAuthn ključ (ne prolazi drugi faktor) — isključite 2FA, prijavite se lozinkom, registrujte novi ključ:
Zaboravili ste lozinku — postavite novi heš (generišite ga na serveru i unesite):
Zaključali ste sebe IP-filterom — isključite ograničenje:
sudo mysql na serveru, ili phpMyAdmin / odeljak baze u kontrolnoj tabli hostinga. Nakon oporavka ponovo uključite WebAuthn i IP-filter.
Pregled poslova nalazi se u root cron-u servera (dodaju se preko sudo crontab -e). Ostavite samo redove za alate koje koristite; prilagodite putanje svom serveru.
sudo crontab -l i da je cron servis aktivan.
TIMEZONE iz config.php. Konstanta TIMEZONE utiče samo na PHP (kako kontrolna tabla prikazuje datume), ali cron demon pokreće poslove po sistemskom vremenu OS-a. Ako se zona servera ne poklapa sa vašom, izveštaj „08:00“ stiže u pogrešno vreme. Primer: server je u drugoj zoni (Europe/London, UTC+1), a vi u Beogradu (UTC+2) → izveštaj „08:00“ stiže u 09:00 po vašem vremenu. Proverite i po potrebi uskladite sistemsku zonu sa svojom:
0 8 * * * odradiće u 08:00 po lokalnom vremenu. U suprotnom biste morali da pomerate sam cron, ali pri prelasku na zimsko/letnje vreme pomak bi se opet razišao — zato je ispravnije podesiti sistemsku zonu.
crontab.txt) nalaze se u folderu system/ pored projekta, izvan public_html. To nije deo sajta — ne treba ih otpremati u web-koren; smestite ih na server po sistemskim putanjama (kao u crontab-u iznad):
lynis-scan.sh → /usr/local/bin/ (chmod +x) — pokreće lynis audit system, tokom skeniranja postavlja fleg /tmp/lynis-running i kopira lynis-report.dat u data/lynis/ kontrolne table;logwatch_daily.sh → /usr/local/bin/ (chmod +x) — formira dnevni Logwatch izveštaj (sshd, fail2ban, sudo, postfix) u data/logwatch/;smart-scan.sh → /usr/local/bin/ (chmod +x) — snima stanje diskova (smartctl) u data/disk/;debsums-scan.sh → /usr/local/bin/ (chmod +x) — proverava integritet paketa (debsums) u data/debsums/;clamav-scan.sh → /usr/local/bin/ (chmod +x) — ClamAV antivirusno skeniranje po rizičnim putanjama (web, home, temp); upisuje pregled u /var/log/clamav/scan.log, odakle ga čita stranica ClamAV (red 01:30 u crontab-u iznad);load-ipsum.sh → /usr/local/bin/ (chmod +x) — ažurira ipset skup ipsum (level 1) na licu mesta, bez kidanja aktivnih pravila fajervola (red 04:00 u crontab-u iznad);daily-report-all.sh → /usr/local/bin/ (chmod +x) — pokreće izveštaj cron/daily_report.php kontrolne table (red 08:00 u crontab-u iznad);daily_report.php — već je deo kontrolne table (cron/daily_report.php), pokreće se preko daily-report-all.sh, ne treba ga posebno postavljati;collect-metrics-all.sh → /usr/local/bin/ (chmod +x) — pokreće cron/collect_metrics.php kontrolne table (stranica „Performanse“, red */5 u crontab-u iznad); collect_metrics.php je već deo kontrolne table, ne treba ga posebno postavljati;crontab.txt (system/cron/) — primer poslova; potrebne redove upišite preko sudo crontab -e./usr/local/bin/. Direktno iz FileZilla tamo ne možete upisati — direktorijum pripada root-u, i SFTP-klijent će dobiti SSH_FX_PERMISSION_DENIED. Redosled je ovakav: prvo otpremiti fajl u /tmp (tamo svi mogu da pišu), zatim ga jednom komandom premestiti na mesto:
/tmp u korenu servera — ne /var/tmp i ne tmp/ unutar same kontrolne table (poslednji pripada www-data-u i zatvoren je za vašeg korisnika). U stablu FileZilla /tmp je grana najvišeg nivoa, pored var, a ne unutar njega.
/usr/local/bin/, log — /var/log/arciveo-cron.log) — ručno ne treba ništa raditi.
/home/*/web/*/public_html i /var/www/*, i stavljaju izveštaje u njihov data/. Ako je kontrolna tabla na drugoj putanji — dodajte je u red for app in … unutar skripti, inače izveštaji Lynis/SMART/debsums/Logwatch neće stići u kontrolnu tablu.
logs/cron.log prvi kreira root cron — pripadaće root-u, i kartica „Cron dnevnik“ u kontrolnoj tabli neće moći ni da ga pročita ni da ga očisti. Kreirajte fajl unapred u ime web-korisnika (vlasnik direktorijuma sajta; na HestiaCP to je nalog, npr. admin) — tada će root cron samo dopisivati, ne menjajući vlasnika:
stat -c %U /path/to/monitor.
sudo crontab -e), inače će se izvršavati dvaput.
sudo crontab (to bi bila direktna eskalacija do root-a za svakoga ko dobije pristup sesiji kontrolne table), već uska skripta sa dve komande (list/set), koja dira samo svoj blok između servisnih komentara. Instalirajte jednom:
www-data — proverite pod kim radi PHP-FPM pul sajta (ps -o user= -C php-fpm) i unesite ga u sudoers red.
public/crontab_monitor.php otpremljen preko FTP/SFTP pod drugim sistemskim korisnikom (na primer, root) nego ostali fajlovi sajta, web-server neće moći da ga pročita. Uporedite vlasnika i prava sa susednim fajlom i uskladite:
Monitor otkriva prisustvo alata putem dpkg-query — APT baze paketa. Ako alat nije instaliran putem apt (ručno, iz snap ili iz izvornog koda), dpkg ga ne vidi.
Greška 500 — proverite logove PHP, nginx i samog monitora:
www-data, već pod korisničkim nalogom (na primer admin — vlasnik direktorijuma sajta). Sva sudo-pravila i članstvo u grupama (adm, systemd-journal) treba dodeliti tom korisniku, inače će moduli prikazati „Nije aktivan / 0“ iako servisi rade. Da saznate stvarnog PHP korisnika: ps -o user= -C php-fpm | sort -u ili vlasnik direktorijuma sajta stat -c '%U' /path/to/monitor. Dalje u svim komandama ispod umesto www-data upišite njega. Automatska instalacija sama određuje veb-korisnika i za njega upisuje sudoers.
Podaci se ne prikazuju — gotovo uvek su u pitanju nepodešena sudo-prava. Proverite konkretnu komandu kao veb-korisnik (zamenite www-data svojim). Flag -n = bez lozinke, kao kod PHP — ako traži lozinku, znači da u sudoers nema pravila:
sudo aa-status u terminalu prikazuje profile, a stranica „AppArmor“ — „Neaktivan“). Uzrok: veb-korisnik nema sudo-pravo na komandu tog modula. Proverite je iz spiska iznad: ako traži lozinku — dodajte nedostajući red u /etc/sudoers.d/monitor („Podešavanje sudo“). Česte „nove“ komande: /usr/sbin/aa-status (MAC), /usr/sbin/psad --Status (PSAD).
apache2ctl, ausearch, aa-status ili ss, ili veb-korisnik nije u grupama adm/systemd-journal (odatle se čitaju logovi fail2ban/auth/modsec i journalctl — Falco i događaji kernela).
Simptom: na serveru podaci postoje (vidljivi kroz shell), a stranica prikazuje „nema podataka“ ili pogrešan status — na primer AIDE prijavljuje „Nije inicijalizovana“, iako je baza kreirana.
Uzrok je open_basedir: mnoge kontrolne table i hostinzi ograničavaju PHP-FPM pul na direktorijum domena, pa se PHP funkcije file_exists(), file_get_contents(), filemtime() po sistemskim putanjama (/var/lib/aide, /var/log, /proc…) blokiraju. Monitor to zaobilazi tako što takve putanje čita standardnim sistemskim komandama (cat, test, stat).
open_basedir. Ispravno rešenje je čitanje sistemskim komandama (već urađeno za AIDE i Mrežni monitor). Nije potrebno proširivati open_basedir na /var, /proc, a i manje je bezbedno.
Monitor proverava sertifikate povezujući se sa domenima direktno preko porta 443. Ako domen nije dostupan sa samog servera ili je port zatvoren fajervolom — provera neće uspeti.
/etc/nginx/sites-enabled/, /etc/nginx/conf.d/) i Apache (/etc/apache2/sites-enabled/) plus trenutni host iz HTTP_HOST.
Monitor se povezuje na MySQL kao korisnik iz config.php koji ima pristup samo svojoj bazi. MySQL u information_schema prikazuje samo baze na kojima ima privilegije — zato ostale nisu vidljive.
Da bi monitor video sve baze, dajte ovom korisniku pravo samo za čitanje (jednom, kao root; unesite korisničko ime iz config.php):
sudo mysql kontrolna tabla ne koristi: spisak baza uzima preko sopstvene PDO veze.
PostgreSQL zahteva pristup na nivou korisnika postgres, koji veb-korisnik kontrolne table nema. Otvaranje širokog sudo psql iz PHP-a nije bezbedno — umesto toga kontrolna tabla poziva usku omotač-skriptu bez parametara, koja samo ispisuje verziju, broj konekcija i listu baza sa veličinama. Kreirajte je:
monitor-pgstat iz sudoers (korak 13 ručne instalacije) i sam skript nemojte kreirati: kartica PostgreSQL će ostati jednostavno neaktivna.
Kontrolna tabla prikazuje šta se dešava; u nastavku — šta činiti u tipičnim situacijama. Opšte pravilo: bez panike, uporedite sa legitimnom aktivnošću (vaše radnje, ažuriranja, rezervne kopije) i reagujte prema ozbiljnosti.
ignoreip./etc, van /usr/share) — potencijalna podmena. Proverite paket: debsums PACKAGE_NAME, ako sumnjate — ponovo ga instalirajte (apt install --reinstall).127.0.0.1 ili zatvorite port u UFW. To je stvarna rupa.certbot renew ili podešavanja u kontrolnoj tabli).sudo apt update && sudo apt upgrade; nakon ažuriranja kernela ponovo pokrenite server.