Ovo je vodič za instalaciju, podešavanje i održavanje Arcivéo Security 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 Security 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.
Dva ritma rada. Stranice kontrolne table pitaju alate u trenutku otvaranja — uvek vidite trenutno stanje. Pored toga, po rasporedu (cron) rade pozadinski poslovi:
Potpun spisak poslova nalazi se u odeljku „Svi cron poslovi na jednom mestu“.
Ocena kreće od maksimuma i smanjuje se za svaki otkriveni problem:
PermitRootLogin yes) — −20PasswordAuthentication yes) — −10X11Forwarding, MaxAuthTries veći od 3 ili sshd_config čitljiv za sve naloge — −5TRACE ili nedostaje zaglavlje Strict-Transport-Security ili X-Frame-Options — −5Rezultat: 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.
Kanala ima četiri: Telegram, Email, webhook i push u pregledaču. Nezavisni su — uključite koje god želite, i sva četiri. Istim kanalima idu dnevni bezbednosni izveštaj, obaveštenja o opterećenju i nalazi senzora događaja; podešavaju se jednom, ovde, 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.Webhook. Jedna adresa koja prima POST pokriva Slack, Discord, Mattermost, n8n i sopstveni obrađivač. „Podešavanja“ → Webhook: nalepite adresu i uključite prekidač.
{"text": …}, ka Discord-u {"content": …} (Discord odbija poruke duže od 2000 znakova, pa se tekst skraćuje);text, event, severity, source, count, host, ts — tekst poruke ne treba ponovo rastavljati.Push obaveštenja. Poruka stiže pravo u pregledač, a ako je kontrolna tabla dodata na početni ekran telefona — kao obično obaveštenje aplikacije, bez bota i bez poštanskog servera između. „Podešavanja“ → Push obaveštenja: uključite prekidač i pritisnite „Poveži ovaj uređaj“ na svakom uređaju koji treba da prima obaveštenja. Brojač „Povezani uređaji“ pokazuje koliko ih ima.
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.
Kontrolna tabla je zatvorena prijavom lozinkom i, ako je uključen, IP filterom. Programu ni jedno ni drugo ne odgovara, pa spoljni sistemi imaju sopstveni ulaz — dve adrese samo za čitanje, zaštićene tokenom. Token ništa ne menja na serveru: njime se mogu samo dobiti pokazatelji.
Uključivanje — „Podešavanja“ → „API samo za čitanje“: prekidač „Uključi API“; token se stvara automatski pri prvom čuvanju. Dugme „Novi token“ izdaje drugi i u istom trenutku isključuje sve koji su koristili prethodni.
/api/status.php — JSON: bezbednosna ocena, stanje modula, poslednje merenje opterećenja sa najtežim procesima i bezbednosni događaji za 24 sata;/api/metrics.php — isti brojevi u tekstualnom formatu Prometheus-a (metrike arciveo_*: arciveo_security_score, arciveo_fail2ban_banned, arciveo_cpu_busy_pct i tako dalje).Ako vaš klijent ne ume da postavi zaglavlje, token se prima i kao parametar — ?token=…. Imajte u vidu da u tom obliku završava u dnevniku pristupa veb servera, pa je zaglavlje bolje.
Prometheus. Gotov blok za scrape_configs:
api disabled — API je isključen u podešavanjima. Odbijeni zahtevi upisuju se u log aplikacije zajedno sa IP adresom pošiljaoca, pa se pogađanje tokena vidi na stranici „Logovi aplikacije“.
Kontrolna tabla se instalira na svaki server posebno i dobro odgovara na pitanje „kako je ova mašina“. Na pitanje „kako su sve moje mašine“ ne odgovara — zato svaka kontrolna tabla može da šalje kratak pregled u korisnički nalog, gde se serveri vide u jednom spisku.
Šta uzeti u korisničkom nalogu my.arciveo.com → odeljak „Moji serveri“: tamo se izdaje token (oblika fk_…) i navedena je adresa primaoca https://my.arciveo.com/api/fleet.php. Token je jedan po nalogu — isti za sve vaše servere.
Šta podesiti u kontrolnoj tabli — „Podešavanja“ → „Pregled servera“: adresa primaoca, token, naziv servera (kako će biti potpisan u spisku; ostavite li prazno, uzima se domen kontrolne table) i prekidač „Šalji pregled“. Dugme „Pošalji odmah“ proverava vezu istog časa, bez čekanja na raspored.
Dalje pregled odlazi preko cron-a, na svakih 15 minuta:
Šta se tačno šalje: naziv i domen servera, operativni sistem, vreme rada, verzija PHP-a; bezbednosna ocena; stanje modula (UFW, broj Fail2ban jail-ova, blokade za danas, da li rade CrowdSec, Suricata i Falco, pretnje ClamAV-a, izmene AIDE-a, Lynis indeks, ažuriranja na čekanju, da li je potrebno ponovno pokretanje, dani do isteka sertifikata, broj opasno otvorenih portova); poslednje merenje opterećenja (load, CPU, RAM, disk, inode); brojači događaja za 24 sata i poslednji kritični događaj. Dnevnika, lozinki ni sadržaja datoteka u pregledu nema.
sudo crontab -l) i šta odgovara dugme „Pošalji odmah“. Greške pri slanju upisuju se u log aplikacije sa oznakom FLEET — tu se vidi da li je token odbijen (HTTP 401) ili sama veza nije uspostavljena.
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. Prozor od 24 sata je podrazumevani: dugmad na vrhu prebacuju ga na 7 dana ili 30 dana.
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.
Dve dubine čuvanja. „Sirovi“ petominutni snimci žive jedan dan (plus sat rezerve, da najstarija tačka na grafikonu ima prethodnika za proračun). Svaki završeni sat se sažima u jedan red; taj časovni niz čuva se 30 dana i upravo njega čitaju prikazi „7 dana“ i „30 dana“. Mesec istorije tako košta oko 720 redova umesto približno 8600.
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.
Najteži procesi. Ispod grafikona su dve tabele sa pet procesa koji najviše troše CPU:
Obe tabele uvek opisuju poslednja 24 sata, čak i kada grafikoni pokazuju mesec: snimak procesa nose samo petominutni redovi, a oni se ne čuvaju duže od jednog dana.
ps, PHP skript prikupljanja i lanac cron/sudo iznad njega) izuzimaju se sa spiska — inače bi zauzimali prve redove u svakom snimku: ps u trenutku pokretanja pokazuje skoro 100 % CPU. Ostali cron poslovi pokrenuti u istom minutu se pojavljuju — upravo zbog njih tabela i postoji.
Obaveštenja o opterećenju (odeljak „Podešavanja“ → „Obaveštenja o opterećenju“) — pri prekoračenju praga za CPU/RAM/disk/inode kontrolna tabla šalje obaveštenje svim uključenim kanalima (Telegram, Email, webhook, push — istim onim kojima ide dnevni izveštaj; za obaveštenja se ništa ne uključuje posebno), a zatim još jedno kada se metrika vrati u normalu. Dok se prag zadržava, ne spamuje: sledeće obaveštenje stiže tek posle ciklusa „vratilo se u normalu → 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.
Dnevni izveštaj odgovara na pitanje „kako je server“. Senzor odgovara na drugo — „šta se upravo dogodilo“. Na svakih 5 minuta ispituje brze izvore i beleži samo ono što se promenilo od prethodne provere; stranica „Bezbednosni događaji“ u meniju prikazuje spisak nalaza.
Spore provere — Lynis, debsums, ažuriranja paketa, rok SSL sertifikata — senzor ne dira: njihovi brojevi se ionako menjaju jednom dnevno i ostaju posao dnevnog izveštaja.
Šta primećuje — devet izvora:
[Priority: 1] podiže nalaz na kritičan;FOUND u dnevniku skeniranja;root (kritično) i prijava sa adrese koja ranije nije viđena (upozorenje);Alat koji nije instaliran ili čiji dnevnik kontrolna tabla ne može da pročita jednostavno ćuti — to nije ni greška ni događaj.
data/secwatch_state.json), a prvi prolaz samo upisuje tu oznaku. U suprotnom bi uključivanje nadzora donelo obaveštenje o svemu što su dnevnici nakupili mesecima.
Podešavanje — „Podešavanja“ → „Nadzor događaja“:
23-7 tokom kojeg se upozorenja ne šalju.Obaveštenja idu istim kanalima kao i dnevni izveštaj (Telegram, Email, webhook, push) — ništa se ne uključuje posebno. Svi nalazi se upisuju u spisak nezavisno od toga da li je obaveštenje poslato, i čuvaju se 90 dana.
Spisak događaja. Filteri: period (24 sata, 7, 30 ili 90 dana), važnost i izvor; prikazuje se poslednjih 500 zapisa. Dugme „Proveri odmah“ pokreće tačno isti prolaz kao cron — zgodno odmah posle podešavanja, da se ne čeka pet minuta; ono navodi i razlog kada obaveštenje nije poslato („ispod praga važnosti“, „tihi sati“, „nije podešen nijedan kanal obaveštenja“). Crveni brojač pored stavke menija je broj kritičnih događaja u poslednja 24 sata.
Kartica adrese. Klik na red u listi događaja ili u bloku Povezane adrese otvara sve što se o jednoj adresi zna: hronologiju njenih događaja, državu i u prvom redu zaključak. Red liste otvara karticu kada se događaj odnosi na tačno jednu adresu; ako ih navodi više, veze su same adrese unutar reda. Zaključaka ima četiri:
Ispod hronologije stoji blok Šta se u isto vreme dešavalo na serveru: događaji koji uopšte nemaju adresu. AIDE ne zna ko je izmenio datoteku, ClamAV ne zna ko je doneo zaraženu. Prikazani su oni koji padaju u aktivnost adrese i šest sati posle nje. Upravo prijava zajedno sa onim što je usledilo razdvaja pokušaj od stvarnog pristupa.
Raspored. Posao ide u root crontab (sudo crontab -e), pomeren za 2 minuta u odnosu na prikupljanje metrika, da oba ne krenu istovremeno:
php cron/security_watch.php. Omotač pronalazi sve instalacije kontrolne table na serveru i pokreće proveru u ime vlasnika sajta — sa istim sudo pravima koja kontrolna tabla koristi sa veba. Direktan poziv iz root crontab-a napravio bi datoteku stanja data/secwatch_state.json u vlasništvu korisnika root, i dugme „Proveri odmah“ prestalo bi da radi.
Stranica „Veb server“ rastavlja dnevnik pristupa i pokazuje koliko je bilo zahteva, koji se deo završio greškom i ko ih je slao. ModSecurity odgovara na pitanje „šta je blokirano“, ova stranica na pitanje „šta je uopšte stizalo na sajt“.
Šta se vidi: broj zahteva, RPS, udeo grešaka, poseban brojač 5xx i količina poslatog saobraćaja; grafikon zahteva po satima; raspodela kodova 2xx/3xx/4xx/5xx; česte adrese, česte IP adrese, česte greške (kod plus putanja) i klijenti (User-Agent). Period: 24 sata ili 7 dana.
Izvor je dnevnik pristupa u formatu combined, pa odgovaraju i Nginx i Apache, a dodatni modul nije potreban. Kontrolna tabla traži dnevnik među standardnim datotekama:
/var/log/nginx/access.log/var/log/apache2/access.log/var/log/apache2/other_vhosts_access.log/var/log/httpd/access_logPored njih, kontrolna tabla proverava datoteke *access*.log i *requests*.log u direktorijumima /var/log/nginx/, /var/log/apache2/ i /var/log/httpd/. Tako se pronalazi i dnevnik koji sajt upisuje u sopstvenu datoteku direktivom CustomLog — na primer arciveo-monitor_requests.log, koji pravi Arcivéo instalater.
Čita se samo jedan dnevnik: kada Nginx stoji ispred Apache-a, sabiranje dva dnevnika brojalo bi svaki zahtev dva puta. Uzima se prvi dnevnik sa spiska iznad u koji je upisivano tokom poslednjeg dana (datoteke pronađene po maski proveravaju se posle njega, od najsvežijih); ako ni u jedan nije upisivano tokom dana, uzima se najsvežiji neprazan. Zato dnevnik koji je ispraznio logrotate ili koji je ostao od isključenog veb servera ne zaklanja onaj živi. Čita se poslednji deo dnevnika (3 MB), a rezultat se kešira na 5 minuta — zato na opterećenom sajtu izabrani period možda neće biti pokriven u celosti; stvarni obuhvat je ispisan iznad grafikona.
adm, a veb korisnik nije u njoj. Arcivéo instalater ga dodaje u tu grupu; posle ručne instalacije pomaže mali omotač od root-a kome je dozvoljena tačno jedna stvar — da ispiše dnevnik (stranica ModSecurity radi na isti način). Omotač bira dnevnik po istim pravilima kao kontrolna tabla. Komanda se ispisuje na samoj stranici; evo je i ovde. Nalepite je celu — to je jedna komanda:
Veb korisnik može da se razlikuje od www-data — proverite pod kojim korisnikom radi PHP-FPM pool sajta (ps -o user= -C php-fpm) i upišite ga u red za sudoers. Ako ime dnevnika ne sadrži ni access ni requests, dopišite njegovu putanju na početak reda L=… unutar omotača.
Pokušaji poznatih ranjivosti. Panel poredi zahteve iz dnevnika sa potpisima dvadesetak raširenih eksploita: PHP-CGI, obilazak direktorijuma u Apache-u, PHPUnit, Log4Shell, ranjivosti rutera, kamera i VPN mrežnih prolaza. Za svaki pokušaj odgovara da li može da proradi na ovom serveru i oslanja se na činjenice: instalirane verzije Apache-a i PHP-a, prisustvo Jave i kod kojim je server odgovorio na zahtev za fajl. Crvenom je označeno samo ono što zaista može da proradi.
Zaštita veb servera. Panel šalje zahtev svakom sajtu na serveru preko 127.0.0.1 i proverava šta dobija posetilac: da li se vide verzije veb servera i PHP-a, da li je uključen metod TRACE i da li postoje zaštitna zaglavlja Strict-Transport-Security, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy i Content-Security-Policy. Sajtovi se uzimaju iz adrese na kojoj je panel otvoren i iz fajlova virtuelnih hostova, ako panel može da ih pročita. Rezultat se osvežava na svakih 10 minuta.
Ako nešto nedostaje, ispod tabele se pojavljuje jedna komanda. Ona pravi zaseban fajl zz-arciveo-hardening.conf i ponovo učitava veb server tek posle uspešne provere konfiguracije; zaglavlja koja sajt već šalje sam ne dupliraju se. CSP se ne nudi kao jedan red: politika se pravi za konkretan sajt, inače on prestaje da učitava sopstvene skripte, stilove i fontove. Poništavanje izmene na Apache-u:
ServerSignature) ne označava se ako je verzija veb servera već skrivena: bez verzije prikazuje samo naziv servera i ime hosta.
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.Kontrolna tabla već radi, a na istom serveru je potreban još jedan sajt — sa sopstvenim domenom pored monitora. Posle automatskog podešavanja server je običan Apache + PHP-FPM, pa su sajtu potrebne tri stvari: sopstveni direktorijum, sopstveni vhost i sopstveni sertifikat. Kontrolnu tablu pritom ne diramo: ona nadgleda ceo server, drugi primerak za drugi domen nije potreban.
site2.example.com je adresa novog sajta. To može biti i zaseban domen (mycompany.com) i poddomen (shop.mycompany.com) — za Apache nema razlike, razlikuju se samo DNS zapis (korak 1) i izdavanje sertifikata (korak 5). site2 je samo kratko ime sajta: tako se zovu direktorijum /var/www/site2 i konfiguraciona datoteka site2.conf. Sa domenom nema nikakve veze, Apache uzima adresu isključivo iz ServerName; ime može biti bilo koje — za shop.mycompany.com je, na primer, zgodno shop: direktorijum /var/www/shop, konfiguracija shop.conf.
1. DNS. U DNS panelu kod registratora domena napravite A zapis ka IP adresi ovog servera:
Posle nekoliko minuta proverite: dig +short site2.example.com treba da vrati IP servera.
2. Direktorijum sajta.
3. vhost. Blok se u terminal nalepi u celini — putanja do PHP-FPM soketa određuje se sama:
4. Uključite sajt i proverite konfiguraciju pre ponovnog učitavanja:
5. SSL. certbot je već instaliran automatskim podešavanjem; DNS u ovom trenutku mora da pokazuje na server:
Treći i naredni domeni dodaju se na isti način — ponovite korake 1–5 uz drugi domen i drugi direktorijum.
Host ne poklapa ni sa jednim ServerName (pristup preko IP adrese ili tuđi domen usmeren na vaš server), Apache isporučuje prvi po abecedi uključen sajt iz /etc/apache2/sites-enabled/. Standardni 000-default automatsko podešavanje isključuje, pa ta „dežurna“ uloga ostaje vhostu kontrolne table (arciveo-monitor.conf) — na sajtove koji se otvaraju sopstvenim imenom to ne utiče. Ako preko IP adrese treba da se otvara drugi sajt, nazovite njegovu datoteku tako da bude prva po abecedi (na primer 000-site2.conf).
site2_error.log i site2_access.log u /var/log/apache2/.
.htaccess (front kontroler), pa bi ugnežđeni sajt isporučivao nešto drugo nego što očekujete. Držite sajtove jedan pored drugog: /var/www/monitor, /var/www/site2.
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;security-watch-all.sh → /usr/local/bin/ (chmod +x) — pokreće cron/security_watch.php kontrolne table u ime vlasnika sajta (stranica „Bezbednosni događaji“, red 2-57/5 u crontab-u iznad); security_watch.php već ulazi u sastav kontrolne table i ne instalira se posebno;fleet-push-all.sh → /usr/local/bin/ (chmod +x) — šalje pregled servera u korisnički nalog preko cron/fleet_push.php kontrolne table (red 3,18,33,48 iznad);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.