Ručna instalacija

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):

  1. Povezati se sa serverom preko SSH-a;
  2. Ažurirati sistem, postaviti ime hosta i vremensku zonu;
  3. Napraviti običnog korisnika sa sudo pravima (ne raditi kao root);
  4. Podesiti prijavu preko SSH ključa i onemogućiti prijavu lozinkom;
  5. Uključiti zaštitni zid i automatsku zaštitu;
  6. (opciono) instalirati kontrolnu tablu HestiaCP — veb-server, bazu, poštu „iz kutije“.

02. Prvo povezivanje putem SSH

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 2. Kopirati javni ključ na server:

# macOS / Linux: ssh-copy-id deploy@203.0.113.10 # Windows (PowerShell): type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh deploy@203.0.113.10 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

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:

echo 'PermitRootLogin no' | sudo tee /etc/ssh/sshd_config.d/00-hardening.conf >/dev/null sudo systemctl restart ssh

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.

07. Instalacija kontrolne table HestiaCP (opciono)

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).
# Proveriti verziju PHP-a i ekstenzije: php -v php -m | grep -iE 'pdo_mysql|openssl|curl|mbstring|ioncube'

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:

PHPSOCK=$(ls -1 /run/php/php*-fpm.sock 2>/dev/null | head -1) # auto-detekcija PHP-FPM soketa sudo tee /etc/apache2/sites-available/monitor.conf > /dev/null <<'EOF' <VirtualHost *:80> ServerName monitor.example.com DocumentRoot /var/www/monitor <Directory /var/www/monitor> AllowOverride All Require all granted </Directory> <FilesMatch \.php$> SetHandler "proxy:unix:__PHPSOCK__|fcgi://localhost" </FilesMatch> </VirtualHost> EOF sudo sed -i "s#__PHPSOCK__#${PHPSOCK}#" /etc/apache2/sites-available/monitor.conf sudo a2dissite 000-default.conf sudo a2ensite monitor.conf sudo apache2ctl configtest sudo systemctl reload apache2

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.phpobriš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.
Detaljan pregled svih parametara — u FAQ: „Fajl config.php — sva podešavanja kontrolne table“.

13. Podešavanje sudo za veb-server

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 journalctl bez 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:

sudo apt install acl sudo setfacl -R -m u:www-data:rX /var/log/clamav /var/log/suricata 2>/dev/null sudo setfacl -d -m u:www-data:rX /var/log/clamav /var/log/suricata 2>/dev/null

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:

sudo tee /usr/local/bin/monitor-modsec >/dev/null <<'EOF' #!/bin/sh echo "ENGINE=$(grep -hE '^SecRuleEngine[[:space:]]+' /etc/modsecurity/*.conf 2>/dev/null | tail -1 | awk '{print $2}')" echo "---LOG---" tail -n 3000 /var/log/apache2/modsec_audit.log 2>/dev/null echo "---RULES---" for f in /etc/modsecurity/crs/rules/*.conf /usr/share/modsecurity-crs/rules/*.conf /etc/modsecurity/custom-rules.conf; do [ -f "$f" ] && { echo "===FILE:$(basename "$f")==="; cat "$f"; } done EOF sudo chown root:root /usr/local/bin/monitor-modsec sudo chmod 755 /usr/local/bin/monitor-modsec
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:

location ^~ /data/ { deny all; } location ^~ /tmp/ { deny all; } location ^~ /logs/ { deny all; } location ^~ /includes/ { deny all; } location ^~ /cron/ { deny all; } location ^~ /database/ { deny all; } location = /config.php { deny all; }
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 drugi location / — 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:

  1. Promenite admin lozinku — odeljak „Korisnici“ u meniju.
  2. 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.
  3. 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).
  4. Unesite licencu — kod ARCIVEO-… iz korisničkog naloga aktivirajte na svoj domen i umetnite ključ u „Podešavanja“ → „Licenca“. Više detalja.
  5. Podesite obaveštenja — Telegram i/ili Email u „Podešavanja“. Više detalja.
  6. Obrišite instaler public/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):

18. Cron i održavanje

Podešava se jednom, takođe opciono, ali se preporučuje. Detaljne komande — u priručniku:

  1. Cron-zadaci (izveštaji, ažuriranje lista, provere);
  2. Izrada rezervnih kopija;
  3. Ažuriranje i prenos kontrolne table;
  4. Vraćanje pristupa — u slučaju gubitka ključa/lozinke.
Nešto ne radi ili prikazuje „nema podataka“? Pogledajte grupu „Dijagnostika“ u priručniku.
Arcivéo - Security Monitor © 2026