Volledig handmatige installatie: van een net aangeschafte VPS tot een werkend dashboard, stap voor stap.
Servervoorbereiding, site aanmaken, database, config.php en SSL worden hier beschreven.
Commando's voor elke beveiligingstool en voor cron vindt u in de
FAQ-naslaggids, met links onderweg.
Belangrijkste regel: wanneer u SSH of de firewall wijzigt, sluit de huidige verbinding niet voordat u de nieuwe in een apart venster hebt getest. Raakt u de toegang toch kwijt — bijna alle hosters bieden een noodconsole (VNC/Recovery) in het configuratiescherm.
01. VPS met Ubuntu/Debian gekocht — hoe te beginnen
Na aankoop stuurt de hostingprovider: IP-adres, gebruikersnaam (meestal root) en wachtwoord (of SSH-sleutel). Dat is genoeg om in te loggen. De te volgen stappen (elke stap is een sectie hieronder):
Verbind met de server via SSH;
Werk het systeem bij, stel de hostnaam en tijdzone in;
Maak een gewone gebruiker met sudo-rechten (werk niet als root);
Stel inloggen met SSH-sleutel in en schakel inloggen met wachtwoord uit;
Schakel de firewall en automatische beveiliging in;
(optioneel) installeer het beheerpaneel HestiaCP — webserver, database en e-mail “out of the box”.
02. Eerste verbinding via SSH
SSH is een beveiligde terminal naar de server. Vervang 203.0.113.10 door uw eigen IP.
203.0.113.10 is een voorbeeld, een niet-bestaand adres (gereserveerd voor documentatie). Voer het niet zo in — vervang het door het echte IP van uw server uit de e-mail van uw hoster. Anders komt er geen verbinding tot stand.
Windows 10/11: open PowerShell of “Terminal” en gebruik de ingebouwde ssh (of clients PuTTY / MobaXterm). macOS / Linux: open “Terminal”.
# Inloggen als root (wachtwoord ontvangen van uw hoster):
ssh root@203.0.113.10
# Als uw hoster een sleutelbestand gaf in plaats van een wachtwoord:
ssh -i pad/naar/sleutel root@203.0.113.10
Bij de eerste verbinding vraagt SSH naar “authenticity of host” — voer yes in. Het wachtwoord wordt tijdens het typen niet weergegeven (dat is normaal). Als uw hoster een tijdelijk wachtwoord gaf — wijzig het met de opdracht passwd.
03. Systeem bijwerken en basisconfiguratie
Werk eerst alle pakketten bij en stel de hostnaam en tijdzone in.
Lijst met tijdzones — timedatectl list-timezones. Verschijnt aan het einde van de update een blauw venster “Daemons using outdated libraries” — selecteer dan alle services (Spatie) en klik op OK, dit is veilig.
04. Een gebruiker met sudo aanmaken
Voortdurend als root werken is onveilig. Maak een gewone gebruiker aan en geef die sudo-rechten (indien nodig commando's als admin uitvoeren). Vervang deploy door een naam naar keuze.
# Gebruiker aanmaken (stelt een wachtwoord in en vraagt gegevens — Enter volstaat):
adduser deploy
# Toevoegen aan de groep sudo:
usermod -aG sudo deploy
# Controleren (als root):
su - deploy
sudo whoami # moet weergeven: root
exit
Log daarna in op de server met deze gebruiker: ssh deploy@203.0.113.10 en voer beheerderscommando's uit met het voorvoegsel sudo.
05. SSH-sleutels en wachtwoordlogin uitschakelen
Inloggen met een sleutel is veiliger dan met een wachtwoord: een wachtwoord kan worden geraden, een sleutel vrijwel niet. Eerst maakt u een sleutel op uw eigen computer, kopieert u die naar de server, controleert u de login — en pas daarna schakelt u het wachtwoord uit.
Stap 1. Maak een sleutel op uw eigen computer (Windows PowerShell / macOS / Linux):
ssh-keygen -t ed25519 -C "my-laptop"
# Enter bij alle vragen (de sleutel komt in ~/.ssh/id_ed25519)
Stap 2. Kopieer de publieke sleutel naar de server:
Stap 3. Controleer de login met de sleutel in een nieuw venster — dit moet zonder wachtwoord toegang geven:
ssh deploy@203.0.113.10
Voer Variant B niet uit voordat de login met de sleutel is gecontroleerd en werkt (Stappen 1–3), en sluit uw werksessie niet. Hiermee wordt wachtwoordlogin uitgeschakeld voor alle gebruikers, inclusief root. Zonder een werkende sleutel verliest u volledig de toegang tot de server — die kunt u dan alleen nog herstellen via de console van uw hostingprovider. Geen sleutel — neem dan Variant A.
Stap 4. Verscherp de SSH-toegang. De instellingen zetten we in een apart bestand, de hoofdconfig laten we ongemoeid. Kies de variant die bij uw situatie past:
Variant A — alleen root sluiten, wachtwoord behouden. Een sleutel is niet nodig, u verliest de toegang niet:
Variant B — volledige hardening. Schakel wachtwoordlogin uit en laat root alleen via sleutel toe. Voer dit alleen uit nadat u hebt vastgesteld dat de login met de sleutel werkt:
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
In beide varianten is root via wachtwoord afgesloten. PermitRootLogin no verbiedt root volledig, prohibit-password — laat alleen login via sleutel toe (voor beheer logt u in als deploy en gebruikt u sudo). Wilt u de SSH-poort wijzigen — voeg dan de regel Port 2222 toe, maar open eerst de nieuwe poort in de firewall (volgende hoofdstuk) en controleer de login, anders sluit u zichzelf buiten.
06. Basisfirewall en automatische bescherming
Sluit alles overbodigs af met de firewall en schakel fail2ban in (blokkeert wachtwoord-brute-force via SSH). Sta eerst SSH toe, anders verliest u de toegang zodra UFW ingeschakeld is.
# SSH toestaan (of uw poort als u die gewijzigd hebt) en web:
sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
# Firewall inschakelen:
sudo ufw enable
sudo ufw status verbose
# fail2ban — SSH-bescherming tegen brute-force (basisprofiel direct actief):
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
Dit is het minimum. Werkende fail2ban-instellingen, de ipsum-blocklist, uitgebreide UFW en de overige tools vindt u in de groep “Beveiligingstools” van de handleiding. Het Arcivéo Monitor-paneel zelf toont overzichtelijk de status van dit alles.
07. HestiaCP installeren (optioneel)
HestiaCP — een gratis hostingbeheerpaneel: het installeert en configureert de webserver (nginx + apache), PHP, database (MariaDB), e-mail, DNS en SSL-certificaten, en biedt een webinterface voor websites. Handig als u niet alles handmatig wilt instellen en van plan bent sites te hosten (waaronder de Arcivéo Monitor-panel zelf).
Installeer HestiaCP op een schone server (een verse ondersteunde Ubuntu/Debian, minimaal ~1–2 GB RAM), vóór de installatie van andere webservers en databases — anders ontstaan er conflicten. De installatie duurt 10–20 minuten en herstart de server.
# Installatieprogramma downloaden en starten:
wget https://raw.githubusercontent.com/hestiacp/hestiacp/release/install/hst-install.sh
sudo bash hst-install.sh
Het installatieprogramma vraagt om een e-mailadres en hostnaam en installeert daarna de volledige stack. Na de herstart is het paneel bereikbaar op https://YOUR_IP:8083 (gebruikersnaam en wachtwoord toont het installatieprogramma aan het eind).
HestiaCP beheert zelf UFW en fail2ban — u hoeft die niet apart in te stellen, het pikt ze op. SSH-sleutels en het uitschakelen van het wachtwoord (vorige sectie) doet u toch nog.
08. Systeemvereisten en ionCube
Het dashboard is een PHP-applicatie op een gangbare LAMP/LEMP-stack:
Besturingssysteem: Linux (Ubuntu/Debian aanbevolen);
Webserver: nginx of Apache met PHP-FPM;
PHP 8.0+ met extensies: pdo_mysql, openssl, curl, json, mbstring;
ionCube Loader — een PHP-extensie die nodig is om het dashboard te laten werken;
Database: MySQL 5.7+ of MariaDB 10.3+;
HTTPS — verplicht (aanmelden en WebAuthn werken alleen via https);
sudo voor de webservergebruiker (beperkte set — stap 13).
ionCube Loader installeren (als die er nog niet is). Op hosting met een paneel (HestiaCP, cPanel) schakelt u ionCube in met een vinkje in de PHP-instellingen. Handmatig op Ubuntu/Debian:
# PHP-versie en extensiemap achterhalen:
php -v
EXTDIR=$(php -r 'echo ini_get("extension_dir");'); PHPVER=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')
# Loaders downloaden en uitpakken (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
# De loader voor uw PHP-versie naar de extensiemap kopiëren:
sudo cp ioncube/ioncube_loader_lin_${PHPVER}.so "$EXTDIR"/
# Inschakelen (CLI + PHP-FPM) en herstarten:
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
# Controle — in de uitvoer verschijnt de regel "with the ionCube PHP Loader":
php -v
De versie van de loader moet overeenkomen met de PHP-versie (bijvoorbeeld ioncube_loader_lin_8.1.so voor PHP 8.1). Gebruikt u meerdere PHP-versies — schakel dan voor elke versie de loader in.
09. Domein en DNS
Om het dashboard te openen via een adres als monitor.example.com en gratis SSL te krijgen, heeft u een domein nodig dat naar uw server verwijst. Maak in het DNS-beheerpaneel een A-record aan:
Type: A
Naam: monitor (subdomein → monitor.example.com)
of @ (hoofddomein → example.com)
Waarde: 203.0.113.10 ← IP van uw server
TTL: 3600
Controleer na enkele minuten of het domein naar de server verwijst:
dig +short monitor.example.com # moet uw IP teruggeven
# of, als dig ontbreekt:
getent hosts monitor.example.com
Een SSL-certificaat van Let's Encrypt wordt alleen voor een domein uitgegeven — DNS moet naar de server verwijzen vóór de uitgifte van het certificaat.
10. Site aanmaken en paneelbestanden uploaden
Apache: DocumentRoot — naar de root van het paneel, NIET naar public/. Stijlen (CSS/JS), sw.js, manifest.json staan in assets/ naast public/ en worden opgevraagd vanaf de site-root. De .htaccess in de root is de front-controller. Als u onder Apache DocumentRoot op public/ zet, opent het paneel zonder stijlen. Voor puur nginx is het andersom: als root wordt public/ genomen en assets/ wordt via een aparte regel geserveerd (zie het nginx-blok hieronder).
De paneelbestanden (het distributiearchief) worden na aankoop gedownload in uw account op my.arciveo.com → “Downloads”. Pak het archief uit vóór het uploaden.
1) Maak de paneelmap aan en upload daarin de inhoud van de distributie (zodat public/, assets/, config.php enz. erin komen te staan):
sudo mkdir -p /var/www/monitor
# upload daarna de distributiebestanden naar /var/www/monitor (FileZilla / WinSCP / scp)
2) Configureer de webserver.Apache: DocumentRoot — naar de root van het paneel (NIET naar /public); AllowOverride All is verplicht. Het pad naar de PHP-FPM-socket wordt automatisch bepaald. Plak het blok in zijn geheel in de terminal:
PHPSOCK=$(ls -1 /run/php/php*-fpm.sock 2>/dev/null | head -1) # auto-detectie van de 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 heeft geen .htaccess, dus nemen we public/ als root en serveren we assets/, sw.js, manifest.json (een niveau hoger) via een aparte regel:
PHPSOCK=$(ls -1 /run/php/php*-fpm.sock 2>/dev/null | head -1) # auto-detectie van de 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 en manifest staan een niveau hoger dan 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
Bestanden uploaden — SFTP/SCP (FileZilla, WinSCP) of scp:
# Voorbeeld via scp vanaf de lokale computer:
scp -r ./monitor/* deploy@203.0.113.10:/var/www/monitor/
Stel de bestandsrechten in — dit is een verplichte stap. Als u onder root of via SFTP hebt geüpload, behoren de bestanden aan root toe en kan de webserver (www-data) ze niet lezen — het paneel opent dan leeg of met een 403-fout (in de log: .htaccess unreadable / directory not executable). Het onderstaande commando lost dit op:
# We normaliseren de rechten van de hele webroot: een door root aangemaakte map is
# ontoegankelijk voor de webserver (www-data) — zonder dit geeft het paneel een lege pagina of 403.
# Apache draait onder www-data; als u een andere webgebruiker hebt, vervang die.
cd /var/www/monitor
# Werkmappen maken we vóór chown aan — anders blijven nieuwe mappen root:root
# en kan de webserver (www-data) er bij chmod 750 niet in schrijven.
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) Geef uzelf toegang om via SFTP te uploaden. Na het commando hierboven zijn alle bestanden eigendom van www-data, terwijl FileZilla / WinSCP verbinden met uw eigen gebruiker — het uploaden mislukt dan met SSH_FX_PERMISSION_DENIED (Permission denied). Inloggen als root om te uploaden kan niet — de root-login is in stap 05 uitgeschakeld. Kies een van de twee varianten.
Variant A — een ACL alleen voor uw gebruiker (aanbevolen). Alleen u krijgt schrijfrechten; de webserver kan de code van het paneel nog steeds niet overschrijven:
sudo apt install -y acl
# Schrijfrechten voor uw gebruiker op de hele paneelmap:
sudo setfacl -R -m u:deploy:rwX /var/www/monitor
# Dezelfde regel als standaard — voor bestanden en mappen die later worden aangemaakt:
sudo setfacl -R -d -m u:deploy:rwX /var/www/monitor
Variant B — via de groep www-data. Eenvoudiger, maar ook de webserver krijgt schrijfrechten op de bestanden van het paneel: bij een kwetsbaarheid in PHP zou de code vervangen kunnen worden. De volgorde van de commando's is van belang — config.php en de werkmappen worden als laatste dichtgezet:
sudo usermod -aG www-data deploy
# Schrijfrecht voor de groep + setgid (bit 2): via SFTP geüploade bestanden
# blijven in de groep www-data — anders kan het paneel ze niet overschrijven.
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
Na variant B maakt u opnieuw verbinding in FileZilla (Server → Verbinding verbreken, daarna opnieuw inloggen) — de nieuwe groep werkt pas bij een nieuwe login, tot dan heeft u nog steeds geen rechten. Controle: id deploy — in de groepenlijst moet www-data verschijnen; ls -ld /var/www/monitor — rechten drwxrwsr-x, de letter s in plaats van x betekent dat setgid is gezet.
11. Database
Maak een database en gebruiker aan en importeer daarna het schema. Het blok plakt u in zijn geheel in de terminal. monitor_db en monitor_user zijn voorbeeldnamen; u kunt uw eigen namen kiezen. Onthoud de databasenaam, gebruiker en wachtwoord — die vult u in de volgende stap in config.php in:
# 1. Database. Het wachtwoord stelt u ÉÉN keer in bij DBPASS en wordt in alle regels ingevuld.
# Plak het blok IN ZIJN GEHEEL in de terminal; sudo mysql logt root in via de unix-socket
# (root-wachtwoord niet nodig). Gebruik NIET het interactieve `sudo mysql -u root -p`
# met kopiëren/plakken — bij het plakken belanden de SQL-regels in de wachtwoordprompt en gaan verloren.
DBPASS='CHOOSE_A_PASSWORD' # ← wijzig alleen deze regel
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
# Controle (moet monitor_db tonen):
mysql -u monitor_user -p"$DBPASS" -e "SHOW DATABASES;"
# Vul ditzelfde wachtwoord in config.php → DB_PASS in.
Het schema hoeft u niet te importeren — het paneel maakt bij het eerste bezoek in de browser zelf de tabellen en het admin-account aan (uit database/db.sql) als de database leeg is. Handmatig het schema importeren is alleen nodig als de auto-initialisatie mislukte.
Als u de browserinstallatie public/start_db.php hebt gebruikt — verwijder die meteen na de installatie: hij maakt het mogelijk de database zonder authenticatie opnieuw aan te maken. Zolang het bestand in de hoofdmap van het paneel of in public/ staat, toont het paneel een rode waarschuwing.
12. config.php configureren
config.php in de hoofdmap van het dashboard (/var/www/monitor/config.php) is het enige bestand dat u handmatig moet bewerken. Alle instellingen van het dashboard staan erin als define()-constanten. Open het in een editor:
sudo nano /var/www/monitor/config.php
Vul uw eigen waarden in op de gemarkeerde plekken; laat de rest ongewijzigd:
// --- Database (uit stap 11) ---
define('DB_HOST', 'localhost'); // laten staan
define('DB_NAME', 'db_name'); // wat u in stap 11 hebt aangemaakt
define('DB_USER', 'user'); // wat u in stap 11 hebt aangemaakt
define('DB_PASS', 'db_password'); // wat u in stap 11 hebt ingesteld
define('DB_CHARSET', 'utf8mb4'); // laten staan
// --- Applicatie ---
define('APP_URL', 'https://monitor.example.com'); // adres van het dashboard, zonder slash aan het eind
define('TIMEZONE', 'Europe/Amsterdam'); // uw tijdzone
// --- Sessieduur ---
define('SESSION_LIFETIME', 28800); // inactiviteit tot opnieuw inloggen, sec (28800 = 8 u)
Wat u moet aanpassen:
DB_NAME, DB_USER, DB_PASS — precies dezelfde databasenaam, gebruiker en wachtwoord die u bij het aanmaken van de database in stap 11 hebt ingesteld (als u de voorbeelden hebt behouden — monitor_db / monitor_user). Laat DB_HOST en DB_CHARSET ongemoeid.
APP_URL — het volledige adres van het dashboard met https://, zonder slash aan het eind en zonder www. Moet overeenkomen met het domein waarop u de licentie activeert (stap 16), anders wordt de sleutel geweigerd.
TIMEZONE — uw tijdzone (lijst — timedatectl list-timezones). Bepaalt alleen hoe het dashboard datums weergeeft; op de uitvoertijd van cron-taken heeft dit geen invloed (daar geldt de tijdzone van het systeem).
SESSION_LIFETIME — na hoeveel seconden inactiviteit het dashboard vraagt opnieuw in te loggen (standaard 8 uur). Bijv. 3600 = 1 uur, 86400 = een etmaal.
Het blok voor foutlogging (display_errors, log_errors, error_log) — laat op de standaardwaarden staan.
Sla het bestand op (Ctrl+O, Enter, daarna Ctrl+X) en start PHP-FPM opnieuw — anders worden de wijzigingen door OPcache niet toegepast:
sudo systemctl restart php*-fpm
config.php is een geheim bestand (het bevat het databasewachtwoord). Het staat in de hoofdmap van het dashboard, die tevens de webroot is, maar is afgeschermd: rechten 640 (ingesteld in stap 10) en een expliciet verbod in de .htaccess van de hoofdmap. Publiceer het niet in openbare repository's en stuur het niet met een echt wachtwoord naar de support.
PHP draait onder de gebruiker van de webserver, die geen rechten heeft op systeemcommando's. Toegang wordt beperkt verleend: gerichte sudo op specifieke hulpprogramma's en logs lezen via groepen (zonder sudo). Een inbraak op de weblaag geeft geen root.
In de voorbeelden is www-data de standaardgebruiker van Apache. Heeft u een andere (in sommige panelen draait PHP onder een aparte gebruiker) — vervang deze overal. Achterhalen: ps -o user= -C php-fpm | sort -u.
1. Maak /etc/sudoers.d/monitor aan met sudo visudo -f /etc/sudoers.d/monitor en plak het volgende (verwijder de regels van ongebruikte modules):
# UFW — status en regels (pagina “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 en unban (banned geeft de bans van alle jails met één commando;
# ban/unban zijn nodig voor de knoppen in het paneel)
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 *
# Beveiligingsupdates (kaart “Updates”). Alleen lezen, maar juist als root:
# de apt-cache (~70 MB) is alleen toegankelijk voor root, een niet-root bouwt hem bij elke aanroep opnieuw op
# (4,2 s CPU tegen 0,01 s). Zonder wildcard — precies dit ene commando, het installeert niets.
www-data ALL=(ALL) NOPASSWD: /usr/bin/apt list --upgradable
# IPset (aanvalskaart, 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 — gebeurtenissen zoeken + laatste regels van het log lezen (exact pad)
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
# Open poorten (kernel-/SSH-/Falco-logs worden ZONDER sudo gelezen — via de groep
# systemd-journal, zie punt 2; sudo voor journalctl hoeft NIET en is onveilig)
www-data ALL=(ALL) NOPASSWD: /usr/bin/ss -tuln, /usr/sbin/ss -tuln, /bin/ss -tuln
# PostgreSQL (alleen als u het gebruikt) — vast read-only script,
# aan te maken volgens FAQ “PostgreSQL wordt niet weergegeven”; zonder dit verwijdert u de regel
www-data ALL=(ALL) NOPASSWD: /usr/local/bin/monitor-pgstat
sudo chmod 440 /etc/sudoers.d/monitor
sudo visudo -c # moet "parsed OK" zijn
2. Toegang tot logs en het systemd-journaal. Modules lezen /var/log/fail2ban.log, auth.log, ufw.log, apache2/*, aide rechtstreeks (op Debian/Ubuntu zitten deze logs in de groep adm). Kernel-, SSH- en Falco-gebeurtenissen komen uit journald met het commando journalctlzonder sudo, via de groep systemd-journal. Voeg de webgebruiker toe aan beide groepen en herstart PHP-FPM:
sudo usermod -aG adm,systemd-journal www-data
sudo systemctl restart php*-fpm # verplicht, anders worden de groepen niet toegepast
3. Als ClamAV of Suricata hun logs niet naar de groep adm schrijven (soms root:root) — geef dan toegang via ACL:
4. ModSecurity-wrapper. Het audit-log van de WAF (/var/log/apache2/modsec_audit.log) is eigendom van root met rechten 640, de webgebruiker kan het niet rechtstreeks lezen. De ModSecurity-pagina haalt de engine-modus, gebeurtenissen en de lijst met actieve regels op via een vast read-only script — dat is hierboven met een regel in sudoers toegestaan:
Zonder het bestand /etc/modsecurity/modsecurity.conf werkt de WAF zelf niet: het pakket plaatst alleen modsecurity.conf-recommended, en de regel-engine blijft uitgeschakeld — hoe u die inschakelt, zie FAQ → “ModSecurity installeren”.
De gebruiker in alle sudoers-regels moet overeenkomen met de gebruiker van de FPM-pool: op een gewone Apache/Debian is dat www-data, in HestiaCP draait de pool van de site onder de eigenaar van de site (bijvoorbeeld admin) — controleer grep -E '^user' /etc/php/*/fpm/pool.d/monitor.example.com.conf.
5. Als er vóór Apache een Nginx staat (HestiaCP, ISPmanager en andere panelen — daar proxyt Nginx PHP naar Apache en serveert het de statische bestanden zelf). Servicemappen zijn afgeschermd met .htaccess-bestanden, maar Nginx leest die niet: elk statisch bestand (.json, .txt, .log, .dat) serveert het rechtstreeks, buiten Apache om. Panelcaches en gegevens lekken naar buiten — bijvoorbeeld tmp/modsec_cache.json met WAF-gebeurtenissen en de IP-adressen van aanvallers. Voeg een blokkering toe aan de siteconfig van Nginx:
Het voorvoegsel ^~ is verplicht: het wordt eerder gekozen dan de reguliere regel voor statische bestanden binnen location /, anders werkt de blokkering niet.
In HestiaCP plaatst u dit in een apart bestand /home/<user>/conf/web/<domain>/nginx.ssl.conf_deny (en nginx.conf_deny voor HTTP) — de siteconfig laadt nginx.ssl.conf_* en overschrijft zulke bestanden niet bij het opnieuw opbouwen. Toepassen: sudo nginx -t && sudo systemctl reload nginx.
Controle: curl -s -o /dev/null -w '%{http_code}\n' https://monitor.example.com/tmp/modsec_cache.json — moet 403 zijn. Draait Apache zonder Nginx (luistert zelf op 80/443), dan hoeft u niets toe te voegen — .htaccess volstaat.
Controleer de paden naar de binaries met which (bijvoorbeeld which ufw cscli ausearch ss). Bewerk sudoers uitsluitend via visudo. De lijst met alle MySQL-databases wordt via een aparte GRANT ingeschakeld (FAQ → “Er is maar één database zichtbaar”).
14. Toegangsbeperking op IP
Beperk de toegang tot de monitor op IP-adres — zelfs als de URL bekend wordt, opent de inlogpagina niet. Dit kan op webserverniveau (voorbeeld voor nginx hieronder) of in het paneel zelf (“Instellingen” → “Toegangsbeperking op IP”). Gebruikt u Apache, gebruik dan de beperking in het paneel.
Als de nginx-site al is ingesteld volgens stap 10, voeg geen tweedelocation / toe — plaats de regels allow/deny in het bestaande blok. Twee identieke location / in één server { } is een configuratiefout, nginx start dan niet opnieuw op.
# In de nginx-config (binnen server { }):
# Het ACME-pad van Let's Encrypt houden we open buiten de IP-beperking om —
# zodat uitgifte en automatische verlenging van SSL (stap 15) niet afhangen van het IP-filter.
location ^~ /.well-known/acme-challenge/ { allow all; }
location / {
allow 203.0.113.10; # ← vul uw eigen IP in
allow 10.0.0.0/8; # lokaal netwerk (indien nodig)
deny all;
try_files $uri $uri/ /index.php?$query_string;
}
# nginx herladen:
sudo nginx -t && sudo systemctl reload nginx
15. SSL (HTTPS) uitgeven
Het dashboard werkt uitsluitend via HTTPS. De inlogsessie gebruikt een beveiligde cookie en WebAuthn (2FA) werkt alleen op HTTPS. Via http:// kunt u niet inloggen.
Het certificaat is gratis (Let's Encrypt). De DNS van het domein moet al naar de server wijzen. De opdracht hangt af van de webserver:
# Apache:
sudo certbot --apache -d monitor.example.com
# nginx — ALLEEN als u daadwerkelijk nginx gebruikt. Voer dit op Apache NIET uit:
# apt haalt nginx binnen en bezet poort 80, conflict met Apache.
# sudo apt install python3-certbot-nginx
# sudo certbot --nginx -d monitor.example.com
# certbot voegt HTTPS zelf toe aan de config en stelt automatische verlenging in
Wat certbot vraagt: e-mail → akkoord met Terms (Y) → e-mail delen met EFF (naar eigen inzicht). Daarna geeft het zelf het certificaat uit, voegt <VirtualHost *:443> toe, stelt de redirect http→https en automatische verlenging in.
De DNS moet naar de server wijzen VÓÓR u certbot start (eigendomsverificatie via poort 80). Controle: dig +short monitor.example.com → IP van de server. Poorten 80/443 open: sudo ufw allow 80,443/tcp.
Na de uitgifte: https://monitor.example.com opent met een slotje, http:// redirect naar https:// (APP_URL in config.php is al ingesteld in stap 12).
16. Inloggen en eerste configuratie
Open https://monitor.example.com, log in met admin / useradmin en doorloop de checklist:
Wachtwoord van admin wijzigen — sectie “Gebruikers” in het menu.
WebAuthn (2FA) inschakelen — “WebAuthn-sleutels” → sleutel/passkey registreren (vereist HTTPS). Registreer er meteen twee: bij verlies van de enige sleutel is inloggen daarmee onmogelijk. Meer info.
Toegang op IP beperken — “Instellingen” → “Toegangsbeperking op IP” (vul uw eigen IP in vóór het inschakelen, anders sluit u uzelf buiten).
Licentie invoeren — activeer de code ARCIVEO-… uit uw account op uw domein en plak de sleutel in “Instellingen” → “Licentie”. Meer info.
Meldingen instellen — Telegram en/of e-mail in “Instellingen”. Meer info.
Installer verwijderenpublic/start_db.php, indien nog aanwezig (stap 11).
17. Beveiligingstools (optioneel)
Het dashboard werkt al. Tools installeert u naar wens — wat u nodig heeft, installeert u, en het dashboard toont meteen de status. De installatiecommando's van elk staan in de handleiding (aparte secties per tool):
Dit is een demo van Arcivéo Security Monitor, alleen-lezen — alle wijzigingen zijn uitgeschakeld. Installeer het op uw eigen server om echte beveiligingsgegevens te beheren.