Täysin manuaalinen asennus: juuri ostetusta VPS:stä toimivaan hallintapaneeliin, vaihe vaiheelta.
Palvelimen valmistelu, sivuston luonti, tietokanta, config.php ja SSL kuvataan tässä.
Kunkin tietoturvatyökalun komennot ja cron löytyvät
FAQ-oppaasta, linkit matkan varrella.
Tärkein sääntö: kun muutat SSH:ta tai palomuuria, älä sulje nykyistä yhteyttä, ennen kuin olet testannut uuden erillisessä ikkunassa. Jos pääsy silti katoaa — lähes kaikki hostingpalvelut tarjoavat hätäkonsolin (VNC/Recovery) hallintapaneelissa.
01. Ostit VPS:n, jossa on Ubuntu/Debian — mistä aloittaa
Oston jälkeen palveluntarjoaja lähettää: IP-osoitteen, käyttäjätunnuksen (yleensä root) ja salasanan (tai SSH-avaimen). Tämä riittää kirjautumiseen. Toimintajärjestys (jokainen vaihe on oma osionsa alla):
Yhdistä palvelimeen SSH:n kautta;
Päivitä järjestelmä, aseta konenimi ja aikavyöhyke;
Luo tavallinen käyttäjä, jolla on sudo-oikeudet (älä työskentele rootina);
Määritä kirjautuminen SSH-avaimella ja poista salasanakirjautuminen käytöstä;
Ota käyttöön palomuuri ja automaattinen suojaus;
(valinnainen) asenna HestiaCP-hallintapaneeli — verkkopalvelin, tietokanta ja sähköposti valmiina.
02. Ensimmäinen yhteys SSH:llä
SSH on suojattu pääte palvelimeen. Korvaa 203.0.113.10 omalla IP-osoitteellasi.
203.0.113.10 on esimerkki, olematon osoite (varattu dokumentaatiota varten). Älä syötä sitä sellaisenaan — korvaa se palvelimesi oikealla IP-osoitteella, jonka sait hostingpalvelun sähköpostista. Muuten yhteyttä ei muodostu.
Windows 10/11: avaa PowerShell tai ”Pääte” ja käytä sisäänrakennettua ssh-komentoa (tai PuTTY- / MobaXterm-asiakasohjelmia). macOS / Linux: avaa ”Pääte”.
# Kirjautuminen root-käyttäjänä (salasana tuli hostingpalvelulta):
ssh root@203.0.113.10
# Jos hostingpalvelu antoi avaintiedoston salasanan sijaan:
ssh -i polku/avaimeen root@203.0.113.10
Ensimmäisellä yhteydellä SSH kysyy isännän aitoudesta (”authenticity of host”) — syötä yes. Salasana ei näy kirjoitettaessa (tämä on normaalia). Jos hostingpalvelu antoi väliaikaisen salasanan, vaihda se komennolla passwd.
03. Järjestelmän päivitys ja perusasetukset
Ensimmäiseksi päivitä kaikki paketit sekä aseta koneen nimi ja aikavyöhyke.
Aikavyöhykkeiden luettelo — timedatectl list-timezones. Jos päivityksen lopussa ilmestyy sininen ikkuna ”Daemons using outdated libraries”, valitse kaikki palvelut (välilyönti) ja paina OK — se on turvallista.
04. Sudo-käyttäjän luonti
Jatkuva työskentely root-tunnuksella ei ole turvallista. Luo tavallinen käyttäjä ja anna sille sudo-oikeudet (komentojen ajaminen ylläpitäjänä tarvittaessa). Korvaa deploy haluamallasi nimellä.
# Luo käyttäjä (asettaa salasanan ja kysyy tietoja — voit painaa Enter):
adduser deploy
# Lisää sudo-ryhmään:
usermod -aG sudo deploy
# Tarkista (root-tunnuksella):
su - deploy
sudo whoami # pitäisi tulostaa: root
exit
Kirjaudu jatkossa palvelimelle tällä käyttäjällä: ssh deploy@203.0.113.10, ja aja ylläpitäjän komennot sudo-etuliitteellä.
05. SSH-avaimet ja salasanakirjautumisen poistaminen
Avaimella kirjautuminen on turvallisempaa kuin salasanalla: salasanan voi arvata, avainta ei käytännössä. Luodaan ensin avain omalla tietokoneella, kopioidaan se palvelimelle, tarkistetaan kirjautuminen — ja vasta sitten poistetaan salasana käytöstä.
Vaihe 1. Luo avain omalla tietokoneellasi (Windows PowerShell / macOS / Linux):
ssh-keygen -t ed25519 -C "my-laptop"
# Enter kaikkiin kysymyksiin (avain tallentuu polkuun ~/.ssh/id_ed25519)
Vaihe 3. Tarkista avaimella kirjautuminen uudessa ikkunassa — sen pitäisi päästää sisään ilman salasanaa:
ssh deploy@203.0.113.10
Älä suorita Vaihtoehtoa B, ennen kuin avaimella kirjautuminen on testattu ja toimii (Vaiheet 1–3), äläkä sulje työistuntoa. Se poistaa salasanakirjautumisen käytöstä kaikilta käyttäjiltä, myös rootilta. Ilman toimivaa avainta menetät palvelimen käyttöoikeuden kokonaan — saat sen takaisin vain hostingpalvelun konsolin kautta. Ei avainta — valitse Vaihtoehto A.
Vaihe 4. Tiukenna SSH-pääsyä. Asetukset laitetaan erilliseen tiedostoon koskematta pääkonfiguraatioon. Valitse vaihtoehto tilanteen mukaan:
Vaihtoehto A — sulje vain root, säilytä salasana. Avainta ei tarvita, et menetä pääsyä:
Vaihtoehto B — täysi hardening. Poista salasanakirjautuminen käytöstä ja salli root vain avaimella. Suorita vasta varmistettuasi, että avaimella kirjautuminen toimii:
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
Molemmissa vaihtoehdoissa root on suljettu salasanalta. PermitRootLogin no estää rootin kokonaan, prohibit-password — sallii kirjautumisen vain avaimella (ylläpitoa varten kirjaudu tunnuksella deploy ja käytä sudo). Jos haluat vaihtaa SSH-portin — lisää rivi Port 2222, mutta avaa ensin uusi portti palomuurissa (seuraava osio) ja tarkista kirjautuminen, muuten suljet itseltäsi pääsyn.
06. Peruspalomuuri ja automaattinen suojaus
Sulje kaikki tarpeeton palomuurilla ja ota käyttöön fail2ban (estää SSH-salasanojen arvaamisen). Salli ensin SSH, muuten menetät pääsyn UFW:n käyttöönoton jälkeen.
# Salli SSH (tai oma porttisi, jos vaihdoit) ja web:
sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
# Ota palomuuri käyttöön:
sudo ufw enable
sudo ufw status verbose
# fail2ban — suojaa SSH:n arvaamiselta (perusprofiili aktiivinen heti):
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
Tämä on vähimmäistaso. Toimivat fail2ban-asetukset, ipsum-estolista, laajennettu UFW ja muut työkalut löytyvät käsikirjan Tietoturvatyökalut-ryhmästä. Arcivéo Monitor -paneeli näyttää kaiken tämän tilan havainnollisesti.
07. HestiaCP-paneelin asennus (valinnainen)
HestiaCP — ilmainen hostingin hallintapaneeli: asentaa ja määrittää verkkopalvelimen (nginx + apache), PHP:n, tietokannan (MariaDB), sähköpostin, DNS:n ja SSL-varmenteet, tarjoaa verkkokäyttöliittymän sivustoille. Kätevä, jos et halua määrittää kaikkea käsin ja aiot ylläpitää sivustoja (ml. itse Arcivéo Monitor -paneelin).
Asenna HestiaCP puhtaalle palvelimelle (tuore tuettu Ubuntu/Debian, vähintään ~1–2 Gt RAM), ennen muiden verkkopalvelimien ja tietokantojen asennusta — muuten syntyy konflikteja. Asennus kestää 10–20 minuuttia ja käynnistää palvelimen uudelleen.
# Lataa asennusohjelma ja käynnistä:
wget https://raw.githubusercontent.com/hestiacp/hestiacp/release/install/hst-install.sh
sudo bash hst-install.sh
Asennusohjelma kysyy sähköpostin ja isäntänimen, minkä jälkeen se asentaa koko pinon. Uudelleenkäynnistyksen jälkeen paneeli on saatavilla osoitteessa https://YOUR_IP:8083 (asennusohjelma näyttää käyttäjätunnuksen ja salasanan lopuksi).
HestiaCP hallitsee itse UFW:tä ja fail2ban:ia — niitä ei tarvitse määrittää erikseen, se ottaa ne käyttöön. Tee SSH-avaimet ja salasanan poisto käytöstä (edellinen osio) silti.
08. Järjestelmävaatimukset ja ionCube
Hallintapaneeli on PHP-sovellus tyypillisessä LAMP/LEMP-pinossa:
Käyttöjärjestelmä: Linux (Ubuntu/Debian suositellaan);
ionCube Loader — PHP-laajennus, joka on välttämätön paneelin toiminnalle;
Tietokanta: MySQL 5.7+ tai MariaDB 10.3+;
HTTPS — pakollinen (kirjautuminen ja WebAuthn toimivat vain https:n kautta);
sudo verkkopalvelimen käyttäjälle (suppea joukko — vaihe 13).
# Tarkista PHP:n versio ja laajennukset:
php -v
php -m | grep -iE 'pdo_mysql|openssl|curl|mbstring|ioncube'
ionCube Loaderin asennus (jos sitä ei vielä ole). Hallintapaneelin sisältävässä hostingissa (HestiaCP, cPanel) ionCube otetaan käyttöön valintaruudulla PHP-asetuksissa. Käsin Ubuntussa/Debianissa:
# Selvitä PHP:n versio ja laajennushakemisto:
php -v
EXTDIR=$(php -r 'echo ini_get("extension_dir");'); PHPVER=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')
# Lataa ja pura loaderit (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
# Kopioi PHP-versiotasi vastaava loader laajennushakemistoon:
sudo cp ioncube/ioncube_loader_lin_${PHPVER}.so "$EXTDIR"/
# Ota käyttöön (CLI + PHP-FPM) ja käynnistä uudelleen:
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
# Tarkistus — tulosteeseen ilmestyy rivi "with the ionCube PHP Loader":
php -v
Loaderin version on vastattava PHP:n versiota (esimerkiksi ioncube_loader_lin_8.1.so PHP 8.1:lle). Jos käytät useita PHP-versioita, ota loader käyttöön jokaiselle.
09. Verkkotunnus ja DNS
Jotta paneelin voi avata osoitteesta kuten monitor.example.com ja saada ilmaisen SSL:n, tarvitset verkkotunnuksen, joka osoittaa palvelimellesi. Luo DNS-hallintapaneelissa A-tietue:
Tyyppi: A
Nimi: monitor (aliverkkotunnus → monitor.example.com)
tai @ (juuriverkkotunnus → example.com)
Arvo: 203.0.113.10 ← palvelimesi IP
TTL: 3600
Tarkista muutaman minuutin kuluttua, että verkkotunnus osoittaa palvelimelle:
dig +short monitor.example.com # pitäisi palauttaa IP-osoitteesi
# tai, jos dig puuttuu:
getent hosts monitor.example.com
Let's Encrypt -SSL-varmenne myönnetään vain verkkotunnukselle — DNS:n on osoitettava palvelimelle ennen varmenteen luontia.
10. Luo sivusto ja siirrä paneelin tiedostot
Apache: DocumentRoot — paneelin juureen, EI public/-kansioon. Tyylit (CSS/JS), sw.js ja manifest.json sijaitsevat assets/-kansiossa public/-kansion vieressä ja haetaan sivuston juuresta. Juuren .htaccess on etuohjain. Jos Apachessa DocumentRoot osoittaa public/-kansioon, paneeli avautuu ilman tyylejä. Puhtaassa nginx-asennuksessa päinvastoin: juureksi otetaan public/, ja assets/ tarjotaan erillisellä säännöllä (katso nginx-lohko alla).
Paneelin tiedostot (jakelun arkisto) ladataan oston jälkeen tilillä my.arciveo.com → ”Lataukset”. Pura arkisto ennen siirtoa.
1) Luo paneelin hakemisto ja siirrä siihen jakelun sisältö (jotta sisällä ovat public/, assets/, config.php jne.):
nginx: nginx:llä ei ole .htaccess-tiedostoa, joten juureksi otetaan public/, ja assets/, sw.js, manifest.json (tasoa ylempänä) tarjotaan erillisellä säännöllä:
PHPSOCK=$(ls -1 /run/php/php*-fpm.sock 2>/dev/null | head -1) # PHP-FPM-soketin automaattinen tunnistus
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 ja manifest sijaitsevat tasoa ylempänä kuin 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
Tiedostojen siirto — SFTP/SCP (FileZilla, WinSCP) tai scp:
# Esimerkki scp:llä paikalliselta tietokoneelta:
scp -r ./monitor/* deploy@203.0.113.10:/var/www/monitor/
Aseta tiedostojen oikeudet — tämä on pakollinen vaihe. Jos siirsit tiedostot root-käyttäjänä tai SFTP:llä, ne kuuluvat root-käyttäjälle, eikä verkkopalvelin (www-data) pysty lukemaan niitä — paneeli avautuu tyhjänä tai 403-virheellä (lokissa: .htaccess unreadable / directory not executable). Alla oleva komento korjaa tämän:
# Normalisoidaan koko webrootin oikeudet: rootin luoma hakemisto ei ole
# verkkopalvelimen (www-data) käytettävissä — ilman tätä paneeli tarjoaa tyhjän sivun tai 403:n.
# Apache toimii www-data-käyttäjänä; jos sinulla on toinen web-käyttäjä — vaihda se.
cd /var/www/monitor
# Työkansiot luodaan ENNEN chownia — muuten uudet hakemistot jäävät root:root-omistukseen
# ja chmod 750:n jälkeen verkkopalvelin (www-data) ei pysty kirjoittamaan niihin.
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) Avaa itsellesi tiedostojen lataus SFTP:llä. Yllä olevan komennon jälkeen kaikki tiedostot kuuluvat www-data-käyttäjälle, kun taas FileZilla / WinSCP yhdistävät omalla käyttäjätunnuksellasi — lataus epäonnistuu silloin virheeseen SSH_FX_PERMISSION_DENIED (Permission denied). Kirjautuminen root-tunnuksella lataamista varten ei ole vaihtoehto — root-kirjautuminen poistettiin käytöstä vaiheessa 05. Valitse toinen kahdesta vaihtoehdosta.
Vaihtoehto A — ACL vain omalle käyttäjällesi (suositeltava). Kirjoitusoikeuden saat vain sinä; verkkopalvelin ei edelleenkään voi korvata paneelin koodia:
sudo apt install -y acl
# Kirjoitusoikeus käyttäjällesi koko paneelihakemistoon:
sudo setfacl -R -m u:deploy:rwX /var/www/monitor
# Sama sääntö oletuksena — myöhemmin luotaville tiedostoille ja kansioille:
sudo setfacl -R -d -m u:deploy:rwX /var/www/monitor
Vaihtoehto B — www-data-ryhmän kautta. Yksinkertaisempi, mutta kirjoitusoikeuden paneelin tiedostoihin saa myös verkkopalvelin: PHP:n haavoittuvuuden yhteydessä koodi voitaisiin korvata. Komentojen järjestyksellä on merkitystä — config.php ja työkansiot suljetaan viimeisenä:
sudo usermod -aG www-data deploy
# Kirjoitusoikeus ryhmälle + setgid (bitti 2): SFTP:llä ladatut tiedostot
# pysyvät www-data-ryhmässä — muuten paneeli ei pysty korvaamaan niitä.
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
Vaihtoehdon B jälkeen yhdistä FileZillassa uudelleen (Palvelin → Katkaise yhteys, kirjaudu sitten uudelleen) — uusi ryhmä tulee voimaan vasta uudella kirjautumisella, sitä ennen oikeuksia ei vieläkään ole. Tarkistus: id deploy — ryhmäluettelossa pitää näkyä www-data; ls -ld /var/www/monitor — oikeudet drwxrwsr-x, kirjain s merkin x tilalla tarkoittaa, että setgid on asetettu.
11. Tietokanta
Luo tietokanta ja käyttäjä, tuo sitten skeema. Lohko liitetään terminaaliin kokonaisuudessaan. monitor_db ja monitor_user ovat esimerkkinimiä, voit määrittää omasi; muista tietokannan nimi, käyttäjä ja salasana — kirjaat ne config.php-tiedostoon seuraavassa vaiheessa:
# 1. Tietokanta. Salasana asetetaan KERRAN DBPASS-muuttujaan ja sijoitetaan kaikkiin riveihin.
# Lohko liitetään terminaaliin KOKONAISUUDESSAAN; sudo mysql kirjautuu rootiksi unix-soketilla
# (rootin salasanaa ei tarvita). ÄLÄ käytä interaktiivista `sudo mysql -u root -p`
# kopioi-liitä-tavalla — liitettäessä SQL-rivit menevät salasanakyselyyn ja katoavat.
DBPASS='CHOOSE_A_PASSWORD' # ← muuta vain tämä rivi
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
# Tarkistus (pitäisi näyttää monitor_db):
mysql -u monitor_user -p"$DBPASS" -e "SHOW DATABASES;"
# Kirjaa sama salasana config.php-tiedostoon → DB_PASS.
Skeemaa ei tarvitse tuoda — paneeli luo itse taulut ja admin-tilin ensimmäisellä selainkäynnillä (tiedostosta database/db.sql), jos tietokanta on tyhjä. Skeeman manuaalinen tuonti tarvitaan vain, jos automaattinen alustus ei toiminut.
Jos käytit selainpohjaista asennusohjelmaa public/start_db.php — poista se heti asennuksen jälkeen: se sallii tietokannan uudelleenluonnin ilman kirjautumista. Niin kauan kuin tiedosto on paneelin juuressa tai public/-kansiossa, paneeli näyttää punaisen varoituksen.
12. config.php:n asetukset
config.php paneelin juuressa (/var/www/monitor/config.php) on ainoa tiedosto, jota täytyy muokata käsin. Kaikki paneelin asetukset on määritetty siinä define()-vakioina. Avaa se editorissa:
sudo nano /var/www/monitor/config.php
Syötä omat arvosi korostettuihin kohtiin; jätä muu ennalleen:
// --- Tietokanta (vaiheesta 11) ---
define('DB_HOST', 'localhost'); // jätä ennalleen
define('DB_NAME', 'db_name'); // luotu vaiheessa 11
define('DB_USER', 'user'); // luotu vaiheessa 11
define('DB_PASS', 'db_password'); // asetettu vaiheessa 11
define('DB_CHARSET', 'utf8mb4'); // jätä ennalleen
// --- Sovellus ---
define('APP_URL', 'https://monitor.example.com'); // paneelin osoite, ilman lopun kauttaviivaa
define('TIMEZONE', 'Europe/Helsinki'); // aikavyöhykkeesi
// --- Istunnon kesto ---
define('SESSION_LIFETIME', 28800); // toimettomuus ennen uutta kirjautumista, s (28800 = 8 h)
Mitä muuttaa:
DB_NAME, DB_USER, DB_PASS — täsmälleen samat tietokannan nimi, käyttäjä ja salasana, jotka annoit tietokantaa luodessasi vaiheessa 11 (jos jätit esimerkit — monitor_db / monitor_user). Älä koske DB_HOST- ja DB_CHARSET-arvoihin.
APP_URL — paneelin koko osoite https://-alkuisena, ilman lopun kauttaviivaa ja ilman www-etuliitettä. Sen on vastattava domainia, jolle aktivoit lisenssin (vaihe 16), muuten avain hylätään.
TIMEZONE — aikavyöhykkeesi (lista — timedatectl list-timezones). Vaikuttaa vain siihen, miten paneeli näyttää päivämäärät; cron-tehtävien käynnistysaikaan se ei vaikuta (siinä pätee järjestelmän vyöhyke).
SESSION_LIFETIME — kuinka monen toimettoman sekunnin jälkeen paneeli pyytää kirjautumaan uudelleen (oletus 8 tuntia). Esim. 3600 = 1 tunti, 86400 = vuorokausi.
Tallenna tiedosto (Ctrl+O, Enter, sitten Ctrl+X) ja käynnistä PHP-FPM uudelleen — muuten OPcachen takia muutokset eivät tule voimaan:
sudo systemctl restart php*-fpm
config.php on salainen tiedosto (siinä on tietokannan salasana). Se sijaitsee paneelin juuressa, joka on myös web-juuri, mutta se on suojattu: oikeudet 640 (asetettu vaiheessa 10) ja nimenomainen esto juuren .htaccess-tiedostossa. Älä julkaise sitä julkisiin repositorioihin äläkä lähetä sitä tukeen todellisen salasanan kanssa.
PHP suoritetaan web-palvelimen käyttäjänä, jolla ei ole oikeuksia järjestelmäkomentoihin. Pääsy annetaan tarkasti rajattuna: täsmällinen sudo tietyille työkaluille ja lokien luku ryhmien kautta (ilman sudoa). Web-kerroksen murto ei anna root-oikeuksia.
Esimerkeissä www-data on Apachen vakiokäyttäjä. Jos sinulla on toinen (joissakin paneeleissa PHP toimii erillisenä käyttäjänä) — korvaa kaikkialla. Tarkista: ps -o user= -C php-fpm | sort -u.
1. Luo /etc/sudoers.d/monitor komennolla sudo visudo -f /etc/sudoers.d/monitor ja lisää seuraava (poista käyttämättömien moduulien rivit):
# UFW — tila ja säännöt (sivu ”Palomuuri”)
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 — tila, bannit ja bannien poisto (banned palauttaa kaikkien jailien bannit yhdellä komennolla;
# ban/unban tarvitaan paneelin painikkeille)
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 *
# Tietoturvapäivitykset (kortti ”Päivitykset”). Vain luku, mutta nimenomaan rootina:
# apt-välimuisti (~70 Mt) on vain rootin käytettävissä, ei-root rakentaa sen uudelleen joka kutsulla
# (4.2 s CPU vs. 0.01 s). Ilman wildcardia — täsmälleen tämä yksi komento, ei asenna mitään.
www-data ALL=(ALL) NOPASSWD: /usr/bin/apt list --upgradable
# IPset (hyökkäyskartta, kojelauta)
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 — tapahtumien haku + lokin viimeisten rivien luku (tarkka polku)
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
# Avoimet portit (ytimen/SSH:n/Falcon lokit luetaan ILMAN sudoa — ryhmän
# systemd-journal kautta, ks. kohta 2; sudoa journalctl:lle EI tarvitse antaa eikä se ole turvallista)
www-data ALL=(ALL) NOPASSWD: /usr/bin/ss -tuln, /usr/sbin/ss -tuln, /bin/ss -tuln
# PostgreSQL (vain jos käytät) — kiinteä vain luku -skripti,
# luo FAQ:n ”PostgreSQL ei näy” mukaan; ilman sitä poista rivi
www-data ALL=(ALL) NOPASSWD: /usr/local/bin/monitor-pgstat
sudo chmod 440 /etc/sudoers.d/monitor
sudo visudo -c # pitää olla "parsed OK"
2. Pääsy lokeihin ja systemd-journaliin. Moduulit lukevat /var/log/fail2ban.log, auth.log, ufw.log, apache2/*, aide suoraan (Debianissa/Ubuntussa nämä lokit ovat ryhmässä adm). Ytimen, SSH:n ja Falcon tapahtumat haetaan journaldista komennolla journalctlilman sudoa, ryhmän systemd-journal kautta. Lisää web-käyttäjä molempiin ryhmiin ja käynnistä PHP-FPM uudelleen:
sudo usermod -aG adm,systemd-journal www-data
sudo systemctl restart php*-fpm # pakollinen, muuten ryhmät eivät tule voimaan
3. Jos ClamAV tai Suricata kirjoittaa lokit muuhun kuin adm-ryhmään (joskus root:root) — anna pääsy ACL:n kautta:
4. ModSecurity-kääre. WAF:n auditlokin (/var/log/apache2/modsec_audit.log) omistaa root oikeuksin 640, eikä web-käyttäjä voi lukea sitä suoraan. ModSecurity-sivu hakee moottorin tilan, tapahtumat ja aktiivisten sääntöjen listan kiinteän vain luku -skriptin kautta — juuri se on sallittu sudoersissa yllä olevalla rivillä:
Ilman tiedostoa /etc/modsecurity/modsecurity.conf itse WAF ei toimi: paketti asentaa vain modsecurity.conf-recommended, ja sääntömoottori jää pois päältä — ks. käyttöönotto FAQ → ”ModSecurityn asennus”.
Käyttäjän on kaikilla sudoers-riveillä oltava sama kuin FPM-poolin käyttäjä: tavallisessa Apache/Debian-ympäristössä se on www-data, HestiaCP:ssä sivuston pooli toimii sivuston omistajana (esimerkiksi admin) — tarkista grep -E '^user' /etc/php/*/fpm/pool.d/monitor.example.com.conf.
5. Jos Apachen edessä on Nginx (HestiaCP, ISPmanager ja muut paneelit — niissä Nginx välittää PHP:n Apachelle ja tarjoaa staattisen sisällön itse). Palvelinhakemistot on suojattu .htaccess-tiedostoilla, mutta Nginx ei lue niitä: minkä tahansa staattisen tiedoston (.json, .txt, .log, .dat) se tarjoaa suoraan Apachen ohi. Paneelin välimuistit ja data vuotavat ulos — esimerkiksi tmp/modsec_cache.json, jossa on WAF:n tapahtumat ja hyökkääjien IP-osoitteet. Lisää esto Nginxin sivustokonfiguraatioon:
Etuliite ^~ on pakollinen: se valitaan ennen staattisen sisällön säännöllistä lauseketta location /:n sisällä, muuten esto ei toimi.
HestiaCP:ssä sijoita tämä erilliseen tiedostoon /home/<user>/conf/web/<domain>/nginx.ssl.conf_deny (ja nginx.conf_deny HTTP:lle) — sivuston konfiguraatio liittää nginx.ssl.conf_* eikä ylikirjoita tällaisia tiedostoja uudelleenrakennuksessa. Ota käyttöön: sudo nginx -t && sudo systemctl reload nginx.
Tarkistus: curl -s -o /dev/null -w '%{http_code}\n' https://monitor.example.com/tmp/modsec_cache.json — pitää olla 403. Jos Apache toimii ilman Nginxiä (kuuntelee itse 80/443), mitään ei tarvitse lisätä — .htaccess riittää.
Tarkista binäärien polut komennolla which (esimerkiksi which ufw cscli ausearch ss). Muokkaa sudoersia vain visudo:n kautta. Kaikkien MySQL-tietokantojen listaus otetaan käyttöön erillisellä GRANTilla (FAQ → ”Näkyy vain yksi tietokanta”).
14. Pääsyn rajoittaminen IP-osoitteen mukaan
Rajoita pääsyä monitoriin IP-osoitteen mukaan — vaikka URL tulisi tunnetuksi, kirjautumissivu ei aukea. Tämän voi tehdä verkkopalvelimen tasolla (nginx-esimerkki alla) tai itse paneelissa (”Asetukset” → ”Pääsyn rajoittaminen IP-osoitteen mukaan”). Jos käytössäsi on Apache, käytä paneelin rajoitusta.
Jos nginx-sivusto on jo määritetty vaiheen 10 mukaan, älä lisää toistalocation / -lohkoa — kirjoita allow/deny-rivit jo olemassa olevaan lohkoon. Kaksi samaa location / -lohkoa samassa server { } -lohkossa on määritysvirhe, eikä nginx käynnisty uudelleen.
Hallintapaneeli toimii vain HTTPS:n kautta. Kirjautumisistunto käyttää suojattua evästettä, ja WebAuthn (2FA) toimii vain HTTPS:llä. Osoitteella http:// ei voi kirjautua.
Varmenne on ilmainen (Let's Encrypt). Domainin DNS:n täytyy jo osoittaa palvelimelle. Komento riippuu verkkopalvelimesta:
# Apache:
sudo certbot --apache -d monitor.example.com
# nginx — VAIN jos käytössäsi on nimenomaan nginx. Apachella ÄLÄ suorita:
# apt vetää mukanaan nginx:n ja varaa portin 80, konflikti Apachen kanssa.
# sudo apt install python3-certbot-nginx
# sudo certbot --nginx -d monitor.example.com
# certbot lisää HTTPS:n konfiguraatioon ja määrittää automaattisen uusinnan
Mitä certbot kysyy: e-mail → Termsien hyväksyntä (Y) → e-mailin luovutus EFF:lle (oman harkinnan mukaan). Sen jälkeen se hankkii varmenteen, lisää <VirtualHost *:443>, määrittää uudelleenohjauksen http→https ja automaattisen uusinnan.
DNS:n täytyy osoittaa palvelimelle ENNEN certbotin suoritusta (omistuksen tarkistus portin 80 kautta). Tarkistus: dig +short monitor.example.com → palvelimen IP. Portit 80/443 auki: sudo ufw allow 80,443/tcp.
Hankinnan jälkeen: https://monitor.example.com avautuu lukolla, http:// ohjaa osoitteeseen https:// (APP_URL tiedostossa config.php on jo asetettu vaiheessa 12).
16. Kirjautuminen ja alkuasetukset
Avaa https://monitor.example.com, kirjaudu admin / useradmin ja käy läpi tarkistuslista:
Vaihda admin-salasana — valikon kohta ”Käyttäjät”.
Ota WebAuthn (2FA) käyttöön — ”WebAuthn-avaimet” → rekisteröi avain/passkey (vaatii HTTPS:n). Rekisteröi heti kaksi: jos ainoa avain katoaa, sillä ei voi enää kirjautua. Lisätietoja.
Rajaa pääsy IP:n mukaan — ”Asetukset” → ”Pääsyn rajaus IP:n mukaan” (lisää oma IP ennen käyttöönottoa, muuten estät pääsyn itseltäsi).
Syötä lisenssi — aktivoi tililtä saatu koodi ARCIVEO-… omaan verkkotunnukseesi ja liitä avain kohtaan ”Asetukset” → ”Lisenssi”. Lisätietoja.
Määritä ilmoitukset — Telegram ja/tai sähköposti kohdassa ”Asetukset”. Lisätietoja.
Poista asennusohjelmapublic/start_db.php, jos se on jäljellä (vaihe 11).
17. Turvatyökalut (valinnainen)
Paneeli on jo käytössä. Työkalut asennetaan tarpeen mukaan — asennat sen, mitä tarvitset, ja paneeli näyttää tilan heti. Kunkin asennuskomennot löytyvät ohjeesta (omat osiot työkaluittain):
Tämä on Arcivéo Security Monitorin demo vain katselua varten – kaikki muutokset on poistettu käytöstä. Ota se käyttöön omalla palvelimellasi hallitaksesi todellisia tietoturvatietoja.