Ruční instalace

Zcela ruční instalace: od právě zakoupeného VPS až po funkční panel, krok za krokem. Příprava serveru, vytvoření webu, databáze, config.php a SSL jsou popsány zde. Příkazy pro jednotlivé bezpečnostní nástroje a pro cron najdete v příručce FAQ, odkazy jsou uvedeny průběžně.

Hlavní pravidlo: při změně SSH nebo firewallu neuzavírejte stávající připojení, dokud si nové neověříte v samostatném okně. Pokud přesto o přístup přijdete — téměř všichni poskytovatelé nabízejí nouzovou konzoli (VNC/Recovery) ve svém ovládacím panelu.

01. Koupil jsem VPS s Ubuntu/Debian — kde začít

Po nákupu vám hostingová firma pošle: IP adresu, uživatelské jméno (obvykle root) a heslo (nebo SSH klíč). To pro přihlášení stačí. Postup (každý krok je popsán v sekci níže):

  1. Připojit se k serveru přes SSH;
  2. Aktualizovat systém, nastavit název hostitele a časové pásmo;
  3. Vytvořit běžného uživatele s právy sudo (nepracovat pod rootem);
  4. Nastavit přihlášení pomocí SSH klíče a vypnout přihlášení heslem;
  5. Zapnout firewall a automatickou ochranu;
  6. (volitelně) nainstalovat ovládací panel HestiaCP — webový server, databáze a pošta „z krabice“.

02. První připojení přes SSH

SSH je zabezpečený terminál k serveru. Místo 203.0.113.10 zadejte svou IP adresu.

203.0.113.10 je příklad, neexistující adresa (vyhrazená pro dokumentaci). Nezadávejte ji tak, jak je — nahraďte ji skutečnou IP adresou vašeho serveru z e-mailu od hostingu. Jinak se připojení nezdaří.

Windows 10/11: otevřete PowerShell nebo „Terminál“ a použijte vestavěné ssh (nebo klienty PuTTY / MobaXterm).
macOS / Linux: otevřete „Terminál“.

# Přihlášení jako root (heslo přišlo od hostingu): ssh root@203.0.113.10 # Pokud hosting místo hesla poskytl soubor s klíčem: ssh -i cesta/ke/klíči root@203.0.113.10
Při prvním připojení se SSH zeptá na „authenticity of host“ — zadejte yes. Heslo se při psaní nezobrazuje (to je v pořádku). Pokud vám hosting dal dočasné heslo, změňte ho příkazem passwd.

03. Aktualizace systému a základní nastavení

Nejdřív aktualizujte všechny balíčky a nastavte název hostitele a časové pásmo.

# Aktualizace systému: apt update && apt upgrade -y # Základní nástroje: apt install -y curl wget ufw fail2ban unattended-upgrades # Časové pásmo (příklad) a název hostitele: timedatectl set-timezone Europe/Prague hostnamectl set-hostname myserver # Automatické bezpečnostní aktualizace: dpkg-reconfigure -plow unattended-upgrades
Seznam časových pásem — timedatectl list-timezones. Pokud se na konci aktualizace objeví modré okno „Daemons using outdated libraries“ — označte všechny služby (mezerník) a stiskněte OK, je to bezpečné.

04. Vytvoření uživatele se sudo

Trvale pracovat pod root je nebezpečné. Vytvořte běžného uživatele a dejte mu práva sudo (spouštění příkazů jako správce podle potřeby). Nahraďte deploy libovolným jménem.

# Vytvořit uživatele (nastaví heslo a zeptá se na údaje — lze Enter): adduser deploy # Přidat do skupiny sudo: usermod -aG sudo deploy # Ověřit (pod root): su - deploy sudo whoami # mělo by vypsat: root exit
Dále se na server přihlašujte už pod tímto uživatelem: ssh deploy@203.0.113.10 a příkazy správce spouštějte s prefixem sudo.

05. SSH klíče a vypnutí přihlašování heslem

Přihlášení klíčem je bezpečnější než heslo: heslo lze uhodnout, klíč prakticky ne. Nejprve vytvoříme klíč na svém počítači, zkopírujeme ho na server, ověříme přihlášení – a teprve poté vypneme heslo.

Krok 1. Vytvořte klíč na svém počítači (Windows PowerShell / macOS / Linux):

ssh-keygen -t ed25519 -C "my-laptop" # Enter na všechny dotazy (klíč se uloží do ~/.ssh/id_ed25519)

Krok 2. Zkopírujte veřejný klíč na server:

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

Krok 3. Ověřte přihlášení klíčem v novém okně – mělo by vpustit bez hesla:

ssh deploy@203.0.113.10
Neprovádějte Variantu B, dokud přihlášení klíčem neověříte a nefunguje (Kroky 1–3), a nezavírejte pracovní relaci. Vypne přihlášení heslem pro všechny uživatele, včetně root. Bez funkčního klíče zcela ztratíte přístup k serveru — vrátit ho půjde jen přes konzoli hostingu. Nemáte klíč — zvolte Variantu A.

Krok 4. Zpřísnit přístup přes SSH. Nastavení ukládáme do samostatného souboru, hlavní konfiguraci neměníme. Vyberte variantu podle situace:

Varianta A — jen zakázat root, heslo ponechat. Klíč není nutný, o přístup nepřijdete:

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

Varianta B — plný hardening. Vypnout přihlášení heslem a root ponechat jen po klíči. Provádějte pouze poté, co ověříte, že přihlášení klíčem funguje:

sudo tee /etc/ssh/sshd_config.d/00-hardening.conf >/dev/null <<'EOF' PubkeyAuthentication yes PasswordAuthentication no PermitRootLogin prohibit-password KbdInteractiveAuthentication no EOF sudo systemctl restart ssh
V obou variantách je root po heslu zakázán. PermitRootLogin no zakazuje root úplně, prohibit-password — ponechává přihlášení jen po klíči (pro administraci se přihlašujte pod deploy a používejte sudo). Chcete-li změnit port SSH — přidejte řádek Port 2222, ale nejprve otevřete nový port ve firewallu (další sekce) a ověřte přihlášení, jinak si zavřete přístup.

06. Základní firewall a automatická ochrana

Zavřete vše nepotřebné firewallem a zapněte fail2ban (blokuje hádání hesel přes SSH). Nejprve povolte SSH, jinak po zapnutí UFW ztratíte přístup.

# Povolit SSH (nebo váš port, pokud jste ho měnili) a web: sudo ufw allow OpenSSH sudo ufw allow 80,443/tcp # Zapnout firewall: sudo ufw enable sudo ufw status verbose # fail2ban — ochrana SSH proti hádání hesel (základní profil je aktivní ihned): sudo systemctl enable --now fail2ban sudo fail2ban-client status sshd
To je minimum. Provozní nastavení fail2ban, blok-list ipsum, rozšířené UFW a další nástroje najdete ve skupině „Bezpečnostní nástroje“ příručky. Samotný panel Arcivéo Monitor přehledně zobrazí stav toho všeho.

07. Instalace panelu HestiaCP (volitelné)

HestiaCP — bezplatný panel pro správu hostingu: nainstaluje a nakonfiguruje webový server (nginx + apache), PHP, databázi (MariaDB), poštu, DNS a SSL certifikáty a poskytne webové rozhraní pro weby. Hodí se, pokud nechcete vše nastavovat ručně a plánujete hostovat weby (včetně samotného panelu Arcivéo Monitor).

HestiaCP instalujte na čistý server (čerstvá podporovaná Ubuntu/Debian, minimálně ~1–2 GB RAM), před instalací dalších webových serverů a databází — jinak nastanou konflikty. Instalace trvá 10–20 minut a restartuje server.
# Stáhnout instalátor a spustit: wget https://raw.githubusercontent.com/hestiacp/hestiacp/release/install/hst-install.sh sudo bash hst-install.sh

Instalátor se zeptá na e-mail a název hostitele, poté nainstaluje celý stack. Po restartu je panel dostupný na adrese https://YOUR_IP:8083 (přihlašovací jméno a heslo instalátor zobrazí na konci).

HestiaCP sama spravuje UFW a fail2ban — není třeba je nastavovat zvlášť, převezme je. SSH klíče a vypnutí hesla (předchozí sekce) přesto proveďte.

08. Systémové požadavky a ionCube

Panel je PHP aplikace na typickém LAMP/LEMP stacku:

  • OS: Linux (doporučeno Ubuntu/Debian);
  • Webový server: nginx nebo Apache s PHP-FPM;
  • PHP 8.0+ s rozšířeními: pdo_mysql, openssl, curl, json, mbstring;
  • ionCube Loader — rozšíření PHP nutné pro chod panelu;
  • DB: MySQL 5.7+ nebo MariaDB 10.3+;
  • HTTPS — povinné (přihlášení a WebAuthn fungují jen přes https);
  • sudo pro uživatele webového serveru (úzká sada — krok 13).
# Ověřit verzi PHP a rozšíření: php -v php -m | grep -iE 'pdo_mysql|openssl|curl|mbstring|ioncube'

Instalace ionCube Loaderu (pokud ještě není). Na hostingu s panelem (HestiaCP, cPanel) se ionCube zapíná zaškrtnutím v nastavení PHP. Ručně na Ubuntu/Debian:

# Zjistit verzi PHP a adresář rozšíření: php -v EXTDIR=$(php -r 'echo ini_get("extension_dir");'); PHPVER=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;') # Stáhnout a rozbalit loadery (64-bit): cd /tmp wget -q https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz tar xzf ioncube_loaders_lin_x86-64.tar.gz # Zkopírovat loader pro vaši verzi PHP do adresáře rozšíření: sudo cp ioncube/ioncube_loader_lin_${PHPVER}.so "$EXTDIR"/ # Připojit (CLI + PHP-FPM) a restartovat: echo "zend_extension=ioncube_loader_lin_${PHPVER}.so" | sudo tee /etc/php/${PHPVER}/mods-available/ioncube.ini sudo phpenmod ioncube sudo systemctl restart php${PHPVER}-fpm # Ověření — ve výstupu se objeví řádek "with the ionCube PHP Loader": php -v
Verze loaderu se musí shodovat s verzí PHP (například ioncube_loader_lin_8.1.so pro PHP 8.1). Pokud používáte více verzí PHP, připojte loader pro každou z nich.

09. Doména a DNS

Chcete-li dashboard otevírat na adrese jako monitor.example.com a získat bezplatný SSL, potřebujete doménu směřující na váš server. V ovládacím panelu DNS vytvořte A-záznam:

Typ: A Název: monitor (poddoména → monitor.example.com) nebo @ (kořen domény → example.com) Hodnota: 203.0.113.10 ← IP vašeho serveru TTL: 3600

Za pár minut ověřte, že doména směřuje na server:

dig +short monitor.example.com # měl by vrátit vaši IP # nebo, pokud dig chybí: getent hosts monitor.example.com
SSL certifikát Let's Encrypt se vydává pouze na doménu — DNS musí směřovat na server před vydáním certifikátu.

10. Vytvoření webu a nahrání souborů panelu

Apache: DocumentRoot — na kořen panelu, NE na public/. Styly (CSS/JS), sw.js a manifest.json leží v assets/ vedle public/ a načítají se z kořene webu. Kořenový .htaccess je front-controller. Pokud u Apache nastavíte DocumentRoot na public/, panel se otevře bez stylů. U čistého nginx je to naopak: kořenem se bere public/ a assets/ se servíruje zvláštním pravidlem (viz blok nginx níže).
Soubory panelu (archiv distribuce) se po nákupu stahují ve vašem účtu my.arciveo.com„Stažené soubory“. Archiv před nahráním rozbalte.

1) Vytvořte adresář panelu a nahrajte do něj obsah distribuce (aby uvnitř byly public/, assets/, config.php atd.):

sudo mkdir -p /var/www/monitor # poté nahrát soubory distribuce do /var/www/monitor (FileZilla / WinSCP / scp)

2) Nastavte webový server. Apache: DocumentRoot — na kořen panelu (NE na /public); AllowOverride All je povinný. Cesta k soketu PHP-FPM se určí automaticky. Blok se vkládá do terminálu celý:

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

nginx: nginx nemá .htaccess, proto jako kořen bereme public/ a assets/, sw.js, manifest.json (o úroveň výš) servírujeme zvláštním pravidlem:

PHPSOCK=$(ls -1 /run/php/php*-fpm.sock 2>/dev/null | head -1) # auto-detekce soketu PHP-FPM sudo tee /etc/nginx/sites-available/monitor.conf > /dev/null <<'EOF' server { listen 80; server_name monitor.example.com; root /var/www/monitor/public; index index.php; # assets, service worker a manifest leží o úroveň výš než public/ location ~ ^/(assets/|sw\.js|manifest\.json) { root /var/www/monitor; } location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:__PHPSOCK__; } } EOF sudo sed -i "s#__PHPSOCK__#${PHPSOCK}#" /etc/nginx/sites-available/monitor.conf sudo ln -s /etc/nginx/sites-available/monitor.conf /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx

Nahrání souborů — SFTP/SCP (FileZilla, WinSCP) nebo scp:

# Příklad přes scp z místního počítače: scp -r ./monitor/* deploy@203.0.113.10:/var/www/monitor/
Nastavte práva k souborům — je to povinný krok. Pokud jste nahrávali pod root nebo přes SFTP, soubory patří root a webový server (www-data) je nedokáže přečíst — panel se otevře prázdný nebo s chybou 403 (v logu: .htaccess unreadable / directory not executable). Příkaz níže to opraví:
# Normalizujeme práva celého webrootu: adresář vytvořený rootem je pro # webový server (www-data) nedostupný — bez toho panel vrací prázdnou stránku nebo 403. # Apache běží pod www-data; pokud máte jiného webového uživatele — nahraďte. cd /var/www/monitor # Pracovní složky vytváříme PŘED chown — jinak nové adresáře zůstanou root:root # a při chmod 750 do nich webový server (www-data) nebude moci zapisovat. sudo mkdir -p data/lynis data/logwatch tmp logs sudo chown -R www-data:www-data /var/www/monitor sudo find /var/www/monitor -type d -exec chmod 755 {} \; sudo find /var/www/monitor -type f -exec chmod 644 {} \; sudo chmod 640 /var/www/monitor/config.php sudo chmod 750 data tmp logs

3) Zpřístupněte si nahrávání souborů přes SFTP. Po příkazu výše patří všechny soubory uživateli www-data, zatímco FileZilla / WinSCP se připojují pod vaším vlastním uživatelem — nahrávání pak selže s SSH_FX_PERMISSION_DENIED (Permission denied). Přihlásit se kvůli nahrávání jako root nelze — přihlášení root bylo vypnuto v kroku 05. Vyberte jednu ze dvou variant.

Varianta A — ACL jen pro vašeho uživatele (doporučeno). Právo zápisu získáte pouze vy; webový server stále nemůže přepsat kód panelu:

sudo apt install -y acl # Právo zápisu pro vašeho uživatele na celý adresář panelu: sudo setfacl -R -m u:deploy:rwX /var/www/monitor # Stejné pravidlo jako výchozí — pro soubory a složky vytvořené později: sudo setfacl -R -d -m u:deploy:rwX /var/www/monitor

Varianta B — přes skupinu www-data. Jednodušší, ale právo zápisu k souborům panelu získá i webový server: při zranitelnosti v PHP by šlo kód vyměnit. Na pořadí příkazů záleží — config.php a pracovní složky se zavírají jako poslední:

sudo usermod -aG www-data deploy # Zápis pro skupinu + setgid (bit 2): soubory nahrané přes SFTP zůstávají # ve skupině www-data — jinak je panel nedokáže přepsat. sudo find /var/www/monitor -type d -exec chmod 2775 {} \; sudo find /var/www/monitor -type f -exec chmod 664 {} \; sudo chmod 640 /var/www/monitor/config.php sudo chmod 2750 /var/www/monitor/data /var/www/monitor/tmp /var/www/monitor/logs
Po variantě B se ve FileZille připojte znovu (Server → Odpojit, poté se znovu přihlaste) — nová skupina se projeví až při novém přihlášení, do té doby oprávnění stále nebudete mít. Kontrola: id deploy — v seznamu skupin se musí objevit www-data; ls -ld /var/www/monitor — oprávnění drwxrwsr-x, písmeno s místo x znamená, že setgid je nastaven.

11. Databáze

Vytvořte databázi a uživatele, poté importujte schéma. Blok se do terminálu vkládá celý najednou. monitor_db a monitor_user jsou jen ukázkové názvy, můžete zvolit libovolné vlastní; zapamatujte si název databáze, uživatele a heslo — vepíšete je do config.php v dalším kroku:

# 1. Databáze. Heslo se nastavuje JEDNOU v DBPASS a doplní se do všech řádků. # Blok se do terminálu vkládá CELÝ; sudo mysql přihlásí root přes unix-socket # (heslo root není potřeba). NEPOUŽÍVEJTE interaktivní `sudo mysql -u root -p` # s kopírováním — při vložení půjdou SQL řádky do dotazu na heslo a ztratí se. DBPASS='CHOOSE_A_PASSWORD' # ← změňte pouze tento řádek sudo mysql <<SQL CREATE DATABASE IF NOT EXISTS monitor_db CHARACTER SET utf8mb4; CREATE USER IF NOT EXISTS 'monitor_user'@'localhost' IDENTIFIED BY '$DBPASS'; GRANT ALL ON monitor_db.* TO 'monitor_user'@'localhost'; FLUSH PRIVILEGES; SQL # Kontrola (měla by zobrazit monitor_db): mysql -u monitor_user -p"$DBPASS" -e "SHOW DATABASES;" # Toto stejné heslo vepište do config.php → DB_PASS.
Schéma není potřeba importovat — panel si tabulky a účet admin vytvoří sám při prvním otevření v prohlížeči (z database/db.sql), pokud je databáze prázdná. Ruční import schématu je nutný, jen když automatická inicializace neproběhla.
Pokud jste použili webový instalátor public/start_db.phpsmažte jej ihned po instalaci: umožňuje bez přihlášení znovu vytvořit databázi. Dokud soubor leží v kořeni panelu nebo v public/, panel zobrazuje červené upozornění.

12. Nastavení config.php

config.php v kořenovém adresáři panelu (/var/www/monitor/config.php) je jediný soubor, který je nutné upravit ručně. Veškerá nastavení panelu jsou v něm zadána konstantami define(). Otevřete jej v editoru:

sudo nano /var/www/monitor/config.php

Do zvýrazněných míst doplňte vlastní hodnoty; zbytek ponechte beze změny:

// --- Databáze (z kroku 11) --- define('DB_HOST', 'localhost'); // ponechat define('DB_NAME', 'db_name'); // co jste vytvořili v kroku 11 define('DB_USER', 'user'); // co jste vytvořili v kroku 11 define('DB_PASS', 'db_password'); // co jste zadali v kroku 11 define('DB_CHARSET', 'utf8mb4'); // ponechat // --- Aplikace --- define('APP_URL', 'https://monitor.example.com'); // adresa panelu, bez lomítka na konci define('TIMEZONE', 'Europe/Prague'); // vaše časové pásmo // --- Doba trvání relace --- define('SESSION_LIFETIME', 28800); // nečinnost do opětovného přihlášení, s (28800 = 8 h)

Co měnit:

  • DB_NAME, DB_USER, DB_PASS — přesně tytéž název databáze, uživatel a heslo, které jste zadali při vytváření databáze v kroku 11 (pokud jste ponechali příklady — monitor_db / monitor_user). DB_HOST a DB_CHARSET neupravujte.
  • APP_URL — úplná adresa panelu s https://, bez lomítka na konci a bez www. Musí se shodovat s doménou, na kterou aktivujete licenci (krok 16), jinak bude klíč odmítnut.
  • TIMEZONE — vaše časové pásmo (seznam — timedatectl list-timezones). Ovlivňuje pouze to, jak panel zobrazuje data; na čas spuštění úloh cron nemá vliv (tam platí pásmo systému).
  • SESSION_LIFETIME — po kolika sekundách nečinnosti panel vyžádá opětovné přihlášení (výchozí je 8 hodin). Např. 3600 = 1 hodina, 86400 = jeden den.
  • Blok logování chyb (display_errors, log_errors, error_log) — ponechte výchozí.

Uložte soubor (Ctrl+O, Enter, poté Ctrl+X) a restartujte PHP-FPM — jinak se změny kvůli OPcache neprojeví:

sudo systemctl restart php*-fpm
config.php je tajný soubor (je v něm heslo k databázi). Leží v kořenovém adresáři panelu, který je zároveň webovým kořenem, ale je uzavřený: práva 640 (nastavena v kroku 10) a výslovný zákaz v kořenovém .htaccess. Nezveřejňujte jej ve veřejných repozitářích a nepředávejte podpoře s reálným heslem.
Podrobný rozbor všech parametrů — ve FAQ: „Soubor config.php — všechna nastavení panelu“.

13. Nastavení sudo pro webový server

PHP běží pod uživatelem webového serveru, který nemá práva na systémové příkazy. Přístup se uděluje úzce: cílené sudo na konkrétní nástroje a čtení logů přes skupiny (bez sudo). Prolomení webové vrstvy nedává root.

V příkladech je www-data standardní uživatel Apache. Pokud máte jiného (v některých panelech běží PHP pod samostatným uživatelem) — nahraďte všude. Zjistíte příkazem: ps -o user= -C php-fpm | sort -u.

1. Vytvořte /etc/sudoers.d/monitor pomocí sudo visudo -f /etc/sudoers.d/monitor a vložte (řádky nepoužívaných modulů odstraňte):

# UFW — stav a pravidla (stránka „Brána firewall“) www-data ALL=(ALL) NOPASSWD: /usr/sbin/ufw status, /usr/sbin/ufw status verbose, /usr/sbin/ufw status numbered www-data ALL=(ALL) NOPASSWD: /usr/sbin/ufw allow [0-9]*, /usr/sbin/ufw deny [0-9]*, /usr/sbin/ufw --force delete [0-9]* # Fail2ban — stav, ban a odbanování (banned vrátí bany všech jailů jedním příkazem; # ban/unban potřebují tlačítka panelu) www-data ALL=(ALL) NOPASSWD: /usr/bin/fail2ban-client status, /usr/bin/fail2ban-client status *, /usr/bin/fail2ban-client banned, /usr/bin/fail2ban-client set * banip *, /usr/bin/fail2ban-client set * unbanip * # Bezpečnostní aktualizace (karta „Aktualizace“). Jen čtení, ale právě od roota: # cache apt (~70 MB) je dostupná jen rootovi, ne-root ji přestavuje při každém volání # (4,2 s CPU proti 0,01 s). Bez wildcard — přesně tento jeden příkaz, nic neinstaluje. www-data ALL=(ALL) NOPASSWD: /usr/bin/apt list --upgradable # IPset (mapa útoků, dashboard) www-data ALL=(ALL) NOPASSWD: /usr/sbin/ipset list -t ipsum # CrowdSec www-data ALL=(ALL) NOPASSWD: /usr/bin/cscli decisions list *, /usr/bin/cscli alerts list *, /usr/bin/cscli bouncers list *, /usr/bin/cscli scenarios list * # Auditd — hledání událostí + čtení posledních řádků žurnálu (přesná cesta) www-data ALL=(ALL) NOPASSWD: /usr/sbin/ausearch -m * www-data ALL=(ALL) NOPASSWD: /usr/bin/tail -n 300 /var/log/audit/audit.log # Monit / ModSecurity / AppArmor / PSAD www-data ALL=(ALL) NOPASSWD: /usr/bin/monit status www-data ALL=(ALL) NOPASSWD: /usr/sbin/apache2ctl -M www-data ALL=(ALL) NOPASSWD: /usr/local/bin/monitor-modsec www-data ALL=(ALL) NOPASSWD: /usr/sbin/aa-status www-data ALL=(ALL) NOPASSWD: /usr/sbin/psad --Status # Otevřené porty (logy jádra/SSH/Falco se čtou BEZ sudo — přes skupinu # systemd-journal, viz bod 2; sudo pro journalctl dávat NENÍ třeba a je nebezpečné) www-data ALL=(ALL) NOPASSWD: /usr/bin/ss -tuln, /usr/sbin/ss -tuln, /bin/ss -tuln # PostgreSQL (jen pokud používáte) — pevný read-only skript, # vytvořte podle FAQ „PostgreSQL se nezobrazuje“; bez něj řádek smažte www-data ALL=(ALL) NOPASSWD: /usr/local/bin/monitor-pgstat
sudo chmod 440 /etc/sudoers.d/monitor sudo visudo -c # mělo by být "parsed OK"

2. Přístup k logům a žurnálu systemd. Moduly čtou /var/log/fail2ban.log, auth.log, ufw.log, apache2/*, aide přímo (na Debianu/Ubuntu jsou tyto logy ve skupině adm). Události jádra, SSH a Falco se berou z journaldu příkazem journalctl bez sudo, přes skupinu systemd-journal. Přidejte webového uživatele do obou skupin a restartujte PHP-FPM:

sudo usermod -aG adm,systemd-journal www-data sudo systemctl restart php*-fpm # nutné, jinak se skupiny neaplikují

3. Pokud ClamAV nebo Suricata zapisují logy mimo skupinu adm (občas root:root) — udělte přístup přes ACL:

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

4. Obálka ModSecurity. Audit log WAF (/var/log/apache2/modsec_audit.log) patří rootovi s právy 640, webový uživatel jej přímo číst nemůže. Stránka ModSecurity bere režim jádra, události a seznam aktivních pravidel přes pevný read-only skript — ten je povolen v sudoers řádkem výše:

sudo tee /usr/local/bin/monitor-modsec >/dev/null <<'EOF' #!/bin/sh echo "ENGINE=$(grep -hE '^SecRuleEngine[[:space:]]+' /etc/modsecurity/*.conf 2>/dev/null | tail -1 | awk '{print $2}')" echo "---LOG---" tail -n 3000 /var/log/apache2/modsec_audit.log 2>/dev/null echo "---RULES---" for f in /etc/modsecurity/crs/rules/*.conf /usr/share/modsecurity-crs/rules/*.conf /etc/modsecurity/custom-rules.conf; do [ -f "$f" ] && { echo "===FILE:$(basename "$f")==="; cat "$f"; } done EOF sudo chown root:root /usr/local/bin/monitor-modsec sudo chmod 755 /usr/local/bin/monitor-modsec
Bez souboru /etc/modsecurity/modsecurity.conf samotný WAF nefunguje: balíček ukládá jen modsecurity.conf-recommended a jádro pravidel zůstává vypnuté — jak jej zapnout, viz FAQ → „Instalace ModSecurity“.
Uživatel ve všech řádcích sudoers se musí shodovat s uživatelem FPM poolu: na běžném Apache/Debianu je to www-data, v HestiaCP běží pool webu pod vlastníkem webu (například admin) — zkontrolujte grep -E '^user' /etc/php/*/fpm/pool.d/monitor.example.com.conf.

5. Pokud je před Apache Nginx (HestiaCP, ISPmanager a další panely — tam Nginx proxuje PHP do Apache a statiku vydává sám). Servisní adresáře jsou uzavřené soubory .htaccess, ale Nginx je nečte: jakýkoli statický soubor (.json, .txt, .log, .dat) vydá přímo, mimo Apache. Ven uniknou cache panelu a data — například tmp/modsec_cache.json s událostmi WAF a IP adresami útočníků. Přidejte zákaz do konfigurace webu Nginx:

location ^~ /data/ { deny all; } location ^~ /tmp/ { deny all; } location ^~ /logs/ { deny all; } location ^~ /includes/ { deny all; } location ^~ /cron/ { deny all; } location ^~ /database/ { deny all; } location = /config.php { deny all; }
Prefix ^~ je povinný: vybírá se dříve než regulární pravidlo pro statiku uvnitř location /, jinak zákaz nezabere.
V HestiaCP ukládejte toto samostatným souborem /home/<user>/conf/web/<domain>/nginx.ssl.conf_deny (a nginx.conf_deny pro HTTP) — konfigurace webu připojuje nginx.ssl.conf_* a při přestavbě takové soubory nepřepisuje. Aplikovat: sudo nginx -t && sudo systemctl reload nginx.
Kontrola: curl -s -o /dev/null -w '%{http_code}\n' https://monitor.example.com/tmp/modsec_cache.json — mělo by být 403. Pokud Apache běží bez Nginx (naslouchá na 80/443 sám), není třeba nic přidávat — .htaccess stačí.
Cesty k binárkám ověřte přes which (například which ufw cscli ausearch ss). Sudoers upravujte pouze přes visudo. Seznam všech databází MySQL se zapíná samostatným GRANT (FAQ → „Vidět jen jednu DB“).

14. Omezení přístupu podle IP

Omezte přístup k monitoru podle IP adresy — i kdyby se URL stalo známým, přihlašovací stránka se neotevře. Lze to nastavit na úrovni webového serveru (příklad pro nginx níže) nebo přímo v panelu („Nastavení“ → „Omezení přístupu podle IP“). Pokud máte Apache, použijte omezení v panelu.

Pokud je web nginx už nastaven podle kroku 10, nepřidávejte druhý location / — řádky allow/deny vepište do již existujícího bloku. Dva stejné location / v jednom server { } jsou chyba konfigurace a nginx se nespustí.
# V konfiguraci nginx (uvnitř server { }): # ACME cestu Let's Encrypt necháme otevřenou mimo IP omezení — # aby vydání a automatické obnovení SSL (krok 15) nezáviselo na IP filtru. location ^~ /.well-known/acme-challenge/ { allow all; } location / { allow 203.0.113.10; # ← vepište svou IP allow 10.0.0.0/8; # lokální síť (pokud je potřeba) deny all; try_files $uri $uri/ /index.php?$query_string; } # Restartovat nginx: sudo nginx -t && sudo systemctl reload nginx

15. Vydání SSL (HTTPS)

Panel funguje pouze přes HTTPS. Přihlašovací relace používá zabezpečenou cookie a WebAuthn (2FA) funguje jen na HTTPS. Přes http:// se přihlásit nelze.

Certifikát je zdarma (Let's Encrypt). DNS domény už musí ukazovat na server. Příkaz závisí na webovém serveru:

# Apache: sudo certbot --apache -d monitor.example.com # nginx — POUZE pokud máte skutečně nginx. Na Apache NEspouštějte: # apt stáhne nginx a obsadí port 80, konflikt s Apache. # sudo apt install python3-certbot-nginx # sudo certbot --nginx -d monitor.example.com # certbot sám zapíše HTTPS do konfigurace a nastaví automatické obnovení
Na co se certbot zeptá: e-mail → souhlas s Terms (Y) → předání e-mailu do EFF (podle vašeho uvážení). Poté sám vydá certifikát, zapíše <VirtualHost *:443>, nastaví přesměrování http→https a automatické obnovení.
DNS musí ukazovat na server PŘED spuštěním certbot (ověření vlastnictví přes port 80). Kontrola: dig +short monitor.example.com → IP serveru. Porty 80/443 otevřené: sudo ufw allow 80,443/tcp.

Po vydání: https://monitor.example.com se otevírá se zámkem, http:// přesměrovává na https:// (APP_URL v config.php je už nastaveno v kroku 12).

16. Přihlášení a prvotní nastavení

Otevřete https://monitor.example.com, přihlaste se jako admin / useradmin a projděte kontrolní seznam:

  1. Změnit heslo admin — sekce „Uživatelé“ v menu.
  2. Zapnout WebAuthn (2FA) — „Klíče WebAuthn“ → zaregistrujte klíč/passkey (vyžaduje HTTPS). Zaregistrujte rovnou dva: při ztrátě jediného klíče nebude přihlášení pomocí něj možné. Více.
  3. Omezit přístup podle IP — „Nastavení“ → „Omezení přístupu podle IP“ (před zapnutím zadejte svou IP, jinak si zablokujete přístup).
  4. Zadat licenci — kód ARCIVEO-… z účtu aktivujte na svou doménu a klíč vložte do „Nastavení“ → „Licence“. Více.
  5. Nastavit oznámení — Telegram a/nebo Email v „Nastavení“. Více.
  6. Smazat instalátor public/start_db.php, pokud zůstal (krok 11).

17. Bezpečnostní nástroje (volitelné)

Panel už funguje. Nástroje se instalují podle potřeby — nainstalujete jen to, co chcete, a panel hned zobrazí stav. Příkazy pro instalaci každého z nich najdete v příručce (samostatné sekce k jednotlivým nástrojům):

18. Cron a údržba

Nastavuje se jednou, také volitelně, ale doporučujeme to. Podrobné příkazy najdete v příručce:

  1. Úlohy cron (reporty, aktualizace seznamů, kontroly);
  2. Zálohování;
  3. Aktualizace a přenos panelu;
  4. Obnovení přístupu — pro případ ztráty klíče/hesla.
Něco nefunguje nebo se zobrazuje „žádná data“? Podívejte se do skupiny „Diagnostika“ v příručce.
Arcivéo - Security Monitor © 2026