FAQ

Ez az útmutató az Arcivéo Monitor telepítéséhez, beállításához és karbantartásához. A szakaszok csoportosítva vannak: általános áttekintés, a vezérlőpult telepítése, a biztonsági eszközök csatlakoztatása, beépített modulok és diagnosztika. A parancsok a jobb oldali gombbal másolhatók.

Első lépések

01. A panel telepítése — válasszon módszert

A panel telepítése külön, lépésről lépésre haladó oldalakon található. Válasszon módszert:

Ha bizonytalan, válassza az automatikusat. Ez a kézikönyv marad az egységes forrás az SSL-hez, az eszközökhöz, a cronhoz és a diagnosztikához — a telepítési oldalak ennek szakaszaira hivatkoznak, semmit sem duplikálva.

Áttekintés

02. Mi az Arcivéo Monitor

Arcivéo Monitor — szerverbiztonsági irányítópult. Összegyűjti a telepített eszközök (Fail2ban, UFW, Lynis, ModSecurity, AIDE, ClamAV, Auditd, CrowdSec, Suricata, Falco stb.) adatait, és egységes felületen jeleníti meg őket irányítópulttal, támadási térképpel és eszközönkénti részletes oldalakkal.

A Monitor nem aktív védelmi eszköz — önmagában nem blokkolja a támadásokat. Feladata a már működő eszközök adatainak összegyűjtése és áttekinthető megjelenítése.

03. Hogyan működik a monitor a szerveren

A monitor kizárólag helyben működik — arra a szerverre kell telepíteni, amelyet felügyel. Nincs SSH és nincs távoli API.

Minden parancsot (fail2ban-client, ufw status, ipset list stb.) a panel a webszerver felhasználójának nevében futtat (általában www-data, tárhelypaneleknél a webhely fiókja) szűk jogosultsági körrel a sudo révén — csak az adott segédprogramokra, teljes root-hozzáférés nélkül. Az eredményeket a rendszer feldolgozza és a böngészőben jeleníti meg.

Több szerver esetén telepítse a monitort mindegyikre külön-külön, egyedi domainnel.

04. Hogyan számítjuk ki a biztonsági pontszámot

A pontszám a maximumról indul, és minden feltárt problémáért csökken:

  • Az UFW nem aktív — −30
  • A Fail2ban nem fut (nincs aktív jail) — −25
  • Nincsenek WebAuthn kulcsok — −15
  • Lynis hardening index < 60 — −20; 60–79 — −10
  • Az IPset ipsum nincs betöltve — −10
  • A ClamAV fenyegetéseket talált — −20
  • AIDE fájlváltozások — −15
  • Az SSL lejárt — −30, <14 nap múlva lejár — −15, <30 nap — −5
  • A CrowdSec telepítve van, de nem fut — −5
  • A Suricata telepítve van, de nem fut — −5
  • Adatbázis/gyorsítótár (MySQL, PostgreSQL, Redis…) kívülről elérhető — −10
  • A root SSH-bejelentkezés engedélyezett (PermitRootLogin yes) — −20
  • Telepítésre váró biztonsági frissítések — −5

Eredmény: 80+ = Védett, 60–79 = Figyelem, <60 = Veszélyben.

A ClamAV, AIDE, CrowdSec és Suricata levonásai csak akkor érvényesek, ha az eszköz telepítve van. Az inicializált adatbázis nélküli Lynis és AIDE „nincs adat” állapotot mutat, és nem csökkenti a pontszámot. A mai támadások száma megjelenik a vezérlőpulton, de a biztonsági pontszámot nem befolyásolja.

Beállítások és licenc

05. WebAuthn — kétfaktoros hitelesítés

A WebAuthn jelszó nélküli hitelesítési szabvány hardveres biztonsági kulccsal. Támogatja a YubiKey, Touch ID, Face ID, Windows Hello és Passkey eszközöket.

A jelszavas belépés után a rendszer megerősítést kér a regisztrált kulccsal. Még ha a jelszó ki is szivárog, fizikai kulcs vagy biometria nélkül a belépés lehetetlen.

A beállításhoz nyissa meg a WebAuthn-kulcsok menüpontot az oldalsó menüben, és kattintson a „Kulcs regisztrálása” gombra. Regisztráljon egyből két kulcsot: ha az egyetlen kulcs elveszik vagy elromlik, a panelbe való belépés vele lehetetlenné válik.

A WebAuthn kizárólag HTTPS kapcsolaton működik. HTTP-kapcsolaton a kulcs regisztrálása és a kulccsal való belépés nem érhető el.

06. Értesítések: Telegram és e-mail

A vezérlőpult biztonsági jelentést tud küldeni Telegramra és e-mailre (gombnyomásra és ütemezetten). A beállítás a „Beállítások” szakaszban történik.

Telegram. Szükség van egy bot-tokenre és egy chat id-re:

  1. A Telegramban írjon a @BotFather címre → /newbot → megkapja a 123456:ABC... formátumú tokent.
  2. Írjon egy tetszőleges üzenetet az új botjának (hogy az válaszolni tudjon Önnek).
  3. Tudja meg a chat id-jét: írjon a @userinfobot botnak, vagy nyissa meg a https://api.telegram.org/bot<TOKEN>/getUpdates címet, és keresse meg a "chat":{"id":...} részt.
  4. Illessze be a tokent és a chat id-t a „Beállítások” → Telegram menübe, majd kattintson a „Mentés és tesztküldés” gombra.

E-mail. Két módszer közül választhat a „Beállítások” → E-mail menüben:

  • SMTP — a postafiókja kiszolgálója, portja (465/SSL vagy 587/TLS), felhasználóneve és jelszava;
  • Resend — modern API: adja meg az API-kulcsot (re_...) és a megerősített feladói domaint.
A „Tesztküldés” gomb azonnal ellenőrzi a csatornát. Az automatikus jelentés ütemezése cronnal történik („Összes cron-feladat” szakasz): ez indítja a küldést, a csatornákat pedig a beállításokból veszi.

Jelentés állapota: „FIGYELEM” vagy „OK”. A fejléc csak valós probléma vagy függőben lévő teendő esetén válik „FIGYELEM” állapotúvá: ClamAV-fenyegetést talált, fájlváltozások az AIDE-ban, kritikus Falco-események (Emergency/Alert/Critical az elmúlt 24 órában), leállt szolgáltatás a Monitban, újraindítás szükséges, lejáró SSL (≤14 nap) vagy függőben lévő biztonsági frissítések. A háttérzaj — a botok SSH-próbálkozásai, a fail2ban által kitiltott IP-k, a Suricata-riasztások, a Lynis-figyelmeztetések és a már elhárított ModSecurity-kérések — nem emeli meg az állapotot, ezért az ilyen számok a jelentésben önmagukban nem jelentenek „FIGYELMET”.

07. Licenc – megadás és aktiválás

A részletes felügyeleti modulok (Lynis, UFW, ModSecurity, támadási térkép, AIDE, ClamAV stb.) érvényes licenc esetén nyílnak meg. Enélkül az irányítópult, a beállítások és a fiók működnek, a modulok viszont a „Licenc szükséges” kártyát mutatják.

A fiókban történt vásárlás után rendelkezik egy aktiválási kóddal, amely ARCIVEO-XXXX-XXXX-XXXX-XXXX formájú. Ezt „aktiválni” kell a panel doménjére – ez a kódot egy aláírt licencfájllá alakítja ([license] blokk), amelyet beilleszt a panelbe.

Hogyan aktiválható (3 lépés):

  1. Vegye elő az aktiválási kódot. A my.arciveo.com fiók → „Licencek” / „Licenc aktiválása” szakasz – másolja ki az ARCIVEO-… kódot.
  2. Aktiválja a kódot a saját doménjére. Ugyanott a fiókban nyissa meg a „Licenc aktiválása” menüpontot, és adja meg: az aktiválási kódot, az e-mail-címét és a panel doménjét (azt a címet, amelyen a monitor megnyílik, pl. monitor.example.com). Kattintson az aktiválásra – a rendszer legenerálja az ehhez a doménhez kötött licencfájlt, és megjeleníti egy mezőben a „Másolás” gombbal.
  3. Illessze be a kulcsot a panelbe. Másolja ki a teljes licencszöveget → a panelben nyissa meg a „Beállítások” → „Licenc” blokkot, illessze be, és kattintson a „Mentés” gombra. A modulok azonnal feloldódnak.

A panel kriptográfiailag ellenőrzi a kulcsot: az aláírást, a doménhez kötést és az érvényességi időt.

Az aktiváláskor megadott doménnek pontosan meg kell egyeznie a panel címével. Vegye ki a config.php APP_URL konstansából, és csak a gazdanevet adja meg – https:// és www előtag nélkül. Az aktiválás egyszeri: a kód a megadott doménhez tartozó licenccé alakul, és nem aktiválható újra – hibás domén esetén a kulcs nem illik a paneléhez, a kód pedig elhasználódik. Ezért figyelmesen adja meg a doment.
Ha az érvényesség lejárt vagy megváltozott a domén, a panel fejlécében figyelmeztetés jelenik meg. A licenc véglegesen a doménhez kötődik, és nem vihető át másik doménre: új időszakhoz vagy új doménhez új kulcs szükséges (a fiókban vásárolható meg és egyszer aktiválható).

08. A config.php fájl — a panel összes beállítása

A panel összes fő paramétere egyetlen config.php fájlban van megadva a gyökérben (a public/ mappa mellett), egyszerű define() konstansokkal. A fájl a telepítéskor jön létre; kézi szerkesztésre ritkán van szükség — főként domainváltáskor, átköltöztetéskor vagy másik adatbázishoz való csatlakozáskor. Bármilyen módosítás után indítsa újra a PHP-FPM-et (különben az OPcache miatt a változások nem lépnek életbe).

Írja be saját értékeit a kiemelt helyekre; a többit hagyja úgy, ahogy van:

// --- Adatbázis --- define('DB_HOST', 'localhost'); // hagyja define('DB_NAME', 'db_name'); // amit az adatbázis létrehozásakor megadott define('DB_USER', 'user'); // amit az adatbázis létrehozásakor megadott define('DB_PASS', 'db_password'); // amit az adatbázis létrehozásakor megadott define('DB_CHARSET', 'utf8mb4'); // hagyja // --- Alkalmazás --- define('APP_URL', 'https://monitor.example.com'); // a panel címe, záró perjel nélkül define('TIMEZONE', 'Europe/Budapest'); // az Ön időzónája // --- Munkamenet ideje --- define('SESSION_LIFETIME', 28800); // tétlenség az újbóli belépésig, mp (28800 = 8 ó)

Adatbázis. A MySQL/MariaDB kapcsolat adatai:

  • DB_HOST — az adatbázis-kezelő hosztja, szinte mindig localhost;
  • DB_NAME — a panel adatbázisának neve;
  • DB_USER — az adatbázis felhasználója (csak a saját adatbázisához fér hozzá);
  • DB_PASS — ennek a felhasználónak a jelszava;
  • DB_CHARSET — a kapcsolat kódolása, hagyja utf8mb4 értéken.

Alkalmazás.

  • APP_URL — a panel teljes címe (pl. https://monitor.example.com). Egyeznie kell azzal a domainnel, amelyre a licencet aktiválták — különben a rendszer elutasítja a kulcsot (lásd a „Licenc” szakaszt);
  • TIMEZONE — a PHP időzónája: csak arra hat, ahogyan a panel a dátumokat és az időt megjeleníti. A cron-feladatok indítási idejére nincs hatással — ott a rendszer időzónája érvényes (lásd „Az összes cron-feladat”).

Munkamenet ideje. A SESSION_LIFETIME a munkamenet tétlenségi időkorlátja másodpercben (gördülő: aktivitáskor frissül). Alapértelmezetten 28800 = 8 óra; ennyi tétlenség után a panel újbóli belépést kér. Például 3600 = 1 óra, 86400 = egy nap.

Hibanaplózás. A hibák soha nem jelennek meg a látogatóknak, hanem a logs/php_errors.log fájlba íródnak — ezek az „Alkalmazásnaplók” oldalon láthatók. Ezeket a sorokat (display_errors=0, log_errors=1, az error_log útvonala) általában nem kell módosítani — a beállítások közvetlenül a fájlban vannak megadva, és nem függenek a php.ini fájltól.

A config.php titkos fájl. Tartalmazza az adatbázis jelszavát. A panel gyökerében található (a public/ mellett), és ennél a panelnél a webgyökér (DocumentRoot) éppen a panel gyökere, nem a public/. Maga a fájl nem „szivárog ki”: a gyökér .htaccess fájljában explicit tiltás van rá (Require all denied) — a szerver 403 választ ad. E szabály nélkül sem szivárogna ki a forráskód: ez PHP — a szerver végrehajtja, nem szövegként adja vissza. A biztonság kedvéért: ne tegye közzé nyilvános tárolókban, és ne küldje el a támogatásnak valós jelszóval. A fájl jogosultsága — 640.
Átköltöztetéskor vagy a hozzáférés visszaállításakor ez a fájl a hitelesítő adatok fő forrása: az adatbázis neve, a felhasználó és a jelszó éppen innen származik (lásd „A panel frissítése és átköltöztetése” és „A hozzáférés visszaállítása” szakaszokat).

Biztonsági eszközök

09. UFW tűzfal

Az UFW (Uncomplicated Firewall) egyszerű felület az nftables/iptables felé. Az összes bejövő portot lezárja, kivéve a kifejezetten engedélyezetteket. Az „UFW tűzfal” oldal mutatja az állapotot és a szabályokat.

sudo apt install ufw # SSH engedélyezése (kötelezően a bekapcsolás ELŐTT!) és web sudo ufw allow OpenSSH sudo ufw allow 80,443/tcp # Adatbázis lezárása kívülről (hozzáférés csak helyileg) sudo ufw deny 3306 # Bekapcsolás és ellenőrzés sudo ufw enable sudo ufw status verbose
Az ufw enable előtt feltétlenül engedélyezze az SSH-t (ufw allow OpenSSH), különben elveszíti a hozzáférést a szerverhez.
A „külső kitettség” az irányítópulton figyelembe veszi az UFW-t: a deny szabállyal lezárt port nem számít kívülről elérhetőnek.
A Skipping adding existing rule nem hiba. Az UFW így jelzi, hogy pontosan ilyen szabály már létezik, és nem adja hozzá ismételten. Az automatikus beállítás újbóli futtatásakor (amely idempotens) ez normál üzenet — nem kell reagálni rá.

10. A Fail2ban telepítése

Automatikusan blokkolja az IP-címet a sikertelen bejelentkezési kísérletek számának túllépése után. Elemzi az SSH, nginx, Apache és más szolgáltatások naplóit.

sudo apt install fail2ban sudo systemctl enable --now fail2ban # Állapot ellenőrzése: sudo fail2ban-client status
A működő konfiguráció (jail.local több tucat jaillel és az ipsum-alapú automatikus tiltással) a következő szakaszban található.

11. Működő Fail2ban + ipsum konfiguráció

Az alaptelepítés fent található. Itt a működő konfiguráció, amely több tucat aktív jailt és több ezer tiltást eredményez: általános beállítások, kulcsfontosságú jailek és a rosszindulatú IP-k automatikus tiltása az ipsum listából.

A /etc/fail2ban/jail.local fájl — általános beállítások és a legfontosabb jailek:

[DEFAULT] bantime = 1w findtime = 900 maxretry = 3 backend = systemd banaction = nftables-multiport ignoreip = 127.0.0.1/8 ::1 <YOUR_IP> <TRUSTED_NETS> # Progresszív tiltás: minden ismétlés hosszabb bantime.increment = true bantime.factor = 2 bantime.maxtime = 5w bantime.rndtime = 300 [sshd] enabled = true maxretry = 5 bantime = -1 # végleges tiltás SSH brute force esetén findtime = 3600 # Visszaesők: akit többször tiltottak — véglegesen tiltva [recidive] enabled = true logpath = /var/log/fail2ban.log banaction = %(banaction_allports)s bantime = -1 findtime = 86400 maxretry = 2 [http-get-dos] enabled = true maxretry = 100 findtime = 300 bantime = 1w # Webszolgáltatások (apache-*, nginx-*, php-url-fopen, phpmyadmin-syslog): [nginx-http-auth] enabled = true port = http,https [apache-badbots] enabled = true port = http,https # … és a többi szolgáltatás jailje (dovecot, exim, postfix-sasl, # mysqld-auth, vsftpd, portscan, pam-generic) — enabled = true
Az ignoreip mezőbe feltétlenül írja be saját IP-jét és a megbízható hálózatokat, különben saját magát is kitilthatja. A módosítások után: sudo fail2ban-client reload.

Az ipsum tiltólista automatikus betöltése a root cronba (sudo crontab -e): a level 1 (100+ ezer IP) betöltődik az ipsum halmazba, amelyet a tűzfal szűr (részletek a „IPset tiltólista” szakaszban):

# 04:00 — az ipset ipsum frissítése (level 1, maximális lefedettség): 0 4 * * * /usr/local/bin/load-ipsum.sh >> /path/to/monitor/logs/cron.log 2>&1
A halmaz neve kötelezően ipsum legyen — pontosan ezt olvassa be a dashboard (az „IPset ipsum” kártya). Szintek: levels/1.txt — maximális lefedettség, levels/3.txt — pontosabb (3+ forrás).

Miért van a „Biztonsági monitor” két zónára osztva. A védelem két szinten működik, és a dashboard nem keveri őket:

  • Valós támadások (reaktív) — mindaz, amit a fail2ban elkapott: élő betörési kísérletek (a sshd, apache-*, nginx-* stb. jailek) és a rosszindulatú visszaesők (a recidive jail — akiket már többször tiltottak). Ezek olyan IP-k, amelyek ténylegesen betörni próbáltak Önhöz — ott vannak a támadási térképen és az „Idővonalon”.
  • Megelőző tiltás (proaktív) — az ismert rosszindulatú IP-k nyilvános ipset ipsum tiltólistája, amelyet a tűzfal szűr le a DROP szabállyal. Ezek a címek többségükben nem is érintették a szerverét — előre le vannak tiltva; az „IPset ipsum” számláló mutatja, mennyit szűrt meg megelőző jelleggel.

A különbség egyszerű: a reaktív — „ezek támadtak és tiltást kaptak”, a megelőző — „ezeket még a kísérlet előtt letiltottuk”. Korábban a recidive-be mesterségesen betöltötték az ipsum list-3-at (innen ered a régi „listás recidive” felosztás); most a recidive már csak a valódi visszaesőket tartalmazza, a megelőzés pedig teljes egészében a tűzfalon van.

12. IPset blokklista (ipsum)

ipsum — nyilvános, naponta frissülő lista a rosszindulatú IP-címekről. A Monitor a betöltött címek számát mutatja a vezérlőpulton és a támadási térképen, és beszámítja a biztonsági pontszámba (−10, ha a lista nincs betöltve).

fail2ban nélküli minimális megoldás — külön ipsum lista iptables-alapú blokkolással:

# Lista létrehozása (egyszer): sudo ipset create ipsum hash:ip # Frissítő szkript /usr/local/bin/update-ipsum.sh: #!/bin/bash ipset flush ipsum for ip in $(curl -s https://raw.githubusercontent.com/stamparm/ipsum/master/levels/3.txt); do ipset add ipsum "$ip" 2>/dev/null done iptables -C INPUT -m set --match-set ipsum src -j DROP 2>/dev/null \ || iptables -I INPUT -m set --match-set ipsum src -j DROP # Cron (sudo crontab -e, naponta 4:00-kor): 0 4 * * * /usr/local/bin/update-ipsum.sh
A fail2ban-recidive-vel bővített megoldás a „Működő Fail2ban + ipsum konfiguráció” szakaszban található.
Az ipset a memóriában él, és újraindításkor elveszik. A pusztán napi cron a lista tartalmát üresen hagyja az újraindítástól a következő futásig (a vezérlőpult 0-t mutat). Töltse be a listát induláskor is — tegye a betöltést szkriptbe, és kösse a @reboot eseményhez. Egyúttal a create … -exist parancs beállítja a maxelem 300000 korlátot (az alapértelmezett 65536 mellett a level 1 nem fér el, „Hash is full” hibát kapna):
# /usr/local/bin/load-ipsum.sh #!/bin/bash curl -s https://raw.githubusercontent.com/stamparm/ipsum/master/levels/1.txt \ | grep -v '^#' | sed 's/^/add ipsum /' \ | (echo "create ipsum hash:ip hashsize 131072 maxelem 300000 -exist"; echo "flush ipsum"; cat) \ | ipset restore -exist # sudo crontab -e — naponta 04:00-kor ÉS minden induláskor: 0 4 * * * /usr/local/bin/load-ipsum.sh @reboot sleep 60 && /usr/local/bin/load-ipsum.sh
Hogyan működik automatikus telepítéskor. A szkript betölti a teljes level 1 listát (100+ ezer IP) az ipsum listába, és ha a tűzfalat a telepítő kezeli (friss VPS — „Teljes”/„Könnyített” profilok), egy DROP szabállyal csatolja a listát a UFW-hez — ezekről az IP-címekről a forgalom ténylegesen blokkolódik. A szabály az ESTABLISHED,RELATED után áll, ezért a meglévő kapcsolatok (köztük az Ön SSH-ja) nem szakadnak meg — csak a listán szereplő új kapcsolatok tiltódnak. A lista az ipsum-load.service szolgáltatás indulásakor áll helyre, a tűzfal előtt (különben a UFW nem indulna el), és a cron 04:00-kor frissíti. Egy már beállított szerveren (panel, saját tűzfal) a telepítő nem nyúl a tűzfalhoz — ott az ipsum a vezérlőpult és a támadási térkép listája marad, a DROP szabály pedig igény szerint kézzel adható hozzá (a minimális megoldás az iptables … --match-set ipsum … -j DROP-pal — feljebb). Automatikus telepítéskor kézzel semmit sem kell tenni.

13. A CrowdSec telepítése

A Fail2ban modern helyettesítője kollektív threat intelligence funkcióval: közösségi bannok és saját szabályok. A bannok tűzfalra alkalmazásához külön bouncer szükséges.

curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash sudo apt install crowdsec sudo systemctl enable --now crowdsec # Bouncer az iptables/nftables számára: sudo apt install crowdsec-firewall-bouncer-iptables # Állapot ellenőrzése: sudo systemctl status crowdsec sudo cscli decisions list sudo cscli bouncers list
„Nincs elindítva” állapot a panelen = a szolgáltatás telepítve van, de a szolgáltatás nem aktív (a monitor a systemctl is-active crowdsec paranccsal ellenőrzi). Indítás: sudo systemctl enable --now crowdsec; hiba esetén nézze meg: sudo journalctl -u crowdsec -n 30. Ugyanez érvényes minden „Nincs elindítva” állapotú szolgáltatásra (Suricata, Falco, Monit, MySQL).
„0 forgatókönyv” vagy „0 bouncer” a dashboardon. A CrowdSec alapból szinte üresen érkezik — gyűjtemények nélkül semmit sem észlel, regisztrált bouncer nélkül pedig a bannok nem érvényesülnek a tűzfalon. Telepítse az alap gyűjteményeket, és győződjön meg róla, hogy a bouncer szerepel a listában:
# Alap gyűjtemények (Linux + SSH + webszerver): sudo cscli collections install crowdsecurity/linux crowdsecurity/sshd crowdsecurity/base-http-scenarios sudo systemctl reload crowdsec # A bouncernek szerepelnie kell a listában, aktív kapcsolat állapottal: sudo cscli bouncers list
A bouncer naplójában stream halted / a bannok nem érvényesülnek. Ez egy árva api-kulcs: a bouncert eltávolították a cscli bouncers list listából, de a régi kulcsa megmaradt itt: /etc/crowdsec/bouncers/*.yaml. Regisztrálja újra a bouncert, és írja be a friss kulcsot:
sudo cscli bouncers add fw-bouncer # kiírja az új api_key értéket # írja be ezt a kulcsot az api_key: mezőbe itt: /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml sudo systemctl restart crowdsec-firewall-bouncer
Az automatikus telepítés („Teljes védelem” profil) magától feltelepíti a gyűjteményeket és regisztrálja a firewall-bouncert — kézzel erre csak manuális telepítéskor vagy a CrowdSec kézi módosítása után van szükség.

14. AIDE telepítése

Az AIDE (Advanced Intrusion Detection Environment) pillanatképet készít a fájlrendszerről, és minden ellenőrzéskor jelzi a változásokat a /etc, /bin, /usr könyvtárakban. Telepítés után kötelező az adatbázis inicializálása (aideinit).

sudo apt install aide # Az adatbázis inicializálása (5–15 perc): sudo aideinit sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db # Ubuntu 24.04: a /var/lib/aide könyvtár 700 módban jön létre (tulajdonos _aide), # és a panel (www-data) nem látja az adatbázist → „Nincs inicializálva” jelenik meg. # Nyissa meg a könyvtárat átjárásra (az adatbázisfájlok 600-asak maradnak): sudo chmod 755 /var/lib/aide # Első ellenőrzés a monitor által olvasott naplóba ÍRÁSSAL. # Ubuntu/Debian alatt az aide explicit --config kapcsolót igényel (különben „missing configuration”; # az aide.wrapper bináris az újabb verziókban nem érhető el): sudo bash -c 'aide --config /etc/aide/aide.conf --check > /var/log/aide/aide.log 2>&1'
Az aideinit során a terminál 5–15 percig a Running aide --init... soron áll — ez normális (az egész fájlrendszer hasítása, lemezterhelés). Ne szakítsa meg Ctrl+C-vel. Ha a folyamat „lóg”, de semmit sem ír ki, lehet, hogy egy rejtett Overwrite existing aide.db.new [Yn]? kérdésre vár választ (nyomja meg a Y billentyűt). Az aktivitás egy másik munkamenetből ellenőrizhető: pgrep -af aide.
aideinit hiba: „21_aide_spamassassin … printf: invalid number” (return code 20) — az AIDE konfigurációs kódrészletének ismert hibája Ubuntu 22.04 alatt. Az adatbázis nem jön létre. Vegye ki a hibás kódrészletet, majd próbálja újra:
sudo mv /etc/aide/aide.conf.d/21_aide_spamassassin /etc/aide/21_aide_spamassassin.disabled sudo aideinit sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
Állapotok az irányítópulton. „Nincs inicializálva” = a panel nem látja az adatbázisfájlt: vagy nem futott az aideinit, vagy (Ubuntu 24.04) a /var/lib/aide könyvtár 700 módban jött létre és a www-data számára elérhetetlen — ezt a sudo chmod 755 /var/lib/aide orvosolja (lásd a fenti blokkot). „Nem volt ellenőrzés” = az adatbázis megvan, de ellenőrzés még nem futott — ez nem hiba. Az eredményeket a monitor a /var/log/aide/aide.log fájlból olvassa.
Rendszeres ellenőrzés → napló a panel számára. Az alapértelmezett /etc/cron.daily/aide az újabb Ubuntu/Debian rendszereken lehet, hogy nem a megfelelő formában írja a /var/log/aide/aide.log fájlt (és az aide.wrapper sincs már meg bennük). Megbízhatóbb saját cron-bejegyzést hozzáadni explicit --config kapcsolóval — ez root által, 644 módban írja a naplót, és a monitor további csoportok nélkül olvassa:
# sudo crontab -e — napi ellenőrzés 02:00-kor: 0 2 * * * /usr/bin/aide --config /etc/aide/aide.conf --check > /var/log/aide/aide.log 2>&1 # Futtatás most, az ütemezés bevárása nélkül: sudo bash -c 'aide --config /etc/aide/aide.conf --check > /var/log/aide/aide.log 2>&1'
Az automatikus telepítés már mindezt elvégzi: chmod 755 /var/lib/aide és a 02:00-kor futó ellenőrző cron — kézzel semmit sem kell tennie.
Az első inicializálást tiszta szerveren végezze — a webalkalmazások telepítése előtt. Jogszerű változtatások után hozza létre újra az adatbázist: sudo aideinit && sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db.

15. ClamAV telepítése

Víruskereső Linuxra. Különösen hasznos a /var/www ellenőrzéséhez PHP-shellek és kártékony kód után.

sudo apt install clamav clamav-daemon sudo systemctl enable --now clamav-daemon # Szignatúra-adatbázis frissítése: sudo freshclam # Mappa kézi vizsgálata: sudo clamscan -r /var/www --infected
A clamd démon „Inaktív” állapotot mutat az enable --now után? Három tipikus ok:

1. A konfigban benne maradt az Example sor — a clamd nem indul el, amíg ott van:

sudo sed -i '/^Example/d' /etc/clamav/clamd.conf sudo systemctl restart clamav-daemon

2. Nincs letöltve a szignatúra-adatbázis — a clamd nélküle nem indul el:

sudo systemctl stop clamav-freshclam sudo freshclam sudo systemctl start clamav-freshclam sudo systemctl restart clamav-daemon

3. Egyszerűen csak betölt — a clamd 30–60 mp alatt tölti be a ~8 millió szignatúrát a memóriába. Várjon, majd ellenőrizze: systemctl is-active clamav-daemon (az activating állapot → még tölt).

Diagnosztika: sudo journalctl -u clamav-daemon -n 30 --no-pager.
A vezérlőpulton „Ellenőrzött fájlok: 0” / „Utolsó vizsgálat: —” látható? A clamd démon csak a memóriában tartja a szignatúrákat, magától ütemezetten semmit sem vizsgál. A panel az ütemezett vizsgálat eredményeit mutatja, ezért kell egy cron, amely vizsgál és naplóz. Az automatikus telepítő elhelyezi a /usr/local/bin/clamav-scan.sh burkolót és egy cront 01:30-ra — az első futás után feltöltődik az „Ellenőrzött fájlok” és az „Utolsó vizsgálat” érték. Azonnali indítás az ütemezés bevárása nélkül: sudo /usr/local/bin/clamav-scan.sh.

16. A Linux Malware Detect (maldet) telepítése

Linux Malware Detect (LMD) – webes fenyegetésekre szabott kártevőkereső: PHP-shellek, webes backdoorok, letöltők. A ClamAV motorját használja, és saját szignatúrákkal egészíti ki.

wget https://www.rfxn.com/downloads/maldetect-current.tar.gz tar -xzf maldetect-current.tar.gz dir=$(ls -d maldetect-*/ | head -1) && cd "$dir" && sudo bash install.sh && cd ~ rm -rf maldetect-* maldetect-current.tar.gz # Szignatúrák frissítése: sudo maldet -u # A /var/www vizsgálata: sudo maldet -a /var/www
Az LMD és a ClamAV jól kiegészíti egymást. Legutóbbi jelentés: maldet --report.
A telepítés során megjelenhet az update-rc.d: error: unable to read /etc/init.d/maldet sor – ez ártalmatlan. A maldet nem használja az init.d-t, a szignatúrafrissítés és a vizsgálatok a /etc/cron.daily/maldet révén futnak. Ha lentebb látható az installation completed, akkor minden települt.
Az oldalon az szerepel, hogy az LMD „Nincs telepítve”, pedig telepítve van? A maldet nem apt révén települ, hanem a /usr/local/maldetect könyvtárba, és bekapcsolt open_basedir esetén a megléte a shellen keresztül ellenőrizhető – lásd „Az oldal üres, pedig az adatok megvannak a szerveren” szakaszt.

17. A Suricata telepítése

Hálózati behatolásérzékelő rendszer: csomagszinten elemzi a forgalmat, és több ezer támadási szignatúrát ismer. Kiegészíti a ModSecurity-t (az HTTP-szinten működik, a Suricata pedig TCP/IP-szinten).

sudo add-apt-repository ppa:oisf/suricata-stable sudo apt update && sudo apt install suricata # Aktuális szabályok letöltése: sudo suricata-update sudo systemctl enable --now suricata
A Suricata „Aktív”, de a panel nem mutat riasztásokat / az események száma 0? A Suricata a /var/log/suricata/eve.json fájlt root alatt írja, a könyvtár 750-es jogosultsággal, így a webszerver (www-data) nem tudja olvasni. Nyissa meg a könyvtárat átjárásra – a benne lévő fájlok védettek maradnak:
sudo chmod o+rx /var/log/suricata
Az automatikus telepítés ezt magától elvégzi – kézzel nem szükséges.

18. A Falco telepítése

eBPF/kernel module segítségével elfogja a rendszerhívásokat, és valós időben észleli az anomáliákat: shell az nginxből, a /etc/passwd olvasása webes folyamat által, írás a /bin könyvtárba stb.

curl -fsSL https://falco.org/repo/falcosecurity-packages.asc > /tmp/falco.asc gpg --dearmor < /tmp/falco.asc | sudo tee /usr/share/keyrings/falco-archive-keyring.gpg > /dev/null sudo chmod 644 /usr/share/keyrings/falco-archive-keyring.gpg && rm /tmp/falco.asc echo "deb [signed-by=/usr/share/keyrings/falco-archive-keyring.gpg] https://download.falco.org/packages/deb stable main" \ | sudo tee /etc/apt/sources.list.d/falcosecurity.list sudo apt update && sudo apt install falco sudo systemctl enable --now falco
A Monitor a journalctl -u falco paranccsal olvassa a Falco eseményeit (sudo nélkül — a systemd-journal csoporton keresztül). Győződjön meg róla, hogy a www-data tagja ennek a csoportnak — lásd a „sudo beállítása” pontot (2. lépés) a kézi telepítés oldalán.
A „0 esemény 24 óra alatt” normális állapot, nem hiba. A Falco eseményvezérelt: hallgat, amíg minden rendben van, és csak anomália esetén ír eseményt (shell webes folyamatból, a /etc/passwd olvasása, írás a rendszerkönyvtárakba). A nulla kritikus esemény napi szinten egy nyugodt szerveren egészséges állapot.
A panelhez megbízhatóbb a fájlkimenet. A journalctl olvasásához naplójogosultság kell; hogy a panel stabilan lássa az eseményeket, az automatikus telepítés bekapcsolja a Falco file_output beállítását → /var/log/falco/falco.log, és a szolgáltatáshoz beállítja az UMask=0022 értéket (a naplót a webszerver is olvashatja). Új telepítésnél ezt kézzel nem kell beállítani.

19. A ModSecurity (WAF) telepítése

A ModSecurity egy webalkalmazás-tűzfal (WAF) Apache vagy Nginx alá. Alkalmazásszinten blokkolja a támadásokat: SQL-injekciók, XSS, útvonalbejárás, szkennerek.

# Apache: sudo apt install libapache2-mod-security2 sudo a2enmod security2 # OWASP Core Rule Set szabálykészlet: sudo apt install modsecurity-crs # KÖTELEZŐ: e fájl nélkül a szabálymotor kikapcsolt állapotban van sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf sudo sed -i 's/^SecRuleEngine DetectionOnly/SecRuleEngine On/' /etc/modsecurity/modsecurity.conf sudo apache2ctl configtest && sudo systemctl reload apache2 # Ellenőrzés: 403-at kell visszaadnia curl -s -o /dev/null -w '%{http_code}\n' "https://monitor.example.com/?id=1%20UNION%20SELECT%201,2--"
Önmagában a csomag telepítése semmit sem véd. Az Apache az IncludeOptional /etc/modsecurity/*.conf sorral tölti be a konfigokat, a csomag viszont csak a modsecurity.conf-recommended fájlt helyezi el — ez nem esik a *.conf maszk alá. Ha nem másolja át a modsecurity.conf fájlba, a SecRuleEngine Off marad: a modul betöltődik, a CRS-szabályok betöltődnek, de a forgalom nem kerül ellenőrzésre, és auditnapló sem jön létre. A köztes DetectionOnly mód csak naplózza az eseményeket, a kéréseket nem blokkolja — a felület ezt sárgával jelzi.

A felület hozzáférése az auditnaplóhoz. A /var/log/apache2/modsec_audit.log napló a root tulajdona (640-es jogosultság), a webes felhasználó nem tudja olvasni. A felület egy burkolón keresztül veszi az adatokat — hozza létre ezt:

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 # az /etc/sudoers.d/monitor fájlban (a felhasználó = amelyik alatt a PHP-FPM fut): # www-data ALL=(ALL) NOPASSWD: /usr/local/bin/monitor-modsec
A burkoló az utolsó, behúzás nélküli SecRuleEngine direktívát veszi: a behúzott sorok <LocationMatch>/<Directory> blokkokon belül vannak (például a WAF kikapcsolása phpMyAdminhoz), és nem határozzák meg a globális módot.
A sudoers-beli felhasználónak egyeznie kell az FPM-pool felhasználójával: normál Apache/Debian rendszeren ez a www-data, HestiaCP-ben a webhely poolja a webhely tulajdonosa alatt fut (például admin) — ellenőrizze a grep -E '^user' /etc/php/*/fpm/pool.d/monitor.example.com.conf paranccsal.
Ha a webhely Nginx-proxy mögött áll (HestiaCP), az Apache magát a proxyt látja kliensként — a felület a támadó valós IP-címét az X-Forwarded-For fejlécből veszi. A statisztikába csak a szabály általi találatot okozó tranzakciók kerülnek: a SecAuditLogRelevantStatus direktíva minden 4xx/5xx választ az auditnaplóba ír, ezért oda a hétköznapi 403/500-as válaszok is bekerülnek — ezeket a felület nem tekinti WAF-eseménynek.
A ---RULES--- blokkra a „Minden aktív szabály” szakasznak van szüksége — a felület nem csak a találatot okozó, hanem az összes betöltött CRS-szabályt + az egyénieket is megjeleníti. A for f in … ciklus három útvonala a CRS-szabályok és a helyi kiegészítések tipikus helye; ha Önnél más az elrendezés (a csomag a saját könyvtárába telepíti a fájlokat, vagy az egyéni szabályok nem a /etc/modsecurity/custom-rules.conf fájlban vannak), keresse meg a valós útvonalakat a sudo grep -rl 'IncludeOptional\|^Include ' /etc/apache2/mods-enabled/security2.conf /etc/apache2/conf-enabled/*.conf 2>/dev/null paranccsal, és illessze be őket a listába. Ha a burkoló régi (e szakasz nélküli) — a szakasz csak egy „nem elérhető” figyelmeztetést jelenít meg, az oldal többi része a korábbiak szerint működik.

20. Az Auditd telepítése

Az Auditd (Linux Audit Daemon) kernelszinten rögzíti a rendszerhívásokat: be- és kijelentkezéseket, sudo-parancsokat, sikertelen hitelesítési kísérleteket, fájlmódosításokat. A Monitor megjeleníti a mai bejelentkezéseket, a sikertelen kísérleteket és a sudo-parancsokat.

sudo apt install auditd audispd-plugins sudo systemctl enable --now auditd # Állapot és események ellenőrzése: sudo systemctl status auditd sudo ausearch -m USER_LOGIN -ts today
A Monitor az ausearch paranccsal (/usr/sbin/ausearch) olvassa az eseményeket, szükség esetén pedig a /var/log/audit/audit.log fájlból a tail paranccsal. Mindkettőnek szerepelnie kell a sudoers fájlban.

21. A Monit telepítése

Figyeli a szolgáltatásokat (nginx, php-fpm, mysql stb.), és leállás esetén újraindítja őket. E-mailben tud riasztásokat küldeni.

sudo apt install monit sudo systemctl enable --now monit # Konfigurációk: sudo nano /etc/monit/monitrc ls /etc/monit/conf.d/
A monitor a monit status paranccsal kéri le a szolgáltatások listáját. A /etc/monit/monitrc fájlban engedélyezve kell lennie a HTTP-felületnek (a set httpd blokk allow localhost beállítással), különben a monit status hibát ad vissza.
A dashboardon „0 megfigyelt szolgáltatás” látható? Két oka lehet. (1) A HTTP-felület ki van kapcsolva — a monitrc fájlban a set httpd sor ki van kommentelve (alapból # set httpd port 2812 … formában). Vegye ki a blokkot a kommentből, és engedélyezze a localhostot. (2) A bekapcsolt httpd önmagában semmit sem figyel — a Monit csak azt veszi számításba, amit check-stanzák írnak le; ezek nélkül a lista akkor is üres, ha a felület működik. Minimális működő konfiguráció:
# /etc/monit/conf.d/00-httpd — HTTP-felület a localhosthoz: set httpd port 2812 use address localhost allow localhost # check-stanzák példái (mit figyeljen): check process sshd with pidfile /run/sshd.pid start program = "/usr/bin/systemctl start ssh" stop program = "/usr/bin/systemctl stop ssh" check filesystem rootfs with path / if space usage > 90% then alert
sudo monit -t # szintaxis ellenőrzése (Control file syntax OK) sudo systemctl reload monit sudo monit status
Az automatikus telepítés kész conf.d fájlt helyez el a 2812-es porton figyelő httpd-vel és egy sor ellenőrzéssel — új telepítésnél nem kell kézzel beállítani.
A szolgáltatás „Hibás” állapotú? A monitor csak megjeleníti az állapotot, és szándékosan nem indítja újra a szolgáltatásokat a webes felületről (ez a biztonsági panelben távoli root-parancsvégrehajtást jelentene). A diagnosztika és az újraindítás SSH-n keresztül, a Monittal történik:
sudo monit status <service> # a hiba oka sudo monit restart <service> # újraindítás a Moniton keresztül # ha a Monit nem indítja el a szolgáltatást — nézze meg a saját unitját: sudo systemctl status <unit> --no-pager sudo journalctl -u <unit> -n 50 --no-pager

22. A PSAD telepítése (portszkennelés-észlelés)

A PSAD az iptables naplóját elemzi, és felismeri a portszkennelést és a hálózati támadásokat, minden forráshoz veszélyszintet (1–5) rendelve. Kiegészíti a fail2bant és a Suricatát.

sudo apt install psad # A PSAD az iptables naplóját olvassa — engedélyezni kell a naplózást (az UFW ezt magától megteszi). # Tiszta iptables esetén adjon LOG szabályokat az INPUT/FORWARD láncokhoz. sudo psad --sig-update sudo systemctl enable --now psad
A Monitor a psad --Status parancson keresztül olvassa be az adatokat (szükséges a sudoersben). Az iptables naplózása nélkül az oldal üres lesz — ez normális, amíg nem történt szkennelés.

23. AppArmor / SELinux (hozzáférés-vezérlés)

A Mandatory Access Control korlátozza, hogy egy program mely fájlokhoz és erőforrásokhoz férhet hozzá, még akkor is, ha feltörték. Az Ubuntu/Debian rendszereken alapértelmezésben az AppArmor működik (általában már telepítve és aktív).

# AppArmor (Ubuntu/Debian): sudo apt install apparmor apparmor-utils sudo systemctl enable --now apparmor sudo aa-status # profilok ellenőrzése
A monitor az aa-status parancson keresztül olvassa az állapotot (sudoersben kell lennie). Megjeleníti az enforce/complain módú profilok számát és a profil nélküli folyamatokat.

A „betöltött profilok” száma nagyobb, mint az enforce + complain — ez normális. Az AppArmor 4.x-ben (Ubuntu 24.04 és újabb) megjelent az unconfined mód: a profil be van töltve a kernelbe, de semmit sem korlátoz. Az Ubuntu így jelöl meg több tucat profilt olyan programoknál, amelyek user namespace-eket használnak (böngészők, torrentkliensek és hasonlók). Ha vannak ilyen profilok, a „betöltött profilok” kártya borostyánszínűvé válik, és megjeleníti a számukat — például unconfined: 90 a 120 betöltöttből, amiből 26 enforce módú. Ténylegesen csak az enforce módú profilok védenek; az Ubuntu 22.04-en (AppArmor 3.x) ez a mód nincs, és a számok mindig egyeznek.

sudo aa-status | grep -E "profiles are" # bontás módok szerint sudo aa-enforce /etc/apparmor.d/profile-name # profil enforce módba állítása
Azokat a profilokat, amelyeket az Ubuntu szándékosan hagyott unconfined állapotban, csak tudatosan érdemes enforce módba állítani: nem tévedésből vannak kikapcsolva, hanem mert különben az adott programok működése megszakad. A complain módú profilok más eset: ott a szabályok már meg vannak írva, csak nem érvényesülnek.

24. A debsums telepítése (csomagintegritás)

A debsums ellenőrzi, hogy a telepített csomagok fájljai egyeznek-e a tárolóból származó ellenőrzőösszegekkel — felderíti a kicserélt rendszerbinárisokat (kiegészíti az AIDE-ot). A teljes ellenőrzés 1–2 percig tart, ezért cron futtatja, a felület pedig a data/debsums/debsums.log fájlból olvassa be az eredményt, és maga sorolja kategóriákba (csak a binárisok és a könyvtárak fontosak).

A feladat a root cronba kerül (sudo crontab -e). A kész debsums-scan.sh burkoló a /usr/local/bin/ mappába kerül (chmod +x; lásd a cron-feladatok összegzését), és maga írja a jelentést a felület data/debsums/ mappájába.

sudo apt install debsums # Cron-sor (naponta 4:30-kor): 30 4 * * * /usr/local/bin/debsums-scan.sh >> /path/to/monitor/logs/cron.log 2>&1

A debsums-scan.sh burkoló maga megtalálja a felület data/ mappáját — az útvonalat nem kell megadni.

A szerveren az /etc/ (konfigurációk) és a /usr/share/ (erőforrások) módosításai általában normálisak — a felület külön színnel jelöli őket. A binárisok és könyvtárak módosításai riasztóak (/bin, /sbin, /usr/lib stb.) — a „Binárisok / könyvtárak” kártya éppen ezeket mutatja.

25. Lynis-jelentések beállítása

A Lynis kézzel vagy cron segítségével indítható. A jelentést a projekt data/lynis/ mappájába kell menteni — a monitor a lynis-report.dat fájlt olvassa.

# Egyszeri futtatás (adja meg a panel gyökeréhez vezető saját útvonalát): sudo lynis audit system --report-file /path/to/monitor/data/lynis/lynis-report.dat # Napi audit — cron-sor (kész lynis-scan.sh burkoló a /usr/local/bin/ alatt, lásd az összefoglalót): 0 3 * * * /usr/local/bin/lynis-scan.sh >> /path/to/monitor/logs/cron.log 2>&1
Az első futtatás után a „Lynis audit” oldal azonnal megjeleníti a hardening indexet, a figyelmeztetéseket és az ajánlásokat.
Az „Audit indítása” gomb a Lynis oldalon. Ez a háttérben futtatja a lynis-scan.sh parancsfájlt közvetlenül a panelről (a cronra nem várva): megjeleníti a „Vizsgálat…” állapotot, és a végén magától frissíti a jelentést. Ehhez a webes felhasználónak sudoers-sorra van szüksége a szkript futtatásához — a telepítő ezt automatikusan hozzáadja a /etc/sudoers.d/monitor fájlhoz. Ha a panelt kézzel/korábban telepítette, egészítse ki azzal a felhasználóval, amely már szerepel a fájlban:
u=$(sudo awk '/NOPASSWD/ && !/lynis-scan/ {print $1; exit}' /etc/sudoers.d/monitor) [ -n "$u" ] && echo "$u ALL=(ALL) NOPASSWD: /usr/local/bin/lynis-scan.sh" | sudo tee -a /etc/sudoers.d/monitor sudo visudo -c && sudo chmod 440 /etc/sudoers.d/monitor

26. A Logwatch-jelentések beállítása

A Logwatch mentse a napi jelentéseket a projekt data/logwatch/ mappájába .txt formátumban. A monitor megjeleníti a legutóbbi jelentést és az archívumot.

# Naponta (6:00) — cron-sor (kész logwatch_daily.sh wrapper a /usr/local/bin/ mappában, lásd az összefoglalót): 0 6 * * * /usr/local/bin/logwatch_daily.sh >> /path/to/monitor/logs/cron.log 2>&1

Vezérlőpult moduljai

27. Hálózati monitor (beépített)

A hálózati monitor nem igényel telepítést — ez a vezérlőpult beépített oldala. A szerver hálózati állapotát helyi forrásokból jeleníti meg:

  • interfészek és forgalom — a /proc/net/dev alapján;
  • a linkek állapota (UP/DOWN) és IP — az ip segítségével;
  • kapcsolatok és figyelő portok — az ss segítségével;
  • a kernel hálózati eseményei 24 óra alatt — a journalctl -k segítségével.

Az első három forrás sudo nélkül működik, ezért az interfészek, a forgalom, a kapcsolatok és a portok azonnal láthatók. A „Kernelesemények” blokk a journalctl -k parancsot használja — ez a systemd-journal csoporton keresztül olvasható („A sudo beállítása”, 2. pont), sudo nem szükséges. Ellenőrizze, hogy minden elérhető-e a webes felhasználó számára:

# Ellenőrzés www-data néven (a PHP ez alatt fut): sudo -u www-data bash -c 'cat /proc/net/dev' sudo -u www-data bash -c 'ip -o link show' sudo -u www-data bash -c 'ss -s' sudo -u www-data journalctl -k --no-pager -n 5
A „Hálózati kernelesemények” blokk a kernel hálózati verem eseményeit jeleníti meg (link fel/le váltása, vivőjel-hibák, „network unreachable”). A tűzfal UFW BLOCK bejegyzései nem kerülnek ide — ezek a „UFW tűzfal” és a „Támadási térkép” oldalakon vannak. Az üres blokk zöld pipával = a nap folyamán nem volt hálózati hiba.

28. Lemez és SMART

A beépített oldal három dolgot mutat:

  • Fájlrendszerek — a partíciók telítettsége (df); a sáv ≥90%-nál pirosra vált;
  • Tárolók — a lemezek listája (lsblk), csak a valósak (a loop/snap rejtve van);
  • Állapot (SMART) — a lemez állapota és attribútumai (smartctl).

A tárhely és az eszközlista beállítás nélkül, azonnal működik. A SMART-hoz a smartmontools csomag szükséges. A webes folyamatnak nincs közvetlen hozzáférése a lemezes eszközökhöz, ezért a SMART-adatokat cron útján a data/disk/smart.txt fájlba gyűjti, a dashboard pedig azt olvassa be.

A feladat a root-cronba kerül (sudo crontab -e). A kész smart-scan.sh burkoló a /usr/local/bin/ könyvtárba kerül (chmod +x; lásd a cron-feladatok összefoglalóját), és maga ír a dashboard data/disk/ könyvtárába.

sudo apt install smartmontools # Cron-sor (30 percenként): */30 * * * * /usr/local/bin/smart-scan.sh >> /path/to/monitor/logs/cron.log 2>&1

A smart-scan.sh burkoló maga megtalálja a dashboard data/ könyvtárát — az útvonalat nem kell megadni. Belül az lsblk -e7,11 kizárja a loop/cdrom eszközöket.

Virtuális lemezeken (QEMU/KVM és hasonlók) általában csak az összesített „állapot: OK” státusz érhető el, a hőmérséklet, az üzemidő és az újraleképezett szektorok viszont üresek lehetnek — ez normális. Fizikai szerveren minden attribútum megjelenik.

29. Teljesítmény (CPU/RAM/hálózat/lemez)

Az oldal a szerver terhelésének előzményeit mutatja az elmúlt 24 órára — Load Average, CPU-kihasználtság és I/O-várakozás, RAM/Swap, hálózati forgalom (fogadás/küldés), lemez I/O (olvasás/írás), lemez- és inode-telítettség, nyitott fájlleírók és MySQL-kapcsolatok, továbbá az aktuális TCP-kapcsolatok és folyamatok száma.

Az adatokat a cron/collect_metrics.php gyűjti — 5 percenként egy „nyers” pillanatképet ír a számlálókról (/proc/loadavg, /proc/meminfo, /proc/stat, /proc/net/dev, /proc/diskstats, df/df -i, /proc/sys/fs/file-nr, SHOW GLOBAL STATUS LIKE 'Threads_connected') az adatbázis system_metrics táblájába; a százalékokat és sebességeket az oldal maga számolja a szomszédos pillanatképek különbségéből (a lemez-/inode-/fájlleíró-telítettség és a MySQL-kapcsolatok pillanatnyi értékek, átszámítás nélkül). Sudo nem szükséges — a források root jogosultság nélkül olvashatók. A 24 óránál régebbi pontok minden íráskor automatikusan törlődnek.

# Cron-sor (5 percenként): */5 * * * * /usr/local/bin/collect-metrics-all.sh >> /path/to/monitor/logs/cron.log 2>&1

A collect-metrics-all.sh csomagoló (lásd a cron-feladatok összefoglalóját) maga megtalálja a szerveren telepített összes panelpéldányt, és mindegyik cron/collect_metrics.php fájlját a webhely tulajdonosának nevében futtatja.

Amíg a gyűjtő legalább kétszer le nem futott (a telepítés utáni első ~10 perc), az oldal „az adatok gyűjtése folyamatban” üzenetet mutat — a grafikonokhoz legalább egy szomszédos pontpár kell a sebességek és százalékok kiszámításához.

Terhelési riasztások („Beállítások” → „Terhelési riasztások” szakasz) — a CPU/RAM/lemez/inode küszöb túllépésekor a panel értesítést küld Telegramra/e-mailre (ugyanazok a csatornák, mint a napi jelentésnél — a riasztásokhoz nem kell külön bekapcsolni őket), és egy továbbit akkor, amikor a metrika visszatért a normál tartományba. A küszöb tartása alatt nem küld ismételten spam-et: a következő értesítés csak a „helyreállt → újra túllépte” ciklus után érkezik.

A küszöböket ugyanaz a collect_metrics.php ellenőrzi minden futtatáskor (5 percenként) — külön cron nem szükséges. A „már értesítettünk / még nem” állapot a data/alerts_state.json fájlban tárolódik, a küszöbök pedig a panel beállításaiban.

30. Támadási térkép (GeoIP)

A „Támadási térkép” oldal a geoiplookup paranccsal állapítja meg az országot az IP alapján. A GeoIP csomag nélkül az országok nem ismerhetők fel, és a pontok nem jelennek meg a térképen:

sudo apt install geoip-bin geoip-database # Ellenőrzés: geoiplookup 8.8.8.8
Sudo nem szükséges — a /usr/share/GeoIP/GeoIP.dat adatbázist bárki olvashatja, az eredmények a tmp/geoip_cache.json fájlba kerülnek gyorsítótárba. Maga a térkép (Leaflet + OpenStreetMap csempék) a böngészőben töltődik be — internet szükséges azon a számítógépen, ahol a vezérlőpult meg van nyitva.

31. Külső kitettség, frissítések és automatikus frissítések

Két beépített irányítópult-kártya, amely nem az eszköz „be/ki” állapotát mutatja, hanem a szerver tényleges védettségét. Nem igényelnek telepítést, helyben, sudo nélkül olvashatók.

Külső kitettség — hány szolgáltatás figyel minden interfészen (0.0.0.0/[::]), és érhető el kívülről. Pirossal jelzi, ha adatbázis vagy gyorsítótár lóg ki kifelé (MySQL, PostgreSQL, Redis, MongoDB, Memcached, Elasticsearch) — ez közvetlen rés (−10 a Biztonsági pontszámhoz). Forrás: ss -tuln.

Ha a kártya piros — zárja el az adatbázist a külvilág elől: kösse a 127.0.0.1 címhez (bind-address a MySQL/PostgreSQL konfigban, bind 127.0.0.1 a Redisben), vagy zárja le a portot az UFW-ben.
A „nyitott port” ≠ „kívülről elérhető”. A 127.0.0.1 (loopback) címen figyelő szolgáltatás csak magának a szervernek látszik — kívülről nem érhető el, még ha a port „nyitva” is van. Ezért biztonságos a 25-ös porton loopbackhez kötött Postfix: az automatikus beállítás beállítja az inet_interfaces = loopback-only értéket (plusz a semleges smtpd_banner — ezzel megszűnik a Lynis MAIL-8818 figyelmeztetése a verzió felfedéséről). A „Külső kitettség” kártya csak azt számítja kifelé nyitottnak, ami a 0.0.0.0/[::] címen figyel; a loopback-szolgáltatások nem kerülnek oda.
Lynis MAIL-8818 kézzel (ha saját kezűleg telepítette a levelezést): a /etc/postfix/main.cf fájlban állítsa be az smtpd_banner = $myhostname ESMTP (verzió és OS nélkül) és az inet_interfaces = loopback-only értéket, majd sudo systemctl restart postfix.

Biztonsági frissítések — hány biztonsági javítás vár telepítésre, és szükséges-e újraindítás a kernelfrissítés után (−5 a Biztonsági pontszámhoz, ha vannak javítások). Forrás: /usr/lib/update-notifier/apt-check, a /var/run/reboot-required fájl. Részletes lista a „Biztonsági frissítések” oldalon.

# Frissítések telepítése: sudo apt update && sudo apt upgrade # Ellenőrizze, mi figyel kifelé: ss -tuln | grep -E '0\.0\.0\.0|\[::\]'
A frissítési kártya Ubuntu/Debian rendszeren működik (update-notifier-common). Ha az apt-check hiányzik — a monitor az apt-get -s upgrade paranccsal számolja a javításokat.

Automatikus biztonsági frissítések (unattended-upgrades) — a „Biztonsági frissítések” oldalon külön kártya mutatja, hogy be van-e kapcsolva a biztonsági javítások automatikus telepítése, és mikor futott le utoljára. Sudo nem szükséges — az állapot az apt-config dump paranccsal olvasható.

sudo apt install unattended-upgrades sudo dpkg-reconfigure -plow unattended-upgrades # bekapcsolás # Ellenőrizze, hogy be van-e kapcsolva: apt-config dump | grep Unattended-Upgrade

Karbantartás

32. Biztonsági mentés

A biztonsági mentés a legfőbb védelem: az adatvesztés minden feltörésnél súlyosabb. Két dologra van szükség — a szerver/webhelyek mentése és külön a vezérlőpult adatbázisának mentése (itt vannak a felhasználók, a WebAuthn-kulcsok, a beállítások és a licenc).

A változat — HestiaCP: a felhasználó Backup lapja → mentéskészítő gomb (vagy ütemezetten a szerverbeállításokban). A mentés tartalmazza a webhelyeket és azok adatbázisait.

B változat — kézzel (cron): adatbázis-dump + a vezérlőpult data/ könyvtárának archívuma:

# root-cron (sudo crontab -e) — napi mentés 2:30-kor (írja be a saját neveit/útvonalait): 30 2 * * * mysqldump -u root MY_DB | gzip > /var/backups/monitor-db-$(date +\%F).sql.gz 40 2 * * * tar czf /var/backups/monitor-data-$(date +\%F).tar.gz -C /path/to/monitor data # A 14 napnál régebbi archívumok törlése: 0 3 * * * find /var/backups -name 'monitor-*' -mtime +14 -delete
Az ugyanazon a szerveren tárolt mentés megvéd a hibáktól, de a szerver elvesztésétől nem. Másolja az archívumokat külső tárhelyre (másik szerver, S3, rclone felhőbe). Ellenőrizze, hogy a visszaállítás valóban működik-e.

33. A panel frissítése és áthelyezése

Frissítés új verzióra. Először készítsen biztonsági mentést. Ezután töltse fel újra a kódfájlokat, megőrizve az adatait:

  • felülírandó (kód): public/, includes/, assets/, cron/, database/, valamint a gyökérben lévő .htaccess (a front controller — az útválasztást nem szabad a régi verzióból meghagyni), manifest.json, sw.js;
  • ne érintse: config.php (adatbázis-adatok), data/ (jelentések), logs/, tmp/ (munkamenetek és gyorsítótár).
# Feltöltés után — a PHP-gyorsítótár ürítése (ha az opcache be van kapcsolva): sudo systemctl reload php*-fpm
A FileZilla ezt írja: SSH_FX_PERMISSION_DENIEDPermission denied. A panel fájljai a www-data tulajdonában vannak (a telepítéskor így lettek beállítva), miközben az SFTP-kliens a saját felhasználójával csatlakozik, amelynek nincs írási joga. Ha az egész panelt a www-data-nak adja „hogy működjön”, épp az vezet ehhez a hibához; alább három módszer, mindegyik megoldja a problémát.
# A változat (ajánlott) — a tulajdonosok szétválasztása: a kód az öné, a munkakönyvtárak a webszerveré. # A webszerver egyáltalán nem kap írási jogot a panel KÓDJÁHOZ: sudo chown -R deploy:www-data /path/to/monitor sudo chown -R www-data:www-data /path/to/monitor/data /path/to/monitor/tmp /path/to/monitor/logs sudo find /path/to/monitor -type d -exec chmod 755 {} \; sudo find /path/to/monitor -type f -exec chmod 644 {} \; sudo chmod 750 /path/to/monitor/data /path/to/monitor/tmp /path/to/monitor/logs sudo chmod 640 /path/to/monitor/config.php # B változat — ACL a jelenlegi tulajdonosok fölött (semmit nem helyezünk át): sudo apt install -y acl sudo setfacl -R -m u:deploy:rwX /path/to/monitor sudo setfacl -R -d -m u:deploy:rwX /path/to/monitor # C változat — a www-data csoporton keresztül. Egyszerűbb, de a panel fájljaira # a webszerver is írási jogot kap (PHP-sebezhetőségnél a kód lecserélhető): sudo usermod -aG www-data deploy sudo find /path/to/monitor -type d -exec chmod 2775 {} \; sudo find /path/to/monitor -type f -exec chmod 664 {} \; sudo chmod 640 /path/to/monitor/config.php sudo chmod 2750 /path/to/monitor/data /path/to/monitor/tmp /path/to/monitor/logs
Miért biztonságos az A változat. A panel csak három könyvtárba ír — data/ (jelentések), tmp/ (munkamenetek és gyorsítótár), logs/; ezek a www-data-nál maradnak. A többi kód, és a webszervernek csak olvasásra van rá szüksége, amit a www-data csoport 644 jogosultsággal biztosít. Mellékhaszon: PHP-sebezhetőség esetén a panel fájljai már nem írhatók felül. Hosting-paneleken (HestiaCP és hasonlók) az A változat nem szükséges: ott a webhely fájljai amúgy is ahhoz a fiókhoz tartoznak, amellyel SFTP-n bejelentkezik, a webszerver pedig csoport alapján olvassa őket.
A B változat csapdája: a fájlokon végrehajtott bármely későbbi chmod visszaállítja az ACL-maszkot, és a hozzáférés csendben megszűnik. Ha a „jogosultságok rendbetétele” után a feltöltés ismét Permission denied hibába ütközik — futtassa le újra mindkét setfacl parancsot.
A C változatban a 2-es bit a setgid: az SFTP-n feltöltött fájlok a www-data csoportban maradnak, különben a panel nem tudja felülírni őket. A C változat után csatlakozzon újra a FileZillában — az új csoport csak új bejelentkezéskor lép életbe. Ellenőrzés: id deploy (meg kell jelennie a www-data csoportnak) és ls -ld /path/to/monitor (drwxrwsr-x — az s betű azt jelenti, hogy a setgid be van állítva).

Áthelyezés másik szerverre:

  1. Az új szerveren állítsa fel a webhelyet + HTTPS (lásd a kézi telepítés oldalát).
  2. Másolja át a panel összes fájlját a config.php és data/ mellett.
  3. Helyezze át az adatbázist: mysqldump a régin → importálás az újon; javítsa az adatbázis-adatokat a config.php fájlban.
  4. Ismételje meg az új szerveren: sudoers, az adm csoporttagság, cron-feladatok.
  5. A licenc a domainhez van kötve — ha a domain ugyanaz, a kulcs továbbra is működni fog.

34. Hozzáférés visszaállítása (elveszett kulcs, jelszó, IP-tiltás)

Ha nem tud bejelentkezni, minden közvetlenül az adatbázisban javítható a szerverről. Nyissa meg az adatbázist (a neve a config.php fájlból):

sudo mysql MY_DB

Elveszett WebAuthn kulcs (a második faktor nem sikerül) – kapcsolja ki a 2FA-t, jelentkezzen be jelszóval, majd regisztráljon új kulcsot:

UPDATE users SET webauthn_enabled = 0;

Elfelejtett jelszó – állítson be új hasht (generálja a szerveren, és illessze be):

# Az új jelszó hashének generálása: php -r "echo password_hash('NEW_PASSWORD', PASSWORD_BCRYPT), \"\n\";" # Az adatbázisban (illessze be a kapott hasht): # UPDATE users SET password = '$2y$10$...' WHERE username = 'admin';

Kizárta magát az IP-szűrővel – kapcsolja ki a korlátozást:

UPDATE settings SET value = '0' WHERE name = 'ip_restriction_enabled';
Az adatbázis mindig elérhető: sudo mysql a szerveren, vagy a phpMyAdmin / a tárhely vezérlőpultjának adatbázis-szakasza. A visszaállítás után kapcsolja be újra a WebAuthn-t és az IP-szűrőt.

35. Az összes cron-feladat egy helyen

A feladatok összesítése a szerver root cron-jában van (a sudo crontab -e paranccsal adhatók hozzá). Csak azoknak az eszközöknek a sorait hagyja meg, amelyeket használ; az útvonalakat igazítsa a saját szerveréhez.

# A monitor szerveroldali cron-ja (root) — írja be ezzel: sudo crontab -e # 01:30 — ClamAV vizsgálat a veszélyes útvonalakon (web, home, temp) → a „Fájl ellenőrizve” és „Utolsó vizsgálat” kártyák 30 1 * * * /usr/local/bin/clamav-scan.sh >> /path/to/monitor/logs/cron.log 2>&1 # 02:00 — AIDE fájlintegritás-ellenőrzés (explicit --config szükséges) 0 2 * * * /usr/bin/aide --config /etc/aide/aide.conf --check > /var/log/aide/aide.log 2>&1 # induláskor — a /var/lib/aide jogosultságainak helyreállítása (a csomag tmpfiles-fájlja, # az aide-common.conf 0700-ra állítja, és a panel többé nem látja az adatbázist) @reboot chmod 755 /var/lib/aide # 03:00 — Lynis biztonsági audit 0 3 * * * /usr/local/bin/lynis-scan.sh >> /path/to/monitor/logs/cron.log 2>&1 # 04:00 — az ipsum blokklista frissítése (level 1) 0 4 * * * /usr/local/bin/load-ipsum.sh >> /path/to/monitor/logs/cron.log 2>&1 # az ipsum halmazt induláskor az ipsum-load.service szolgáltatás emeli be (a tűzfal ELŐTT, különben # az UFW nem látja a halmazt a before.rules-ban) — ez nem cron. Itt csak a fenti napi frissítés van. # 06:00 — Logwatch jelentés 0 6 * * * /usr/local/bin/logwatch_daily.sh >> /path/to/monitor/logs/cron.log 2>&1 # 30 percenként — SMART lemezellenőrzés */30 * * * * /usr/local/bin/smart-scan.sh >> /path/to/monitor/logs/cron.log 2>&1 # 04:30 — debsums csomagintegritás 30 4 * * * /usr/local/bin/debsums-scan.sh >> /path/to/monitor/logs/cron.log 2>&1 # 08:00 — ütemezett jelentés e-mailre és Telegramra 0 8 * * * /usr/local/bin/daily-report-all.sh >> /path/to/monitor/logs/cron.log 2>&1 # óránként — a csomaglisták frissítése (a „Biztonsági frissítések” kártyához) 0 * * * * /usr/bin/apt-get update -qq >/dev/null 2>&1 # 5 percenként — erőforrás-pillanatkép (CPU/RAM/hálózat/lemez) a „Teljesítmény” oldalhoz */5 * * * * /usr/local/bin/collect-metrics-all.sh >> /path/to/monitor/logs/cron.log 2>&1
Az egyes elemek részleteit a megfelelő szakaszok tartalmazzák. A mentési feladatok (előző szakasz) ugyanebbe a cronba kerülnek. A módosítások után ellenőrizze: sudo crontab -l és hogy a cron-szolgáltatás aktív-e.
A cron időzítése = a szerver időzónája, nem a config.php-beli TIMEZONE. A TIMEZONE konstans csak a PHP-t érinti (ahogy a panel a dátumokat megjeleníti), de a cron-démon az operációs rendszer rendszeridejéhez igazítva futtatja a feladatokat. Ha a szerver időzónája nem egyezik az Önével, a „08:00”-s jelentés nem a megfelelő időben érkezik. Példa: a szerver másik időzónában áll (Europe/London, UTC+1), Ön viszont Budapesten (UTC+2) → a „08:00”-s jelentés az Ön ideje szerint 09:00-kor érkezik. Ellenőrizze, és szükség esetén igazítsa a rendszer időzónáját a sajátjához:
# A szerver jelenlegi időzónájának ellenőrzése: timedatectl # A saját időzóna beállítása (példa) és a cron újraindítása: sudo timedatectl set-timezone Europe/Budapest sudo systemctl restart cron
Ezután a 0 8 * * * sor a helyi idő szerint 08:00-kor fut le. Egyébként magát a cront kellene eltolni, de a téli/nyári időszámításra váltáskor az eltolás ismét elcsúszna — ezért helyesebb a rendszer időzónáját beállítani.
Kész burkoló szkriptek. Ezek működő másolatai és egy crontab-minta (crontab.txt) a projekt melletti system/ mappában találhatók, a public_html-en kívül. Ez nem része a webhelynek — a webgyökérbe nem kell feltölteni; helyezze el a szerveren a rendszerútvonalakon (mint a fenti crontabban):
  • lynis-scan.sh/usr/local/bin/ (chmod +x) — futtatja a lynis audit system-et, a vizsgálat idejére kihelyezi a /tmp/lynis-running jelzőt, és a lynis-report.dat-ot a panel data/lynis/ mappájába másolja;
  • logwatch_daily.sh/usr/local/bin/ (chmod +x) — napi Logwatch jelentést készít (sshd, fail2ban, sudo, postfix) a data/logwatch/ mappába;
  • smart-scan.sh/usr/local/bin/ (chmod +x) — rögzíti a lemezek állapotát (smartctl) a data/disk/ mappába;
  • debsums-scan.sh/usr/local/bin/ (chmod +x) — ellenőrzi a csomagok integritását (debsums) a data/debsums/ mappába;
  • clamav-scan.sh/usr/local/bin/ (chmod +x) — ClamAV víruskeresés a veszélyes útvonalakon (web, home, temp); az összesítést a /var/log/clamav/scan.log-ba írja, ahonnan a ClamAV oldal beolvassa (a fenti crontab 01:30-as sora);
  • load-ipsum.sh/usr/local/bin/ (chmod +x) — helyben frissíti az ipsum ipset halmazt (level 1), anélkül hogy megtörné az aktív tűzfalszabályokat (a 04:00 sor a fenti crontabban);
  • daily-report-all.sh/usr/local/bin/ (chmod +x) — a panel cron/daily_report.php jelentését futtatja (a fenti crontab 08:00-as sora);
  • daily_report.php — már a panel része (cron/daily_report.php), a daily-report-all.sh-n keresztül fut, külön nem kell telepíteni;
  • collect-metrics-all.sh/usr/local/bin/ (chmod +x) — a panel cron/collect_metrics.php-ját futtatja („Teljesítmény” oldal, a fenti crontab */5 sora); a collect_metrics.php már a panel része, külön nem kell telepíteni;
  • crontab.txt (system/cron/) — feladatminta; a szükséges sorokat a sudo crontab -e paranccsal írja be.
A crontabban szereplő szkriptútvonalnak egyeznie kell azzal, ahová a szkriptet elhelyezte.
Hogyan helyezze a szkriptet a /usr/local/bin/ mappába. Közvetlenül a FileZillából nem lehet oda írni — a könyvtár a root tulajdonában van, és az SFTP-kliens SSH_FX_PERMISSION_DENIED hibát kap. A sorrend a következő: először töltse fel a fájlt a /tmp mappába (oda mindenki írhat), majd egyetlen paranccsal helyezze át a helyére:
# a FileZillában: a „Távoli hely” mezőbe írja be a /tmp-t, és töltse fel oda a szkriptet, # majd SSH-n át (az install rögtön beállítja a tulajdonost és a jogokat, a chown/chmod nem kell): sudo install -o root -g root -m 755 /tmp/lynis-scan.sh /usr/local/bin/lynis-scan.sh rm -f /tmp/lynis-scan.sh # ellenőrzés: a fájl a helyén van, a jogok rwxr-xr-x, a szintaxis ép bash -n /usr/local/bin/lynis-scan.sh && ls -l /usr/local/bin/lynis-scan.sh
Ne keverje össze a könyvtárakat: a szerver gyökerében lévő /tmp kell — nem a /var/tmp és nem a panelen belüli tmp/ (utóbbi a www-data tulajdonában van, és zárva van az Ön felhasználója elől). A FileZilla fájlfájában a /tmp egy felső szintű ág, a var mellett, nem azon belül.
Automatikus beállítással telepítette a szervert? Ezeket a burkolókat és cron-feladataikat a szkript már telepítette (a /usr/local/bin/-ba, a napló a /var/log/arciveo-cron.log) — kézzel nincs teendő.
Hol keresik a szkriptek a panelt. A burkolók doménsemlegesek: a panel telepítéseit a /home/*/web/*/public_html és a /var/www/* végigjárásával találják meg, és a jelentéseket ezek data/ mappájába teszik. Ha a panel más útvonalon van — adja hozzá a szkriptekben lévő for app in … sorhoz, különben a Lynis/SMART/debsums/Logwatch jelentések nem jutnak be a panelbe.
cron.log és hozzáférési jogok. A logs/cron.log fájlt elsőként a root cron hozza létre — így az a root tulajdonába kerül, és a panel „Cron napló” lapja sem olvasni, sem törölni nem tudja majd. Hozza létre a fájlt előre a webfelhasználó nevében (a webhely könyvtárának tulajdonosa; HestiaCP esetén ez egy fiók, pl. admin) — így a root cron már csak hozzáír, nem változtatja meg a tulajdonost:
# előre létrehozás a webfelhasználó nevében (a cron-sorok hozzáadása előtt): sudo -u OWNER touch /path/to/monitor/logs/cron.log # ha a cron.log-ot már a root cron létrehozta — adja át a webfelhasználónak: sudo chown OWNER:OWNER /path/to/monitor/logs/cron.log sudo chmod 644 /path/to/monitor/logs/cron.log
A könyvtár tulajdonosának lekérdezése: stat -c %U /path/to/monitor.
Kezelés a panelből. A „Rendszer” szakaszban van egy „Crontab” oldal — SSH nélkül is megtekinthetők és hozzáadhatók a feladatok. A panel csak az általa hozzáadott feladatokat szerkeszti (külön blokk a root-crontabban, szolgáltatási megjegyzésekkel jelölve); minden, ami már a crontabban áll (a fenti lista), ott csak olvasható „Egyéb szerverfeladatok” listaként jelenik meg, „Másolás a szerkesztőbe” gombbal — ez csak az ütemezést/parancsot viszi át a hozzáadó űrlapba, az eredeti sort nem érinti. Ha egy meglévő feladatot a panel kezelése alá szeretne „helyezni” — másolja a szerkesztőbe, mentse el, majd a régi sort kézzel törölje (sudo crontab -e), különben kétszer fut le.
Egyszeri beállítás a szerveren. Az oldalnak egy privilegizált burkoló szkriptre van szüksége — nem a csupasz sudo crontab-ra (ez közvetlen root-jogosultság-emelés lenne bárki számára, aki hozzáfér a panel munkamenetéhez), hanem egy szűk, két parancsból (list/set) álló szkriptre, amely csak a saját blokkját érinti a szolgáltatási megjegyzések között. Telepítse egyszer:
sudo install -m 0755 -o root -g root /dev/stdin /usr/local/sbin/arciveo-cron <<'ARCIVEO_CRON_EOF' #!/bin/bash set -euo pipefail BEGIN='# >>> ARCIVEO-CRON-MANAGED (edited from the panel; do not edit by hand) >>>' END='# <<< ARCIVEO-CRON-MANAGED <<<' cmd=${1:-} case "$cmd" in list) [ "$#" -eq 1 ] || { echo "usage: ${0##*/} list" >&2; exit 2; } crontab -l -u root 2>/dev/null || true ;; set) [ "$#" -eq 1 ] || { echo "usage: ${0##*/} set (body on stdin)" >&2; exit 2; } body=$(cat) if grep -qF "$BEGIN" <<<"$body" || grep -qF "$END" <<<"$body"; then echo "invalid body: markers not allowed" >&2; exit 2 fi current=$(crontab -l -u root 2>/dev/null || true) tmp=$(mktemp); trap 'rm -f "$tmp"' EXIT { if grep -qF "$BEGIN" <<<"$current"; then awk -v b="$BEGIN" '{print} $0==b{exit}' <<<"$current" else [ -n "$current" ] && printf '%s\n' "$current" echo "$BEGIN" fi printf '%s\n' "$body" echo "$END" if grep -qF "$END" <<<"$current"; then awk -v e="$END" 'f{print} $0==e{f=1}' <<<"$current" fi } > "$tmp" crontab -u root "$tmp" ;; *) echo "usage: ${0##*/} <list|set>" >&2; exit 2 ;; esac ARCIVEO_CRON_EOF echo "www-data ALL=(ALL) NOPASSWD: /usr/local/sbin/arciveo-cron" | sudo tee -a /etc/sudoers.d/monitor sudo visudo -c
A webfelhasználó eltérhet a www-data-tól — ellenőrizze, milyen felhasználóval fut a webhely PHP-FPM készlete (ps -o user= -C php-fpm), és azt írja be a sudoers-sorba.
Az új fájl nem a megfelelő tulajdonossal töltődött fel — az oldal „Access denied.” választ ad. Ha a public/crontab_monitor.php fájlt FTP/SFTP-n keresztül más rendszerfelhasználóval (például root) töltötte fel, mint a webhely többi fájlját, a webszerver nem tudja majd elolvasni. Vesse össze a tulajdonost és a jogokat a szomszédos fájllal, és hozza összhangba:
ls -la public/crontab_monitor.php public/ssl_monitor.php sudo chown OWNER:OWNER public/crontab_monitor.php sudo chmod 644 public/crontab_monitor.php

Diagnosztika

36. Az eszköz telepítve van, de „Nincs telepítve” jelenik meg

A Monitor a dpkg-query – az APT csomagadatbázisa – segítségével észleli az eszközök meglétét. Ha egy eszközt nem az apt révén telepítettek (kézzel, snap-ből vagy forrásból), a dpkg nem látja azt.

# Ellenőrzés dpkg-vel: dpkg -l fail2ban | grep '^ii' dpkg -l auditd | grep '^ii' # A bináris fájl elérési útjának megkeresése: which ufw fail2ban-client auditctl # sudo teszt www-data felhasználóként: sudo -u www-data sudo fail2ban-client status sudo -u www-data sudo ufw status verbose

37. Hibaelhárítás (500, nincs adat)

500-as hiba — ellenőrizze a PHP, az nginx és maga a monitor naplóit:

tail -50 /var/log/nginx/error.log tail -50 /var/log/php*-fpm.log # A monitor naplói: tail -50 logs/monitor_$(date +%Y-%m-%d).log # Mappajogosultságok: ls -la data/ tmp/ logs/
A vezérlőpult tárhelypanelen fut (HestiaCP, ISPmanager, cPanel)? Ott a PHP nem a www-data alatt fut, hanem a felhasználói fiók alatt (például admin — a webhely könyvtárának tulajdonosa). Minden sudo-szabályt és csoporttagságot (adm, systemd-journal) erre a felhasználóra kell beállítani, különben a modulok „Nem aktív / 0” állapotot mutatnak, miközben a szolgáltatások futnak. A PHP valódi felhasználójának lekérdezése: ps -o user= -C php-fpm | sort -u, vagy a webhely könyvtárának tulajdonosa: stat -c '%U' /path/to/monitor. Az alábbi parancsokban ezt írja be a www-data helyett. Az automatikus telepítő maga ismeri fel a webfelhasználót, és a sudoers-t rá állítja be.

Az adatok nem jelennek meg — szinte mindig a be nem állított sudo-jogosultságok az ok. Ellenőrizze az adott parancsot a webfelhasználó nevében (cserélje a www-data-t a sajátjára). A -n kapcsoló = jelszó nélkül, ahogy a PHP is — ha jelszót kér, akkor nincs rá szabály a sudoers-ben:

sudo -u www-data sudo -n fail2ban-client status sudo -u www-data sudo -n ufw status verbose sudo -u www-data sudo -n ipset list -t ipsum sudo -u www-data sudo -n /usr/sbin/ausearch -m USER_LOGIN -ts today sudo -u www-data sudo -n /usr/sbin/aa-status sudo -u www-data sudo -n /usr/sbin/psad --Status sudo -u www-data journalctl -u falco --no-pager -n 5
A modul „Nem aktív” / „0” állapotot ír, pedig az eszköz működik (például a sudo aa-status a terminálban profilokat mutat, az „AppArmor” oldal viszont „Nem aktív”). Ok: a webfelhasználónak nincs sudo-joga ezen modul parancsához. Ellenőrizze a fenti listából: ha jelszót kér — adja hozzá a hiányzó sort a /etc/sudoers.d/monitor fájlhoz („A sudo beállítása”). Gyakori „új” parancsok: /usr/sbin/aa-status (MAC), /usr/sbin/psad --Status (PSAD).
Ha egy adott oldal (Falco, ModSecurity, Auditd, nyitott UFW-portok) üres — vesse össze a sudóról szóló szakasz listájával: valószínűleg nincs engedélyezve az apache2ctl, ausearch, aa-status vagy ss, illetve a webfelhasználó nem tagja az adm/systemd-journal csoportoknak (innen olvassa a rendszer a fail2ban/auth/modsec naplókat és a journalctl-t — Falco és kernelesemények).

38. Az oldal üres, pedig a szerveren vannak adatok

Tünet: a szerveren vannak adatok (shellen keresztül láthatók), az oldal viszont „nincs adat” üzenetet vagy hibás állapotot mutat — például az AIDE azt írja, hogy „Nincs inicializálva”, pedig az adatbázis létre lett hozva.

Az ok az open_basedir: sok panel és tárhely a domain könyvtárára korlátozza a PHP-FPM pool-t, ezért a file_exists(), file_get_contents(), filemtime() PHP-függvények a rendszerútvonalakon (/var/lib/aide, /var/log, /proc…) blokkolódnak. A monitor ezt úgy kerüli meg, hogy az ilyen útvonalakat szabványos rendszerparancsokkal (cat, test, stat) olvassa.

# Látszik-e a fájl shellen keresztül (így olvassa a monitor): sudo -u www-data bash -lc 'test -e /var/lib/aide/aide.db && echo VISIBLE || echo NO' # Az open_basedir aktuális értéke a domain pool-jához: grep -ri open_basedir /etc/php/*/fpm/pool.d/ 2>/dev/null
Ha a shell „látja” a fájlt (VISIBLE), az oldal viszont nem — akkor az open_basedir a hibás. A helyes megoldás a rendszerparancsokkal való olvasás (az AIDE és a Hálózati monitor esetében ez már megvalósult). Az open_basedir kiterjesztése a /var, /proc útvonalakra nem szükséges, és kevésbé biztonságos.

39. Az SSL-oldal nem működik

A monitor a tanúsítványokat úgy ellenőrzi, hogy közvetlenül, a 443-as porton keresztül csatlakozik a domainekhez. Ha a domain magáról a szerverről nem érhető el, vagy a portot blokkolja a tűzfal, az ellenőrzés sikertelen lesz.

# A tanúsítvány kézi ellenőrzése: echo | openssl s_client -connect monitor.example.com:443 2>/dev/null \ | openssl x509 -noout -dates # Elérhetőség ellenőrzése: curl -I https://monitor.example.com
A monitor a domaineket automatikusan az nginx (/etc/nginx/sites-enabled/, /etc/nginx/conf.d/) és az Apache (/etc/apache2/sites-enabled/) konfigjaiból veszi, valamint a HTTP_HOST aktuális hosztjából.
Aldomainek automatikus felismerése. Az aldomaineket a rendszer automatikusan felismeri a nyilvános Certificate Transparency naplókból, és hálózaton keresztül ellenőrzi őket — akkor is, ha más szervereken vannak. Kézzel semmit sem kell hozzáadni.

40. Csak egy adatbázis látszik a több közül

A monitor a config.php fájlban megadott felhasználóval csatlakozik a MySQL-hez, akinek csak a saját adatbázisához van hozzáférése. A MySQL az information_schema táblában csak a jogosultsággal rendelkező adatbázisokat mutatja — ezért a többi nem látszik.

Ahhoz, hogy a monitor minden adatbázist lásson, adjon ennek a felhasználónak csak olvasási jogot (egyszer, rootként; helyettesítse be a config.php fájlban szereplő felhasználónevet):

sudo mysql -u root GRANT SELECT, PROCESS, SHOW DATABASES ON *.* TO 'DB_USER'@'localhost'; FLUSH PRIVILEGES; EXIT;
A SELECT ON *.* csak olvasási jogot ad — módosítani, törölni vagy létrehozni semmit sem lehet vele, így a monitorozáshoz biztonságos.
E GRANT nélkül a panel csak a saját adatbázisát látja — ez nem hiba, hanem jogosultsági korlátozás. A panel semmilyen sudo mysql parancsot nem használ: az adatbázisok listáját a saját PDO-kapcsolatán keresztül kéri le.

41. A PostgreSQL nem jelenik meg az „Adatbázis” oldalon

A PostgreSQL a postgres felhasználói szintű hozzáférést igényli, amellyel a panel webes felhasználója nem rendelkezik. A széles jogkörű sudo psql PHP-ből való megnyitása nem biztonságos — ehelyett a panel egy szűk, paraméter nélküli burkolót hív meg, amely csak a verziót, a kapcsolatok számát és az adatbázisok listáját írja ki a méretükkel. Hozza létre:

sudo tee /usr/local/bin/monitor-pgstat >/dev/null <<'EOF' #!/bin/sh # Arciveo Monitor - read-only PostgreSQL version, connections and per-database size sudo -u postgres psql -tAc "SELECT version();" | grep -oE 'PostgreSQL [0-9.]+' echo "---" sudo -u postgres psql -tAc "SELECT count(*) FROM pg_stat_activity;" echo "---" sudo -u postgres psql -tAc "SELECT datname || '|' || pg_size_pretty(pg_database_size(datname)) FROM pg_database WHERE datistemplate = false;" EOF sudo chown root:root /usr/local/bin/monitor-pgstat sudo chmod 755 /usr/local/bin/monitor-pgstat # a /etc/sudoers.d/monitor fájlban (a felhasználó = az, amellyel a PHP-FPM fut): # www-data ALL=(ALL) NOPASSWD: /usr/local/bin/monitor-pgstat
Ha nem használ PostgreSQL-t — távolítsa el a monitor-pgstat sort a sudoersből (a kézi telepítés 13. lépése), és magát a szkriptet se hozza létre: a PostgreSQL kártya egyszerűen inaktív marad.

42. Riasztás érkezett — mi a teendő

A vezérlőpult megmutatja, mi történik; alább az áll, mi a teendő tipikus helyzetekben. Az általános elv: ne essen pánikba, vesse össze a jogszerű tevékenységgel (saját műveletek, frissítések, biztonsági mentések), és a súlyosság szerint reagáljon.

  • Támadási térkép / sok fail2ban-tiltás — ez normális bármely internetre kötött szervernél (a botok folyamatosan próbálgatják az SSH-t/webet). A lényeg, hogy a tiltások működjenek. Győződjön meg róla, hogy az SSH-bejelentkezés csak kulccsal történik (a jelszó ki van kapcsolva), és az Ön IP-címe szerepel az ignoreip listában.
  • A ModSecurity kéréseket blokkolt — a WAF elhárítja a webhely elleni támadásokat, ez a dolga. Ha a jogszerű forgalmát blokkolja (téves riasztás) — keresse meg a rule id azonosítót a részletekben, és adjon hozzá kivételt a CRS konfigurációjához.
  • AIDE: módosított fájlok — vesse össze a listát azzal, amit tett (csomagfrissítés, konfigok szerkesztése — ez normális). A rendszerbinárisok módosulása, amelyekhez Ön nem nyúlt, ok az éberségre. A jogszerű változtatások után frissítse az AIDE adatbázisát.
  • debsums: módosított bináris fájlok/könyvtárak (az /etc és a /usr/share könyvtáron kívül) — potenciális manipuláció. Ellenőrizze a csomagot: debsums PACKAGE_NAME, kétség esetén telepítse újra (apt install --reinstall).
  • ClamAV / maldet: fenyegetést talált — ellenőrizze a karanténba helyezett fájlt, ne nyissa meg. Ha ez egy webshell a webhely könyvtárában — izolálja a szervert, és keresse meg a belépési pontot (sebezhető bővítmény, hozzáférés-szivárgás).
  • Falco: kritikus események (shell indítása konténerben, érzékeny fájlok elérése) — elemezze az eseményt: kinek a folyamata, mi indította. Gyakran ez jogszerű adminisztrátori tevékenység.
  • Külső kitettség: pirossal jelölt adatbázis/gyorsítótár — azonnal zárja le: kösse a szolgáltatást a 127.0.0.1 címhez, vagy zárja le a portot az UFW-ben. Ez valós biztonsági rés.
  • Az SSL lejár / lejárt — újítsa meg a tanúsítványt (a Let's Encrypt magától megújul; ha nem — ellenőrizze a certbot renew parancsot vagy a beállításokat a vezérlőpulton).
  • Biztonsági frissítések várnak — telepítse: sudo apt update && sudo apt upgrade; a kernel frissítése után indítsa újra a szervert.
A valós feltörés jelei (ismeretlen folyamatok/felhasználók, módosított bináris fájlok, kimenő spam, ismeretlen cron-feladatok): válassza le a szervert a külső hozzáférésről, készítsen biztonsági mentést az elemzéshez, és ha az adatok kritikusak, állítson fel tiszta szervert megbízható biztonsági mentésből — a rootkitet megbízhatóan kitakarítani nehéz.
Arcivéo - Security Monitor © 2026