FAQ

Toto je návod na inštaláciu, konfiguráciu a údržbu Arcivéo Security Monitor. Sekcie sú rozdelené do skupín: všeobecný prehľad, nasadenie panela, pripojenie bezpečnostných nástrojov, zabudované moduly a diagnostika. Príkazy môžete skopírovať tlačidlom vpravo.

Kde začať

01. Inštalácia panela — vyberte spôsob

Inštalácia panela je na samostatných krokových stránkach. Vyberte spôsob:

Ak si nie ste istí, zvoľte automatickú. Táto príručka zostáva jednotným zdrojom pre SSL, nástroje, cron a diagnostiku — inštalačné stránky odkazujú na jej sekcie a nič neduplikujú.

Prehľad

02. Čo je Arcivéo Security Monitor

Arcivéo Security Monitor — panel zabezpečenia servera. Zbiera údaje z nainštalovaných nástrojov (Fail2ban, UFW, Lynis, ModSecurity, AIDE, ClamAV, Auditd, CrowdSec, Suricata, Falco a i.) a zobrazuje ich v jednotnom rozhraní s dashboardom, mapou útokov a podrobnými stránkami pre každý nástroj.

Monitor nie je aktívny ochranný prostriedok — útoky sám neblokuje. Jeho úlohou je agregovať informácie z už fungujúcich nástrojov a prehľadne ich prezentovať.

03. Ako monitor funguje na serveri

Monitor funguje len lokálne — musí byť nainštalovaný na tom istom serveri, ktorý monitoruje. Žiadny SSH ani vzdialené API neexistuje.

Všetky príkazy (fail2ban-client, ufw status, ipset list atď.) panel vykonáva pod používateľom webového servera (zvyčajne www-data, na hostingových paneloch — účet webu) s úzkou sadou práv sudo — len na konkrétne nástroje, bez všeobecného root prístupu. Výsledky sa spracujú a zobrazia v prehliadači.

Dva rytmy práce. Stránky panela sa pýtajú nástrojov v okamihu otvorenia — vždy vidíte aktuálny stav. Okrem toho bežia na pozadí úlohy podľa rozvrhu (cron):

  • každých 5 minút — snímka záťaže pre stránku „Výkon“;
  • každých 5 minút — senzor bezpečnostných udalostí: nové bany, hlásenia IDS, zastavená ochrana, otvorený port (kapitola „Bezpečnostné udalosti“);
  • raz denne — bezpečnostná správa na Telegram a e-mail, ako aj náročné kontroly (Lynis, AIDE, ClamAV, debsums, Logwatch);
  • každých 15 minút — prehľad servera do zákazníckeho účtu, ak je zapnutý.

Úplný zoznam úloh je v kapitole „Všetky cron úlohy na jednom mieste“.

Pri viacerých serveroch inštalujte monitor na každý zvlášť, s vlastnou doménou. Aby ste ich videli v jednom zozname, zapnite prehľad serverov (kapitola „Prehľad serverov v zákazníckom účte“).

04. Ako sa počíta skóre bezpečnosti

Skóre začína na maxime a znižuje sa za každý zistený problém:

  • UFW nie je aktívny — −30
  • Fail2ban nebeží (žiadne aktívne jail) — −25
  • Žiadne kľúče WebAuthn — −15
  • Lynis hardening index < 60 — −20; 60–79 — −10
  • IPset ipsum nie je načítaný — −10
  • Hrozby zistené nástrojom ClamAV — −20
  • Zmeny súborov podľa AIDE — −15
  • SSL vypršal — −30, vyprší o <14 dní — −15, <30 dní — −5
  • CrowdSec je nainštalovaný, ale nebeží — −5
  • Suricata je nainštalovaná, ale nebeží — −5
  • Databáza/cache (MySQL, PostgreSQL, Redis…) dostupné zvonku — −10
  • Povolené prihlásenie root cez SSH (PermitRootLogin yes) — −20
  • Povolené prihlásenie heslom cez SSH (PasswordAuthentication yes) — −10
  • Drobné nastavenia SSH: zapnutý X11Forwarding, MaxAuthTries nad 3 alebo sshd_config čitateľný pre všetky účty — −5
  • Zabezpečenie webového servera: odpovede prezrádzajú verziu webového servera alebo PHP, je zapnutá metóda TRACE alebo chýba hlavička Strict-Transport-Security či X-Frame-Options — −5
  • Čakajú bezpečnostné aktualizácie na inštaláciu — −5

Výsledok: 80+ = Chránený, 60–79 = Pozor, <60 = Ohrozený.

Zrážky za ClamAV, AIDE, CrowdSec a Suricata sa uplatňujú len vtedy, ak je nástroj nainštalovaný. Lynis a AIDE bez inicializovanej databázy sa zobrazujú ako „žiadne údaje“ a skóre neznižujú. Počet dnešných útokov sa zobrazuje na dashboarde, ale skóre bezpečnosti neovplyvňuje. Zabezpečenie webového servera sa nepočíta, ak na kontrolu neodpovedal žiadny web.

Nastavenia a licencia

05. WebAuthn — dvojfaktorová autentifikácia

WebAuthn — štandard autentifikácie bez hesla pomocou hardvérového kľúča. Podporuje YubiKey, Touch ID, Face ID, Windows Hello, Passkey.

Po prihlásení heslom systém vyžiada potvrdenie zaregistrovaným kľúčom. Aj keď heslo unikne — bez fyzického kľúča alebo biometrie sa prihlásiť nedá.

Nastavenie otvoríte cez Kľúče WebAuthn v bočnom menu a kliknite na „Zaregistrovať kľúč“. Zaregistrujte si hneď dva kľúče: ak sa jediný kľúč stratí alebo pokazí, prihlásenie do panela pomocou neho už nebude možné.

WebAuthn funguje iba cez HTTPS. Na HTTP spojení nie je registrácia ani prihlásenie kľúčom dostupné.

06. Upozornenia: Telegram, Email, webhook a push

Kanály sú štyri: Telegram, Email, webhook a push v prehliadači. Sú na sebe nezávislé — zapnite ktorékoľvek, pokojne všetky štyri. Rovnakými kanálmi chodí denná bezpečnostná správa, upozornenia na záťaž aj nálezy senzora udalostí; nastavujú sa raz, tu, v sekcii „Nastavenia“.

Telegram. Potrebujete token bota a chat id:

  1. V Telegrame napíšte @BotFather → /newbot → dostanete token v tvare 123456:ABC....
  2. Napíšte svojmu novému botovi ľubovoľnú správu (aby vám mohol odpovedať).
  3. Zistite svoj chat id: napíšte botovi @userinfobot, alebo otvorte https://api.telegram.org/bot<TOKEN>/getUpdates a nájdite "chat":{"id":...}.
  4. Vložte token a chat id do „Nastavenia“ → Telegram a stlačte „Uložiť a poslať test“.

Email. Dva spôsoby na výber v „Nastavenia“ → Email:

  • SMTP — hostiteľ, port (465/SSL alebo 587/TLS), prihlasovacie meno a heslo vašej e-mailovej schránky;
  • Resend — moderné API: zadajte API kľúč (re_...) a overenú doménu odosielateľa.

Webhook. Jediná adresa prijímajúca POST pokryje Slack, Discord, Mattermost, n8n aj vlastnú obsluhu. „Nastavenia“ → Webhook: vložte adresu a zapnite prepínač.

  • do Slacku a Mattermostu odchádza {"text": …}, do Discordu {"content": …} (Discord odmieta správy dlhšie ako 2000 znakov, text sa preto skracuje);
  • každá iná adresa dostane štruktúrovaný JSON: text, event, severity, source, count, host, ts — text správy netreba znova rozoberať.

Push upozornenia. Správa príde priamo do prehliadača, a ak je panel pridaný na domovskú obrazovku telefónu, ako bežné upozornenie aplikácie — bez bota a bez poštového servera medzi tým. „Nastavenia“ → Push upozornenia: zapnite prepínač a na každom zariadení, ktoré má upozornenia dostávať, stlačte „Pripojiť toto zariadenie“. Počítadlo „Pripojené zariadenia“ ukazuje, koľko ich je.

Push funguje iba cez HTTPS (rovnako ako WebAuthn) a povolenie je potrebné dvakrát: najprv v prehliadači — otázka sa objaví po stlačení „Pripojiť toto zariadenie“ — a potom v samotnom operačnom systéme. Ak je vo Windowse vypnutý hlavný prepínač Nastavenia → Systém → Oznámenia, prehliadač povolenie udelí, panel ohlási odoslanie a na obrazovke sa aj tak nič neobjaví. To isté spôsobí režim „Nerušiť“ a vypnuté upozornenia prehliadača v macOS (Nastavenia systému → Oznámenia).
Každý kanál má vlastné tlačidlo „Poslať test“, ktoré ho ihneď overí. Rozvrh automatickej správy zabezpečuje cron (kapitola „Všetky cron úlohy“): cron spustí odoslanie a kanály sa berú z nastavení.

Stav reportu: „POZOR“ alebo „OK“. Nadpis sa zmení na „POZOR“ iba pri reálnom probléme alebo čakajúcej akcii: nájdená hrozba ClamAV, zmeny súborov v AIDE, kritické udalosti Falco (Emergency/Alert/Critical za posledných 24 h), spadnutá služba v Monit, potrebný reštart, končiace SSL (≤14 dní) alebo čakajúce bezpečnostné aktualizácie. Šum na pozadí — pokusy botov o SSH prihlásenie, IP adresy zabanované cez fail2ban, alerty Suricata, upozornenia Lynis a už odrazené požiadavky ModSecurity — stav nezvyšuje, preto takéto čísla v reporte samy osebe neznamenajú „POZOR“.

07. Licencia — zadanie a aktivácia

Podrobné moduly monitorovania (Lynis, UFW, ModSecurity, mapa útokov, AIDE, ClamAV a i.) sa sprístupnia s platnou licenciou. Bez nej dashboard, nastavenia a účet fungujú, no moduly zobrazujú kartu „Vyžaduje sa licencia“.

Po nákupe v účte máte aktivačný kód v tvare ARCIVEO-XXXX-XXXX-XXXX-XXXX. Ten treba „aktivovať“ na doménu vášho panela — kód sa tým premení na podpísaný licenčný súbor (blok [license]), ktorý vložíte do panela.

Ako aktivovať (3 kroky):

  1. Vezmite aktivačný kód. Účet my.arciveo.com → sekcia „Licencie“ / „Aktivácia licencie“ — skopírujte kód ARCIVEO-….
  2. Aktivujte kód na svoju doménu. Tam istom v účte otvorte „Aktivácia licencie“, zadajte: aktivačný kód, váš email a doménu panela (adresu, na ktorej sa otvára monitor, napr. monitor.example.com). Kliknite na aktiváciu — systém vygeneruje licenčný súbor viazaný na túto doménu a zobrazí ho v poli s tlačidlom „Kopírovať“.
  3. Vložte kľúč do panela. Skopírujte celý text licencie → v paneli otvorte „Nastavenia“ → blok „Licencia“, vložte a kliknite na „Uložiť“. Moduly sa hneď odomknú.

Panel kryptograficky overuje kľúč: podpis, viazanie na doménu a platnosť.

Doména pri aktivácii sa musí presne zhodovať s adresou panela. Vezmite ju z konštanty APP_URL v config.php a zadajte len názov hostiteľa — bez https:// a bez predpony www. Aktivácia je jednorazová: kód sa premení na licenciu pre zadanú doménu a znova sa už neaktivuje — pri chybe v doméne kľúč vášmu panelu nesadne a kód sa spotrebuje. Preto zadávajte doménu pozorne.
Ak platnosť vypršala alebo sa zmenila doména, v hlavičke panela sa objaví upozornenie. Licencia je viazaná na doménu natrvalo a na inú doménu sa neprenáša: na nové obdobie alebo novú doménu potrebujete nový kľúč (kupuje sa v účte a aktivuje sa jednorazovo).

08. Súbor config.php — všetky nastavenia panela

Všetky základné parametre panela sú zadané v jednom súbore config.php v koreni (vedľa priečinka public/) bežnými konštantami define(). Súbor sa vytvorí pri inštalácii; ručne ho treba upravovať zriedka — najmä pri zmene domény, prenose alebo pripojení k inej databáze. Po akejkoľvek úprave reštartujte PHP-FPM (inak sa kvôli OPcache zmeny neprejavia).

Do zvýraznených miest doplňte svoje hodnoty; ostatné nechajte tak, ako je:

// --- Databáza --- define('DB_HOST', 'localhost'); // nechať define('DB_NAME', 'db_name'); // čo ste zadali pri vytváraní DB define('DB_USER', 'user'); // čo ste zadali pri vytváraní DB define('DB_PASS', 'db_password'); // čo ste zadali pri vytváraní DB define('DB_CHARSET', 'utf8mb4'); // nechať // --- Aplikácia --- define('APP_URL', 'https://monitor.example.com'); // adresa panela, bez lomky na konci define('TIMEZONE', 'Europe/Bratislava'); // vaše časové pásmo // --- Trvanie relácie --- define('SESSION_LIFETIME', 28800); // nečinnosť do opätovného prihlásenia, s (28800 = 8 h)

Databáza. Prihlasovacie údaje pripojenia k MySQL/MariaDB:

  • DB_HOST — hostiteľ databázy, takmer vždy localhost;
  • DB_NAME — názov databázy panela;
  • DB_USER — používateľ DB (prístup len k vlastnej databáze);
  • DB_PASS — heslo tohto používateľa;
  • DB_CHARSET — kódovanie spojenia, nechajte utf8mb4.

Aplikácia.

  • APP_URL — úplná adresa panela (napr. https://monitor.example.com). Musí sa zhodovať s doménou, na ktorú je licencia aktivovaná — inak bude kľúč odmietnutý (pozri časť „Licencia“);
  • TIMEZONE — časové pásmo PHP: ovplyvňuje len to, ako panel zobrazuje dátumy a čas. Na čas spúšťania cron úloh nemá vplyv — tam platí pásmo systému (pozri „Všetky cron úlohy“).

Trvanie relácie. SESSION_LIFETIME — časový limit nečinnosti relácie v sekundách (posuvný: obnovuje sa pri aktivite). Predvolene 28800 = 8 hodín; po tomto čase nečinnosti panel vyžiada opätovné prihlásenie. Napríklad 3600 = 1 hodina, 86400 = deň.

Zaznamenávanie chýb. Chyby sa návštevníkom nikdy nezobrazujú, ale zapisujú sa do logs/php_errors.log — vidno ich na stránke „Logy aplikácie“. Tieto riadky (display_errors=0, log_errors=1, cesta error_log) zvyčajne netreba meniť — nastavenia sú zadané priamo v súbore a nezávisia od php.ini.

config.php — tajný súbor. Obsahuje heslo k DB. Nachádza sa v koreni panela (vedľa public/), pričom webový koreň (DocumentRoot) tohto panela je práve koreň panela, nie public/. Samotný súbor „neuniká“: v koreňovom .htaccess je preň nastavený výslovný zákaz (Require all denied) — server vráti 403. Aj bez tohto pravidla by zdrojový kód neunikol: je to PHP — server ho vykonáva, nevydáva ho ako text. Pre istotu: nezverejňujte ho vo verejných repozitároch a neposielajte do podpory s reálnym heslom. Práva na súbor — 640.
Pri prenose alebo obnove prístupu je tento súbor hlavným zdrojom prihlasovacích údajov: názov DB, používateľ a heslo sa berú práve odtiaľto (pozri časti „Aktualizácia a prenos panela“ a „Obnova prístupu“).

09. API len na čítanie (JSON a Prometheus)

Panel je chránený prihlásením heslom a, ak je zapnutý, IP filtrom. Programu nevyhovuje ani jedno, preto majú externé systémy vlastný vstup — dve adresy len na čítanie zabezpečené tokenom. Token na serveri nič nemení: dajú sa ním získať iba ukazovatele.

Zapnutie — „Nastavenia“ → „API len na čítanie“: prepínač „Zapnúť API“; token sa vytvorí automaticky pri prvom uložení. Tlačidlo „Nový token“ vydá iný a v tej istej chvíli odstrihne všetkých, ktorí používali predchádzajúci.

  • /api/status.php — JSON: bezpečnostné skóre, stav modulov, posledné meranie záťaže vrátane najnáročnejších procesov a bezpečnostné udalosti za posledných 24 hodín;
  • /api/metrics.php — tie isté čísla v textovom formáte Prometheus (metriky arciveo_*: arciveo_security_score, arciveo_fail2ban_banned, arciveo_cpu_busy_pct a ďalšie).
curl -H "Authorization: Bearer <TOKEN>" https://monitor.example.com/api/status.php curl -H "Authorization: Bearer <TOKEN>" https://monitor.example.com/api/metrics.php

Ak váš klient nevie nastaviť hlavičku, token sa prijíma aj ako parameter — ?token=…. Rátajte s tým, že v tejto podobe skončí v prístupovom logu webového servera, hlavička je preto vhodnejšia.

Prometheus. Hotový blok pre scrape_configs:

scrape_configs: - job_name: arciveo metrics_path: /api/metrics.php scheme: https authorization: credentials: <TOKEN> static_configs: - targets: ['monitor.example.com']
Odpoveď sa ukladá do vyrovnávacej pamäte na 5 minút: za týmito číslami stojí to isté náročné dopytovanie nástrojov ako za nástenkou. Časté dopytovanie teda server nič nestojí — hodnoty sa jednoducho opakujú až do ďalšieho obnovenia — ale interval kratší než minúta tiež nemá zmysel.
401 — token je nesprávny alebo nebol odovzdaný. 404 s textom api disabled — API je v nastaveniach vypnuté. Odmietnuté požiadavky sa zapisujú do logu aplikácie spolu s IP odosielateľa, takže hádanie tokenu je vidieť na stránke „Logy aplikácie“.

10. Prehľad serverov v zákazníckom účte

Panel sa inštaluje na každý server zvlášť a na otázku „ako sa darí tomuto stroju“ odpovedá dobre. Na otázku „ako sa darí všetkým mojim strojom“ neodpovedá — preto môže každý panel posielať krátky prehľad do zákazníckeho účtu, kde sú servery vidieť v jednom zozname.

Čo si vziať v zákazníckom účte my.arciveo.com → sekcia „Moje servery“: vydáva sa tam token (v tvare fk_…) a je uvedená adresa príjemcu https://my.arciveo.com/api/fleet.php. Token je jeden na účet — rovnaký pre všetky vaše servery.

Čo nastaviť v paneli — „Nastavenia“ → „Prehľad serverov“: adresa príjemcu, token, názov servera (ako bude v zozname podpísaný; ak necháte prázdne, vezme sa doména panela) a prepínač „Posielať prehľad“. Tlačidlo „Odoslať teraz“ overí spojenie okamžite, bez čakania na rozvrh.

Ďalej prehľad odchádza cronom, každých 15 minút:

# každých 15 minút — prehľad servera do zákazníckeho účtu 3,18,33,48 * * * * /usr/local/bin/fleet-push-all.sh >> /path/to/monitor/logs/cron.log 2>&1

Čo presne odchádza: názov a doména servera, operačný systém, čas behu, verzia PHP; bezpečnostné skóre; stav modulov (UFW, počet jailov Fail2ban, bany za dnešok, či bežia CrowdSec, Suricata a Falco, hrozby ClamAV, zmeny AIDE, index Lynis, čakajúce aktualizácie, či je nutný reštart, dni do vypršania certifikátu, počet nebezpečne otvorených portov); posledné meranie záťaže (load, CPU, RAM, disk, inody); počítadlá udalostí za posledných 24 hodín a posledná kritická udalosť. Logy, heslá ani obsah súborov prehľad neobsahuje.

Posiela server, zákaznícky účet sa nepýta. Do vašej siete preto netreba otvárať vstup zvonka a panel uzavretý IP filtrom sa hlási tiež. Uzol sa spozná podľa domény panela, zoznam sa teda po reštarte ani po zmene IP nezdvojí.
Server označený v zákazníckom účte ako mlčiaci znamená, že prehľad dlho neprišiel. Skontrolujte postupne: prepínač „Posielať prehľad“, riadok cronu (sudo crontab -l) a čo odpovie tlačidlo „Odoslať teraz“. Chyby odosielania sa zapisujú do logu aplikácie so značkou FLEET — tam je vidieť, či bol odmietnutý token (HTTP 401), alebo či vôbec nevzniklo spojenie.

Bezpečnostné nástroje

11. Firewall UFW

UFW (Uncomplicated Firewall) — jednoduché rozhranie k nftables/iptables. Uzatvára všetky prichádzajúce porty okrem výslovne povolených. Stránka „Firewall UFW“ zobrazuje stav a pravidlá.

sudo apt install ufw # Povoliť SSH (nutné PRED zapnutím!) a web sudo ufw allow OpenSSH sudo ufw allow 80,443/tcp # Uzavrieť databázu zvonka (prístup len lokálne) sudo ufw deny 3306 # Zapnúť a overiť sudo ufw enable sudo ufw status verbose
Pred ufw enable vždy povoľte SSH (ufw allow OpenSSH), inak stratíte prístup k serveru.
„Externá expozícia“ na dashboarde zohľadňuje UFW: port uzavretý pravidlom deny sa nepovažuje za dostupný zvonka.
Skipping adding existing rule — to nie je chyba. UFW takto oznamuje, že presne takéto pravidlo už existuje, a znovu ho nepridáva. Pri opakovanom spustení automatickej konfigurácie (je idempotentná) je to bežná správa — netreba na ňu reagovať.

12. Inštalácia Fail2ban

Automaticky zablokuje IP adresu po prekročení počtu neúspešných pokusov o prihlásenie. Analyzuje logy SSH, nginx, Apache a ďalších služieb.

sudo apt install fail2ban sudo systemctl enable --now fail2ban # Skontrolovať stav: sudo fail2ban-client status
Funkčná konfigurácia (jail.local s desiatkami jailov a automatickým banom z ipsum) — v nasledujúcej sekcii.

13. Funkčná konfigurácia Fail2ban + ipsum

Základná inštalácia je vyššie. Tu je funkčná konfigurácia, ktorá poskytuje desiatky aktívnych jailov a tisíce blokovaní: všeobecné nastavenia, kľúčové jaily a autoban škodlivých IP zo zoznamu ipsum.

Súbor /etc/fail2ban/jail.local — všeobecné nastavenia a najdôležitejšie jaily:

[DEFAULT] bantime = 1w findtime = 900 maxretry = 3 backend = systemd banaction = nftables-multiport ignoreip = 127.0.0.1/8 ::1 <YOUR_IP> <TRUSTED_NETS> # Progresívny ban: každé opakovanie — dlhšie bantime.increment = true bantime.factor = 2 bantime.maxtime = 5w bantime.rndtime = 300 [sshd] enabled = true maxretry = 5 bantime = -1 # trvalý ban za brute-force SSH findtime = 3600 # Recidivisti: kto dostal niekoľko banov — banuje sa navždy [recidive] enabled = true logpath = /var/log/fail2ban.log banaction = %(banaction_allports)s bantime = -1 findtime = 86400 maxretry = 2 [http-get-dos] enabled = true maxretry = 100 findtime = 300 bantime = 1w # Webové služby (apache-*, nginx-*, php-url-fopen, phpmyadmin-syslog): [nginx-http-auth] enabled = true port = http,https [apache-badbots] enabled = true port = http,https # … a ostatné jaily podľa služieb (dovecot, exim, postfix-sasl, # mysqld-auth, vsftpd, portscan, pam-generic) — enabled = true
Do ignoreip nezabudnite zapísať svoju IP adresu a dôveryhodné siete, inak môžete zabanovať sami seba. Po úpravách: sudo fail2ban-client reload.

Automatické načítanie blok-listu ipsum — do root-cronu (sudo crontab -e): level 1 (100+ tisíc IP) sa načíta do setu ipsum, ktorý sa odrezáva na firewalle (podrobnejšie v sekcii „Blok-list IPset“):

# 04:00 — aktualizácia ipset ipsum (level 1, maximálny záber): 0 4 * * * /usr/local/bin/load-ipsum.sh >> /path/to/monitor/logs/cron.log 2>&1
Set sa musí volať ipsum — práve ten číta dashboard (karta „IPset ipsum“). Úrovne: levels/1.txt — maximálny záber, levels/3.txt — presnejšie (3+ zdroje).

Prečo je „Monitor bezpečnosti“ rozdelený na dve zóny. Ochrana funguje na dvoch úrovniach a dashboard ich nezmiešava:

  • Reálne útoky (reaktív) — všetko, čo zachytil fail2ban: živé pokusy o prienik (jaily sshd, apache-*, nginx-* a pod.) a zlomyseľní recidivisti (jail recidive — tí, ktorých už niekoľkokrát banovali). Sú to IP, ktoré sa k vám skutočne dobýjali — nájdete ich na mape útokov a v „Časovej osi“.
  • Preventívne blokovanie (proaktív) — verejný blok-list známych škodlivých IP ipset ipsum, odrezávaný na firewalle pravidlom DROP. Tieto adresy sa väčšinou vášho servera ani nedotkli — režú sa vopred; počítadlo „IPset ipsum“ ukazuje, koľko ich bolo odrezaných preventívne.

Rozdiel je jednoduchý: reaktív — „tieto zaútočili a dostali ban“, preventív — „tieto sa zablokovali ešte pred pokusom“. Predtým sa do recidive umelo vháňal list-3 ipsum (odtiaľ staré rozdelenie „zoznamoví recidive“); teraz sú v recidive iba skutoční recidivisti a preventív je celý na firewalle.

14. Blok-list IPset (ipsum)

ipsum — verejný zoznam škodlivých IP, aktualizovaný denne. Monitor zobrazuje počet načítaných adries na dashboarde a mape útokov a zohľadňuje ho v Skóre bezpečnosti (−10, ak sada nie je načítaná).

Minimálny variant bez fail2ban — samostatná sada ipsum s blokovaním cez iptables:

# Vytvoriť sadu (jednorazovo): sudo ipset create ipsum hash:ip # Aktualizačný skript /usr/local/bin/update-ipsum.sh: #!/bin/bash ipset flush ipsum for ip in $(curl -s https://raw.githubusercontent.com/stamparm/ipsum/master/levels/3.txt); do ipset add ipsum "$ip" 2>/dev/null done iptables -C INPUT -m set --match-set ipsum src -j DROP 2>/dev/null \ || iptables -I INPUT -m set --match-set ipsum src -j DROP # Cron (sudo crontab -e, denne o 4:00): 0 4 * * * /usr/local/bin/update-ipsum.sh
Rozšírený variant s fail2ban-recidive — v sekcii „Funkčná konfigurácia Fail2ban + ipsum“.
ipset žije v pamäti a pri reštarte sa stráca. Samotný denný cron nechá sadu prázdnu od reštartu až po ďalšie spustenie (dashboard ukáže 0). Načítavajte sadu aj pri štarte — vyčleňte načítanie do skriptu a naviažte ho na @reboot. Zároveň príkaz create … -exist nastaví limit maxelem 300000 (predvolene 65536 — level 1 sa nezmestí, nastane „Hash is full“):
# /usr/local/bin/load-ipsum.sh #!/bin/bash curl -s https://raw.githubusercontent.com/stamparm/ipsum/master/levels/1.txt \ | grep -v '^#' | sed 's/^/add ipsum /' \ | (echo "create ipsum hash:ip hashsize 131072 maxelem 300000 -exist"; echo "flush ipsum"; cat) \ | ipset restore -exist # sudo crontab -e — denne o 04:00 A pri každom štarte: 0 4 * * * /usr/local/bin/load-ipsum.sh @reboot sleep 60 && /usr/local/bin/load-ipsum.sh
Ako to funguje pri automatickej inštalácii. Skript načíta úplný zoznam level 1 (100+ tisíc IP) do sady ipsum a ak firewall spravuje inštalátor (čerstvý VPS — profily „Plná“/„Odľahčená“), pripojí sadu k UFW pravidlom DROP — prevádzka z týchto IP sa reálne blokuje. Pravidlo je za ESTABLISHED,RELATED, takže aktuálne spojenia (vrátane vášho SSH) sa nepretrhnú — režú sa len nové pripojenia zo zoznamu. Sada sa obnovuje pri načítaní služby ipsum-load.service pred firewallom (inak by sa UFW nespustil) a aktualizuje sa cronom o 04:00. Na už nakonfigurovanom serveri (panel, vlastný firewall) inštalátor do firewallu nezasahuje — tam ipsum zostáva zoznamom pre dashboard a mapu útokov a pravidlo DROP sa v prípade záujmu pridá ručne (minimálny variant s iptables … --match-set ipsum … -j DROP — vyššie). Pri automatickej inštalácii netreba robiť nič ručne.

15. Inštalácia CrowdSec

Moderná náhrada za Fail2ban s kolektívnym threat intelligence: bany od komunity plus vlastné pravidlá. Na aplikovanie banov na firewall vyžaduje samostatný bouncer.

curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash sudo apt install crowdsec sudo systemctl enable --now crowdsec # Bouncer pre iptables/nftables: sudo apt install crowdsec-firewall-bouncer-iptables # Overiť stav: sudo systemctl status crowdsec sudo cscli decisions list sudo cscli bouncers list
Stav „Nespustené“ v paneli = služba je nainštalovaná, ale nie je aktívna (monitor ju kontroluje cez systemctl is-active crowdsec). Spustiť: sudo systemctl enable --now crowdsec; pri páde pozri sudo journalctl -u crowdsec -n 30. To isté pravidlo platí pre akúkoľvek službu v stave „Nespustené“ (Suricata, Falco, Monit, MySQL).
„0 scenárov“ alebo „0 bouncerov“ na dashboarde. CrowdSec je hneď po inštalácii takmer prázdny — bez kolekcií nič nedetekuje a bez zaregistrovaného bouncera sa bany na firewall neaplikujú. Doinštalujte základné kolekcie a uistite sa, že bouncer je v zozname:
# Základné kolekcie (Linux + SSH + webový server): sudo cscli collections install crowdsecurity/linux crowdsecurity/sshd crowdsecurity/base-http-scenarios sudo systemctl reload crowdsec # Bouncer musí byť v zozname a v stave aktívneho pripojenia: sudo cscli bouncers list
V logu bouncera stream halted / bany sa neaplikujú. Ide o osirotený api-kľúč: bouncer bol odstránený z cscli bouncers list, ale jeho starý kľúč ostal v /etc/crowdsec/bouncers/*.yaml. Preregistrujte bouncer a zapíšte čerstvý kľúč:
sudo cscli bouncers add fw-bouncer # vypíše nový api_key # zapíšte tento kľúč do api_key: v /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml sudo systemctl restart crowdsec-firewall-bouncer
Automatická inštalácia (profil „Plná ochrana“) sama nainštaluje kolekcie a zaregistruje firewall-bouncer — ručne je to potrebné len pri ručnej inštalácii alebo po ručnom zásahu do CrowdSec.

16. Inštalácia AIDE

AIDE (Advanced Intrusion Detection Environment) vytvorí snímku súborového systému a pri každej kontrole nahlási zmeny v /etc, /bin, /usr. Po inštalácii je nutné inicializovať databázu (aideinit).

sudo apt install aide # Inicializácia databázy (5–15 minút): sudo aideinit sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db # Ubuntu 24.04: adresár /var/lib/aide sa vytvorí v režime 700 (vlastník _aide), # a panel (www-data) databázu nevidí → zobrazuje „Neinicializovaná“. # Sprístupnite adresár na prechod (súbory databázy zostávajú 600): sudo chmod 755 /var/lib/aide # Prvá kontrola SO ZÁPISOM do logu, ktorý číta monitor. # Na Ubuntu/Debian aide vyžaduje explicitný --config (inak „missing configuration“; # binárka aide.wrapper sa v nových verziách nedodáva): sudo bash -c 'aide --config /etc/aide/aide.conf --check > /var/log/aide/aide.log 2>&1'
Počas aideinit terminál 5–15 minút stojí na riadku Running aide --init... — je to normálne (hashovanie celého súborového systému, záťaž disku). Neprerušujte Ctrl+C. Ak proces „visí“, ale nič nezapisuje — možno čaká na odpoveď na skrytú výzvu Overwrite existing aide.db.new [Yn]? (stlačte Y). Aktivitu overíte z inej relácie: pgrep -af aide.
Chyba aideinit: „21_aide_spamassassin … printf: invalid number“ (return code 20) — známa chyba konfiguračného snippetu AIDE v Ubuntu 22.04. Databáza sa nevytvorí. Odstráňte chybný snippet a zopakujte:
sudo mv /etc/aide/aide.conf.d/21_aide_spamassassin /etc/aide/21_aide_spamassassin.disabled sudo aideinit sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
Stavy na dashboarde. „Neinicializovaná“ = panel nevidí súbor databázy: buď sa aideinit nespustil, alebo (Ubuntu 24.04) sa adresár /var/lib/aide vytvoril v režime 700 a je nedostupný pre www-data — vyrieši sa cez sudo chmod 755 /var/lib/aide (pozri blok vyššie). „Bez kontrol“ = databáza existuje, ale kontrola sa ešte nevykonala — nie je to chyba. Výsledky monitor číta z /var/log/aide/aide.log.
Pravidelná kontrola → log pre panel. Štandardný /etc/cron.daily/aide na nových Ubuntu/Debian nemusí zapisovať /var/log/aide/aide.log v potrebnej podobe (a aide.wrapper v nich už nie je). Spoľahlivejšie je pridať vlastný cron s explicitným --config — zapisuje log ako root v režime 644 a monitor ho číta bez ďalších skupín:
# sudo crontab -e — denná kontrola o 02:00: 0 2 * * * /usr/bin/aide --config /etc/aide/aide.conf --check > /var/log/aide/aide.log 2>&1 # Spustiť teraz, bez čakania na plán: sudo bash -c 'aide --config /etc/aide/aide.conf --check > /var/log/aide/aide.log 2>&1'
Automatická inštalácia už toto všetko robí: chmod 755 /var/lib/aide a cron kontroly o 02:00 — ručne nie je potrebné nič.
Prvú inicializáciu vykonajte na čistom serveri — pred inštaláciou webových aplikácií. Po legitímnych zmenách databázu znova vytvorte: sudo aideinit && sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db.

17. Inštalácia ClamAV

Antivírusový skener pre Linux. Obzvlášť užitočný na kontrolu /var/www na prítomnosť PHP shellov a škodlivého kódu.

sudo apt install clamav clamav-daemon sudo systemctl enable --now clamav-daemon # Aktualizovať databázu signatúr: sudo freshclam # Manuálne prehľadať priečinok: sudo clamscan -r /var/www --infected
Démon clamd po enable --now hlási „Neaktívny“? Tri typické príčiny:

1. V konfigurácii zostal riadok Example — clamd sa odmieta spustiť, kým tam je:

sudo sed -i '/^Example/d' /etc/clamav/clamd.conf sudo systemctl restart clamav-daemon

2. Nie je stiahnutá databáza signatúr — clamd sa bez nej nespustí:

sudo systemctl stop clamav-freshclam sudo freshclam sudo systemctl start clamav-freshclam sudo systemctl restart clamav-daemon

3. Len sa načítava — clamd nahráva do pamäte ~8 mil. signatúr 30–60 s. Počkajte a skontrolujte: systemctl is-active clamav-daemon (stav activating → ešte sa načítava).

Diagnostika: sudo journalctl -u clamav-daemon -n 30 --no-pager.
Na dashboarde „Skontrolovaných súborov: 0“ / „Posledné skenovanie: —“? Démon clamd len drží signatúry v pamäti, sám podľa plánu nič neskenuje. Panel zobrazuje výsledky plánovaného skenu, preto je potrebný cron, ktorý skenuje a zapisuje log. Automatická inštalácia nainštaluje obálku /usr/local/bin/clamav-scan.sh a cron o 01:30 — po prvom spustení sa naplní „Skontrolovaných súborov“ a „Posledné skenovanie“. Spustiť hneď bez čakania na plán: sudo /usr/local/bin/clamav-scan.sh.

18. Inštalácia Linux Malware Detect (maldet)

Linux Malware Detect (LMD) — skener škodlivého softvéru pre webové hrozby: PHP shelly, webové backdoory, sťahovače. Používa engine ClamAV a dopĺňa ho vlastnými signatúrami.

wget https://www.rfxn.com/downloads/maldetect-current.tar.gz tar -xzf maldetect-current.tar.gz dir=$(ls -d maldetect-*/ | head -1) && cd "$dir" && sudo bash install.sh && cd ~ rm -rf maldetect-* maldetect-current.tar.gz # Aktualizovať signatúry: sudo maldet -u # Skenovať /var/www: sudo maldet -a /var/www
LMD a ClamAV spolu fungujú výborne. Posledný report: maldet --report.
Pri inštalácii sa môže objaviť riadok update-rc.d: error: unable to read /etc/init.d/maldet — je neškodný. maldet nepoužíva init.d, aktualizácia signatúr a skeny sa spúšťajú cez /etc/cron.daily/maldet. Ak nižšie vidíte installation completed — všetko sa nainštalovalo.
Na stránke sa pri LMD píše „Nenainštalované“, hoci je nainštalovaný? maldet sa neinštaluje cez apt, ale do /usr/local/maldetect, a pri zapnutom open_basedir sa jeho prítomnosť overuje cez shell — pozri časť „Stránka je prázdna, hoci na serveri sú dáta“.

19. Inštalácia Suricata

Sieťový systém detekcie prienikov: analyzuje prevádzku na úrovni paketov a pozná tisíce signatúr útokov. Dopĺňa ModSecurity (ten pracuje na úrovni HTTP, Suricata na úrovni TCP/IP).

sudo add-apt-repository ppa:oisf/suricata-stable sudo apt update && sudo apt install suricata # Stiahnuť aktuálne pravidlá: sudo suricata-update sudo systemctl enable --now suricata
Suricata je „Aktívna“, no dashboard nezobrazuje upozornenia / počet udalostí je 0? Suricata zapisuje /var/log/suricata/eve.json pod root v režime 750 na adresár a webový server (www-data) ho nedokáže prečítať. Sprístupnite adresár na prechod — súbory vnútri zostávajú chránené:
sudo chmod o+rx /var/log/suricata
Automatická inštalácia to urobí sama — ručne to netreba.

20. Inštalácia Falco

Zachytáva systémové volania cez eBPF/kernel module a odhaľuje anomálie v reálnom čase: shell z nginx, čítanie /etc/passwd webovým procesom, zápis do /bin atď.

curl -fsSL https://falco.org/repo/falcosecurity-packages.asc > /tmp/falco.asc gpg --dearmor < /tmp/falco.asc | sudo tee /usr/share/keyrings/falco-archive-keyring.gpg > /dev/null sudo chmod 644 /usr/share/keyrings/falco-archive-keyring.gpg && rm /tmp/falco.asc echo "deb [signed-by=/usr/share/keyrings/falco-archive-keyring.gpg] https://download.falco.org/packages/deb stable main" \ | sudo tee /etc/apt/sources.list.d/falcosecurity.list sudo apt update && sudo apt install falco sudo systemctl enable --now falco
Monitor číta udalosti Falco cez journalctl -u falco (bez sudo — cez skupinu systemd-journal). Uistite sa, že www-data je v tejto skupine — pozri „Nastavenie sudo“ (bod 2) na stránke manuálnej inštalácie.
„0 udalostí za 24 hodín“ je normálny stav, nie chyba. Falco je event-driven: mlčí, kým je všetko v poriadku, a udalosť zapíše len pri anomálii (shell z webového procesu, čítanie /etc/passwd, zápis do systémových adresárov). Nula kritických za deň na pokojnom serveri je zdravý stav.
Pre dashboard je spoľahlivejší výstup do súboru. Čítanie cez journalctl vyžaduje práva na žurnál; aby dashboard videl udalosti stabilne, automatická inštalácia zapne u Falco file_output → /var/log/falco/falco.log a službe nastaví UMask=0022 (log číta webový server). Pri novej inštalácii to netreba nastavovať ručne.

21. Inštalácia ModSecurity (WAF)

ModSecurity — webový firewall (WAF) pre Apache alebo Nginx. Blokuje útoky na úrovni aplikácie: SQL injekcie, XSS, prechádzanie ciest, skenery.

# Apache: sudo apt install libapache2-mod-security2 sudo a2enmod security2 # Sada pravidiel OWASP Core Rule Set: sudo apt install modsecurity-crs # POVINNÉ: bez tohto súboru je engine pravidiel vypnutý sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf sudo sed -i 's/^SecRuleEngine DetectionOnly/SecRuleEngine On/' /etc/modsecurity/modsecurity.conf sudo apache2ctl configtest && sudo systemctl reload apache2 # Kontrola: malo by vrátiť 403 curl -s -o /dev/null -w '%{http_code}\n' "https://monitor.example.com/?id=1%20UNION%20SELECT%201,2--"
Samotná inštalácia balíka nič nechráni. Apache načítava konfigurácie riadkom IncludeOptional /etc/modsecurity/*.conf, no balík umiestni iba modsecurity.conf-recommended — pod masku *.conf nespadá. Ak ho neskopírujete do modsecurity.conf, SecRuleEngine zostáva Off: modul je načítaný, pravidlá CRS sú načítané, no prevádzka sa nekontroluje a audit log sa nevytvára. Medzirežim DetectionOnly len zapisuje udalosti do logu, požiadavky neblokuje — dashboard ho zobrazuje žlto.

Prístup dashboardu k audit logu. Log /var/log/apache2/modsec_audit.log patrí rootovi (práva 640), webový používateľ ho neprečíta. Dashboard získava dáta cez obal — vytvorte ho:

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 # v /etc/sudoers.d/monitor (používateľ = ten, pod ktorým beží PHP-FPM): # www-data ALL=(ALL) NOPASSWD: /usr/local/bin/monitor-modsec
Obal berie poslednú direktívu SecRuleEngine bez odsadenia: odsadené riadky sú vnútri blokov <LocationMatch>/<Directory> (napríklad vypnutie WAF pre phpMyAdmin) a globálny režim neurčujú.
Používateľ v sudoers sa musí zhodovať s používateľom FPM poolu: na bežnom Apache/Debian je to www-data, v HestiaCP pool stránky beží pod vlastníkom stránky (napríklad admin) — overte cez grep -E '^user' /etc/php/*/fpm/pool.d/monitor.example.com.conf.
Ak je stránka za Nginx proxy (HestiaCP), Apache vidí ako klienta samotnú proxy — dashboard berie skutočnú IP adresu útočníka z hlavičky X-Forwarded-For. Do štatistiky sa dostávajú len transakcie so spusteným pravidlom: direktíva SecAuditLogRelevantStatus zapisuje do audit logu ľubovoľné odpovede 4xx/5xx, preto sa tam dostávajú aj bežné 403/500 — dashboard ich za udalosti WAF nepovažuje.
Blok ---RULES--- potrebuje sekcia „Všetky aktívne pravidlá“ — dashboard zobrazuje nielen spustené, ale vôbec všetky načítané pravidlá CRS + vlastné. Tri cesty v cykle for f in … sú typické miesta pre CRS pravidlá a lokálne doplnky; ak máte iné rozloženie (balík ukladá súbory do vlastného adresára, alebo vlastné pravidlá nie sú v /etc/modsecurity/custom-rules.conf), nájdite skutočné cesty príkazom sudo grep -rl 'IncludeOptional\|^Include ' /etc/apache2/mods-enabled/security2.conf /etc/apache2/conf-enabled/*.conf 2>/dev/null a doplňte ich do zoznamu. Ak je obal starý (bez tejto sekcie) — sekcia jednoducho zobrazí upozornenie „nedostupné“, zvyšok stránky funguje ako predtým.

22. Inštalácia Auditd

Auditd (Linux Audit Daemon) zaznamenáva systémové volania na úrovni jadra: prihlásenia a odhlásenia, sudo príkazy, neúspešné pokusy o autentifikáciu, zmeny súborov. Monitor zobrazuje prihlásenia, neúspešné pokusy a sudo príkazy za dnešný deň.

sudo apt install auditd audispd-plugins sudo systemctl enable --now auditd # Skontrolovať stav a udalosti: sudo systemctl status auditd sudo ausearch -m USER_LOGIN -ts today
Monitor číta udalosti cez ausearch (/usr/sbin/ausearch) a v prípade potreby z /var/log/audit/audit.log príkazom tail. Oba musia byť v sudoers.

23. Inštalácia Monit

Sleduje služby (nginx, php-fpm, mysql atď.) a pri páde ich reštartuje. Dokáže posielať upozornenia na email.

sudo apt install monit sudo systemctl enable --now monit # Konfigurácie: sudo nano /etc/monit/monitrc ls /etc/monit/conf.d/
Monitor získava zoznam služieb cez monit status. V /etc/monit/monitrc musí byť zapnuté HTTP rozhranie (blok set httpd s allow localhost), inak monit status vráti chybu.
Na dashboarde „0 služieb pod dohľadom“? Dva dôvody. (1) HTTP rozhranie je vypnuté — v monitrc je riadok set httpd zakomentovaný (predvolene je ako # set httpd port 2812 …). Odkomentujte blok a povoľte localhost. (2) Samotné zapnuté httpd nič nesleduje — Monit počíta len to, čo je popísané v check-stanzách; bez nich je zoznam prázdny aj pri fungujúcom rozhraní. Minimálna funkčná konfigurácia:
# /etc/monit/conf.d/00-httpd — HTTP rozhranie pre localhost: set httpd port 2812 use address localhost allow localhost # príklady check-stanz (čo sledovať): check process sshd with pidfile /run/sshd.pid start program = "/usr/bin/systemctl start ssh" stop program = "/usr/bin/systemctl stop ssh" check filesystem rootfs with path / if space usage > 90% then alert
sudo monit -t # skontrolovať syntax (Control file syntax OK) sudo systemctl reload monit sudo monit status
Automatická inštalácia vloží hotový conf.d s httpd na 2812 a sadou kontrol — na novej inštalácii nie je potrebné nič nastavovať ručne.
Služba v stave „S chybami“? Monitor iba zobrazuje stav a zámerne nereštartuje služby z webového panela (bolo by to vzdialené vykonávanie root príkazov v bezpečnostnom paneli). Diagnostika a reštart — cez SSH pomocou Monit:
sudo monit status <service> # príčina chyby sudo monit restart <service> # reštart cez Monit # ak Monit službu nespustí — pozrite jej vlastný unit: sudo systemctl status <unit> --no-pager sudo journalctl -u <unit> -n 50 --no-pager

24. Inštalácia PSAD (detekcia skenovania portov)

PSAD analyzuje záznamy iptables a odhaľuje skenovanie portov a sieťové útoky, pričom každému zdroju priradí úroveň hrozby (1 – 5). Dopĺňa fail2ban a Suricata.

sudo apt install psad # PSAD číta log iptables — treba zapnúť logovanie (UFW to robí sám). # Pre čisté iptables pridajte pravidlá LOG do reťazcov INPUT/FORWARD. sudo psad --sig-update sudo systemctl enable --now psad
Monitor číta údaje cez psad --Status (musí byť v sudoers). Bez logovania iptables bude stránka prázdna — je to normálne, kým nedošlo k žiadnym skenovaniam.

25. AppArmor / SELinux (riadenie prístupu)

Mandatory Access Control obmedzuje, ku ktorým súborom a prostriedkom môže program pristupovať, aj keď bol napadnutý. V Ubuntu/Debian sa štandardne používa AppArmor (zvyčajne je už nainštalovaný a aktívny).

# AppArmor (Ubuntu/Debian): sudo apt install apparmor apparmor-utils sudo systemctl enable --now apparmor sudo aa-status # skontrolovať profily
Monitor číta stav cez aa-status (musí byť v sudoers). Zobrazuje počet profilov v režime enforce/complain a procesy bez profilu.

„Načítaných profilov“ je viac než enforce + complain — to je normálne. V AppArmor 4.x (Ubuntu 24.04 a novšie) pribudol režim unconfined: profil je načítaný do jadra, no nič neobmedzuje. Ubuntu takto označuje desiatky profilov pre programy využívajúce user namespaces (prehliadače, torrent klienty a podobne). Keď takéto profily existujú, karta „Načítaných profilov“ zožltne a zobrazí ich počet — napríklad unconfined: 90 pri 120 načítaných a 26 v enforce. Reálne chránia len profily v enforce; na Ubuntu 22.04 (AppArmor 3.x) tento režim neexistuje a čísla vždy sedia.

sudo aa-status | grep -E "profiles are" # rozdelenie podľa režimov sudo aa-enforce /etc/apparmor.d/profile-name # prepnúť profil do enforce
Prepínať do enforce profily, ktoré Ubuntu zámerne ponechalo v unconfined, sa oplatí len uvážene: nie sú vypnuté omylom, ale preto, že inak by sa narušila činnosť samotných programov. Profily v complain sú iná vec: pravidlá sú tam už napísané, len sa neuplatňujú.

26. Inštalácia debsums (integrita balíkov)

debsums overuje, či sa súbory nainštalovaných balíkov zhodujú s kontrolnými súčtami z repozitára — odhalí podvrhnuté systémové binárky (dopĺňa AIDE). Úplná kontrola trvá 1–2 minúty, preto sa spúšťa cez cron a panel číta výsledok z data/debsums/debsums.log a sám ho triedi do kategórií (dôležité sú len binárky a knižnice).

Úloha patrí do root-cronu (sudo crontab -e). Hotový wrapper debsums-scan.sh sa umiestni do /usr/local/bin/ (chmod +x; pozri prehľad cron-úloh) a sám zapisuje správu do data/debsums/ panela.

sudo apt install debsums # Cron-riadok (denne o 4:30): 30 4 * * * /usr/local/bin/debsums-scan.sh >> /path/to/monitor/logs/cron.log 2>&1

Wrapper debsums-scan.sh si sám nájde data/ panela — cestu netreba zadávať.

Zmeny v /etc/ (konfigurácie) a /usr/share/ (zdroje) na serveri sú obvykle normálne — panel ich označuje inou farbou. Znepokojivé sú zmeny binárok a knižníc (/bin, /sbin, /usr/lib atď.) — kartička „Binárky / knižnice“ zobrazuje práve ich.

27. Nastavenie správ Lynis

Lynis sa spúšťa ručne alebo cez cron. Správa sa musí ukladať do priečinka data/lynis/ projektu — monitor číta súbor lynis-report.dat.

# Jednorazové spustenie (doplňte vlastnú cestu ku koreňu panela): sudo lynis audit system --report-file /path/to/monitor/data/lynis/lynis-report.dat # Denný audit — cron riadok (hotová obálka lynis-scan.sh v /usr/local/bin/, pozri prehľad): 0 3 * * * /usr/local/bin/lynis-scan.sh >> /path/to/monitor/logs/cron.log 2>&1
Po prvom spustení stránka „Audit Lynis“ ihneď zobrazí hardening index, upozornenia a odporúčania.
Tlačidlo „Spustiť audit“ na stránke Lynis. Spustí lynis-scan.sh na pozadí priamo z panela (bez čakania na cron): zobrazí „Skenovanie…“ a po dokončení samo aktualizuje správu. Na to potrebuje webový používateľ riadok v sudoers na spustenie skriptu — inštalátor ho pridáva automaticky do /etc/sudoers.d/monitor. Ak sa panel inštaloval ručne/skôr, dopíšte ho tým istým používateľom, ktorý je už uvedený v súbore:
u=$(sudo awk '/NOPASSWD/ && !/lynis-scan/ {print $1; exit}' /etc/sudoers.d/monitor) [ -n "$u" ] && echo "$u ALL=(ALL) NOPASSWD: /usr/local/bin/lynis-scan.sh" | sudo tee -a /etc/sudoers.d/monitor sudo visudo -c && sudo chmod 440 /etc/sudoers.d/monitor

28. Nastavenie správ Logwatch

Logwatch musí ukladať denné správy do priečinka data/logwatch/ projektu vo formáte .txt. Monitor zobrazuje poslednú správu a archív.

# Denne (6:00) — cron-riadok (hotový wrapper logwatch_daily.sh v /usr/local/bin/, pozri prehľad): 0 6 * * * /usr/local/bin/logwatch_daily.sh >> /path/to/monitor/logs/cron.log 2>&1

Moduly panela

29. Sieťový monitor (vstavaný)

Sieťový monitor nevyžaduje inštaláciu — je to vstavaná stránka dashboardu. Zobrazuje sieťový stav servera z lokálnych zdrojov:

  • rozhrania a prevádzka — z /proc/net/dev;
  • stav liniek (UP/DOWN) a IP — cez ip;
  • spojenia a načúvajúce porty — cez ss;
  • sieťové udalosti jadra za 24 h — cez journalctl -k.

Prvé tri zdroje fungujú bez sudo, preto sú rozhrania, prevádzka, spojenia a porty viditeľné okamžite. Blok „Udalosti jadra“ používa journalctl -k — číta sa cez skupinu systemd-journal („Nastavenie sudo“, bod 2), sudo nie je potrebné. Overte, či je všetko dostupné web používateľovi:

# Kontrola pod www-data (pod ním beží PHP): sudo -u www-data bash -c 'cat /proc/net/dev' sudo -u www-data bash -c 'ip -o link show' sudo -u www-data bash -c 'ss -s' sudo -u www-data journalctl -k --no-pager -n 5
Blok „Sieťové udalosti jadra“ zobrazuje udalosti sieťového zásobníka jadra (zmena linky up/down, chyby nosnej, „network unreachable“). Záznamy firewallu UFW BLOCK sem nepatria — sú na stránkach „Firewall UFW“ a „Mapa útokov“. Prázdny blok so zelenou fajkou = za deň neboli žiadne sieťové výpadky.

30. Disk a SMART

Vstavaná stránka zobrazuje tri veci:

  • Súborové systémy — zaplnenie oddielov (df); škála sčervenie pri ≥90 %;
  • Úložiská — zoznam diskov (lsblk), len skutočné (loop/snap sú skryté);
  • Zdravie (SMART) — stav disku a atribúty (smartctl).

Miesto a zoznam zariadení fungujú okamžite, bez nastavovania. Pre SMART je potrebný balík smartmontools. Webový proces nemá priamy prístup k diskovým zariadeniam, preto sa SMART načítava cez cron do súboru data/disk/smart.txt a dashboard ho číta.

Úloha patrí do root-cronu (sudo crontab -e). Hotový obal smart-scan.sh sa umiestni do /usr/local/bin/ (chmod +x; pozri prehľad cron-úloh) a sám zapisuje do data/disk/ dashboardu.

sudo apt install smartmontools # Cron-riadok (každých 30 minút): */30 * * * * /usr/local/bin/smart-scan.sh >> /path/to/monitor/logs/cron.log 2>&1

Obal smart-scan.sh si sám nájde data/ dashboardu — cestu nie je potrebné zadávať. Vnútri lsblk -e7,11 vylučuje loop/cdrom.

Na virtuálnych diskoch (QEMU/KVM a podobných) je zvyčajne dostupný len všeobecný stav „zdravie: OK“, pričom teplota, prevádzkové hodiny a prealokované sektory môžu byť prázdne — to je normálne. Na fyzickom serveri sa zobrazujú všetky atribúty.

31. Výkon (CPU/RAM/sieť/disk)

Stránka zobrazuje históriu záťaže servera za posledných 24 hodín — Load Average, vyťaženie CPU a čakanie na I/O, RAM/Swap, sieťovú prevádzku (príjem/odosielanie), diskové I/O (čítanie/zápis), zaplnenie disku a inode, otvorené súborové deskriptory a MySQL pripojenia, plus aktuálny počet TCP pripojení a procesov. Predvolené je okno 24 hodín: tlačidlá hore ho prepnú na 7 dní alebo 30 dní.

Údaje zbiera cron/collect_metrics.php — raz za 5 minút zapíše jeden „surový“ snímok počítadiel (/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') do tabuľky DB system_metrics; percentá a rýchlosti stránka počíta sama z rozdielu medzi susednými snímkami (zaplnenie disku/inode/deskriptorov/MySQL pripojenia — okamžité hodnoty, bez prepočtu). Sudo nie je potrebné — zdroje sa čítajú bez práv root.

Dve hĺbky uchovávania. „Surové“ päťminútové snímky žijú jeden deň (plus hodina rezervy, aby najstarší bod grafu mal ešte predchodcu na výpočet). Každá dokončená hodina sa zloží do jediného riadka; tento hodinový rad sa uchováva 30 dní a práve ten čítajú pohľady „7 dní“ a „30 dní“. Mesiac histórie tak stojí približne 720 riadkov namiesto zhruba 8600.

V obdobiach 7 a 30 dní sa zobrazujú hodinové priemery, nie jednotlivé merania — päťminútová špička sa v tejto mierke vyhladí a stránka na to upozorňuje. Pri Load Average uchováva hodinový riadok priemer aj špičku hodiny, takže graf ukazuje obe čiary. Hneď po aktualizácii sú dlhé obdobia prázdne („pre toto obdobie zatiaľ nie je história“) — hodinový rad sa začne zbierať od tejto chvíle.
# Cron-riadok (každých 5 minút): */5 * * * * /usr/local/bin/collect-metrics-all.sh >> /path/to/monitor/logs/cron.log 2>&1

Obálka collect-metrics-all.sh (pozri prehľad cron-úloh) sama nájde všetky nainštalované inštancie panela na serveri a spustí cron/collect_metrics.php každej z nich pod menom vlastníka stránky.

Kým kolektor neprebehne aspoň dvakrát (prvých ~10 minút po inštalácii), stránka zobrazuje „údaje sa zbierajú“ — grafy potrebujú aspoň jednu dvojicu susedných bodov, aby vypočítali rýchlosti a percentá.

Najnáročnejšie procesy. Pod grafmi sú dve tabuľky s piatimi procesmi, ktoré najviac zaťažujú CPU:

  • „Procesy v poslednom meraní“ — čo zaťažovalo server v okamihu poslednej snímky (čas je v hlavičke karty);
  • „Procesy v špičke dňa“ — tých istých päť, ale z merania s najvyšším Load Average za posledných 24 hodín. To je odpoveď na otázku „čo to bolo v noci“, keď špička v grafe už dávno pominula.

Obe tabuľky vždy opisujú posledných 24 hodín, aj keď grafy ukazujú mesiac: snímku procesov nesú iba päťminútové riadky a tie sa neuchovávajú dlhšie ako deň.

Vlastné procesy merania (ps, PHP skript zberu a reťaz cron/sudo nad ním) sa zo zoznamu vylučujú — inak by stáli na čele každej snímky: ps v okamihu spustenia ukazuje takmer 100 % CPU. Ostatné cron úlohy spustené v tej istej minúte sa naopak zobrazia — presne kvôli tomu tabuľka existuje.

Upozornenia na záťaž (sekcia „Nastavenia“ → „Upozornenia na záťaž“) — pri prekročení prahu pre CPU/RAM/disk/inody pošle panel upozornenie všetkými zapnutými kanálmi (Telegram, Email, webhook, push — tými istými ako denná správa; pre upozornenia netreba zapínať nič zvlášť) a ďalšie, len čo sa metrika vráti do normálu. Kým prah trvá, nespamuje: ďalšie upozornenie príde až po cykle „vrátilo sa do normálu → znova prekročené“.

Prahy kontroluje ten istý collect_metrics.php pri každom spustení (raz za 5 minút) — samostatný cron netreba. Stav „už upozornené / ešte nie“ sa ukladá v data/alerts_state.json, prahy — v nastaveniach panela.

32. Bezpečnostné udalosti (senzor každých 5 minút)

Denná správa odpovedá na otázku „ako sa serveru darí“. Senzor odpovedá na inú — „čo sa práve stalo“. Každých 5 minút sa spýta rýchlych zdrojov a zaznamená len to, čo sa od predchádzajúcej kontroly zmenilo; stránka „Bezpečnostné udalosti“ v ponuke zobrazuje zoznam nálezov.

Pomalých kontrol — Lynis, debsums, aktualizácie balíkov, platnosť SSL — sa senzor nedotýka: ich čísla sa aj tak menia raz denne a zostávajú v réžii dennej správy.

Čo si všíma — deväť zdrojov:

  • Fail2ban — nové bany (porovnáva sa zoznam zablokovaných adries, odblokovanie teda udalosťou nie je a platný ban sa hlási presne raz);
  • CrowdSec — nové rozhodnutia;
  • Falco — udalosti úrovne Emergency, Alert a Critical;
  • Suricata — nové hlásenia; označenie [Priority: 1] dvíha nález na kritický;
  • ClamAV — nové riadky FOUND v zázname kontroly;
  • AIDE — zmeny súborov podľa poslednej kontroly (teda nie častejšie, než ako často sama beží podľa vlastného rozvrhu);
  • SSH — úspešné prihlásenie ako root (kritické) a prihlásenie z adresy, ktorá sa dosiaľ neobjavila (varovanie);
  • Ochranné služby — UFW, Fail2ban, CrowdSec, Suricata, Falco: jedna správa, keď sa služba zastaví, a jedna, keď opäť beží;
  • Porty — port, ktorý sa stal dostupným zvonka; ak je za ním databáza alebo cache, ide o kritický nález.

Nástroj, ktorý nie je nainštalovaný alebo ktorého záznam panel neprečíta, jednoducho mlčí — to nie je chyba ani udalosť.

Prvá kontrola nič neposiela. Každý zdroj si drží značku „pokiaľ sa už čítalo“ (súbor data/secwatch_state.json) a prvý priechod len túto značku zapíše. Inak by po zapnutí sledovania prišlo upozornenie na všetko, čo záznamy nazbierali za mesiace.

Nastavenie — „Nastavenia“ → „Sledovanie udalostí“:

  • Zapnúť sledovanie — kým je vypnuté, cron úloha beží naprázdno a zoznam sa nenapĺňa;
  • Upozorňovať od — „Varovanie“ alebo „Kritické“. Nálezy pod prahom sa do zoznamu dostanú rovnako, ale nie do upozornení;
  • Pauza, min — minimálny odstup medzi upozorneniami, predvolene 15;
  • Tiché hodiny — okno v tvare 23-7, počas ktorého sa varovania neodosielajú.
Kritické nálezy odchádzajú okamžite — nezdrží ich ani pauza, ani tiché hodiny: práve kvôli nim senzor s 5-minútovým krokom existuje. Poistka tu však je: najviac 6 upozornení za hodinu, pre prípad, že by nejaký zdroj začal „blikať“.

Upozornenia chodia rovnakými kanálmi ako denná správa (Telegram, Email, webhook, push) — nič ďalšie zapínať netreba. Všetky nálezy sa zapisujú do zoznamu bez ohľadu na to, či upozornenie odišlo, a uchovávajú sa 90 dní.

Zoznam udalostí. Filtre: obdobie (24 hodín, 7, 30 alebo 90 dní), závažnosť a zdroj; zobrazuje sa posledných 500 záznamov. Tlačidlo „Skontrolovať teraz“ spustí presne ten istý priechod ako cron — hodí sa hneď po nastavení, aby ste nečakali päť minút; uvedie aj dôvod, keď žiadne upozornenie neodišlo („pod prahom závažnosti“, „tiché hodiny“, „nie je nastavený žiadny kanál upozornení“). Červené počítadlo pri položke ponuky je počet kritických udalostí za posledných 24 hodín.

Karta adresy. Kliknutie na riadok v zozname udalostí alebo v bloku Súvisiace adresy otvorí všetko, čo je o jednej adrese známe: časovú os jej udalostí, krajinu a na prvom riadku záver. Riadok zoznamu otvorí kartu, ak sa udalosť týka práve jednej adresy; ak ich uvádza viac, odkazmi sú samotné adresy v riadku. Závery sú štyri:

  • Prístup možný — z adresy prebehlo úspešné prihlásenie a tá istá adresa bola zachytená aj inou ochranou, prípadne hneď potom zareagovali AIDE, ClamAV alebo sa otvoril nový port. Jediný prípad, ktorý sa oplatí overiť ihneď;
  • Prihlásenie z tejto adresy — prihlásenie je a nič iné. Zvyčajne ide o vlastníka z nového miesta, preto sa karta nefarbí načerveno;
  • Zablokovaná — adresa bola zachytená a zablokovaná: ochrana si svoju prácu splnila, netreba nič robiť;
  • Vyžaduje kontrolu — detekcie sú, blokovanie nebolo. Ak sa adresa vracia, zatvorte ju ručne.

Pod časovou osou je blok Čo sa v tom istom čase dialo na serveri: udalosti, ktoré adresu vôbec nemajú. AIDE nevie, kto súbor zmenil, ClamAV nevie, kto priniesol nakazený. Zobrazené sú tie, ktoré spadajú do aktivity adresy a šiestich hodín po nej. Práve prihlásenie spolu s tým, čo nasledovalo, odlišuje pokus od skutočného prístupu.

Súvislosť sa stavia podľa adresy. Útočník, ktorý adresu mení, ju pretrhne. Karta ukazuje, čo ochrany videli, a neberie na seba rozlíšiť prienik od vášho vlastného prihlásenia z nového miesta.

Rozvrh. Úloha patrí do crontabu roota (sudo crontab -e), posunutá o 2 minúty oproti zberu metrík, aby obe neštartovali naraz:

# každých 5 minút — kontrola bezpečnostných udalostí 2-57/5 * * * * /usr/local/bin/security-watch-all.sh >> /path/to/monitor/logs/cron.log 2>&1
Spúšťajte kontrolu len cez wrapper, nikdy priamo cez php cron/security_watch.php. Wrapper nájde všetky inštalácie panela na serveri a spustí kontrolu v mene vlastníka webu — presne s tými právami sudo, ktoré panel používa z webu. Priame volanie z crontabu roota by vytvorilo stavový súbor data/secwatch_state.json vlastnený používateľom root a tlačidlo „Skontrolovať teraz“ by prestalo fungovať.
Ak ste server pripravovali automatickou inštaláciou, úloha je už pridaná — zostáva len zapnúť sledovanie v nastaveniach.

33. Webový server: požiadavky a kódy odpovedí

Stránka „Webový server“ rozoberá prístupový log a ukazuje, koľko bolo požiadaviek, aká časť skončila chybou a kto ich posielal. ModSecurity odpovedá na otázku „čo bolo zablokované“, táto stránka na otázku „čo vôbec na web prišlo“.

Čo je vidieť: počet požiadaviek, RPS, podiel chýb, samostatné počítadlo 5xx a objem odoslaných dát; graf požiadaviek po hodinách; rozloženie kódov 2xx/3xx/4xx/5xx; časté adresy, časté IP, časté chyby (kód plus cesta) a klienti (User-Agent). Obdobie: 24 hodín alebo 7 dní.

Zdrojom je prístupový log vo formáte combined, hodí sa teda Nginx aj Apache a žiadny ďalší modul nie je potrebný. Panel hľadá log medzi štandardnými súbormi:

  • /var/log/nginx/access.log
  • /var/log/apache2/access.log
  • /var/log/apache2/other_vhosts_access.log
  • /var/log/httpd/access_log

Okrem nich panel prehľadáva súbory *access*.log a *requests*.log v adresároch /var/log/nginx/, /var/log/apache2/ a /var/log/httpd/. Nájde sa tak aj log, ktorý web zapisuje do vlastného súboru direktívou CustomLog — napríklad arciveo-monitor_requests.log, ktorý vytvára inštalátor Arcivéo.

Číta sa len jeden log: keď Nginx stojí pred Apache, sčítanie dvoch logov by počítalo každú požiadavku dvakrát. Berie sa prvý log zo zoznamu vyššie, do ktorého sa zapisovalo za posledný deň (súbory nájdené podľa masky sa skúšajú po ňom, od najčerstvejších); ak sa za deň nezapisovalo do žiadneho, berie sa najčerstvejší neprázdny. Log vyprázdnený logrotate alebo zostávajúci po vypnutom webovom serveri preto nezakryje ten živý. Číta sa posledný úsek logu (3 MB) a výsledok sa ukladá do vyrovnávacej pamäte na 5 minút — na vyťaženom webe preto zvolené obdobie nemusí byť pokryté celé; skutočný záber je uvedený nad grafom.

„Panel nedokáže čítať log webového servera“. Príčinou sú takmer vždy práva: logy aj ich adresár patria skupine adm a webový používateľ v nej nie je. Inštalátor Arcivéo ho do tejto skupiny pridá; po ručnej inštalácii pomôže malý wrapper od roota, ktorému je dovolená jediná vec — vypísať log (stránka ModSecurity funguje rovnako). Wrapper vyberá log podľa rovnakých pravidiel ako panel. Príkaz sa vypisuje priamo na stránke; tu je tiež. Vložte ho celý — ide o jediný príkaz:
sudo tee /usr/local/bin/monitor-weblog >/dev/null <<'EOF' && sudo chmod 755 /usr/local/bin/monitor-weblog && echo 'www-data ALL=(root) NOPASSWD: /usr/local/bin/monitor-weblog' | sudo tee /etc/sudoers.d/monitor-weblog >/dev/null && sudo visudo -c #!/bin/sh L="/var/log/nginx/access.log /var/log/apache2/access.log /var/log/apache2/other_vhosts_access.log /var/log/httpd/access_log $(ls -t /var/log/nginx/*access*.log /var/log/apache2/*access*.log /var/log/apache2/*requests*.log /var/log/httpd/*access_log 2>/dev/null)" for f in $L; do [ -r "$f" ] && [ -n "$(find "$f" -size +0 -mmin -1440 2>/dev/null)" ] && exec tail -c 3000000 "$f"; done for f in $(ls -t $L 2>/dev/null); do [ -r "$f" ] && [ -s "$f" ] && exec tail -c 3000000 "$f"; done EOF

Webový používateľ sa môže od www-data líšiť — overte, pod ktorým používateľom beží PHP-FPM pool webu (ps -o user= -C php-fpm), a doplňte ho do riadka sudoers. Ak názov logu neobsahuje ani access, ani requests, doplňte jeho cestu na začiatok riadka L=… vo vnútri wrappera.

„Pre zvolené obdobie nie sú žiadne záznamy“ — log bol prečítaný, ale nenašli sa v ňom zodpovedajúce riadky: buď web naozaj nikto neotvoril, alebo sa log práve pretočil (logrotate) a začína odznova.

Pokusy o známe exploity. Panel porovnáva požiadavky z logu so signatúrami približne dvadsiatich rozšírených exploitov: PHP-CGI, prechod adresármi v Apache, PHPUnit, Log4Shell, chyby routerov, kamier a VPN brán. Pri každom pokuse odpovie, či môže na tomto serveri fungovať, a opiera sa o fakty: nainštalované verzie Apache a PHP, prítomnosť Javy a kód, ktorým server odpovedal na požiadavku na súbor. Červenou je označené len to, čo naozaj môže fungovať.

Zabezpečenie webového servera. Panel sa dopytuje na každý web servera cez 127.0.0.1 a zisťuje, čo dostane návštevník: či je vidieť verziu webového servera a PHP, či je zapnutá metóda TRACE a či sú prítomné ochranné hlavičky Strict-Transport-Security, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy a Content-Security-Policy. Weby sa berú z adresy, na ktorej je panel otvorený, a zo súborov virtuálnych hostiteľov, ak ich panel môže čítať. Výsledok sa obnovuje každých 10 minút.

Ak niečo chýba, pod tabuľkou sa objaví jeden príkaz. Vytvorí samostatný súbor zz-arciveo-hardening.conf a webový server znova načíta až po úspešnom teste konfigurácie; hlavičky, ktoré web už posiela sám, sa nezdvojujú. CSP sa neponúka ako jeden riadok: pravidlá sa zostavujú pre konkrétny web, inak prestane načítavať vlastné skripty, štýly a písma. Vrátenie zmeny na Apache:

sudo a2disconf zz-arciveo-hardening && sudo systemctl reload apache2
Podpis na chybových stránkach (ServerSignature) sa neoznačuje, ak je verzia webového servera už skrytá: bez verzie ukazuje iba názov servera a názov hostiteľa.

34. Mapa útokov (GeoIP)

Stránka „Mapa útokov“ určuje krajinu podľa IP príkazom geoiplookup. Bez balíka GeoIP sa krajiny neurčia a body na mape sa nezobrazia:

sudo apt install geoip-bin geoip-database # Kontrola: geoiplookup 8.8.8.8
Sudo nie je potrebné — databázu /usr/share/GeoIP/GeoIP.dat číta každý, výsledky sa ukladajú do vyrovnávacej pamäte v tmp/geoip_cache.json. Samotná mapa (Leaflet + dlaždice OpenStreetMap) sa načítava v prehliadači — na počítači, kde je otvorený dashboard, je potrebné pripojenie na internet.

35. Externá expozícia, aktualizácie a automatické aktualizácie

Dve zabudované karty dashboardu, ktoré neukazujú „zap./vyp.“ nástroja, ale skutočnú zabezpečenosť servera. Nič netreba inštalovať, čítajú sa lokálne bez sudo.

Externá expozícia — koľko služieb počúva na všetkých rozhraniach (0.0.0.0/[::]) a je dostupných zvonka. Zvýrazní červenou, ak sú navonok vystavené databázy alebo vyrovnávacia pamäť (MySQL, PostgreSQL, Redis, MongoDB, Memcached, Elasticsearch) — to je priama diera (−10 k skóre zabezpečenia). Zdroj: ss -tuln.

Ak je karta červená — uzavrite databázy pred vonkajším svetom: priviažte ich na 127.0.0.1 (bind-address v konfigurácii MySQL/PostgreSQL, bind 127.0.0.1 v Redis) alebo zavrite port v UFW.
„Otvorený port“ ≠ „dostupný zvonka“. Služba počúvajúca na 127.0.0.1 (loopback) je viditeľná len samotnému serveru — zvonka sa k nej nedostanete, aj keď je port „otvorený“. Preto je Postfix na porte 25 priviazaný na loopback bezpečný: automatické nastavenie zapíše inet_interfaces = loopback-only (plus neutrálny smtpd_banner — uzavrie upozornenie Lynis MAIL-8818 o odhalení verzie). Karta „Externá expozícia“ počíta ako navonok iba to, čo počúva na 0.0.0.0/[::]; loopback služby sa tam nedostanú.
Lynis MAIL-8818 ručne (ak ste poštu inštalovali sami): v /etc/postfix/main.cf nastavte smtpd_banner = $myhostname ESMTP (bez verzie a OS) a inet_interfaces = loopback-only, potom sudo systemctl restart postfix.

Bezpečnostné aktualizácie — koľko bezpečnostných záplat čaká na inštaláciu a či je po aktualizácii jadra potrebný reštart (−5 k skóre zabezpečenia pri dostupných záplatách). Zdroj: /usr/lib/update-notifier/apt-check, súbor /var/run/reboot-required. Podrobný zoznam — na stránke „Bezpečnostné aktualizácie“.

# Nainštalovať aktualizácie: sudo apt update && sudo apt upgrade # Skontrolovať, čo počúva navonok: ss -tuln | grep -E '0\.0\.0\.0|\[::\]'
Karta aktualizácií funguje na Ubuntu/Debian (update-notifier-common). Ak apt-check chýba — monitor počíta záplaty cez apt-get -s upgrade.

Automatické bezpečnostné aktualizácie (unattended-upgrades) — na stránke „Bezpečnostné aktualizácie“ samostatná karta ukazuje, či je zapnutá automatická inštalácia bezpečnostných záplat a kedy naposledy prebehla. Sudo nie je potrebné — stav sa číta cez apt-config dump.

sudo apt install unattended-upgrades sudo dpkg-reconfigure -plow unattended-upgrades # zapnúť # Skontrolovať, čo je zapnuté: apt-config dump | grep Unattended-Upgrade

Údržba

36. Zálohovanie

Záloha je hlavná poistka: strata dát je horšia než akékoľvek napadnutie. Potrebujete dve veci — zálohu servera/webov a samostatne zálohu databázy panela (sú tam používatelia, kľúče WebAuthn, nastavenia, licencia).

Možnosť A — HestiaCP: karta Backup u používateľa → tlačidlo na vytvorenie zálohy (alebo podľa plánu v nastaveniach servera). Záloha zahŕňa weby a ich databázy.

Možnosť B — ručne (cron): dump databázy + archív adresára data/ panela:

# root-cron (sudo crontab -e) — denná záloha o 2:30 (doplňte vlastné názvy/cesty): 30 2 * * * mysqldump -u root MY_DB | gzip > /var/backups/monitor-db-$(date +\%F).sql.gz 40 2 * * * tar czf /var/backups/monitor-data-$(date +\%F).tar.gz -C /path/to/monitor data # Mazať archívy staršie ako 14 dní: 0 3 * * * find /var/backups -name 'monitor-*' -mtime +14 -delete
Záloha na tom istom serveri vás zachráni pred chybami, ale nie pred stratou servera. Kopírujte archívy na externé úložisko (iný server, S3, rclone do cloudu). Overte, že obnovenie naozaj funguje.

37. Aktualizácia a prenos panela

Aktualizácia na novú verziu. Najprv si urobte zálohu. Potom nahrajte súbory kódu znova a zachovajte svoje dáta:

  • prepísať (kód): public/, includes/, assets/, cron/, database/, ako aj koreňové .htaccess (front-controller — smerovanie sa nesmie ponechať zo starej verzie), manifest.json, sw.js;
  • nedotýkať sa: config.php (dáta DB), data/ (reporty), logs/, tmp/ (relácie a vyrovnávacia pamäť).
# Po nahratí — vyprázdniť cache PHP (ak je opcache zapnutý): sudo systemctl reload php*-fpm
FileZilla hlási SSH_FX_PERMISSION_DENIED — Permission denied. Súbory panela patria používateľovi www-data (tak boli nastavené pri inštalácii), kým SFTP klient sa pripája pod vaším vlastným používateľom, ktorý nemá právo zápisu. Odovzdať celý panel používateľovi www-data „aby to fungovalo“ je práve to, čo vedie k tejto chybe; nižšie sú tri spôsoby, ktorýkoľvek problém vyrieši.
# Variant A (odporúčané) — oddeliť vlastníkov: kód je váš, pracovné priečinky patria webovému serveru. # Webový server nezíska právo zápisu ku KÓDU panela vôbec: sudo chown -R deploy:www-data /path/to/monitor sudo chown -R www-data:www-data /path/to/monitor/data /path/to/monitor/tmp /path/to/monitor/logs sudo find /path/to/monitor -type d -exec chmod 755 {} \; sudo find /path/to/monitor -type f -exec chmod 644 {} \; sudo chmod 750 /path/to/monitor/data /path/to/monitor/tmp /path/to/monitor/logs sudo chmod 640 /path/to/monitor/config.php # Variant B — ACL nad aktuálnymi vlastníkmi (nič nepresúvame): sudo apt install -y acl sudo setfacl -R -m u:deploy:rwX /path/to/monitor sudo setfacl -R -d -m u:deploy:rwX /path/to/monitor # Variant C — cez skupinu www-data. Jednoduchší, ale právo zápisu k súborom # panela získa aj webový server (pri zraniteľnosti v PHP sa kód dá vymeniť): sudo usermod -aG www-data deploy sudo find /path/to/monitor -type d -exec chmod 2775 {} \; sudo find /path/to/monitor -type f -exec chmod 664 {} \; sudo chmod 640 /path/to/monitor/config.php sudo chmod 2750 /path/to/monitor/data /path/to/monitor/tmp /path/to/monitor/logs
Prečo je variant A bezpečný. Panel zapisuje len do troch priečinkov — data/ (reporty), tmp/ (relácie a vyrovnávacia pamäť), logs/; tie zostávajú za www-data. Zvyšok je kód a webový server ho potrebuje len na čítanie, ktoré poskytuje skupina www-data s právami 644. Vedľajší zisk: pri zraniteľnosti v PHP sa súbory panela už nedajú prepísať. Na hostingových paneloch (HestiaCP a podobných) variant A netreba: tam súbory stránky aj tak patria účtu, pod ktorým sa prihlasujete cez SFTP, a webový server ich číta cez skupinu.
Nástraha variantu B: každý ďalší chmod na súboroch resetuje ACL-masku a prístup ticho zmizne. Ak sa po „upratovaní práv“ nahrávanie opäť zasekne na Permission denied — zopakujte obe príkazy setfacl.
Bit 2 vo variante C je setgid: súbory nahrané cez SFTP zostávajú v skupine www-data, inak ich panel nedokáže prepísať. Po variante C sa vo FileZille pripojte nanovo — nová skupina sa prejaví až pri novom prihlásení. Kontrola: id deploy (musí sa objaviť skupina www-data) a ls -ld /path/to/monitor (drwxrwsr-x — písmeno s znamená, že setgid je nastavený).

Prenos na iný server:

  1. Na novom serveri sprevádzkujte stránku + HTTPS (pozri stránku manuálnej inštalácie).
  2. Skopírujte všetky súbory panela spolu s config.php, data/.
  3. Preneste DB: mysqldump na starom → import na novom; upravte dáta DB v config.php.
  4. Zopakujte na novom serveri: sudoers, členstvo v skupine adm, cron-úlohy.
  5. Licencia je viazaná na doménu — ak je doména rovnaká, kľúč bude fungovať ďalej.

38. Druhá webová stránka na tomto serveri (ďalšia doména)

Panel už beží a na tom istom serveri je potrebná ešte jedna webová stránka — s vlastnou doménou vedľa monitora. Po automatickom nastavení je server bežný Apache + PHP-FPM, takže stránka potrebuje tri veci: vlastný adresár, vlastný vhost a vlastný certifikát. Panela sa pritom nedotýkame: sleduje celý server, druhá inštancia pre druhú doménu nie je potrebná.

Táto časť platí pre server bez hostingového panela. Ak máte nainštalovaný HestiaCP alebo podobný panel, pridajte doménu v ňom, nie ručne. A ak plánujete veľa stránok (navyše s poštou), nainštalujte panel pred automatickým nastavením: skript ho rozpozná a prepne sa do aditívneho režimu, kým panel nainštalovaný neskôr prestavia konfiguráciu Apache, firewallu a pošty.
Čo v príkazoch dosadiť. site2.example.com je adresa novej stránky. Môže to byť samostatná doména (mycompany.com) aj subdoména (shop.mycompany.com) — pre Apache v tom nie je rozdiel, líšia sa len DNS záznam (krok 1) a vydanie certifikátu (krok 5). site2 je len krátky názov stránky: tak sa volajú adresár /var/www/site2 a konfiguračný súbor site2.conf. S doménou nijako nesúvisí, Apache berie adresu výhradne z ServerName; názov môže byť akýkoľvek — pre shop.mycompany.com sa napríklad hodí shop: adresár /var/www/shop, konfigurácia shop.conf.

1. DNS. V paneli DNS u registrátora domény vytvorte záznam A na IP tohto servera:

# Subdoména (shop.mycompany.com): Typ: A Meno: shop Hodnota: 203.0.113.10 TTL: 3600 # Samostatná doména (mycompany.com) — dva záznamy, aby fungovala aj adresa s www: Typ: A Meno: @ Hodnota: 203.0.113.10 TTL: 3600 Typ: A Meno: www Hodnota: 203.0.113.10 TTL: 3600

Po niekoľkých minútach overte: dig +short site2.example.com musí vrátiť IP servera.

2. Adresár stránky.

sudo mkdir -p /var/www/site2 sudo chown -R www-data:www-data /var/www/site2

3. Vhost. Blok sa vkladá do terminálu celý — cesta k soketu PHP-FPM sa zistí sama:

PHPSOCK=$(ls -1 /run/php/php*-fpm.sock 2>/dev/null | head -1) # automatické zistenie soketu PHP-FPM sudo tee /etc/apache2/sites-available/site2.conf > /dev/null <<'EOF' <VirtualHost *:80> ServerName site2.example.com # Samostatná doména: odstráňte # z riadku nižšie, aby sa stránka otvárala aj s www. # Pre subdoménu tento riadok nie je potrebný. #ServerAlias www.site2.example.com DocumentRoot /var/www/site2 <Directory /var/www/site2> Options -Indexes +FollowSymLinks AllowOverride All Require all granted </Directory> <FilesMatch \.php$> SetHandler "proxy:unix:__PHPSOCK__|fcgi://localhost" </FilesMatch> ErrorLog ${APACHE_LOG_DIR}/site2_error.log CustomLog ${APACHE_LOG_DIR}/site2_access.log combined </VirtualHost> EOF sudo sed -i "s#__PHPSOCK__#${PHPSOCK}#" /etc/apache2/sites-available/site2.conf

4. Zapnite stránku a pred znovunačítaním overte konfiguráciu:

sudo a2ensite site2.conf sudo apache2ctl configtest # očakáva sa: Syntax OK sudo systemctl reload apache2

5. SSL. certbot už automatické nastavenie nainštalovalo; DNS musí v tejto chvíli smerovať na server:

# Subdoména — jedna adresa: sudo certbot --apache -d site2.example.com # Samostatná doména — rovno aj s www (oba záznamy A z kroku 1 musia smerovať na server # a www musí byť v ServerAlias, inak certbot druhú adresu neoverí): sudo certbot --apache -d site2.example.com -d www.site2.example.com

Tretia a ďalšie domény sa pridávajú rovnako — zopakujte kroky 1–5 so zmenenou doménou a adresárom.

Kto odpovedá na „cudzie“ požiadavky. Ak Host nezodpovedá žiadnemu ServerName (prístup cez IP alebo cudzia doména nasmerovaná na váš server), Apache vydá abecedne prvú zapnutú stránku z /etc/apache2/sites-enabled/. Štandardný 000-default automatické nastavenie vypína, takže túto „službu“ drží vhost panela (arciveo-monitor.conf) — na stránky otvárané pod vlastným menom to nemá vplyv. Ak sa má cez IP otvárať iná stránka, pomenujte jej súbor tak, aby bol abecedne prvý (napríklad 000-site2.conf).
Ochrana platí pre celý server: UFW, Fail2ban, CrowdSec, ModSecurity a Suricata už bežia a novú stránku pokrývajú automaticky, nastavovať ich zvlášť netreba. Porty 80/443 sú tiež už otvorené. Stránka má vlastné logy: site2_error.log a site2_access.log v /var/log/apache2/.
Adresár novej stránky neumiestňujte dovnútra adresára panela — webový koreň panela riadi vlastný .htaccess (front controller) a vnorená stránka by vracala niečo iné, než očakávate. Držte stránky vedľa seba: /var/www/monitor, /var/www/site2.

39. Obnovenie prístupu (stratený kľúč, heslo, blokovanie IP)

Ak sa nemôžete prihlásiť — všetko sa dá opraviť priamo v databáze na serveri. Otvorte databázu (názov je z config.php):

sudo mysql MY_DB

Stratený kľúč WebAuthn (neprejde druhý faktor) — vypnite 2FA, prihláste sa heslom a zaregistrujte nový kľúč:

UPDATE users SET webauthn_enabled = 0;

Zabudnuté heslo — nastavte nový hash (vygenerujte ho na serveri a doplňte):

# Vygenerovať hash nového hesla: php -r "echo password_hash('NEW_PASSWORD', PASSWORD_BCRYPT), \"\n\";" # V databáze (vložte získaný hash): # UPDATE users SET password = '$2y$10$...' WHERE username = 'admin';

Zablokovali ste si prístup IP-filtrom — vypnite obmedzenie:

UPDATE settings SET value = '0' WHERE name = 'ip_restriction_enabled';
Prístup k databáze máte vždy: sudo mysql na serveri, prípadne phpMyAdmin / sekcia databázy v paneli hostingu. Po obnovení znova zapnite WebAuthn a IP-filter.

40. Všetky cron úlohy na jednom mieste

Súhrn úloh je v root cron serveri (pridávajú sa cez sudo crontab -e). Ponechajte len riadky tých nástrojov, ktoré používate; cesty upravte podľa svojho servera.

# Serverový cron monitora (root) — vpíšte cez: sudo crontab -e # 01:30 — sken ClamAV na nebezpečných cestách (web, home, temp) → karty „Skontrolovaných súborov“ a „Posledné skenovanie“ 30 1 * * * /usr/local/bin/clamav-scan.sh >> /path/to/monitor/logs/cron.log 2>&1 # 02:00 — kontrola integrity súborov AIDE (potrebný explicitný --config) 0 2 * * * /usr/bin/aide --config /etc/aide/aide.conf --check > /var/log/aide/aide.log 2>&1 # pri štarte — obnoviť práva /var/lib/aide (balíkový tmpfiles súbor # aide-common.conf ich resetuje na 0700 a panel prestane vidieť databázu) @reboot chmod 755 /var/lib/aide # 03:00 — bezpečnostný audit Lynis 0 3 * * * /usr/local/bin/lynis-scan.sh >> /path/to/monitor/logs/cron.log 2>&1 # 04:00 — aktualizácia blokovacieho zoznamu ipsum (level 1) 0 4 * * * /usr/local/bin/load-ipsum.sh >> /path/to/monitor/logs/cron.log 2>&1 # sadu ipsum pri štarte zdvíha služba ipsum-load.service (PRED firewallom, inak # UFW nevidí sadu v before.rules) — nie je to cron. Tu je len denný refresh vyššie. # 06:00 — report Logwatch 0 6 * * * /usr/local/bin/logwatch_daily.sh >> /path/to/monitor/logs/cron.log 2>&1 # každých 30 min — kontrola diskov SMART */30 * * * * /usr/local/bin/smart-scan.sh >> /path/to/monitor/logs/cron.log 2>&1 # 04:30 — integrita balíkov debsums 30 4 * * * /usr/local/bin/debsums-scan.sh >> /path/to/monitor/logs/cron.log 2>&1 # 08:00 — plánovaný report na Email a Telegram 0 8 * * * /usr/local/bin/daily-report-all.sh >> /path/to/monitor/logs/cron.log 2>&1 # každú hodinu — obnova zoznamov balíkov (pre kartu „Bezpečnostné aktualizácie“) 0 * * * * /usr/bin/apt-get update -qq >/dev/null 2>&1 # každých 5 min — snímka zdrojov (CPU/RAM/sieť/disk) pre stránku „Výkon“ */5 * * * * /usr/local/bin/collect-metrics-all.sh >> /path/to/monitor/logs/cron.log 2>&1 # každých 5 min, posunuté oproti snímke vyššie — senzor bezpečnostných udalostí: # nové bany, hlásenia IDS, zastavená ochrana, otvorený port. # Kým je sledovanie v nastaveniach vypnuté, úloha nerobí nič. 2-57/5 * * * * /usr/local/bin/security-watch-all.sh >> /path/to/monitor/logs/cron.log 2>&1 # každých 15 min — prehľad servera do zákazníckeho účtu, aby bolo viac serverov # vidieť v jednom zozname. Kým je prehľad vypnutý, úloha nerobí nič. 3,18,33,48 * * * * /usr/local/bin/fleet-push-all.sh >> /path/to/monitor/logs/cron.log 2>&1
Podrobnosti ku každej sú v príslušných sekciách. Zálohovacie úlohy (predchádzajúca sekcia) sa pridávajú do toho istého cronu. Po úpravách skontrolujte: sudo crontab -l a či je cron služba aktívna.
Čas cronu = časové pásmo servera, nie TIMEZONE z config.php. Konštanta TIMEZONE ovplyvňuje len PHP (ako panel zobrazuje dátumy), ale cron démon spúšťa úlohy podľa systémového času OS. Ak sa pásmo servera nezhoduje s vaším, report „08:00“ príde v inom čase. Príklad: server je v inom pásme (Europe/London, UTC+1), a vy v Bratislave (UTC+2) → report „08:00“ vám príde o 09:00. Skontrolujte a v prípade potreby nastavte pásmo systému na svoje:
# Skontrolovať aktuálne pásmo servera: timedatectl # Nastaviť svoje pásmo (príklad) a reštartovať cron: sudo timedatectl set-timezone Europe/Bratislava sudo systemctl restart cron
Potom sa riadok 0 8 * * * spustí o 08:00 miestneho času. Inak by ste museli posúvať samotný cron, no pri prechode na zimný/letný čas sa posun opäť rozíde — preto je správnejšie nastaviť pásmo systému.
Hotové obalové skripty. Ich pracovné kópie a vzor crontabu (crontab.txt) sú v priečinku system/ vedľa projektu, mimo public_html. Toto nie je súčasť webu — nie je potrebné ich nahrávať do webového koreňa; umiestnite ich na server na systémové cesty (ako v crontabe vyššie):
  • lynis-scan.sh → /usr/local/bin/ (chmod +x) — spúšťa lynis audit system, počas skenu nastaví príznak /tmp/lynis-running a skopíruje lynis-report.dat do data/lynis/ panela;
  • logwatch_daily.sh → /usr/local/bin/ (chmod +x) — vytvára denný report Logwatch (sshd, fail2ban, sudo, postfix) do data/logwatch/;
  • smart-scan.sh → /usr/local/bin/ (chmod +x) — sníma stav diskov (smartctl) do data/disk/;
  • debsums-scan.sh → /usr/local/bin/ (chmod +x) — kontroluje integritu balíkov (debsums) do data/debsums/;
  • clamav-scan.sh → /usr/local/bin/ (chmod +x) — antivírusový sken ClamAV na nebezpečných cestách (web, home, temp); zapisuje súhrn do /var/log/clamav/scan.log, odkiaľ ho číta stránka ClamAV (riadok 01:30 v crontabe vyššie);
  • load-ipsum.sh → /usr/local/bin/ (chmod +x) — aktualizuje ipset sadu ipsum (level 1) na mieste, bez narušenia aktívnych pravidiel firewallu (riadok 04:00 v crontabe vyššie);
  • daily-report-all.sh → /usr/local/bin/ (chmod +x) — spúšťa report cron/daily_report.php panela (riadok 08:00 v crontabe vyššie);
  • daily_report.php — už je súčasťou panela (cron/daily_report.php), spúšťa sa cez daily-report-all.sh, samostatne ho netreba inštalovať;
  • collect-metrics-all.sh → /usr/local/bin/ (chmod +x) — spúšťa cron/collect_metrics.php panela (stránka „Výkon“, riadok */5 v crontabe vyššie); collect_metrics.php už je súčasťou panela, samostatne ho netreba inštalovať;
  • security-watch-all.sh → /usr/local/bin/ (chmod +x) — spúšťa cron/security_watch.php panela v mene vlastníka webu (stránka „Bezpečnostné udalosti“, riadok 2-57/5 v crontabe vyššie); security_watch.php je už súčasťou panela a netreba ho inštalovať zvlášť;
  • fleet-push-all.sh → /usr/local/bin/ (chmod +x) — posiela prehľad servera do zákazníckeho účtu cez cron/fleet_push.php panela (riadok 3,18,33,48 vyššie);
  • crontab.txt (system/cron/) — vzor úloh; potrebné riadky vpíšte cez sudo crontab -e.
Cesta ku skriptu v crontabe sa musí zhodovať s tým, kam ste ho umiestnili.
Ako umiestniť skript do /usr/local/bin/. Priamo z FileZilly tam nezapíšete — priečinok patrí root a SFTP-klient dostane SSH_FX_PERMISSION_DENIED. Postup je takýto: najprv nahrať súbor do /tmp (tam píšu všetci), potom ho jedným príkazom presunúť na miesto:
# vo FileZille: do poľa „Vzdialená lokalita“ zadať /tmp a nahrať tam skript, # potom cez SSH (install rovno nastaví vlastníka a práva, chown/chmod netreba): sudo install -o root -g root -m 755 /tmp/lynis-scan.sh /usr/local/bin/lynis-scan.sh rm -f /tmp/lynis-scan.sh # kontrola: súbor je na mieste, práva rwxr-xr-x, syntax neporušená bash -n /usr/local/bin/lynis-scan.sh && ls -l /usr/local/bin/lynis-scan.sh
Nepomýľte si priečinky: potrebný je /tmp v koreni servera — nie /var/tmp ani tmp/ vnútri samotného panela (posledný patrí www-data a je zatvorený pred vaším používateľom). V strome FileZilly je /tmp vetva najvyššej úrovne, vedľa var, nie vnútri neho.
Inštalovali ste server automatickým nastavením? Tieto obaly a ich cron úlohy sú už nainštalované skriptom (v /usr/local/bin/, log — /var/log/arciveo-cron.log) — ručne nemusíte robiť nič.
Kde skripty hľadajú panel. Obaly sú doménovo neutrálne: inštalácie panela nájdu prehľadaním /home/*/web/*/public_html a /var/www/* a reporty ukladajú do ich data/. Ak je panel na inej ceste — pridajte ju do riadku for app in … vnútri skriptov, inak sa reporty Lynis/SMART/debsums/Logwatch do panela nedostanú.
cron.log a prístupové práva. Súbor logs/cron.log ako prvý vytvorí root cron — bude patriť root a záložka „Cron log“ v paneli ho nebude môcť ani prečítať, ani vyčistiť. Vytvorte súbor vopred v mene webového používateľa (vlastník priečinka webu; v HestiaCP je to účet, napr. admin) — potom bude root cron len dopisovať bez zmeny vlastníka:
# vytvoriť vopred pod webovým používateľom (pred pridaním cron riadkov): sudo -u OWNER touch /path/to/monitor/logs/cron.log # ak cron.log už vytvoril root cron — odovzdať webovému používateľovi: sudo chown OWNER:OWNER /path/to/monitor/logs/cron.log sudo chmod 644 /path/to/monitor/logs/cron.log
Zistiť vlastníka priečinka: stat -c %U /path/to/monitor.
Správa z panela. V sekcii „Systém“ je stránka „Crontab“ — úlohy môžete prezerať a pridávať bez SSH. Panel upravuje len úlohy pridané cezeň samotný (samostatný blok v root-crontabe, označený služobnými komentármi); všetko, čo už je v crontabe (zoznam vyššie), je tam zobrazené v zozname „Ostatné úlohy servera“ len na čítanie s tlačidlom „Kopírovať do editora“ — to len prenesie plán/príkaz do formulára na pridanie, pôvodný riadok nemení. Ak chcete existujúcu úlohu „previesť“ pod správu panela — skopírujte ju do editora, uložte a potom starý riadok odstráňte ručne (sudo crontab -e), inak sa bude vykonávať dvakrát.
Jednorazové nastavenie na serveri. Stránka potrebuje privilegovaný obalový skript — nie holý sudo crontab (to by bola priama eskalácia na root pre každého, kto získa prístup k relácii panela), ale úzky skript s dvomi príkazmi (list/set), ktorý sa dotýka len svojho bloku medzi služobnými komentármi. Nainštalujte raz:
sudo install -m 0755 -o root -g root /dev/stdin /usr/local/sbin/arciveo-cron <<'ARCIVEO_CRON_EOF' #!/bin/bash set -euo pipefail BEGIN='# >>> ARCIVEO-CRON-MANAGED (edited from the panel; do not edit by hand) >>>' END='# <<< ARCIVEO-CRON-MANAGED <<<' cmd=${1:-} case "$cmd" in list) [ "$#" -eq 1 ] || { echo "usage: ${0##*/} list" >&2; exit 2; } crontab -l -u root 2>/dev/null || true ;; set) [ "$#" -eq 1 ] || { echo "usage: ${0##*/} set (body on stdin)" >&2; exit 2; } body=$(cat) if grep -qF "$BEGIN" <<<"$body" || grep -qF "$END" <<<"$body"; then echo "invalid body: markers not allowed" >&2; exit 2 fi current=$(crontab -l -u root 2>/dev/null || true) tmp=$(mktemp); trap 'rm -f "$tmp"' EXIT { if grep -qF "$BEGIN" <<<"$current"; then awk -v b="$BEGIN" '{print} $0==b{exit}' <<<"$current" else [ -n "$current" ] && printf '%s\n' "$current" echo "$BEGIN" fi printf '%s\n' "$body" echo "$END" if grep -qF "$END" <<<"$current"; then awk -v e="$END" 'f{print} $0==e{f=1}' <<<"$current" fi } > "$tmp" crontab -u root "$tmp" ;; *) echo "usage: ${0##*/} <list|set>" >&2; exit 2 ;; esac ARCIVEO_CRON_EOF echo "www-data ALL=(ALL) NOPASSWD: /usr/local/sbin/arciveo-cron" | sudo tee -a /etc/sudoers.d/monitor sudo visudo -c
Webový používateľ sa môže líšiť od www-data — skontrolujte, pod kým beží PHP-FPM pool webu (ps -o user= -C php-fpm), a doplňte ho do sudoers riadku.
Nový súbor sa nahral pod nesprávnym vlastníkom — stránka odpovedá „Access denied.“. Ak sa súbor public/crontab_monitor.php nahral cez FTP/SFTP pod iným systémovým používateľom (napríklad root) než ostatné súbory webu, webový server ho nebude môcť prečítať. Porovnajte vlastníka a práva so susedným súborom a zosúlaďte ich:
ls -la public/crontab_monitor.php public/ssl_monitor.php sudo chown OWNER:OWNER public/crontab_monitor.php sudo chmod 644 public/crontab_monitor.php

Diagnostika

41. Nástroj je nainštalovaný, ale zobrazuje sa „Nenainštalované“

Monitor zisťuje prítomnosť nástrojov cez dpkg-query — databázu balíkov APT. Ak nástroj nie je nainštalovaný cez apt (ručne, zo snap-u alebo zo zdrojov), dpkg ho nevidí.

# Overiť cez dpkg: dpkg -l fail2ban | grep '^ii' dpkg -l auditd | grep '^ii' # Nájsť cestu k binárke: which ufw fail2ban-client auditctl # Test sudo pod www-data: sudo -u www-data sudo fail2ban-client status sudo -u www-data sudo ufw status verbose

42. Riešenie problémov (500, žiadne dáta)

Chyba 500 — skontrolujte logy PHP, nginx a samotného monitora:

tail -50 /var/log/nginx/error.log tail -50 /var/log/php*-fpm.log # Logy monitora: tail -50 logs/monitor_$(date +%Y-%m-%d).log # Práva na priečinky: ls -la data/ tmp/ logs/
Panel na hostingovom paneli (HestiaCP, ISPmanager, cPanel)? Tam PHP nebeží pod www-data, ale pod účtom používateľa (napríklad admin — vlastník adresára stránky). Všetky sudo-pravidlá a členstvo v skupinách (adm, systemd-journal) treba nastaviť na tohto používateľa, inak moduly pri bežiacich službách zobrazia „Neaktívny / 0“. Skutočného používateľa PHP zistíte: ps -o user= -C php-fpm | sort -u alebo vlastník adresára stránky stat -c '%U' /path/to/monitor. Vo všetkých príkazoch nižšie ho potom dosaďte namiesto www-data. Automatická inštalácia web-používateľa určí sama a nastaví naň sudoers.

Dáta sa nezobrazujú — takmer vždy ide o nenastavené sudo-práva. Skontrolujte konkrétny príkaz pod web-používateľom (nahraďte www-data svojím). Prepínač -n = bez hesla, ako u PHP — ak si pýta heslo, znamená to, že pravidlo v sudoers chýba:

sudo -u www-data sudo -n fail2ban-client status sudo -u www-data sudo -n ufw status verbose sudo -u www-data sudo -n ipset list -t ipsum sudo -u www-data sudo -n /usr/sbin/ausearch -m USER_LOGIN -ts today sudo -u www-data sudo -n /usr/sbin/aa-status sudo -u www-data sudo -n /usr/sbin/psad --Status sudo -u www-data journalctl -u falco --no-pager -n 5
Modul píše „Neaktívny“ / „0“, hoci nástroj funguje (napríklad sudo aa-status v termináli zobrazuje profily, ale stránka „AppArmor“ — „Neaktívny“). Príčina: web-používateľ nemá sudo-právo na príkaz tohto modulu. Skontrolujte ho zo zoznamu vyššie: ak si pýta heslo — pridajte chýbajúci riadok do /etc/sudoers.d/monitor („Nastavenie sudo“). Časté „nové“ príkazy: /usr/sbin/aa-status (MAC), /usr/sbin/psad --Status (PSAD).
Ak je konkrétna stránka (Falco, ModSecurity, Auditd, otvorené porty UFW) prázdna — porovnajte so zoznamom v sekcii o sudo: pravdepodobne nie je povolený apache2ctl, ausearch, aa-status alebo ss, prípadne web-používateľ nie je v skupinách adm/systemd-journal (odtiaľ sa čítajú logy fail2ban/auth/modsec a journalctl — Falco a udalosti jadra).

43. Stránka je prázdna, hoci údaje na serveri sú

Príznak: na serveri údaje sú (cez shell viditeľné), no stránka zobrazuje „žiadne údaje“ alebo nesprávny stav — napríklad AIDE hlási „Neinicializované“, hoci databáza je vytvorená.

Príčinou je open_basedir: mnohé panely a hostingy obmedzujú fond PHP-FPM na adresár domény, takže PHP funkcie file_exists(), file_get_contents(), filemtime() na systémových cestách (/var/lib/aide, /var/log, /proc…) sú blokované. Monitor to obchádza tak, že takéto cesty číta štandardnými systémovými príkazmi (cat, test, stat).

# Je súbor viditeľný cez shell (takto číta monitor): sudo -u www-data bash -lc 'test -e /var/lib/aide/aide.db && echo VISIBLE || echo NO' # Aktuálna hodnota open_basedir pre fond domény: grep -ri open_basedir /etc/php/*/fpm/pool.d/ 2>/dev/null
Ak shell súbor „vidí“ (VISIBLE), no stránka nie — je to open_basedir. Správnym riešením je čítanie systémovými príkazmi (už zavedené pre AIDE a Sieťový monitor). Rozširovať open_basedir na /var, /proc nie je potrebné a je menej bezpečné.

44. SSL stránka nefunguje

Monitor kontroluje certifikáty priamym pripojením k doménam cez port 443. Ak je doména zo samotného servera nedostupná alebo je port blokovaný firewallom, kontrola neprebehne.

# Overiť certifikát ručne: echo | openssl s_client -connect monitor.example.com:443 2>/dev/null \ | openssl x509 -noout -dates # Overiť dostupnosť: curl -I https://monitor.example.com
Domény monitor preberá automaticky z konfigurácií Nginx (/etc/nginx/sites-enabled/, /etc/nginx/conf.d/) a Apache (/etc/apache2/sites-enabled/) plus aktuálny hostiteľ z HTTP_HOST.
Automatické zisťovanie subdomén. Subdomény sa zisťujú automaticky z verejných logov Certificate Transparency a overujú sa cez sieť — aj keď sú umiestnené na iných serveroch. Ručne netreba nič pridávať.

45. Vidno len jednu DB z viacerých

Monitor sa pripája k MySQL pod používateľom z config.php, ktorý má prístup len k svojej databáze. MySQL zobrazuje v information_schema iba databázy s oprávneniami — preto ostatné nie sú viditeľné.

Aby monitor videl všetky DB, prideľte tomuto používateľovi právo len na čítanie (raz od root; doplňte meno používateľa z config.php):

sudo mysql -u root GRANT SELECT, PROCESS, SHOW DATABASES ON *.* TO 'DB_USER'@'localhost'; FLUSH PRIVILEGES; EXIT;
SELECT ON *.* dáva iba právo na čítanie — nič sa nedá zmeniť, zmazať ani vytvoriť, čo je pre monitorovanie bezpečné.
Bez tohto GRANT panel vidí len svoju databázu — nejde o chybu, ale o obmedzenie práv. Žiadny sudo mysql panel nepoužíva: zoznam databáz získava cez svoje vlastné PDO-pripojenie.

46. PostgreSQL sa nezobrazuje na stránke „Databáza“

PostgreSQL vyžaduje prístup na úrovni používateľa postgres, ktorý webový používateľ panela nemá. Otvárať z PHP široký sudo psql nie je bezpečné — namiesto toho panel volá úzku obálku bez parametrov, ktorá iba vypíše verziu, počet spojení a zoznam databáz s veľkosťami. Vytvorte ju:

sudo tee /usr/local/bin/monitor-pgstat >/dev/null <<'EOF' #!/bin/sh # Arciveo Security Monitor - read-only PostgreSQL version, connections and per-database size sudo -u postgres psql -tAc "SELECT version();" | grep -oE 'PostgreSQL [0-9.]+' echo "---" sudo -u postgres psql -tAc "SELECT count(*) FROM pg_stat_activity;" echo "---" sudo -u postgres psql -tAc "SELECT datname || '|' || pg_size_pretty(pg_database_size(datname)) FROM pg_database WHERE datistemplate = false;" EOF sudo chown root:root /usr/local/bin/monitor-pgstat sudo chmod 755 /usr/local/bin/monitor-pgstat # v /etc/sudoers.d/monitor (používateľ = ten, pod ktorým beží PHP-FPM): # www-data ALL=(ALL) NOPASSWD: /usr/local/bin/monitor-pgstat
Ak PostgreSQL nepoužívate — odstráňte riadok monitor-pgstat zo sudoers (krok 13 manuálnej inštalácie) a samotný skript nevytvárajte: karta PostgreSQL zostane jednoducho neaktívna.

47. Spustil sa alert — čo robiť

Panel ukazuje, čo sa deje; nižšie nájdete, čo robiť v typických situáciách. Základný princíp: nepanikáriť, porovnať s legitímnou aktivitou (vaše akcie, aktualizácie, zálohy) a reagovať podľa závažnosti.

  • Mapa útokov / veľa banov fail2ban — to je norma pre každý server v internete (boty neustále skúšajú SSH/web). Hlavné je, aby bany fungovali. Uistite sa, že prihlásenie cez SSH je len kľúčom (heslo je vypnuté) a vaša IP je v ignoreip.
  • ModSecurity zablokoval požiadavky — WAF odráža útoky na web, to je jeho úloha. Ak sa blokuje váš legitímny prenos (falošné spustenie) — nájdite rule id v detailoch a pridajte výnimku do konfigurácie CRS.
  • AIDE: zmenené súbory — porovnajte zoznam s tým, čo ste robili (aktualizácia balíkov, úprava konfigurácií — norma). Zmeny systémových binárok, ktorých ste sa nedotkli, sú dôvodom na obozretnosť. Po legitímnych zmenách aktualizujte databázu AIDE.
  • debsums: zmenené binárky/knižnice (mimo /etc, mimo /usr/share) — potenciálna podvrhnutie. Overte balík: debsums PACKAGE_NAME, pri pochybnostiach ho preinštalujte (apt install --reinstall).
  • ClamAV / maldet: nájdená hrozba — skontrolujte súbor v karanténe, neotvárajte ho. Ak ide o web shell v adresári webu — izolujte server a hľadajte bod vstupu (zraniteľný plugin, únik prístupov).
  • Falco: kritické udalosti (spustenie shellu v kontajneri, prístup k citlivým súborom) — rozoberte udalosť: čí proces, čo ho spustilo. Často ide o legitímnu administrátorskú aktivitu.
  • Externá expozícia: červeno databáza/cache — okamžite zatvorte: priviažte službu na 127.0.0.1 alebo zatvorte port v UFW. To je reálna diera.
  • SSL vyprší / vypršal — obnovte certifikát (Let's Encrypt sa obnovuje sám; ak nie — skontrolujte certbot renew alebo nastavenia v paneli).
  • Bezpečnostné aktualizácie čakajú — nainštalujte: sudo apt update && sudo apt upgrade; po aktualizácii jadra reštartujte server.
Príznaky skutočného prieniku (neznáme procesy/používatelia, zmenené binárky, odchádzajúci spam, neznáme cron úlohy): odpojte server od externého prístupu, urobte zálohu na analýzu a ak sú dáta kritické, postavte čistý server z dôveryhodnej zálohy — spoľahlivo vyčistiť rootkit je náročné.