Helt manuell installation: från en nyss köpt VPS till en fungerande dashboard, steg för steg.
Serverförberedelse, skapande av webbplats, databas, config.php och SSL beskrivs här.
Kommandon för varje säkerhetsverktyg och för cron finns i
FAQ-referensen, med länkar längs vägen.
Huvudregel: när du ändrar SSH eller brandväggen, stäng inte den aktuella anslutningen förrän du har testat den nya i ett separat fönster. Om åtkomsten ändå går förlorad ger nästan alla webbhotell en nödkonsol (VNC/Recovery) i kontrollpanelen.
01. Köpt en VPS med Ubuntu/Debian – var börjar man
Efter köpet skickar hostingleverantören: IP-adress, användarnamn (oftast root) och lösenord (eller SSH-nyckel). Det räcker för att logga in. Ordningsföljd (varje steg är ett avsnitt nedan):
Anslut till servern via SSH;
Uppdatera systemet, ange värdnamn och tidszon;
Skapa en vanlig användare med sudo-rättigheter (arbeta inte som root);
Ställ in inloggning med SSH-nyckel och inaktivera lösenordsinloggning;
Aktivera brandvägg och autoskydd;
(valfritt) installera kontrollpanelen HestiaCP – webbserver, databas och e-post direkt ur lådan.
02. Första anslutningen via SSH
SSH är en säker terminal till servern. Ersätt 203.0.113.10 med din egen IP.
203.0.113.10 är ett exempel, en obefintlig adress (reserverad för dokumentation). Ange den inte som den är – ersätt den med din servers riktiga IP från hostingleverantörens mejl. Annars går anslutningen inte igenom.
Windows 10/11: öppna PowerShell eller ”Terminal” och använd den inbyggda ssh (eller klienterna PuTTY / MobaXterm). macOS / Linux: öppna ”Terminal”.
# Inloggning som root (lösenordet kom från hostingleverantören):
ssh root@203.0.113.10
# Om hostingleverantören gav en nyckelfil i stället för lösenord:
ssh -i sökväg/till/nyckel root@203.0.113.10
Vid första anslutningen frågar SSH om ”authenticity of host” – ange yes. Lösenordet visas inte när du skriver det (det är normalt). Om hostingleverantören gav ett tillfälligt lösenord – byt det med kommandot passwd.
03. Systemuppdatering och grundinställningar
Först och främst — uppdatera alla paket och ange värdnamn och tidszon.
Lista över tidszoner — timedatectl list-timezones. Om ett blått fönster ”Daemons using outdated libraries” dyker upp i slutet av uppdateringen — markera alla tjänster (Blanksteg) och tryck OK, det är säkert.
04. Skapa en användare med sudo
Att alltid arbeta som root är osäkert. Skapa en vanlig användare och ge den sudo-rättigheter (kör kommandon som administratör vid behov). Ersätt deploy med valfritt namn.
# Skapa användaren (anger lösenord och frågar efter uppgifter — Enter går bra):
adduser deploy
# Lägg till i sudo-gruppen:
usermod -aG sudo deploy
# Kontrollera (som root):
su - deploy
sudo whoami # ska skriva ut: root
exit
Logga hädanefter in på servern som denna användare: ssh deploy@203.0.113.10, och kör administratörskommandon med prefixet sudo.
05. SSH-nycklar och inaktivering av lösenordsinloggning
Inloggning med nyckel är säkrare än lösenord: ett lösenord kan gissas, en nyckel i praktiken inte. Först skapar vi en nyckel på din egen dator, kopierar den till servern, testar inloggningen — och först därefter inaktiverar vi lösenordet.
Steg 1. Skapa en nyckel på din egen dator (Windows PowerShell / macOS / Linux):
ssh-keygen -t ed25519 -C "my-laptop"
# Enter på alla frågor (nyckeln hamnar i ~/.ssh/id_ed25519)
Steg 3. Testa nyckelinloggningen i ett nytt fönster — den ska släppa in dig utan lösenord:
ssh deploy@203.0.113.10
Kör inte Alternativ B förrän inloggning med nyckel har testats och fungerar (Steg 1–3), och stäng inte den aktiva sessionen. Det inaktiverar lösenordsinloggning för alla användare, inklusive root. Utan en fungerande nyckel förlorar du åtkomsten till servern helt — du kan bara få tillbaka den via webbhotellets konsol. Ingen nyckel — använd Alternativ A.
Steg 4. Skärp SSH-åtkomsten. Inställningarna lägger vi i en separat fil, utan att röra huvudkonfigurationen. Välj alternativ efter situationen:
Alternativ A — stäng bara ute root, behåll lösenordet. Ingen nyckel behövs, du förlorar inte åtkomsten:
Alternativ B — full hardening. Inaktivera lösenordsinloggning och tillåt root endast med nyckel. Kör det endast när du är säker på att inloggning med nyckel fungerar:
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
I båda alternativen är root med lösenord stängt. PermitRootLogin no förbjuder root helt, prohibit-password — tillåter inloggning endast med nyckel (för administration loggar du in som deploy och använder sudo). Vill du byta SSH-port — lägg till raden Port 2222, men öppna först den nya porten i brandväggen (nästa avsnitt) och testa inloggningen, annars stänger du ute dig själv.
06. Grundläggande brandvägg och autoskydd
Stäng allt onödigt med brandväggen och aktivera fail2ban (bannar lösenordsknäckning via SSH). Tillåt först SSH, annars förlorar du åtkomsten när UFW aktiveras.
# Tillåt SSH (eller din port om du ändrat) och webb:
sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
# Aktivera brandväggen:
sudo ufw enable
sudo ufw status verbose
# fail2ban — skydd mot SSH-knäckning (grundprofil aktiv direkt):
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
Detta är ett minimum. Fungerande fail2ban-inställningar, ipsum-blocklistan, utökad UFW och övriga verktyg finns i gruppen ”Säkerhetsverktyg” i handboken. Själva Arcivéo Monitor-panelen visar tydligt statusen för allt detta.
07. Installation av HestiaCP-panelen (valfritt)
HestiaCP — en gratis kontrollpanel för webbhotell: installerar och konfigurerar webbserver (nginx + apache), PHP, databas (MariaDB), e-post, DNS och SSL-certifikat samt ger ett webbgränssnitt för webbplatser. Praktiskt om du inte vill konfigurera allt manuellt och tänker vara värd för webbplatser (inklusive själva Arcivéo Monitor-panelen).
Installera HestiaCP på en ren server (nytt Ubuntu/Debian som stöds, minst ~1–2 GB RAM), innan andra webbservrar och databaser installeras — annars uppstår konflikter. Installationen tar 10–20 minuter och startar om servern.
# Ladda ner installationsprogrammet och kör:
wget https://raw.githubusercontent.com/hestiacp/hestiacp/release/install/hst-install.sh
sudo bash hst-install.sh
Installationsprogrammet frågar efter e-post och värdnamn och installerar sedan hela stacken. Efter omstarten är panelen tillgänglig på https://YOUR_IP:8083 (användarnamn och lösenord visas av installationsprogrammet i slutet).
HestiaCP hanterar själv UFW och fail2ban — du behöver inte konfigurera dem separat, den tar hand om det. SSH-nycklar och att inaktivera lösenordet (föregående avsnitt) bör du ändå göra.
08. Systemkrav och ionCube
Panelen är en PHP-applikation på en typisk LAMP/LEMP-stack:
OS: Linux (Ubuntu/Debian rekommenderas);
Webbserver: nginx eller Apache med PHP-FPM;
PHP 8.0+ med tilläggen: pdo_mysql, openssl, curl, json, mbstring;
ionCube Loader — ett PHP-tillägg som krävs för att panelen ska fungera;
DB: MySQL 5.7+ eller MariaDB 10.3+;
HTTPS — obligatoriskt (inloggning och WebAuthn fungerar bara via https);
sudo för webbserverns användare (begränsad uppsättning — steg 13).
Installation av ionCube Loader (om det inte redan finns). På hosting med kontrollpanel (HestiaCP, cPanel) aktiveras ionCube med en kryssruta i PHP-inställningarna. Manuellt på Ubuntu/Debian:
# Ta reda på PHP-version och tilläggskatalog:
php -v
EXTDIR=$(php -r 'echo ini_get("extension_dir");'); PHPVER=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')
# Ladda ner och packa upp loaders (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
# Kopiera loadern för din PHP-version till tilläggskatalogen:
sudo cp ioncube/ioncube_loader_lin_${PHPVER}.so "$EXTDIR"/
# Aktivera (CLI + PHP-FPM) och starta om:
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
# Kontroll — i utdatan visas raden "with the ionCube PHP Loader":
php -v
Loaderns version måste matcha PHP-versionen (t.ex. ioncube_loader_lin_8.1.so för PHP 8.1). Om du använder flera PHP-versioner — aktivera loadern för varje version.
09. Domän och DNS
För att öppna panelen på en adress som monitor.example.com och få gratis SSL behöver du en domän som pekar mot din server. Skapa en A-post i DNS-kontrollpanelen:
Typ: A
Namn: monitor (underdomän → monitor.example.com)
eller @ (domänrot → example.com)
Värde: 203.0.113.10 ← din servers IP
TTL: 3600
Kontrollera efter några minuter att domänen pekar mot servern:
dig +short monitor.example.com # ska returnera din IP
# eller, om dig saknas:
getent hosts monitor.example.com
Let's Encrypt-certifikatet utfärdas endast för en domän — DNS måste peka mot servern innan certifikatet utfärdas.
10. Skapa webbplats och ladda upp panelens filer
Apache: DocumentRoot ska peka på panelens rot, INTE på public/. Stilar (CSS/JS), sw.js och manifest.json ligger i assets/ bredvid public/ och begärs från webbplatsens rot. Roten .htaccess är frontkontroller. Om du under Apache pekar DocumentRoot på public/ öppnas panelen utan stilar. För ren nginx är det tvärtom: public/ tas som rot och assets/ serveras via en separat regel (se nginx-blocket nedan).
Panelens filer (distributionsarkivet) laddas ner efter köpet i portalen my.arciveo.com → ”Nedladdningar”. Packa upp arkivet före uppladdningen.
1) Skapa panelens katalog och ladda upp distributionens innehåll i den (så att public/, assets/, config.php osv. hamnar där):
sudo mkdir -p /var/www/monitor
# ladda sedan upp distributionens filer till /var/www/monitor (FileZilla / WinSCP / scp)
2) Konfigurera webbservern.Apache: DocumentRoot ska peka på panelens rot (INTE på /public); AllowOverride All krävs. Sökvägen till PHP-FPM-socketen fastställs automatiskt. Blocket klistras in i terminalen i sin helhet:
PHPSOCK=$(ls -1 /run/php/php*-fpm.sock 2>/dev/null | head -1) # auto-detektering av PHP-FPM-socket
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 har ingen .htaccess, därför tar vi public/ som rot och serverar assets/, sw.js och manifest.json (en nivå upp) via en separat regel:
PHPSOCK=$(ls -1 /run/php/php*-fpm.sock 2>/dev/null | head -1) # auto-detektering av PHP-FPM-socket
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 och manifest ligger en nivå ovanför 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
Uppladdning av filer — SFTP/SCP (FileZilla, WinSCP) eller scp:
# Exempel via scp från den lokala datorn:
scp -r ./monitor/* deploy@203.0.113.10:/var/www/monitor/
Ställ in filrättigheterna — detta är ett obligatoriskt steg. Om du laddade upp som root eller via SFTP ägs filerna av root, och webbservern (www-data) kan inte läsa dem — panelen öppnas tom eller med fel 403 (i loggen: .htaccess unreadable / directory not executable). Kommandot nedan åtgärdar detta:
# Normalisera rättigheterna för hela webbroten: en katalog skapad av root är
# otillgänglig för webbservern (www-data) — utan detta ger panelen en tom sida eller 403.
# Apache körs som www-data; om du har en annan webbanvändare — byt ut den.
cd /var/www/monitor
# Skapa arbetsmapparna FÖRE chown — annars förblir de nya katalogerna root:root
# och vid chmod 750 kan webbservern (www-data) inte skriva i dem.
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) Öppna uppladdning via SFTP för dig själv. Efter kommandot ovan ägs alla filer av www-data, medan FileZilla / WinSCP ansluter som din egen användare — uppladdningen misslyckas då med SSH_FX_PERMISSION_DENIED (Permission denied). Att logga in som root för att ladda upp går inte — root-inloggningen stängdes av i steg 05. Välj ett av de två alternativen.
Alternativ A — en ACL enbart för din användare (rekommenderas). Skrivrättigheter får bara du; webbservern kan fortfarande inte skriva över panelens kod:
sudo apt install -y acl
# Skrivrättighet för din användare till hela panelkatalogen:
sudo setfacl -R -m u:deploy:rwX /var/www/monitor
# Samma regel som standard — för filer och mappar som skapas senare:
sudo setfacl -R -d -m u:deploy:rwX /var/www/monitor
Alternativ B — via gruppen www-data. Enklare, men även webbservern får skrivrättighet till panelens filer: vid en sårbarhet i PHP skulle koden kunna bytas ut. Ordningen på kommandona spelar roll — config.php och arbetsmapparna stängs sist:
sudo usermod -aG www-data deploy
# Skrivrätt för gruppen + setgid (biten 2): filer som laddas upp via SFTP
# stannar kvar i gruppen www-data — annars kan panelen inte skriva över dem.
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
Efter alternativ B — anslut på nytt i FileZilla (Server → Koppla från, logga sedan in igen): den nya gruppen börjar gälla först vid en ny inloggning, dessförinnan har du fortfarande inga rättigheter. Kontroll: id deploy — i grupplistan ska www-data dyka upp; ls -ld /var/www/monitor — rättigheter drwxrwsr-x, bokstaven s i stället för x betyder att setgid är satt.
11. Databas
Skapa en databas och en användare, importera sedan schemat. Blocket klistras in i terminalen i sin helhet. monitor_db och monitor_user är exempelnamn — du kan ange vilka du vill; kom ihåg databasnamnet, användaren och lösenordet — du anger dem i config.php i nästa steg:
# 1. Databas. Lösenordet anges EN gång i DBPASS och infogas i alla rader.
# Blocket klistras in i terminalen I SIN HELHET; sudo mysql loggar in root via unix-socket
# (root-lösenord behövs inte). Använd INTE interaktivt `sudo mysql -u root -p`
# med copy-paste — vid inklistring hamnar SQL-raderna i lösenordsfrågan och försvinner.
DBPASS='CHOOSE_A_PASSWORD' # ← ändra bara denna rad
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
# Kontroll (ska visa monitor_db):
mysql -u monitor_user -p"$DBPASS" -e "SHOW DATABASES;"
# Ange samma lösenord i config.php → DB_PASS.
Schemat behöver inte importeras — panelen skapar själv tabellerna och kontot admin vid första besöket i webbläsaren (från database/db.sql) om databasen är tom. Manuell import av schemat behövs bara om autoinitieringen inte fungerade.
Om du använde webbläsarinstallationen public/start_db.php — ta bort den direkt efter installationen: den gör det möjligt att återskapa databasen utan inloggning. Så länge filen ligger i panelens rot eller i public/ visar panelen en röd varning.
12. Konfigurera config.php
config.php i panelens rot (/var/www/monitor/config.php) är den enda filen du behöver redigera för hand. Alla panelinställningar anges i den som define()-konstanter. Öppna den i en editor:
sudo nano /var/www/monitor/config.php
Fyll i dina egna värden på de markerade ställena; låt resten vara som det är:
// --- Databas (från steg 11) ---
define('DB_HOST', 'localhost'); // behåll
define('DB_NAME', 'db_name'); // det du skapade i steg 11
define('DB_USER', 'user'); // det du skapade i steg 11
define('DB_PASS', 'db_password'); // det du angav i steg 11
define('DB_CHARSET', 'utf8mb4'); // behåll
// --- Applikation ---
define('APP_URL', 'https://monitor.example.com'); // panelens adress, utan avslutande snedstreck
define('TIMEZONE', 'Europe/Stockholm'); // din tidszon
// --- Sessionstid ---
define('SESSION_LIFETIME', 28800); // inaktivitet till ny inloggning, sek (28800 = 8 h)
Vad som ska ändras:
DB_NAME, DB_USER, DB_PASS — exakt samma databasnamn, användare och lösenord som du angav när du skapade databasen i steg 11 (om du behöll exemplen — monitor_db / monitor_user). Rör inte DB_HOST och DB_CHARSET.
APP_URL — panelens fullständiga adress med https://, utan avslutande snedstreck och utan www. Den måste matcha domänen som du aktiverar licensen på (steg 16), annars avvisas nyckeln.
TIMEZONE — din tidszon (lista — timedatectl list-timezones). Påverkar bara hur panelen visar datum; startpunkten för cron-jobb påverkas inte (där gäller systemets tidszon).
SESSION_LIFETIME — efter hur många sekunders inaktivitet panelen ber om ny inloggning (standard 8 timmar). T.ex. 3600 = 1 timme, 86400 = ett dygn.
Blocket för felloggning (display_errors, log_errors, error_log) — låt stå som standard.
Spara filen (Ctrl+O, Enter, sedan Ctrl+X) och starta om PHP-FPM — annars tillämpas ändringarna inte på grund av OPcache:
sudo systemctl restart php*-fpm
config.php är en hemlig fil (den innehåller databaslösenordet). Den ligger i panelens rot, som också är webbroten, men är skyddad: rättigheterna 640 (satta i steg 10) och ett uttryckligt förbud i rotens .htaccess. Lägg inte upp den i publika repositorier och skicka den inte till supporten med det riktiga lösenordet.
PHP körs som webbserverns användare, som saknar rättigheter till systemkommandon. Åtkomst ges snävt: punktvis sudo till specifika verktyg och loggläsning via grupper (utan sudo). Ett intrång i webblagret ger inte root.
I exemplen är www-data Apaches standardanvändare. Om du har en annan (i vissa paneler körs PHP under en separat användare) — byt ut den överallt. Ta reda på den: ps -o user= -C php-fpm | sort -u.
1. Skapa /etc/sudoers.d/monitor med sudo visudo -f /etc/sudoers.d/monitor och klistra in (ta bort raderna för moduler du inte använder):
# UFW — status och regler (sidan ”Brandvägg”)
www-data ALL=(ALL) NOPASSWD: /usr/sbin/ufw status, /usr/sbin/ufw status verbose, /usr/sbin/ufw status numbered
www-data ALL=(ALL) NOPASSWD: /usr/sbin/ufw allow [0-9]*, /usr/sbin/ufw deny [0-9]*, /usr/sbin/ufw --force delete [0-9]*
# Fail2ban — status, ban och unban (banned ger banlistor för alla jail med ett kommando;
# ban/unban behövs av panelens knappar)
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 *
# Säkerhetsuppdateringar (kortet ”Uppdateringar”). Endast läsning, men just som root:
# apt-cachen (~70 MB) är åtkomlig endast för root, en icke-root bygger om den vid varje anrop
# (4,2 s CPU mot 0,01 s). Utan wildcard — exakt detta enda kommando, installerar ingenting.
www-data ALL=(ALL) NOPASSWD: /usr/bin/apt list --upgradable
# IPset (attackkarta, 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 — sökning av händelser + läsning av loggens sista rader (exakt sökväg)
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
# Öppna portar (kärn-/SSH-/Falco-loggar läses UTAN sudo — via gruppen
# systemd-journal, se p.2; sudo för journalctl ska INTE ges och är osäkert)
www-data ALL=(ALL) NOPASSWD: /usr/bin/ss -tuln, /usr/sbin/ss -tuln, /bin/ss -tuln
# PostgreSQL (endast om du använder det) — ett fast read-only-skript,
# skapa enligt FAQ ”PostgreSQL visas inte”; utan det tar du bort raden
www-data ALL=(ALL) NOPASSWD: /usr/local/bin/monitor-pgstat
sudo chmod 440 /etc/sudoers.d/monitor
sudo visudo -c # ska vara "parsed OK"
2. Åtkomst till loggar och systemd-journalen. Modulerna läser /var/log/fail2ban.log, auth.log, ufw.log, apache2/*, aide direkt (på Debian/Ubuntu ligger dessa loggar i gruppen adm). Kärn-, SSH- och Falco-händelser hämtas från journald med kommandot journalctlutan sudo, via gruppen systemd-journal. Lägg till webbanvändaren i båda grupperna och starta om PHP-FPM:
sudo usermod -aG adm,systemd-journal www-data
sudo systemctl restart php*-fpm # obligatoriskt, annars tillämpas inte grupperna
3. Om ClamAV eller Suricata skriver loggar utanför gruppen adm (kan vara root:root) — ge åtkomst via ACL:
4. ModSecurity-omslag. WAF:ens auditlogg (/var/log/apache2/modsec_audit.log) ägs av root med rättigheterna 640, och webbanvändaren kan inte läsa den direkt. ModSecurity-sidan hämtar motorns läge, händelser och listan över aktiva regler via ett fast read-only-skript — det är just detta som tillåts i raden i sudoers ovan:
Utan filen /etc/modsecurity/modsecurity.conf fungerar inte WAF:en alls: paketet lägger bara in modsecurity.conf-recommended, och regelmotorn förblir avstängd — hur du slår på den, se FAQ → ”Installera ModSecurity”.
Användaren i alla sudoers-rader måste stämma med FPM-poolens användare: på vanlig Apache/Debian är det www-data, i HestiaCP körs webbplatsens pool som webbplatsens ägare (t.ex. admin) — kontrollera grep -E '^user' /etc/php/*/fpm/pool.d/monitor.example.com.conf.
5. Om Nginx står framför Apache (HestiaCP, ISPmanager och andra paneler — där proxar Nginx PHP till Apache och levererar statiskt innehåll själv). Systemkatalogerna skyddas av .htaccess-filer, men Nginx läser dem inte: valfri statisk fil (.json, .txt, .log, .dat) levereras direkt, förbi Apache. Panelens cachar och data läcker ut — till exempel tmp/modsec_cache.json med WAF-händelser och angriparnas IP-adresser. Lägg till en spärr i Nginx webbplatskonfig:
Prefixet ^~ är obligatoriskt: det väljs före den reguljära regeln för statiskt innehåll inuti location /, annars fungerar inte spärren.
I HestiaCP lägger du detta som en separat fil /home/<user>/conf/web/<domain>/nginx.ssl.conf_deny (och nginx.conf_deny för HTTP) — webbplatskonfigen inkluderar nginx.ssl.conf_* och skriver inte över sådana filer vid ombyggnad. Tillämpa: sudo nginx -t && sudo systemctl reload nginx.
Kontroll: curl -s -o /dev/null -w '%{http_code}\n' https://monitor.example.com/tmp/modsec_cache.json — ska vara 403. Om Apache körs utan Nginx (lyssnar på 80/443 själv) behöver du inte lägga till något — .htaccess räcker.
Kontrollera sökvägarna till binärerna med which (till exempel which ufw cscli ausearch ss). Redigera sudoers endast via visudo. Listan över alla MySQL-databaser aktiveras med en separat GRANT (FAQ → ”Endast en databas syns”).
14. Åtkomstbegränsning via IP
Begränsa åtkomsten till monitorn via IP-adress — även om URL:en blir känd öppnas inte inloggningssidan. Detta kan göras på webbserverns nivå (exempel för nginx nedan) eller i själva panelen (”Inställningar” → ”Åtkomstbegränsning via IP”). Om du använder Apache, använd begränsningen i panelen.
Om nginx-webbplatsen redan är konfigurerad enligt steg 10, lägg inte till en andralocation / — skriv in raderna allow/deny i det befintliga blocket. Två identiska location / i samma server { } är ett konfigurationsfel och nginx startar inte om.
# I nginx-konfigurationen (inuti server { }):
# ACME-sökvägen för Let's Encrypt hålls öppen förbi IP-begränsningen —
# så att utfärdande och automatisk förnyelse av SSL (steg 15) inte beror på IP-filtret.
location ^~ /.well-known/acme-challenge/ { allow all; }
location / {
allow 203.0.113.10; # ← skriv in din IP
allow 10.0.0.0/8; # lokalt nätverk (vid behov)
deny all;
try_files $uri $uri/ /index.php?$query_string;
}
# Ladda om nginx:
sudo nginx -t && sudo systemctl reload nginx
15. Utfärda SSL (HTTPS)
Panelen fungerar endast via HTTPS. Inloggningssessionen använder en skyddad cookie, och WebAuthn (2FA) fungerar bara med HTTPS. Via http:// går det inte att logga in.
Certifikatet är kostnadsfritt (Let's Encrypt). Domänens DNS måste redan peka på servern. Kommandot beror på webbservern:
# Apache:
sudo certbot --apache -d monitor.example.com
# nginx — ENDAST om du faktiskt kör nginx. Kör INTE på Apache:
# apt drar in nginx och tar port 80, konflikt med Apache.
# sudo apt install python3-certbot-nginx
# sudo certbot --nginx -d monitor.example.com
# certbot skriver själv in HTTPS i konfigen och ställer in automatisk förnyelse
Vad certbot frågar om: e-post → godkänn Terms (Y) → dela e-post med EFF (valfritt). Sedan utfärdas certifikatet automatiskt, <VirtualHost *:443> skrivs in, omdirigering http→https och automatisk förnyelse ställs in.
DNS måste peka på servern INNAN certbot körs (ägarkontroll via port 80). Kontroll: dig +short monitor.example.com → serverns IP. Portarna 80/443 öppna: sudo ufw allow 80,443/tcp.
Efter utfärdandet: https://monitor.example.com öppnas med hänglås, http:// omdirigerar till https:// (APP_URL i config.php angavs redan i steg 12).
16. Inloggning och grundinställningar
Öppna https://monitor.example.com, logga in med admin / useradmin och gå igenom checklistan:
Byt admin-lösenord — avsnittet ”Användare” i menyn.
Aktivera WebAuthn (2FA) — ”WebAuthn-nycklar” → registrera nyckel/passkey (kräver HTTPS). Registrera två direkt: om du tappar den enda nyckeln blir inloggning med den omöjlig. Läs mer.
Begränsa åtkomst per IP — ”Inställningar” → ”IP-baserad åtkomstbegränsning” (ange din egen IP innan du aktiverar, annars stänger du ute dig själv).
Ange licens — aktivera koden ARCIVEO-… från kundportalen på din domän och klistra in nyckeln i ”Inställningar” → ”Licens”. Läs mer.
Konfigurera aviseringar — Telegram och/eller e-post i ”Inställningar”. Läs mer.
Ta bort installationsprogrammetpublic/start_db.php om det finns kvar (steg 11).
17. Säkerhetsverktyg (valfritt)
Panelen fungerar redan. Verktygen installeras vid behov — installera det du behöver, så visar panelen statusen direkt. Installationskommandon för varje verktyg finns i handboken (separata avsnitt per verktyg):
Detta är en demo av Arcivéo Security Monitor endast för visning – alla ändringar är inaktiverade. Installera den på din egen server för att hantera riktiga säkerhetsdata.