Manuel installation

Fuldstændig manuel installation: fra en netop købt VPS til et fungerende dashboard, trin for trin. Serverforberedelse, oprettelse af websted, database, config.php og SSL beskrives her. Kommandoer til hvert sikkerhedsværktøj og til cron finder du i FAQ-opslagsværket, med links undervejs.

Vigtigste regel: når du ændrer SSH eller firewall, så luk ikke den aktuelle forbindelse, før du har testet den nye i et separat vindue. Mister du alligevel adgangen — næsten alle hostingudbydere giver en nødkonsol (VNC/Recovery) i kontrolpanelet.

01. Købt en VPS med Ubuntu/Debian — sådan kommer du i gang

Efter købet sender hostingudbyderen: IP-adresse, brugernavn (som regel root) og adgangskode (eller SSH-nøgle). Det er nok til at logge ind. Fremgangsmåde (hvert trin er et afsnit nedenfor):

  1. Opret forbindelse til serveren via SSH;
  2. Opdater systemet, angiv værtsnavn og tidszone;
  3. Opret en almindelig bruger med sudo-rettigheder (arbejd ikke som root);
  4. Konfigurer login med SSH-nøgle og deaktiver login med adgangskode;
  5. Aktivér firewall og autobeskyttelse;
  6. (valgfrit) installer kontrolpanelet HestiaCP — webserver, database og mail “ud af boksen”.

02. Første forbindelse via SSH

SSH er en sikker terminal til serveren. Indsæt din egen IP i stedet for 203.0.113.10.

203.0.113.10 er et eksempel, en ikke-eksisterende adresse (reserveret til dokumentation). Indtast den ikke som den er — udskift den med din servers rigtige IP fra hostingudbyderens mail. Ellers oprettes der ingen forbindelse.

Windows 10/11: åbn PowerShell eller "Terminal" og brug den indbyggede ssh (eller klienterne PuTTY / MobaXterm).
macOS / Linux: åbn "Terminal".

# Login som root (adgangskoden kom fra hostingudbyderen): ssh root@203.0.113.10 # Hvis hostingudbyderen gav en nøglefil i stedet for adgangskode: ssh -i sti/til/nøgle root@203.0.113.10
Ved første forbindelse spørger SSH om "authenticity of host" — skriv yes. Adgangskoden vises ikke, mens du skriver (det er normalt). Hvis hostingudbyderen gav en midlertidig adgangskode, så skift den med kommandoen passwd.

03. Systemopdatering og grundlæggende opsætning

Første skridt — opdater alle pakker og angiv værtsnavn og tidszone.

# Opdater systemet: apt update && apt upgrade -y # Grundlæggende værktøjer: apt install -y curl wget ufw fail2ban unattended-upgrades # Tidszone (eksempel) og værtsnavn: timedatectl set-timezone Europe/Copenhagen hostnamectl set-hostname myserver # Automatiske sikkerhedsopdateringer: dpkg-reconfigure -plow unattended-upgrades
Liste over tidszoner — timedatectl list-timezones. Hvis der til sidst i opdateringen dukker et blåt vindue op med “Daemons using outdated libraries” — markér alle tjenester (Mellemrum) og tryk OK, det er sikkert.

04. Oprettelse af en bruger med sudo

Det er usikkert konstant at arbejde som root. Opret en almindelig bruger, og giv vedkommende sudo-rettigheder (kør admin-kommandoer efter behov). Erstat deploy med et vilkårligt navn.

# Opret bruger (sætter adgangskode og spørger om data — kan udelades med Enter): adduser deploy # Tilføj til gruppen sudo: usermod -aG sudo deploy # Kontrollér (som root): su - deploy sudo whoami # skal udskrive: root exit
Log herefter på serveren med denne bruger: ssh deploy@203.0.113.10, og kør admin-kommandoer med præfikset sudo.

05. SSH-nøgler og deaktivering af adgangskodelogin

Login med nøgle er sikrere end adgangskode: en adgangskode kan gættes, en nøgle stort set ikke. Først opretter vi nøglen på din egen computer, kopierer den til serveren, tester login — og først derefter deaktiverer vi adgangskoden.

Trin 1. Opret nøglen på din egen computer (Windows PowerShell / macOS / Linux):

ssh-keygen -t ed25519 -C "my-laptop" # Enter på alle spørgsmål (nøglen lægges i ~/.ssh/id_ed25519)

Trin 2. Kopiér den offentlige nøgle til serveren:

# 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"

Trin 3. Test login med nøgle i et nyt vindue — det bør lukke dig ind uden adgangskode:

ssh deploy@203.0.113.10
Kør ikke Variant B, før login med nøgle er testet og virker (Trin 1–3), og luk ikke din aktive session. Den deaktiverer login med adgangskode for alle brugere, inklusive root. Uden en fungerende nøgle mister du adgangen til serveren helt — du kan kun få den tilbage via hostingudbyderens konsol. Ingen nøgle — brug Variant A.

Trin 4. Stram SSH-adgangen. Indstillingerne lægger vi i en separat fil, uden at røre hovedkonfigurationen. Vælg variant efter situationen:

Variant A — luk kun for root, behold adgangskoden. Ingen nøgle nødvendig, du mister ikke adgangen:

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

Variant B — fuld hardening. Deaktivér login med adgangskode, og lad root kun logge ind med nøgle. Kør det kun, når du er sikker på, at login med nøgle virker:

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 begge varianter er root med adgangskode lukket. PermitRootLogin no forbyder root helt, prohibit-password — tillader kun login med nøgle (til administration logger du ind som deploy og bruger sudo). Vil du ændre SSH-porten — tilføj linjen Port 2222, men først skal du åbne den nye port i firewallen (næste afsnit) og teste login, ellers lukker du dig selv ude.

06. Basal firewall og autobeskyttelse

Luk alt overflødigt med firewallen, og aktivér fail2ban (banner brute force-forsøg på SSH-adgangskoder). Tillad SSH først, ellers mister du adgangen, når UFW aktiveres.

# Tillad SSH (eller din port, hvis du har ændret den) og web: sudo ufw allow OpenSSH sudo ufw allow 80,443/tcp # Aktivér firewallen: sudo ufw enable sudo ufw status verbose # fail2ban — beskytter SSH mod brute force (basisprofil er aktiv med det samme): sudo systemctl enable --now fail2ban sudo fail2ban-client status sshd
Dette er minimum. Praktiske fail2ban-indstillinger, ipsum-blokliste, udvidet UFW og de øvrige værktøjer finder du i gruppen “Sikkerhedsværktøjer” i håndbogen. Selve Arcivéo Monitor-panelet viser overskueligt status for det hele.

07. Installation af HestiaCP-panelet (valgfrit)

HestiaCP — et gratis kontrolpanel til hosting: det installerer og konfigurerer webserver (nginx + apache), PHP, database (MariaDB), mail, DNS og SSL-certifikater og giver en webgrænseflade til websites. Praktisk, hvis du ikke vil sætte alt op manuelt og planlægger at hoste websites (herunder selve Arcivéo Monitor-panelet).

Installér HestiaCP på en ren server (frisk understøttet Ubuntu/Debian, mindst ~1–2 GB RAM), inden andre webservere og databaser installeres — ellers opstår der konflikter. Installationen tager 10–20 minutter og genstarter serveren.
# Hent installationsprogrammet og kør det: wget https://raw.githubusercontent.com/hestiacp/hestiacp/release/install/hst-install.sh sudo bash hst-install.sh

Installationsprogrammet spørger om email og værtsnavn og installerer derefter hele stakken. Efter genstart er panelet tilgængeligt på https://YOUR_IP:8083 (login og adgangskode viser installationsprogrammet til sidst).

HestiaCP styrer selv UFW og fail2ban — du behøver ikke konfigurere dem særskilt, den tager sig af det. SSH-nøgler og deaktivering af adgangskode (forrige afsnit) skal du dog stadig gøre.

08. Systemkrav og ionCube

Dashboardet er en PHP-applikation på en typisk LAMP/LEMP-stak:

  • OS: Linux (Ubuntu/Debian anbefales);
  • Webserver: nginx eller Apache med PHP-FPM;
  • PHP 8.0+ med udvidelserne: pdo_mysql, openssl, curl, json, mbstring;
  • ionCube Loader — en PHP-udvidelse, som dashboardet kræver;
  • Database: MySQL 5.7+ eller MariaDB 10.3+;
  • HTTPS — påkrævet (login og WebAuthn virker kun over https);
  • sudo for webserverens bruger (et snævert sæt — trin 13).
# Tjek PHP-version og udvidelser: php -v php -m | grep -iE 'pdo_mysql|openssl|curl|mbstring|ioncube'

Installation af ionCube Loader (hvis den ikke allerede er installeret). På hosting med et kontrolpanel (HestiaCP, cPanel) aktiveres ionCube med et flueben i PHP-indstillingerne. Manuelt på Ubuntu/Debian:

# Find PHP-version og udvidelseskatalog: php -v EXTDIR=$(php -r 'echo ini_get("extension_dir");'); PHPVER=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;') # Hent og udpak loaderne (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 # Kopiér loaderen til din PHP-version ind i udvidelseskataloget: sudo cp ioncube/ioncube_loader_lin_${PHPVER}.so "$EXTDIR"/ # Aktivér (CLI + PHP-FPM) og genstart: 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 # Kontrol — i outputtet vises linjen "with the ionCube PHP Loader": php -v
Loaderens version skal matche PHP-versionen (f.eks. ioncube_loader_lin_8.1.so til PHP 8.1). Bruger du flere PHP-versioner — så aktivér en loader for hver.

09. Domæne og DNS

For at åbne dashboardet på en adresse som monitor.example.com og få gratis SSL kræves et domæne, der peger på din server. Opret en A-post i DNS-kontrolpanelet:

Type: A Navn: monitor (underdomæne → monitor.example.com) eller @ (roddomæne → example.com) Værdi: 203.0.113.10 ← IP for din server TTL: 3600

Kontrollér efter et par minutter, at domænet peger på serveren:

dig +short monitor.example.com # skal returnere din IP # eller, hvis dig ikke findes: getent hosts monitor.example.com
Let's Encrypt-certifikatet udstedes kun til et domæne — DNS skal pege på serveren før certifikatet udstedes.

10. Opret websted og upload panelfilerne

Apache: DocumentRoot skal pege på panelets rod, IKKE på public/. Typografi (CSS/JS), sw.js og manifest.json ligger i assets/ ved siden af public/ og hentes fra webstedets rod. Roden .htaccess er frontcontrolleren. Hvis du under Apache sætter DocumentRoot til public/, åbner panelet uden typografi. For ren nginx er det omvendt: public/ bruges som rod, og assets/ serveres med en separat regel (se nginx-blokken nedenfor).
Panelfilerne (distributionsarkivet) hentes efter købet på din konto my.arciveo.com“Downloads”. Pak arkivet ud før upload.

1) Opret panelkataloget og upload distributionens indhold til det (så public/, assets/, config.php osv. havner indeni):

sudo mkdir -p /var/www/monitor # upload derefter distributionsfilerne til /var/www/monitor (FileZilla / WinSCP / scp)

2) Konfigurer webserveren. Apache: DocumentRoot skal pege på panelets rod (IKKE på /public); AllowOverride All er påkrævet. Stien til PHP-FPM-socket'en registreres automatisk. Blokken indsættes i terminalen som helhed:

PHPSOCK=$(ls -1 /run/php/php*-fpm.sock 2>/dev/null | head -1) # auto-registrering af 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, så vi bruger public/ som rod, og assets/, sw.js, manifest.json (et niveau højere) serveres med en separat regel:

PHPSOCK=$(ls -1 /run/php/php*-fpm.sock 2>/dev/null | head -1) # auto-registrering af 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 og manifest ligger et niveau over 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

Upload af filer — SFTP/SCP (FileZilla, WinSCP) eller scp:

# Eksempel via scp fra den lokale computer: scp -r ./monitor/* deploy@203.0.113.10:/var/www/monitor/
Sæt filrettighederne — dette er et obligatorisk trin. Hvis du uploadede som root eller via SFTP, ejes filerne af root, og webserveren (www-data) kan ikke læse dem — panelet åbner tomt eller med en 403-fejl (i loggen: .htaccess unreadable / directory not executable). Kommandoen nedenfor retter dette:
# Vi normaliserer rettighederne for hele webroden: et katalog oprettet af root er utilgængeligt # for webserveren (www-data) — uden dette viser panelet en tom side eller 403. # Apache kører som www-data; hvis du har en anden webbruger — så udskift den. cd /var/www/monitor # Vi opretter arbejdsmapperne FØR chown — ellers forbliver de nye kataloger root:root # og ved chmod 750 kan webserveren (www-data) ikke skrive 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) Åbn upload via SFTP for dig selv. Efter kommandoen ovenfor tilhører alle filer www-data, mens FileZilla / WinSCP forbinder som din egen bruger — uploaden fejler så med SSH_FX_PERMISSION_DENIED (Permission denied). At logge ind som root for at uploade er ikke en mulighed — root-login blev slået fra i trin 05. Vælg en af de to muligheder.

Mulighed A — en ACL kun til din bruger (anbefales). Kun du får skriverettigheder; webserveren kan fortsat ikke overskrive panelets kode:

sudo apt install -y acl # Skriverettighed til din bruger på hele panelmappen: sudo setfacl -R -m u:deploy:rwX /var/www/monitor # Samme regel som standard — for filer og mapper, der oprettes senere: sudo setfacl -R -d -m u:deploy:rwX /var/www/monitor

Mulighed B — via gruppen www-data. Enklere, men webserveren får også skriverettighed til panelets filer: ved en sårbarhed i PHP ville koden kunne udskiftes. Rækkefølgen af kommandoerne betyder noget — config.php og arbejdsmapperne lukkes til sidst:

sudo usermod -aG www-data deploy # Skriverettighed til gruppen + setgid (bit 2): filer uploadet via SFTP # forbliver i gruppen www-data — ellers kan panelet ikke overskrive 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 mulighed B — forbind igen i FileZilla (Server → Afbryd forbindelsen, log derefter ind igen): den nye gruppe træder først i kraft ved et nyt login, indtil da har du stadig ingen rettigheder. Kontrol: id deploy — på gruppelisten skal www-data dukke op; ls -ld /var/www/monitor — rettigheder drwxrwsr-x, bogstavet s i stedet for x betyder, at setgid er sat.

11. Database

Opret en database og en bruger, og importér derefter skemaet. Blokken indsættes i terminalen i sin helhed. monitor_db og monitor_user er eksempelnavne, du kan vælge dine egne; husk navnet på databasen, brugeren og adgangskoden — dem skal du skrive i config.php i næste trin:

# 1. Database. Adgangskoden angives ÉN gang i DBPASS og indsættes i alle linjer. # Blokken indsættes i terminalen I SIN HELHED; sudo mysql logger root ind via unix-socket # (root-adgangskode er ikke nødvendig). Brug IKKE interaktiv `sudo mysql -u root -p` # med kopiér-indsæt — ved indsætning ryger SQL-linjerne ind i adgangskodeprompten og forsvinder. DBPASS='CHOOSE_A_PASSWORD' # ← ret kun denne linje 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 # Kontrol (skal vise monitor_db): mysql -u monitor_user -p"$DBPASS" -e "SHOW DATABASES;" # Skriv den samme adgangskode i config.php → DB_PASS.
Skemaet behøver ikke importeres — panelet opretter selv tabellerne og admin-kontoen ved første besøg i browseren (fra database/db.sql), hvis databasen er tom. Manuel import af skemaet er kun nødvendig, hvis auto-initialiseringen ikke virkede.
Hvis du brugte browser-installationsprogrammet public/start_db.phpslet det straks efter installationen: det gør det muligt at genskabe databasen uden godkendelse. Så længe filen ligger i panelets rod eller i public/, viser panelet en rød advarsel.

12. Konfiguration af config.php

config.php i roden af dashboardet (/var/www/monitor/config.php) er den eneste fil, du skal redigere manuelt. Alle dashboard-indstillinger er defineret i den med define()-konstanter. Åbn den i en editor:

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

Indsæt dine egne værdier på de fremhævede steder; lad resten være som det er:

// --- Database (fra trin 11) --- define('DB_HOST', 'localhost'); // bevar define('DB_NAME', 'db_name'); // det du oprettede i trin 11 define('DB_USER', 'user'); // det du oprettede i trin 11 define('DB_PASS', 'db_password'); // det du angav i trin 11 define('DB_CHARSET', 'utf8mb4'); // bevar // --- Applikation --- define('APP_URL', 'https://monitor.example.com'); // dashboardets adresse, uden skråstreg til sidst define('TIMEZONE', 'Europe/Copenhagen'); // din tidszone // --- Sessionsvarighed --- define('SESSION_LIFETIME', 28800); // inaktivitet indtil ny login, sek. (28800 = 8 t)

Hvad skal ændres:

  • DB_NAME, DB_USER, DB_PASS — præcis det samme databasenavn, den bruger og adgangskode, som du angav ved oprettelsen af databasen i trin 11 (hvis du beholdt eksemplerne — monitor_db / monitor_user). Rør ikke DB_HOST og DB_CHARSET.
  • APP_URL — dashboardets fulde adresse med https://, uden skråstreg til sidst og uden www. Den skal svare til det domæne, du aktiverer licensen på (trin 16), ellers afvises nøglen.
  • TIMEZONE — din tidszone (liste — timedatectl list-timezones). Påvirker kun, hvordan dashboardet viser datoer; det påvirker ikke starttidspunktet for cron-job (der gælder systemets tidszone).
  • SESSION_LIFETIME — efter hvor mange sekunders inaktivitet dashboardet beder om ny login (standard 8 timer). F.eks. 3600 = 1 time, 86400 = et døgn.
  • Blokken til fejllogning (display_errors, log_errors, error_log) — lad den være som standard.

Gem filen (Ctrl+O, Enter, derefter Ctrl+X) og genstart PHP-FPM — ellers træder ændringerne ikke i kraft på grund af OPcache:

sudo systemctl restart php*-fpm
config.php er en hemmelig fil (den indeholder databaseadgangskoden). Den ligger i roden af dashboardet, som også er webroden, men den er beskyttet: rettigheder 640 (sat i trin 10) og et eksplicit forbud i den øverste .htaccess. Læg den ikke i offentlige repositories, og send den ikke til supporten med den rigtige adgangskode.
Detaljeret gennemgang af alle parametre — i FAQ: “Filen config.php — alle dashboard-indstillinger”.

13. Konfiguration af sudo til webserveren

PHP kører som webserverens bruger, der ikke har rettigheder til systemkommandoer. Adgang tildeles snævert: målrettet sudo til bestemte værktøjer og logadgang via grupper (uden sudo). Et kompromitteret weblag giver ikke root.

I eksemplerne er www-data standardbrugeren for Apache. Har du en anden (i nogle paneler kører PHP under en separat bruger) — udskift den overalt. Find den med: ps -o user= -C php-fpm | sort -u.

1. Opret /etc/sudoers.d/monitor via sudo visudo -f /etc/sudoers.d/monitor og indsæt (fjern linjerne for moduler, du ikke bruger):

# UFW — status og regler (siden “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 — status, ban og unban (banned returnerer bans fra alle jails med én kommando; # ban/unban kræves af panelets knapper) 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 * # Sikkerhedsopdateringer (kortet “Opdateringer”). Kun læsning, men netop som root: # apt-cachen (~70 MB) er kun tilgængelig for root, en ikke-root genopbygger den ved hvert kald # (4,2 s CPU mod 0,01 s). Uden wildcard — præcis denne ene kommando, den installerer intet. www-data ALL=(ALL) NOPASSWD: /usr/bin/apt list --upgradable # IPset (angrebskort, 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øgning i hændelser + læsning af logens seneste linjer (præcis sti) 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 # Åbne porte (kerne-/SSH-/Falco-logs læses UDEN sudo — via gruppen # systemd-journal, se pkt. 2; sudo til journalctl skal IKKE gives og er usikkert) www-data ALL=(ALL) NOPASSWD: /usr/bin/ss -tuln, /usr/sbin/ss -tuln, /bin/ss -tuln # PostgreSQL (kun hvis du bruger det) — fast read-only-script, # opret det efter FAQ “PostgreSQL vises ikke”; uden det slet linjen www-data ALL=(ALL) NOPASSWD: /usr/local/bin/monitor-pgstat
sudo chmod 440 /etc/sudoers.d/monitor sudo visudo -c # bør give "parsed OK"

2. Adgang til logs og systemd-journalen. Modulerne læser /var/log/fail2ban.log, auth.log, ufw.log, apache2/*, aide direkte (på Debian/Ubuntu ligger disse logs i gruppen adm). Kerne-, SSH- og Falco-hændelser hentes fra journald med kommandoen journalctl uden sudo, via gruppen systemd-journal. Tilføj webbrugeren til begge grupper og genstart PHP-FPM:

sudo usermod -aG adm,systemd-journal www-data sudo systemctl restart php*-fpm # obligatorisk, ellers træder grupperne ikke i kraft

3. Hvis ClamAV eller Suricata skriver logs uden for gruppen adm (kan være root:root) — giv adgang via 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. ModSecurity-wrapper. WAF-auditloggen (/var/log/apache2/modsec_audit.log) ejes af root med rettigheder 640, og webbrugeren kan ikke læse den direkte. ModSecurity-siden henter motorens tilstand, hændelser og listen over aktive regler via et fast read-only-script — det er netop tilladt i sudoers på linjen ovenfor:

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
Uden filen /etc/modsecurity/modsecurity.conf virker selve WAF'en ikke: pakken lægger kun modsecurity.conf-recommended, og regelmotoren forbliver slået fra — se hvordan du aktiverer den i FAQ → “Installation af ModSecurity”.
Brugeren i alle sudoers-linjer skal svare til FPM-poolens bruger: på almindelig Apache/Debian er det www-data, i HestiaCP kører sitets pool som sitets ejer (f.eks. admin) — tjek grep -E '^user' /etc/php/*/fpm/pool.d/monitor.example.com.conf.

5. Hvis der står en Nginx foran Apache (HestiaCP, ISPmanager og andre paneler — her proxier Nginx PHP til Apache og serverer selv statisk indhold). Systemkatalogerne er lukket med .htaccess-filer, men Nginx læser dem ikke: enhver statisk fil (.json, .txt, .log, .dat) serverer den direkte uden om Apache. Panelets caches og data lækker udad — f.eks. tmp/modsec_cache.json med WAF-hændelser og angribernes IP. Tilføj et forbud i Nginx-sitekonfigurationen:

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; }
Præfikset ^~ er obligatorisk: det vælges før den regulære regel for statisk indhold inde i location /, ellers træder forbuddet ikke i kraft.
I HestiaCP skal du lægge dette i en separat fil /home/<user>/conf/web/<domain>/nginx.ssl.conf_deny (og nginx.conf_deny for HTTP) — sitekonfigurationen inkluderer nginx.ssl.conf_* og overskriver ikke disse filer ved genopbygning. Anvend med: sudo nginx -t && sudo systemctl reload nginx.
Kontrol: curl -s -o /dev/null -w '%{http_code}\n' https://monitor.example.com/tmp/modsec_cache.json — skal give 403. Hvis Apache kører uden Nginx (lytter selv på 80/443), behøver du ikke tilføje noget — .htaccess er nok.
Tjek stierne til binærfilerne med which (f.eks. which ufw cscli ausearch ss). Rediger kun sudoers via visudo. Listen over alle MySQL-databaser aktiveres med en separat GRANT (FAQ → “Kun én database vises”).

14. Adgangsbegrænsning efter IP

Begræns adgangen til monitoren efter IP-adresse — selv hvis URL'en bliver kendt, åbnes login-siden ikke. Det kan gøres på webserver-niveau (eksempel for nginx nedenfor) eller i selve panelet (“Indstillinger” → “Adgangsbegrænsning efter IP”). Har du Apache, så brug begrænsningen i panelet.

Hvis nginx-sitet allerede er sat op efter trin 10, tilføj da ikke en ny location / — skriv linjerne allow/deny ind i den eksisterende blok. To ens location / i samme server { } er en konfigurationsfejl, og nginx genstarter ikke.
# I nginx-konfigurationen (inde i server { }): # ACME-stien fra Let's Encrypt holder vi åben uden om IP-begrænsningen — # så udstedelse og automatisk fornyelse af SSL (trin 15) ikke afhænger af IP-filteret. location ^~ /.well-known/acme-challenge/ { allow all; } location / { allow 203.0.113.10; # ← skriv din egen IP allow 10.0.0.0/8; # lokalt netværk (hvis nødvendigt) deny all; try_files $uri $uri/ /index.php?$query_string; } # Genindlæs nginx: sudo nginx -t && sudo systemctl reload nginx

15. Udsted SSL (HTTPS)

Dashboardet fungerer kun over HTTPS. Login-sessionen bruger en sikker cookie, og WebAuthn (2FA) virker kun over HTTPS. Du kan ikke logge ind via http://.

Certifikatet er gratis (Let's Encrypt). Domænets DNS skal allerede pege på serveren. Kommandoen afhænger af webserveren:

# Apache: sudo certbot --apache -d monitor.example.com # nginx — KUN hvis du faktisk bruger nginx. Kør IKKE på Apache: # apt trækker nginx med og optager port 80, konflikt med Apache. # sudo apt install python3-certbot-nginx # sudo certbot --nginx -d monitor.example.com # certbot skriver selv HTTPS ind i konfigurationen og opsætter automatisk fornyelse
Hvad certbot spørger om: e-mail → accept af Terms (Y) → deling af e-mail med EFF (op til dig). Derefter udsteder den selv certifikatet, skriver <VirtualHost *:443>, opsætter omdirigering http→https og automatisk fornyelse.
DNS skal pege på serveren FØR certbot startes (ejerskabskontrol via port 80). Tjek: dig +short monitor.example.com → serverens IP. Portene 80/443 er åbne: sudo ufw allow 80,443/tcp.

Efter udstedelsen: https://monitor.example.com åbner med en hængelås, http:// omdirigerer til https:// (APP_URL i config.php blev allerede sat i trin 12).

16. Log ind og førstegangsopsætning

Åbn https://monitor.example.com, log ind med admin / useradmin og følg tjeklisten:

  1. Skift admin-adgangskode — sektionen “Brugere” i menuen.
  2. Aktivér WebAuthn (2FA) — “WebAuthn-nøgler” → registrér nøgle/passkey (kræver HTTPS). Registrér to med det samme: mister du din eneste nøgle, kan du ikke logge ind med den. Læs mere.
  3. Begræns adgang efter IP — “Indstillinger” → “Adgangsbegrænsning efter IP” (angiv din egen IP-adresse før du aktiverer, ellers lukker du dig selv ude).
  4. Indtast licens — aktivér koden ARCIVEO-… fra din konto på dit domæne og indsæt nøglen i “Indstillinger” → “Licens”. Læs mere.
  5. Opsæt notifikationer — Telegram og/eller Email under “Indstillinger”. Læs mere.
  6. Slet installationsprogrammet public/start_db.php, hvis det stadig findes (trin 11).

17. Sikkerhedsværktøjer (valgfrit)

Dashboardet kører allerede. Værktøjer installeres efter behov — du installerer det, du har brug for, og dashboardet viser straks status. Installationskommandoerne for hvert enkelt findes i vejledningen (separate afsnit for hvert værktøj):

18. Cron og vedligeholdelse

Konfigureres én gang, også valgfrit, men anbefales. Detaljerede kommandoer finder du i vejledningen:

  1. Cron-job (rapporter, opdatering af lister, tjek);
  2. Sikkerhedskopiering;
  3. Opdatering og flytning af panelet;
  4. Gendannelse af adgang — hvis nøglen/adgangskoden mistes.
Er der noget, der ikke virker eller viser “ingen data”? Kig i gruppen “Diagnostik” i vejledningen.
Arcivéo - Security Monitor © 2026