Helt manuell installasjon: fra en nettopp kjøpt VPS til et fungerende dashbord, steg for steg.
Klargjøring av serveren, oppretting av nettsted, database, config.php og SSL er beskrevet her.
Kommandoer for hvert sikkerhetsverktøy og for cron finner du i
FAQ-referansen, med lenker underveis.
Hovedregel: når du endrer SSH eller brannmuren, ikke lukk den gjeldende tilkoblingen før du har testet den nye i et separat vindu. Skulle du likevel miste tilgangen — nesten alle vertsleverandører tilbyr en nødkonsoll (VNC/Recovery) i kontrollpanelet.
01. Kjøpte VPS med Ubuntu/Debian — hvor begynner du
Etter kjøpet sender vertsleverandøren: IP-adresse, brukernavn (vanligvis root) og passord (eller SSH-nøkkel). Dette er nok for å logge inn. Fremgangsmåte (hvert trinn er en seksjon nedenfor):
Koble til serveren via SSH;
Oppdater systemet, angi vertsnavn og tidssone;
Opprett en vanlig bruker med sudo-rettigheter (ikke jobb som root);
Sett opp innlogging med SSH-nøkkel og deaktiver innlogging med passord;
Aktiver brannmur og autobeskyttelse;
(valgfritt) installer kontrollpanelet HestiaCP — webserver, database og e-post rett ut av boksen.
02. Første tilkobling via SSH
SSH er en sikker terminal til serveren. Sett inn din egen IP i stedet for 203.0.113.10.
203.0.113.10 er et eksempel, en adresse som ikke finnes (reservert for dokumentasjon). Ikke skriv den inn som den er – erstatt den med den faktiske IP-adressen til serveren din fra e-posten fra hostingleverandøren. Ellers blir det ingen tilkobling.
Windows 10/11: åpne PowerShell eller «Terminal» og bruk den innebygde ssh (eller klientene PuTTY / MobaXterm). macOS / Linux: åpne «Terminal».
# Innlogging som root (passordet kom fra hostingleverandøren):
ssh root@203.0.113.10
# Hvis hostingleverandøren ga en nøkkelfil i stedet for passord:
ssh -i sti/til/nøkkel root@203.0.113.10
Ved første tilkobling spør SSH om «authenticity of host» – skriv yes. Passordet vises ikke mens du skriver (det er normalt). Hvis hostingleverandøren ga et midlertidig passord, kan du endre det med kommandoen passwd.
03. Systemoppdatering og grunnkonfigurasjon
Det første du gjør er å oppdatere alle pakker og angi vertsnavn og tidssone.
Liste over tidssoner — timedatectl list-timezones. Hvis det på slutten av oppdateringen dukker opp et blått vindu «Daemons using outdated libraries» — merk alle tjenestene (mellomrom) og trykk OK, det er trygt.
04. Opprette en bruker med sudo
Det er utrygt å jobbe permanent som root. Opprett en vanlig bruker og gi vedkommende sudo-rettigheter (kjøre kommandoer som administrator ved behov). Bytt ut deploy med et hvilket som helst navn.
# Opprett bruker (angir passord og spør om data — du kan trykke Enter):
adduser deploy
# Legg til i sudo-gruppen:
usermod -aG sudo deploy
# Kontroller (som root):
su - deploy
sudo whoami # skal skrive ut: root
exit
Logg deretter inn på serveren som denne brukeren: ssh deploy@203.0.113.10, og kjør administratorkommandoer med prefikset sudo.
05. SSH-nøkler og deaktivering av passordinnlogging
Innlogging med nøkkel er sikrere enn passord: et passord kan gjettes, en nøkkel praktisk talt ikke. Først lager vi nøkkelen på egen datamaskin, kopierer den til serveren, tester innloggingen – og først da deaktiverer vi passordet.
Trinn 1. Lag en nøkkel på egen datamaskin (Windows PowerShell / macOS / Linux):
ssh-keygen -t ed25519 -C "my-laptop"
# Enter på alle spørsmål (nøkkelen havner i ~/.ssh/id_ed25519)
Trinn 2. Kopier den offentlige nøkkelen til serveren:
Trinn 3. Test innlogging med nøkkel i et nytt vindu – det skal slippe deg inn uten passord:
ssh deploy@203.0.113.10
Ikke kjør Variant B før innlogging med nøkkel er testet og fungerer (Trinn 1–3), og ikke lukk den aktive økten. Den deaktiverer innlogging med passord for alle brukere, inkludert root. Uten en fungerende nøkkel mister du tilgangen til serveren fullstendig — du kan bare få den tilbake via vertsleverandørens konsoll. Ingen nøkkel – bruk Variant A.
Trinn 4. Stram inn SSH-tilgangen. Innstillingene legger vi i en egen fil, uten å røre hovedkonfigurasjonen. Velg variant etter situasjonen:
Variant A – steng bare for root, behold passordet. Ingen nøkkel nødvendig, du mister ikke tilgangen:
Variant B – full hardening. Deaktiver innlogging med passord og la root kun logge inn med nøkkel. Kjør det bare når du er sikker på at innlogging med nøkkel fungerer:
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 variantene er root med passord stengt. PermitRootLogin no blokkerer root helt, prohibit-password – tillater innlogging kun med nøkkel (for administrasjon logger du inn som deploy og bruker sudo). Vil du bytte SSH-port – legg til linjen Port 2222, men åpne den nye porten i brannmuren først (neste avsnitt) og test innloggingen, ellers stenger du deg selv ute.
06. Grunnleggende brannmur og automatisk beskyttelse
Steng alt unødvendig med brannmuren og aktiver fail2ban (banner brute force-forsøk på SSH-passord). Først må du tillate SSH, ellers mister du tilgangen etter at UFW er slått på.
# Tillat SSH (eller din port hvis du endret den) og web:
sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
# Slå på brannmuren:
sudo ufw enable
sudo ufw status verbose
# fail2ban — beskytter SSH mot brute force (grunnprofilen er aktiv med en gang):
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
Dette er minimumet. Fungerende fail2ban-innstillinger, ipsum-blokkliste, utvidet UFW og de øvrige verktøyene finner du i gruppen «Sikkerhetsverktøy» i håndboken. Selve Arcivéo Monitor-panelet viser statusen på alt dette oversiktlig.
07. Installasjon av HestiaCP-panelet (valgfritt)
HestiaCP — et gratis kontrollpanel for hosting: installerer og konfigurerer webserver (nginx + apache), PHP, database (MariaDB), e-post, DNS og SSL-sertifikater, og gir et webgrensesnitt for nettsteder. Praktisk hvis du ikke vil sette opp alt manuelt og planlegger å hoste nettsteder (inkludert selve Arcivéo Monitor-panelet).
Installer HestiaCP på en ren server (fersk støttet Ubuntu/Debian, minimum ~1–2 GB RAM), før du installerer andre webservere og databaser — ellers oppstår det konflikter. Installasjonen tar 10–20 minutter og starter serveren på nytt.
# Last ned installasjonsprogrammet og kjør det:
wget https://raw.githubusercontent.com/hestiacp/hestiacp/release/install/hst-install.sh
sudo bash hst-install.sh
Installasjonsprogrammet spør etter e-post og vertsnavn, og installerer deretter hele stakken. Etter omstart er panelet tilgjengelig på https://YOUR_IP:8083 (brukernavn og passord vises av installasjonsprogrammet til slutt).
HestiaCP styrer selv UFW og fail2ban — du trenger ikke sette dem opp separat, det ordnes automatisk. SSH-nøkler og deaktivering av passord (forrige del) bør du likevel gjøre.
08. Systemkrav og ionCube
Dashbordet er en PHP-applikasjon på en typisk LAMP/LEMP-stack:
OS: Linux (Ubuntu/Debian anbefales);
Webserver: nginx eller Apache med PHP-FPM;
PHP 8.0+ med utvidelsene: pdo_mysql, openssl, curl, json, mbstring;
ionCube Loader — en PHP-utvidelse som kreves for at dashbordet skal fungere;
Database: MySQL 5.7+ eller MariaDB 10.3+;
HTTPS — obligatorisk (innlogging og WebAuthn fungerer bare over https);
sudo for webserverbrukeren (et begrenset sett — trinn 13).
Installere ionCube Loader (hvis den ikke allerede er på plass). På hosting med kontrollpanel (HestiaCP, cPanel) aktiveres ionCube med en avkrysning i PHP-innstillingene. Manuelt på Ubuntu/Debian:
# Finn PHP-versjon og utvidelseskatalog:
php -v
EXTDIR=$(php -r 'echo ini_get("extension_dir");'); PHPVER=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')
# Last ned og pakk ut 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
# Kopier loaderen for din PHP-versjon til utvidelseskatalogen:
sudo cp ioncube/ioncube_loader_lin_${PHPVER}.so "$EXTDIR"/
# Aktiver (CLI + PHP-FPM) og start på nytt:
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
# Sjekk — i utdataen vises linjen "with the ionCube PHP Loader":
php -v
Loader-versjonen må stemme med PHP-versjonen (for eksempel ioncube_loader_lin_8.1.so for PHP 8.1). Bruker du flere PHP-versjoner — aktiver loaderen for hver av dem.
09. Domene og DNS
For å åpne dashbordet på en adresse som monitor.example.com og få gratis SSL trenger du et domene som peker til serveren din. Opprett en A-post i DNS-kontrollpanelet:
Type: A
Navn: monitor (underdomene → monitor.example.com)
eller @ (domenerot → example.com)
Verdi: 203.0.113.10 ← IP-en til serveren din
TTL: 3600
Sjekk etter noen minutter at domenet peker til serveren:
dig +short monitor.example.com # skal returnere IP-en din
# eller, hvis dig mangler:
getent hosts monitor.example.com
Et SSL-sertifikat fra Let's Encrypt utstedes bare til et domene — DNS må peke til serveren før sertifikatet utstedes.
10. Opprett nettsted og last opp panelfilene
Apache: DocumentRoot — til panelets rot, IKKE til public/. Stilark (CSS/JS), sw.js og manifest.json ligger i assets/ ved siden av public/ og hentes fra nettstedets rot. Rot-.htaccess er frontkontrolleren. Hvis du under Apache setter DocumentRoot til public/, åpnes panelet uten stiler. For ren nginx er det motsatt: public/ brukes som rot, og assets/ serveres av en egen regel (se nginx-blokken nedenfor).
Panelfilene (distribusjonsarkivet) lastes ned etter kjøp i kontoen my.arciveo.com → «Nedlastinger». Pakk ut arkivet før opplasting.
1) Opprett panelkatalogen og last innholdet i distribusjonen opp i den (slik at public/, assets/, config.php osv. havner inni):
sudo mkdir -p /var/www/monitor
# last deretter distribusjonsfilene opp til /var/www/monitor (FileZilla / WinSCP / scp)
2) Konfigurer webserveren.Apache: DocumentRoot — til panelets rot (IKKE til /public); AllowOverride All er påkrevd. Banen til PHP-FPM-socketen finnes automatisk. Blokken limes inn i terminalen i sin helhet:
PHPSOCK=$(ls -1 /run/php/php*-fpm.sock 2>/dev/null | head -1) # auto-oppdaging 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, derfor bruker vi public/ som rot, og assets/, sw.js, manifest.json (ett nivå over) serverer vi med en egen regel:
PHPSOCK=$(ls -1 /run/php/php*-fpm.sock 2>/dev/null | head -1) # auto-oppdaging 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 og manifest ligger ett nivå 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
Opplasting av filer — SFTP/SCP (FileZilla, WinSCP) eller scp:
# Eksempel via scp fra en lokal datamaskin:
scp -r ./monitor/* deploy@203.0.113.10:/var/www/monitor/
Sett rettigheter på filene — dette er et obligatorisk trinn. Hvis du lastet opp som root eller via SFTP, eies filene av root, og webserveren (www-data) klarer ikke å lese dem — panelet åpnes tomt eller med feil 403 (i loggen: .htaccess unreadable / directory not executable). Kommandoen nedenfor retter dette:
# Normaliser rettighetene for hele webroten: en katalog opprettet av root er utilgjengelig
# for webserveren (www-data) — uten dette gir panelet en tom side eller 403.
# Apache kjører som www-data; hvis du har en annen webbruker — bytt ut.
cd /var/www/monitor
# Opprett arbeidsmappene FØR chown — ellers blir nye kataloger stående som root:root
# og med chmod 750 kan ikke webserveren (www-data) 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) Åpne opplasting via SFTP for deg selv. Etter kommandoen over eies alle filene av www-data, mens FileZilla / WinSCP kobler til som din egen bruker – opplastingen feiler da med SSH_FX_PERMISSION_DENIED (Permission denied). Å logge inn som root for å laste opp er ikke et alternativ – root-innlogging ble slått av i trinn 05. Velg ett av de to alternativene.
Alternativ A – en ACL kun for din bruker (anbefalt). Bare du får skriverettigheter; nettserveren kan fortsatt ikke overskrive panelets kode:
sudo apt install -y acl
# Skriverettighet for din bruker til hele panelkatalogen:
sudo setfacl -R -m u:deploy:rwX /var/www/monitor
# Samme regel som standard – for filer og mapper som opprettes senere:
sudo setfacl -R -d -m u:deploy:rwX /var/www/monitor
Alternativ B – via gruppen www-data. Enklere, men nettserveren får også skriverettighet til panelets filer: ved en sårbarhet i PHP kan koden byttes ut. Rekkefølgen på kommandoene betyr noe – config.php og arbeidsmappene lukkes til slutt:
sudo usermod -aG www-data deploy
# Skriverett for gruppen + setgid (bit 2): filer som lastes opp via SFTP
# blir værende i gruppen www-data – ellers kan ikke panelet 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
Etter alternativ B – koble til på nytt i FileZilla (Server → Koble fra, logg deretter inn igjen): den nye gruppen trer i kraft først ved en ny innlogging, før det har du fortsatt ingen rettigheter. Kontroll: id deploy – i gruppelisten skal www-data dukke opp; ls -ld /var/www/monitor – rettigheter drwxrwsr-x, bokstaven s i stedet for x betyr at setgid er satt.
11. Database
Opprett databasen og brukeren, og importer deretter skjemaet. Blokken limes inn i terminalen i sin helhet. monitor_db og monitor_user er eksempelnavn – du kan velge hvilke du vil. Husk databasenavnet, brukeren og passordet – du skal skrive dem inn i config.php i neste trinn:
# 1. Database. Passordet settes ÉN gang i DBPASS og settes inn i alle linjer.
# Blokken limes inn i terminalen I SIN HELHET; sudo mysql logger inn root via unix-socket
# (root-passord trengs ikke). IKKE bruk interaktiv `sudo mysql -u root -p`
# med kopier-lim inn – ved innliming havner SQL-linjene i passordforespørselen og forsvinner.
DBPASS='CHOOSE_A_PASSWORD' # ← endre kun denne linjen
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 (skal vise monitor_db):
mysql -u monitor_user -p"$DBPASS" -e "SHOW DATABASES;"
# Skriv det samme passordet inn i config.php → DB_PASS.
Skjemaet trenger ikke importeres – panelet oppretter selv tabellene og admin-kontoen ved første besøk i nettleseren (fra database/db.sql) hvis databasen er tom. Manuell import av skjemaet trengs bare hvis auto-initialiseringen ikke fungerte.
Hvis du brukte nettleserinstallereren public/start_db.php – slett den umiddelbart etter installasjonen: den gjør det mulig å gjenopprette databasen uten pålogging. Så lenge filen ligger i rotmappen til panelet eller i public/, viser panelet en rød advarsel.
12. Konfigurere config.php
config.php i roten av panelet (/var/www/monitor/config.php) er den eneste filen du må redigere manuelt. Alle panelinnstillingene er angitt i den som define()-konstanter. Åpne den i en editor:
sudo nano /var/www/monitor/config.php
Sett inn dine egne verdier på de uthevede stedene; la resten stå som det er:
// --- Database (fra trinn 11) ---
define('DB_HOST', 'localhost'); // la stå
define('DB_NAME', 'db_name'); // det du opprettet i trinn 11
define('DB_USER', 'user'); // det du opprettet i trinn 11
define('DB_PASS', 'db_password'); // det du anga i trinn 11
define('DB_CHARSET', 'utf8mb4'); // la stå
// --- Applikasjon ---
define('APP_URL', 'https://monitor.example.com'); // adressen til panelet, uten skråstrek på slutten
define('TIMEZONE', 'Europe/Oslo'); // din tidssone
// --- Sesjonstid ---
define('SESSION_LIFETIME', 28800); // inaktivitet før ny innlogging, sek (28800 = 8 t)
Hva du skal endre:
DB_NAME, DB_USER, DB_PASS — nøyaktig samme databasenavn, bruker og passord som du anga da du opprettet databasen i trinn 11 (hvis du beholdt eksemplene — monitor_db / monitor_user). Ikke rør DB_HOST og DB_CHARSET.
APP_URL — full adresse til panelet med https://, uten skråstrek på slutten og uten www. Må stemme med domenet du aktiverer lisensen på (trinn 16), ellers blir nøkkelen avvist.
TIMEZONE — din tidssone (liste — timedatectl list-timezones). Påvirker kun hvordan panelet viser datoer; det påvirker ikke når cron-jobbene kjører (der gjelder systemets tidssone).
SESSION_LIFETIME — etter hvor mange sekunder med inaktivitet panelet ber deg logge inn på nytt (standard er 8 timer). F.eks. 3600 = 1 time, 86400 = ett døgn.
Blokken for feillogging (display_errors, log_errors, error_log) — la stå på standard.
Lagre filen (Ctrl+O, Enter, deretter Ctrl+X) og start PHP-FPM på nytt — ellers blir ikke endringene tatt i bruk på grunn av OPcache:
sudo systemctl restart php*-fpm
config.php er en hemmelig fil (den inneholder databasepassordet). Den ligger i roten av panelet, som også er web-roten, men er beskyttet: rettighetene 640 (satt i trinn 10) og et eksplisitt forbud i rot-.htaccess. Ikke legg den ut i offentlige repositorier og ikke send den til supporten med det ekte passordet.
PHP kjøres som webserverbrukeren, som ikke har rettigheter til systemkommandoer. Tilgang gis snevert: punktvis sudo til bestemte verktøy og lesing av logger via grupper (uten sudo). Et innbrudd i weblaget gir ikke root.
I eksemplene er www-data standardbrukeren for Apache. Hvis du har en annen (i noen paneler kjører PHP under en egen bruker) – erstatt overalt. Sjekk: ps -o user= -C php-fpm | sort -u.
1. Opprett /etc/sudoers.d/monitor med sudo visudo -f /etc/sudoers.d/monitor og lim inn (fjern linjer for moduler du ikke bruker):
# UFW — status og regler (siden «Brannmur»)
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 oppheving (banned gir bannene fra alle jail'er med én kommando;
# ban/unban trengs av knappene i panelet)
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 *
# Sikkerhetsoppdateringer (kortet «Oppdateringer»). Kun lesing, men nettopp som root:
# apt-cachen (~70 MB) er kun tilgjengelig for root, en ikke-root bygger den på nytt ved hvert kall
# (4.2 s CPU mot 0.01 s). Uten wildcard — nøyaktig denne ene kommandoen, den installerer ingenting.
www-data ALL=(ALL) NOPASSWD: /usr/bin/apt list --upgradable
# IPset (angrepskart, dashbord)
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øk i hendelser + lesing av siste loggflinjer (nøyaktig 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
# Åpne porter (kjerne-/SSH-/Falco-logger leses UTEN sudo — via gruppen
# systemd-journal, se pkt. 2; sudo for journalctl skal IKKE gis og er utrygt)
www-data ALL=(ALL) NOPASSWD: /usr/bin/ss -tuln, /usr/sbin/ss -tuln, /bin/ss -tuln
# PostgreSQL (kun hvis du bruker det) — fast read-only-skript,
# opprett etter FAQ «PostgreSQL vises ikke»; uten det, slett linjen
www-data ALL=(ALL) NOPASSWD: /usr/local/bin/monitor-pgstat
2. Tilgang til logger og systemd-journalen. Modulene leser /var/log/fail2ban.log, auth.log, ufw.log, apache2/*, aide direkte (på Debian/Ubuntu ligger disse loggene i gruppen adm). Kjerne-, SSH- og Falco-hendelser hentes fra journald med kommandoen journalctluten sudo, via gruppen systemd-journal. Legg webbrukeren til i begge gruppene og start PHP-FPM på nytt:
sudo usermod -aG adm,systemd-journal www-data
sudo systemctl restart php*-fpm # obligatorisk, ellers trer ikke gruppene i kraft
3. Hvis ClamAV eller Suricata skriver logger til en annen gruppe enn adm (kan være root:root) – gi tilgang via ACL:
4. ModSecurity-innpakning. Revisjonsloggen til WAF (/var/log/apache2/modsec_audit.log) eies av root med rettighetene 640, og webbrukeren kan ikke lese den direkte. ModSecurity-siden henter motormodus, hendelser og listen over aktive regler via et fast read-only-skript – det er nettopp tillatt i sudoers med linjen over:
Uten filen /etc/modsecurity/modsecurity.conf fungerer ikke selve WAF: pakken legger bare inn modsecurity.conf-recommended, og regelmotoren forblir avslått – se hvordan du slår den på i FAQ → «Installasjon av ModSecurity».
Brukeren i alle sudoers-linjene må stemme med brukeren for FPM-poolen: på vanlig Apache/Debian er dette www-data, i HestiaCP kjører nettstedets pool som nettstedeieren (for eksempel admin) – sjekk grep -E '^user' /etc/php/*/fpm/pool.d/monitor.example.com.conf.
5. Hvis Nginx står foran Apache (HestiaCP, ISPmanager og andre paneler – der proxyer Nginx PHP til Apache og serverer statiske filer selv). Systemkatalogene er stengt med .htaccess-filer, men Nginx leser dem ikke: enhver statisk fil (.json, .txt, .log, .dat) serverer den direkte, utenom Apache. Panelets cacher og data lekker utover – for eksempel tmp/modsec_cache.json med WAF-hendelser og IP-adressene til angripere. Legg forbudet inn i Nginx-konfigurasjonen for nettstedet:
Prefikset ^~ er obligatorisk: det velges før den regulære regelen for statiske filer inne i location /, ellers virker ikke forbudet.
I HestiaCP legger du dette i en egen fil /home/<user>/conf/web/<domain>/nginx.ssl.conf_deny (og nginx.conf_deny for HTTP) – nettstedets konfigurasjon inkluderer nginx.ssl.conf_* og overskriver ikke slike filer ved gjenoppbygging. Bruk: 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 – bør være 403. Hvis Apache kjører uten Nginx (lytter på 80/443 selv), trenger du ikke legge til noe – .htaccess er nok.
Sjekk stiene til binærfilene med which (for eksempel which ufw cscli ausearch ss). Rediger sudoers kun via visudo. Listen over alle MySQL-databaser slås på med et eget GRANT (FAQ → «Bare én database vises»).
14. Tilgangsbegrensning etter IP
Begrens tilgangen til Monitor etter IP-adresse — selv om URL-en blir kjent, åpnes ikke innloggingssiden. Dette kan gjøres på webserver-nivå (eksempel for nginx nedenfor) eller i selve dashbordet («Innstillinger» → «Tilgangsbegrensning etter IP»). Bruker du Apache, benytt begrensningen i dashbordet.
Hvis nginx-nettstedet allerede er satt opp etter trinn 10, ikke legg til en nylocation / — skriv linjene allow/deny inn i den eksisterende blokken. To identiske location / i samme server { } er en konfigurasjonsfeil, og nginx vil ikke starte på nytt.
# I nginx-konfigurasjonen (inne i server { }):
# ACME-stien til Let's Encrypt holder vi åpen utenom IP-begrensningen —
# slik at utstedelse og automatisk fornyelse av SSL (trinn 15) ikke avhenger av IP-filteret.
location ^~ /.well-known/acme-challenge/ { allow all; }
location / {
allow 203.0.113.10; # ← skriv inn din IP
allow 10.0.0.0/8; # lokalt nettverk (om nødvendig)
deny all;
try_files $uri $uri/ /index.php?$query_string;
}
# Last inn nginx på nytt:
sudo nginx -t && sudo systemctl reload nginx
15. Utsted SSL (HTTPS)
Panelet fungerer kun over HTTPS. Innloggingsøkten bruker en sikker informasjonskapsel, og WebAuthn (2FA) fungerer bare på HTTPS. Du kan ikke logge inn via http://.
Sertifikatet er gratis (Let's Encrypt). Domenets DNS må allerede peke til serveren. Kommandoen avhenger av webserveren:
# Apache:
sudo certbot --apache -d monitor.example.com
# nginx — KUN hvis du faktisk bruker nginx. Ikke kjør dette på Apache:
# apt vil dra inn nginx og oppta port 80, konflikt med Apache.
# sudo apt install python3-certbot-nginx
# sudo certbot --nginx -d monitor.example.com
# certbot skriver selv HTTPS inn i konfigurasjonen og setter opp automatisk fornyelse
Dette spør certbot om: e-post → godta Terms (Y) → dele e-post med EFF (etter eget ønske). Deretter utsteder den selv sertifikatet, skriver <VirtualHost *:443>, setter opp omdirigering http→https og automatisk fornyelse.
DNS må peke til serveren FØR du kjører certbot (eierskapskontroll via port 80). Sjekk: dig +short monitor.example.com → serverens IP. Portene 80/443 er åpne: sudo ufw allow 80,443/tcp.
Etter utstedelse: https://monitor.example.com åpnes med hengelås, http:// omdirigeres til https:// (APP_URL i config.php ble allerede satt i trinn 12).
16. Innlogging og førstegangsoppsett
Åpne https://monitor.example.com, logg inn med admin / useradmin og gå gjennom sjekklisten:
Bytt admin-passord — under «Brukere» i menyen.
Aktiver WebAuthn (2FA) — «WebAuthn-nøkler» → registrer nøkkel/passkey (krever HTTPS). Registrer to med en gang: mister du den eneste nøkkelen, blir innlogging med den umulig. Les mer.
Begrens tilgang etter IP — «Innstillinger» → «Tilgangsbegrensning etter IP» (skriv inn din egen IP før du slår det på, ellers stenger du deg selv ute).
Legg inn lisens — aktiver koden ARCIVEO-… fra kontoen på ditt domene og lim inn nøkkelen i «Innstillinger» → «Lisens». Les mer.
Sett opp varsler — Telegram og/eller e-post i «Innstillinger». Les mer.
Slett installasjonsprogrammetpublic/start_db.php hvis det fortsatt finnes (steg 11).
17. Sikkerhetsverktøy (valgfritt)
Dashbordet fungerer allerede. Verktøyene installeres etter behov – installer det du trenger, så viser dashbordet statusen umiddelbart. Installasjonskommandoene for hvert verktøy finner du i håndboken (egne avsnitt per verktøy):
Dette er en demo av Arcivéo Security Monitor kun for visning – alle endringer er deaktivert. Sett den opp på din egen server for å håndtere reelle sikkerhetsdata.