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):
Připojit se k serveru přes SSH;
Aktualizovat systém, nastavit název hostitele a časové pásmo;
Vytvořit běžného uživatele s právy sudo (nepracovat pod rootem);
Nastavit přihlášení pomocí SSH klíče a vypnout přihlášení heslem;
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 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:
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ý:
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.php — smaž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.
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.
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 journalctlbez 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:
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:
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:
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:
Změnit heslo admin — sekce „Uživatelé“ v menu.
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.
Omezit přístup podle IP — „Nastavení“ → „Omezení přístupu podle IP“ (před zapnutím zadejte svou IP, jinak si zablokujete přístup).
Zadat licenci — kód ARCIVEO-… z účtu aktivujte na svou doménu a klíč vložte do „Nastavení“ → „Licence“. Více.
Nastavit oznámení — Telegram a/nebo Email v „Nastavení“. Více.
Smazat instalátorpublic/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):
Toto je demo Arcivéo Security Monitoru pouze pro prohlížení — veškeré změny jsou vypnuté. Nasaďte jej na svůj server a spravujte reálná bezpečnostní data.