Potpuno ručna instalacija: od tek kupljenog VPS-a do funkcionalne kontrolne table, korak po korak.
Priprema servera, kreiranje sajta, baza podataka, config.php i SSL opisani su ovde.
Komande za svaki bezbednosni alat i za cron nalaze se u
FAQ priručniku, linkovi su usput.
Glavno pravilo: kada menjate SSH ili firewall, ne zatvarajte trenutnu vezu dok novu ne proverite u zasebnom prozoru. Ako ipak izgubite pristup — skoro svi hosteri daju konzolu za hitne slučajeve (VNC/Recovery) u kontrolnoj tabli.
01. Kupili ste VPS sa Ubuntu/Debian — odakle početi
Nakon kupovine hoster šalje: IP adresu, korisničko ime (obično root) i lozinku (ili SSH ključ). To je dovoljno za prijavu. Redosled koraka (svaki korak je odeljak ispod):
Povezati se sa serverom preko SSH-a;
Ažurirati sistem, postaviti ime hosta i vremensku zonu;
Napraviti običnog korisnika sa sudo pravima (ne raditi kao root);
Podesiti prijavu preko SSH ključa i onemogućiti prijavu lozinkom;
SSH je zaštićeni terminal ka serveru. Umesto 203.0.113.10 unesite svoju IP adresu.
203.0.113.10 je primer, nepostojeća adresa (rezervisana za dokumentaciju). Nemojte je unositi ovako — zamenite je stvarnom IP adresom vašeg servera iz poruke hostera. U suprotnom neće biti povezivanja.
Windows 10/11: otvorite PowerShell ili „Terminal“ i koristite ugrađeni ssh (ili klijente PuTTY / MobaXterm). macOS / Linux: otvorite „Terminal“.
# Prijava kao root (lozinku ste dobili od hostera):
ssh root@203.0.113.10
# Ako vam je hoster dao ključ-fajl umesto lozinke:
ssh -i putanja/do/ključa root@203.0.113.10
Pri prvom povezivanju SSH će pitati za „authenticity of host“ — unesite yes. Lozinka se pri unosu ne prikazuje (to je normalno). Ako vam je hoster dao privremenu lozinku — promenite je komandom passwd.
03. Ažuriranje sistema i osnovno podešavanje
Prvi korak — ažurirajte sve pakete i podesite ime hosta i vremensku zonu.
# Ažuriranje sistema:
apt update && apt upgrade -y
# Osnovne alatke:
apt install -y curl wget ufw fail2ban unattended-upgrades
# Vremenska zona (primer) i ime hosta:
timedatectl set-timezone Europe/Belgrade
hostnamectl set-hostname myserver
# Automatska bezbednosna ažuriranja:
dpkg-reconfigure -plow unattended-upgrades
Spisak vremenskih zona — timedatectl list-timezones. Ako se na kraju ažuriranja pojavi plavi prozor „Daemons using outdated libraries“ — označite sve servise (razmaknica) i pritisnite OK, to je bezbedno.
04. Kreiranje korisnika sa sudo pravima
Stalan rad kao root nije bezbedan. Kreirajte običnog korisnika i dodelite mu sudo prava (pokretanje komandi kao administrator po potrebi). Zamenite deploy bilo kojim imenom.
# Kreiraj korisnika (postaviće lozinku i pitati podatke — može Enter):
adduser deploy
# Dodaj u grupu sudo:
usermod -aG sudo deploy
# Proveri (kao root):
su - deploy
sudo whoami # treba da ispiše: root
exit
Zatim se na server prijavljujte već kao ovaj korisnik: ssh deploy@203.0.113.10, a administratorske komande pokrećite sa prefiksom sudo.
05. SSH ključevi i onemogućavanje prijave lozinkom
Prijava ključem je sigurnija od lozinke: lozinka se može pogoditi, ključ — praktično ne. Prvo pravimo ključ na svom računaru, kopiramo ga na server, proveravamo prijavu — i tek onda onemogućavamo lozinku.
Korak 1. Napraviti ključ na svom računaru (Windows PowerShell / macOS / Linux):
ssh-keygen -t ed25519 -C "my-laptop"
# Enter na sva pitanja (ključ će biti u ~/.ssh/id_ed25519)
Korak 3. Proveriti prijavu ključem u novom prozoru — treba da pusti bez lozinke:
ssh deploy@203.0.113.10
Ne izvršavajte Varijantu B dok prijava ključem nije proverena i ne radi (Koraci 1–3), i ne zatvarajte radnu sesiju. Ona onemogućava prijavu lozinkom za sve korisnike, uključujući root. Bez ispravnog ključa potpuno ćete izgubiti pristup serveru — vratiti ga možete jedino preko konzole hostinga. Nemate ključ — uzmite Varijantu A.
Korak 4. Postrožite pristup preko SSH. Podešavanja stavljamo u zaseban fajl, osnovni konfig ne diramo. Izaberite varijantu prema situaciji:
Varijanta A — samo zatvoriti root, lozinku ostaviti. Ključ nije potreban, nećete izgubiti pristup:
Varijanta B — potpuni hardening. Onemogućiti prijavu lozinkom i root ostaviti samo preko ključa. Izvršavajte samo kada se uverite da prijava ključem radi:
sudo tee /etc/ssh/sshd_config.d/00-hardening.conf >/dev/null <<'EOF'
PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin prohibit-password
KbdInteractiveAuthentication no
EOF
sudo systemctl restart ssh
U obe varijante root preko lozinke je zatvoren. PermitRootLogin no zabranjuje root potpuno, prohibit-password — ostavlja prijavu samo preko ključa (za administraciju se prijavljujte kao deploy i koristite sudo). Ako želite da promenite SSH port — dodajte liniju Port 2222, ali prvo otvorite novi port u firewall-u (sledeći odeljak) i proverite prijavu, inače ćete sebi zatvoriti pristup.
06. Osnovni firewall i automatska zaštita
Zatvorite sve suvišno firewallom i uključite fail2ban (banuje pokušaje pogađanja lozinke preko SSH). Prvo dozvolite SSH, jer ćete inače nakon uključivanja UFW izgubiti pristup.
# Dozvoliti SSH (ili vaš port, ako ste ga menjali) i veb:
sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
# Uključiti firewall:
sudo ufw enable
sudo ufw status verbose
# fail2ban — zaštita SSH od pogađanja (osnovni profil je odmah aktivan):
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
Ovo je minimum. Radna podešavanja fail2ban-a, blok-listu ipsum, prošireni UFW i ostale alate potražite u grupi „Bezbednosni alati“ priručnika. Sama kontrolna tabla Arcivéo Monitor pregledno prikazuje status svega toga.
HestiaCP — besplatna kontrolna tabla za upravljanje hostingom: instalira i podešava veb-server (nginx + apache), PHP, bazu podataka (MariaDB), poštu, DNS i SSL-sertifikate, pruža veb-interfejs za sajtove. Praktična je ako ne želite sve ručno da podešavate i planirate da hostujete sajtove (uključujući i samu kontrolnu tablu Arcivéo Monitor).
Instalirajte HestiaCP na čist server (sveža podržana verzija Ubuntu/Debian, minimum ~1–2 GB RAM), pre instalacije drugih veb-servera i baza podataka — u suprotnom će doći do konflikata. Instalacija traje 10–20 minuta i ponovo će pokrenuti server.
# Preuzmi instalacioni program i pokreni:
wget https://raw.githubusercontent.com/hestiacp/hestiacp/release/install/hst-install.sh
sudo bash hst-install.sh
Instalacioni program će pitati za email i ime hosta, a zatim postaviti ceo stek. Nakon ponovnog pokretanja, kontrolna tabla je dostupna na adresi https://YOUR_IP:8083 (login i lozinku prikazuje instalacioni program na kraju).
HestiaCP sama upravlja UFW-om i fail2ban-om — nije ih potrebno posebno podešavati, ona će ih preuzeti. SSH-ključeve i onemogućavanje lozinke (prethodni odeljak) svakako uradite.
08. Sistemski zahtevi i ionCube
Kontrolna tabla je PHP aplikacija na tipičnom LAMP/LEMP steku:
OS: Linux (preporučuju se Ubuntu/Debian);
Veb-server: nginx ili Apache sa PHP-FPM;
PHP 8.0+ sa ekstenzijama: pdo_mysql, openssl, curl, json, mbstring;
ionCube Loader — PHP ekstenzija neophodna za rad kontrolne table;
BP: MySQL 5.7+ ili MariaDB 10.3+;
HTTPS — obavezno (prijava i WebAuthn rade samo preko https);
sudo za korisnika veb-servera (uzak skup — korak 13).
Instalacija ionCube Loader-a (ako već nije prisutan). Na hostingu sa kontrolnom tablom (HestiaCP, cPanel) ionCube se uključuje kvačicom u PHP podešavanjima. Ručno na Ubuntu/Debian:
# Saznati verziju PHP-a i direktorijum ekstenzija:
php -v
EXTDIR=$(php -r 'echo ini_get("extension_dir");'); PHPVER=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')
# Preuzeti i raspakovati loadere (64-bit):
cd /tmp
wget -q https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz
tar xzf ioncube_loaders_lin_x86-64.tar.gz
# Kopirati loader za vašu verziju PHP-a u direktorijum ekstenzija:
sudo cp ioncube/ioncube_loader_lin_${PHPVER}.so "$EXTDIR"/
# Uključiti (CLI + PHP-FPM) i restartovati:
echo "zend_extension=ioncube_loader_lin_${PHPVER}.so" | sudo tee /etc/php/${PHPVER}/mods-available/ioncube.ini
sudo phpenmod ioncube
sudo systemctl restart php${PHPVER}-fpm
# Provera — u izlazu će se pojaviti red "with the ionCube PHP Loader":
php -v
Verzija loadera mora da se poklapa sa verzijom PHP-a (na primer ioncube_loader_lin_8.1.so za PHP 8.1). Ako koristite više verzija PHP-a — uključite loader za svaku.
09. Domen i DNS
Da biste kontrolnu tablu otvarali na adresi poput monitor.example.com i dobili besplatan SSL — potreban je domen koji upućuje na vaš server. U kontrolnoj tabli za DNS napravite A-zapis:
Tip: A
Ime: monitor (poddomen → monitor.example.com)
ili @ (koren domena → example.com)
Vrednost: 203.0.113.10 ← IP vašeg servera
TTL: 3600
Nakon nekoliko minuta proverite da li domen upućuje na server:
dig +short monitor.example.com # treba da vrati vaš IP
# ili, ako nema dig:
getent hosts monitor.example.com
Let's Encrypt SSL-sertifikat se izdaje samo za domen — DNS mora da upućuje na server pre izdavanja sertifikata.
10. Kreiranje sajta i otpremanje fajlova kontrolne table
Apache: DocumentRoot — na koren kontrolne table, NE na public/. Stilovi (CSS/JS), sw.js, manifest.json nalaze se u assets/ pored public/ i zahtevaju se iz korena sajta. Korenski .htaccess je front-kontroler. Ako pod Apache postavite DocumentRoot na public/ — kontrolna tabla će se otvoriti bez stilova. Kod čistog nginx-a — obrnuto: za koren se uzima public/, a assets/ se serviraju posebnim pravilom (vidi blok nginx ispod).
Fajlovi kontrolne table (arhiva distributiva) preuzimaju se nakon kupovine u korisničkom nalogu my.arciveo.com → „Preuzimanja“. Raspakujte arhivu pre otpremanja.
1) Napravite direktorijum kontrolne table i otpremite u njega sadržaj distributiva (tako da se unutra nađu public/, assets/, config.php itd.):
sudo mkdir -p /var/www/monitor
# zatim otpremite fajlove distributiva u /var/www/monitor (FileZilla / WinSCP / scp)
2) Podesite veb-server.Apache: DocumentRoot — na koren kontrolne table (NE na /public); AllowOverride All je obavezan. Putanja do PHP-FPM soketa određuje se automatski. Blok se u terminal ubacuje u celini:
nginx: nginx nema .htaccess, pa za koren uzimamo public/, a assets/, sw.js, manifest.json (nivo iznad) serviramo posebnim pravilom:
PHPSOCK=$(ls -1 /run/php/php*-fpm.sock 2>/dev/null | head -1) # auto-detekcija PHP-FPM soketa
sudo tee /etc/nginx/sites-available/monitor.conf > /dev/null <<'EOF'
server {
listen 80;
server_name monitor.example.com;
root /var/www/monitor/public;
index index.php;
# assets, service worker i manifest nalaze se nivo iznad public/
location ~ ^/(assets/|sw\.js|manifest\.json) { root /var/www/monitor; }
location / { try_files $uri $uri/ /index.php?$query_string; }
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:__PHPSOCK__;
}
}
EOF
sudo sed -i "s#__PHPSOCK__#${PHPSOCK}#" /etc/nginx/sites-available/monitor.conf
sudo ln -s /etc/nginx/sites-available/monitor.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
Otpremanje fajlova — SFTP/SCP (FileZilla, WinSCP) ili scp:
# Primer preko scp sa lokalnog računara:
scp -r ./monitor/* deploy@203.0.113.10:/var/www/monitor/
Postavite dozvole na fajlove — ovo je obavezan korak. Ako ste otpremali pod root ili preko SFTP-a, fajlovi pripadaju korisniku root, pa veb-server (www-data) neće moći da ih pročita — kontrolna tabla će se otvoriti prazna ili sa greškom 403 (u logu: .htaccess unreadable / directory not executable). Komanda ispod to popravlja:
# Normalizujemo dozvole celog webroot-a: direktorijum koji je napravio root nije dostupan
# veb-serveru (www-data) — bez ovoga kontrolna tabla vraća praznu stranicu ili 403.
# Apache radi pod www-data; ako imate drugog veb-korisnika — zamenite.
cd /var/www/monitor
# Radne foldere pravimo PRE chown — inače novi direktorijumi ostaju root:root
# i pri chmod 750 veb-server (www-data) neće moći da piše u njih.
sudo mkdir -p data/lynis data/logwatch tmp logs
sudo chown -R www-data:www-data /var/www/monitor
sudo find /var/www/monitor -type d -exec chmod 755 {} \;
sudo find /var/www/monitor -type f -exec chmod 644 {} \;
sudo chmod 640 /var/www/monitor/config.php
sudo chmod 750 data tmp logs
3) Otvorite sebi otpremanje fajlova preko SFTP. Nakon gornje komande svi fajlovi pripadaju korisniku www-data, dok se FileZilla / WinSCP povezuju pod vašim sopstvenim korisnikom — otpremanje tada pada uz SSH_FX_PERMISSION_DENIED (Permission denied). Prijava kao root radi otpremanja nije opcija — root prijava je isključena u koraku 05. Izaberite jednu od dve varijante.
Varijanta A — ACL samo za vašeg korisnika (preporučeno). Pravo upisa dobijate samo vi; veb-server i dalje ne može da prepiše kôd kontrolne table:
sudo apt install -y acl
# Pravo upisa za vašeg korisnika na ceo direktorijum kontrolne table:
sudo setfacl -R -m u:deploy:rwX /var/www/monitor
# Isto pravilo kao podrazumevano — za fajlove i foldere napravljene kasnije:
sudo setfacl -R -d -m u:deploy:rwX /var/www/monitor
Varijanta B — preko grupe www-data. Jednostavnija, ali pravo upisa u fajlove kontrolne table dobija i veb-server: uz ranjivost u PHP-u kôd bi mogao da se podmeni. Redosled komandi je bitan — config.php i radni folderi se zatvaraju poslednji:
sudo usermod -aG www-data deploy
# Upis za grupu + setgid (bit 2): fajlovi otpremljeni preko SFTP ostaju
# u grupi www-data — inače kontrolna tabla ne može da ih prepiše.
sudo find /var/www/monitor -type d -exec chmod 2775 {} \;
sudo find /var/www/monitor -type f -exec chmod 664 {} \;
sudo chmod 640 /var/www/monitor/config.php
sudo chmod 2750 /var/www/monitor/data /var/www/monitor/tmp /var/www/monitor/logs
Posle varijante B povežite se ponovo u FileZilli (Server → Prekini vezu, pa se ponovo prijavite) — nova grupa važi tek pri novoj prijavi, do tada dozvole i dalje nećete imati. Provera: id deploy — na spisku grupa mora da se pojavi www-data; ls -ld /var/www/monitor — dozvole drwxrwsr-x, slovo s umesto x znači da je setgid postavljen.
11. Baza podataka
Kreirajte bazu i korisnika, zatim uvezite šemu. Blok se u terminal ubacuje u celini. monitor_db i monitor_user su primeri imena, možete zadati bilo koja svoja; zapamtite ime baze, korisnika i lozinku — upisaćete ih u config.php u sledećem koraku:
# 1. Baza podataka. Lozinka se zadaje JEDNOM u DBPASS i podmeće se u sve redove.
# Blok se u terminal ubacuje U CELINI; sudo mysql prijavljuje root preko unix-soketa
# (root lozinka nije potrebna). NE koristite interaktivni `sudo mysql -u root -p`
# sa kopiranjem — pri ubacivanju SQL redovi će otići u upit za lozinku i nestati.
DBPASS='CHOOSE_A_PASSWORD' # ← izmenite samo ovaj red
sudo mysql <<SQL
CREATE DATABASE IF NOT EXISTS monitor_db CHARACTER SET utf8mb4;
CREATE USER IF NOT EXISTS 'monitor_user'@'localhost' IDENTIFIED BY '$DBPASS';
GRANT ALL ON monitor_db.* TO 'monitor_user'@'localhost';
FLUSH PRIVILEGES;
SQL
# Provera (treba da prikaže monitor_db):
mysql -u monitor_user -p"$DBPASS" -e "SHOW DATABASES;"
# Ovu istu lozinku upišite u config.php → DB_PASS.
Šemu nije potrebno uvoziti — kontrolna tabla sama kreira tabele i nalog admin pri prvom otvaranju u pregledaču (iz database/db.sql), ako je baza prazna. Ručni uvoz šeme je potreban samo ako automatska inicijalizacija nije uspela.
Ako ste koristili instalater u pregledaču public/start_db.php — obrišite ga odmah po instalaciji: on omogućava ponovno kreiranje baze bez autorizacije. Dok se fajl nalazi u korenu kontrolne table ili u public/, kontrolna tabla prikazuje crveno upozorenje.
12. Podešavanje config.php
config.php u korenu kontrolne table (/var/www/monitor/config.php) — jedini fajl koji treba ručno urediti. Sva podešavanja kontrolne table zadata su u njemu konstantama define(). Otvorite ga u uređivaču:
sudo nano /var/www/monitor/config.php
Unesite svoje vrednosti tamo gde su podsvetljena mesta; ostalo ostavite kako jeste:
// --- Baza podataka (iz koraka 11) ---
define('DB_HOST', 'localhost'); // ostaviti
define('DB_NAME', 'db_name'); // ono što ste kreirali u koraku 11
define('DB_USER', 'user'); // ono što ste kreirali u koraku 11
define('DB_PASS', 'db_password'); // ono što ste zadali u koraku 11
define('DB_CHARSET', 'utf8mb4'); // ostaviti
// --- Aplikacija ---
define('APP_URL', 'https://monitor.example.com'); // adresa kontrolne table, bez kose crte na kraju
define('TIMEZONE', 'Europe/Belgrade'); // vaša vremenska zona
// --- Trajanje sesije ---
define('SESSION_LIFETIME', 28800); // neaktivnost do ponovne prijave, sek (28800 = 8 h)
Šta menjati:
DB_NAME, DB_USER, DB_PASS — tačno isti naziv baze, korisnik i lozinka koje ste zadali pri kreiranju baze u koraku 11 (ako ste ostavili primere — monitor_db / monitor_user). DB_HOST i DB_CHARSET ne dirajte.
APP_URL — puna adresa kontrolne table sa https://, bez kose crte na kraju i bez www. Mora se poklapati sa domenom na koji aktivirate licencu (korak 16), inače će ključ biti odbijen.
TIMEZONE — vaša vremenska zona (spisak — timedatectl list-timezones). Utiče samo na to kako kontrolna tabla prikazuje datume; na vreme pokretanja cron zadataka ne utiče (tamo važi zona sistema).
SESSION_LIFETIME — nakon koliko sekundi neaktivnosti kontrolna tabla traži ponovnu prijavu (podrazumevano 8 sati). Npr. 3600 = 1 sat, 86400 = jedan dan.
Blok za beleženje grešaka (display_errors, log_errors, error_log) — ostavite podrazumevano.
Sačuvajte fajl (Ctrl+O, Enter, zatim Ctrl+X) i ponovo pokrenite PHP-FPM — inače se zbog OPcache izmene neće primeniti:
sudo systemctl restart php*-fpm
config.php — tajni fajl (u njemu je lozinka baze). Nalazi se u korenu kontrolne table, koji je ujedno i veb-koren, ali je zaštićen: prava 640 (postavljena u koraku 10) i izričita zabrana u korenskom .htaccess. Ne postavljajte ga u javne repozitorijume i ne šaljite ga podršci sa stvarnom lozinkom.
PHP se izvršava pod korisnikom veb-servera, koji nema prava na sistemske komande. Pristup se dodeljuje usko: ciljani sudo za konkretne alate i čitanje logova preko grupa (bez sudo). Proboj veb-sloja ne daje root.
U primerima je www-data standardni korisnik za Apache. Ako imate drugog (u nekim tablama PHP radi pod zasebnim korisnikom) — zamenite ga svuda. Saznajte: ps -o user= -C php-fpm | sort -u.
1. Kreirajte /etc/sudoers.d/monitor pomoću sudo visudo -f /etc/sudoers.d/monitor i umetnite (uklonite redove modula koje ne koristite):
# UFW — status i pravila (stranica „Zaštitni zid“)
www-data ALL=(ALL) NOPASSWD: /usr/sbin/ufw status, /usr/sbin/ufw status verbose, /usr/sbin/ufw status numbered
www-data ALL=(ALL) NOPASSWD: /usr/sbin/ufw allow [0-9]*, /usr/sbin/ufw deny [0-9]*, /usr/sbin/ufw --force delete [0-9]*
# Fail2ban — status, ban i unban (banned vraća banove svih jail-ova jednom komandom;
# ban/unban su potrebni dugmadima kontrolne table)
www-data ALL=(ALL) NOPASSWD: /usr/bin/fail2ban-client status, /usr/bin/fail2ban-client status *, /usr/bin/fail2ban-client banned, /usr/bin/fail2ban-client set * banip *, /usr/bin/fail2ban-client set * unbanip *
# Bezbednosne nadogradnje (kartica „Nadogradnje“). Samo čitanje, ali baš pod root-om:
# apt keš (~70 MB) dostupan je samo root-u, ne-root ga rekompajlira pri svakom pozivu
# (4.2 s CPU naspram 0.01 s). Bez wildcard-a — tačno ova jedna komanda, ništa ne instalira.
www-data ALL=(ALL) NOPASSWD: /usr/bin/apt list --upgradable
# IPset (mapa napada, kontrolna tabla)
www-data ALL=(ALL) NOPASSWD: /usr/sbin/ipset list -t ipsum
# CrowdSec
www-data ALL=(ALL) NOPASSWD: /usr/bin/cscli decisions list *, /usr/bin/cscli alerts list *, /usr/bin/cscli bouncers list *, /usr/bin/cscli scenarios list *
# Auditd — pretraga događaja + čitanje poslednjih redova žurnala (tačna putanja)
www-data ALL=(ALL) NOPASSWD: /usr/sbin/ausearch -m *
www-data ALL=(ALL) NOPASSWD: /usr/bin/tail -n 300 /var/log/audit/audit.log
# Monit / ModSecurity / AppArmor / PSAD
www-data ALL=(ALL) NOPASSWD: /usr/bin/monit status
www-data ALL=(ALL) NOPASSWD: /usr/sbin/apache2ctl -M
www-data ALL=(ALL) NOPASSWD: /usr/local/bin/monitor-modsec
www-data ALL=(ALL) NOPASSWD: /usr/sbin/aa-status
www-data ALL=(ALL) NOPASSWD: /usr/sbin/psad --Status
# Otvoreni portovi (žurnali jezgra/SSH/Falco čitaju se BEZ sudo — preko grupe
# systemd-journal, vidi t.2; sudo za journalctl NE treba davati i nije bezbedno)
www-data ALL=(ALL) NOPASSWD: /usr/bin/ss -tuln, /usr/sbin/ss -tuln, /bin/ss -tuln
# PostgreSQL (samo ako ga koristite) — fiksna read-only skripta,
# kreirati po FAQ „PostgreSQL se ne prikazuje“; bez nje obrišite red
www-data ALL=(ALL) NOPASSWD: /usr/local/bin/monitor-pgstat
sudo chmod 440 /etc/sudoers.d/monitor
sudo visudo -c # mora biti "parsed OK"
2. Pristup logovima i systemd žurnalu. Moduli čitaju /var/log/fail2ban.log, auth.log, ufw.log, apache2/*, aide direktno (na Debian/Ubuntu ti logovi su u grupi adm). Događaji jezgra, SSH i Falco uzimaju se iz journald komandom journalctlbez sudo, preko grupe systemd-journal. Dodajte veb-korisnika u obe grupe i ponovo pokrenite PHP-FPM:
sudo usermod -aG adm,systemd-journal www-data
sudo systemctl restart php*-fpm # obavezno, inače se grupe neće primeniti
3. Ako ClamAV ili Suricata pišu logove van grupe adm (nekad je root:root) — dajte pristup preko ACL-a:
4. Omotač za ModSecurity. Audit-log WAF-a (/var/log/apache2/modsec_audit.log) pripada root-u sa pravima 640 i veb-korisnik ga ne može čitati direktno. Stranica ModSecurity uzima režim mehanizma, događaje i listu aktivnih pravila kroz fiksnu read-only skriptu — koja je i dozvoljena u sudoers redu iznad:
Bez fajla /etc/modsecurity/modsecurity.conf sam WAF ne radi: paket postavlja samo modsecurity.conf-recommended, i mehanizam pravila ostaje isključen — kako da ga uključite, vidi FAQ → „Instalacija ModSecurity“.
Korisnik u svim redovima sudoers-a mora se poklapati sa korisnikom FPM pula: na običnom Apache/Debian to je www-data, u HestiaCP pul sajta radi pod vlasnikom sajta (na primer, admin) — proverite grep -E '^user' /etc/php/*/fpm/pool.d/monitor.example.com.conf.
5. Ako je ispred Apache-a Nginx (HestiaCP, ISPmanager i druge table — tamo Nginx proksira PHP u Apache, a statiku servira sam). Servisni direktorijumi su zatvoreni fajlovima .htaccess, ali ih Nginx ne čita: svaki statički fajl (.json, .txt, .log, .dat) on servira direktno, zaobilazeći Apache. Napolje će iscuriti kešovi table i podaci — na primer tmp/modsec_cache.json sa WAF događajima i IP adresama napadača. Dodajte zabranu u konfiguraciju Nginx sajta:
Prefiks ^~ je obavezan: bira se pre regularnog pravila za statiku unutar location /, inače zabrana neće delovati.
U HestiaCP ovo stavite u zaseban fajl /home/<user>/conf/web/<domain>/nginx.ssl.conf_deny (i nginx.conf_deny za HTTP) — konfiguracija sajta uključuje nginx.ssl.conf_* i pri ponovnom sklapanju takve fajlove ne briše. Primenite: sudo nginx -t && sudo systemctl reload nginx.
Provera: curl -s -o /dev/null -w '%{http_code}\n' https://monitor.example.com/tmp/modsec_cache.json — treba da bude 403. Ako Apache radi bez Nginx-a (sam sluša 80/443), ništa ne treba dodavati — .htaccess je dovoljan.
Putanje do binarnih fajlova proverite pomoću which (na primer which ufw cscli ausearch ss). Sudoers menjajte samo kroz visudo. Lista svih MySQL baza uključuje se zasebnim GRANT-om (FAQ → „Vidljiva je samo jedna baza“).
14. Ograničenje pristupa po IP-u
Ograničite pristup Monitoru po IP adresi — čak i ako URL postane poznat, stranica za prijavu se neće otvoriti. Može na nivou veb-servera (primer za nginx ispod) ili u samoj kontrolnoj tabli („Podešavanja“ → „Ograničenje pristupa po IP-u“). Ako koristite Apache, koristite ograničenje u kontrolnoj tabli.
Ako je nginx sajt već podešen prema koraku 10, nemojte dodavati drugilocation / — upišite linije allow/deny u već postojeći blok. Dva ista location / u jednom server { } — greška u konfiguraciji, nginx se neće ponovo pokrenuti.
# U nginx konfiguraciji (unutar server { }):
# ACME putanju Let's Encrypt držimo otvorenom mimo IP ograničenja —
# da izdavanje i automatsko obnavljanje SSL-a (korak 15) ne zavise od IP filtera.
location ^~ /.well-known/acme-challenge/ { allow all; }
location / {
allow 203.0.113.10; # ← upišite svoj IP
allow 10.0.0.0/8; # lokalna mreža (ako je potrebno)
deny all;
try_files $uri $uri/ /index.php?$query_string;
}
# Ponovo učitati nginx:
sudo nginx -t && sudo systemctl reload nginx
15. Izdavanje SSL-a (HTTPS)
Kontrolna tabla radi samo preko HTTPS-a. Sesija prijave koristi bezbedan kolačić, a WebAuthn (2FA) radi samo na HTTPS-u. Preko http:// nije moguće prijaviti se.
Sertifikat je besplatan (Let's Encrypt). DNS domena već mora da pokazuje na server. Komanda zavisi od veb-servera:
# Apache:
sudo certbot --apache -d monitor.example.com
# nginx — SAMO ako imate baš nginx. Na Apache-u NE pokrećite:
# apt će povući nginx i zauzeti port 80, sukob sa Apache-om.
# sudo apt install python3-certbot-nginx
# sudo certbot --nginx -d monitor.example.com
# certbot će sam upisati HTTPS u konfiguraciju i podesiti automatsko obnavljanje
Šta će certbot pitati: e-mail → saglasnost sa Terms (Y) → prosleđivanje e-maila EFF-u (po vašem izboru). Zatim će sam izdati sertifikat, upisati <VirtualHost *:443>, podesiti preusmeravanje http→https i automatsko obnavljanje.
DNS mora da pokazuje na server PRE pokretanja certbota (provera vlasništva preko porta 80). Provera: dig +short monitor.example.com → IP servera. Portovi 80/443 otvoreni: sudo ufw allow 80,443/tcp.
Nakon izdavanja: https://monitor.example.com otvara se sa katancem, http:// preusmerava na https:// (APP_URL u config.php je već zadat u koraku 12).
16. Prijava i početno podešavanje
Otvorite https://monitor.example.com, prijavite se sa admin / useradmin i prođite kroz kontrolnu listu:
Promenite admin lozinku — odeljak „Korisnici“ u meniju.
Uključite WebAuthn (2FA) — „WebAuthn ključevi“ → registrujte ključ/passkey (zahteva HTTPS). Registrujte odmah dva: ako izgubite jedini ključ, prijava pomoću njega neće biti moguća. Više detalja.
Ograničite pristup po IP-u — „Podešavanja“ → „Ograničenje pristupa po IP-u“ (unesite svoj IP pre uključivanja, inače ćete zatvoriti pristup sebi).
Unesite licencu — kod ARCIVEO-… iz korisničkog naloga aktivirajte na svoj domen i umetnite ključ u „Podešavanja“ → „Licenca“. Više detalja.
Podesite obaveštenja — Telegram i/ili Email u „Podešavanja“. Više detalja.
Obrišite instalerpublic/start_db.php, ako je ostao (korak 11).
17. Bezbednosni alati (opciono)
Kontrolna tabla već radi. Alati se instaliraju po želji — instalirate ono što vam treba, a kontrolna tabla odmah prikazuje status. Komande za instalaciju svakog nalaze se u priručniku (posebni odeljci po alatima):
Ovo je demonstracija programa Arcivéo Security Monitor samo za pregled — sve izmene su onemogućene. Postavite ga na svoj server da biste upravljali stvarnim bezbednosnim podacima.