FAQ

Ez az útmutató az Arcivéo Security 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 Security Monitor

Arcivéo Security 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.

Kétféle ütem. A panel oldalai megnyitáskor kérdezik le az eszközöket — mindig az aktuális állapotot látja. Emellett ütemezetten (cron) háttérfeladatok is futnak:

  • 5 percenként — terhelési pillanatkép a „Teljesítmény” oldalhoz;
  • 5 percenként — a biztonsági események érzékelője: új tiltások, IDS-riasztások, leállt védelem, megnyílt port („Biztonsági események” fejezet);
  • naponta egyszer — a biztonsági jelentés Telegramra és e-mailben, valamint a nehéz ellenőrzések (Lynis, AIDE, ClamAV, debsums, Logwatch);
  • 15 percenként — a kiszolgáló összefoglalója az ügyfélfiókba, ha be van kapcsolva.

A feladatok teljes listája az „Az összes cron-feladat egy helyen” fejezetben található.

Több kiszolgáló esetén telepítse a monitort mindegyikre külön, saját domainnel. Ha egy listában szeretné látni őket, kapcsolja be a kiszolgálók áttekintését („Kiszolgálók áttekintése az ügyfélfiókban” fejezet).

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
  • A jelszavas SSH-bejelentkezés engedélyezett (PasswordAuthentication yes) — −10
  • Apró SSH-beállítások: bekapcsolt X11Forwarding, 3-nál nagyobb MaxAuthTries, vagy minden fiók számára olvasható sshd_config — −5
  • A webszerver védelme: a válaszok elárulják a webszerver vagy a PHP verzióját, be van kapcsolva a TRACE metódus, vagy hiányzik a Strict-Transport-Security vagy az X-Frame-Options fejléc — −5
  • 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. A webszerver védelme nem számít bele, ha egyetlen oldal sem válaszolt az ellenőrzésre.

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, e-mail, webhook és push

Négy csatorna van: Telegram, e-mail, webhook és push a böngészőben. Egymástól függetlenek — bármelyiket bekapcsolhatja, akár mind a négyet. Ugyanezeken a csatornákon megy a napi biztonsági jelentés, a terhelési riasztások és az eseményérzékelő találatai; egyszer kell beállítani őket, itt, a „Beállítások” részben.

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.

Webhook. Egyetlen POST-ot fogadó cím lefedi a Slacket, a Discordot, a Mattermostot, az n8n-t és a saját kezelőjét is. „Beállítások” → Webhook: illessze be a címet, és kapcsolja be a kapcsolót.

  • a Slack és a Mattermost a {"text": …} alakot kapja, a Discord a {"content": …} alakot (a Discord elutasítja a 2000 karakternél hosszabb üzeneteket, ezért a szöveg rövidül);
  • minden más cím strukturált JSON-t kap: text, event, severity, source, count, host, ts — az üzenet szövegét nem kell újra elemezni.

Push értesítések. Az üzenet közvetlenül a böngészőbe érkezik, és ha a panel fel van véve a telefon kezdőképernyőjére, közönséges alkalmazásértesítésként — bot és levelezőkiszolgáló nélkül. „Beállítások” → Push értesítések: kapcsolja be a kapcsolót, és minden eszközön, amelyiknek értesítést kell kapnia, nyomja meg az „Eszköz csatlakoztatása” gombot. A „Csatlakoztatott eszközök” számláló mutatja, hány van.

A push csak HTTPS-en működik (akárcsak a WebAuthn), és az engedély kétszer szükséges: először a böngészőben — a kérdés az „Eszköz csatlakoztatása” gomb után jelenik meg —, majd magában az operációs rendszerben. Ha Windowsban ki van kapcsolva a fő kapcsoló a Beállítások → Rendszer → Értesítések alatt, a böngésző megadja az engedélyt, a panel jelzi a küldést, a képernyőn mégsem jelenik meg semmi. Ugyanezt okozza a „Ne zavarjanak” mód és a kikapcsolt böngészőértesítés macOS-en (Rendszerbeállítások → Értesítések).
Minden csatornának saját „Tesztküldés” gombja van, amely azonnal ellenőrzi. Az automatikus jelentés ütemezését a cron végzi („Az összes cron-feladat” fejezet): a cron 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).

09. Csak olvasható API (JSON és Prometheus)

A panelt jelszavas bejelentkezés védi, és — ha be van kapcsolva — az IP-szűrő. Egy programnak egyik sem felel meg, ezért a külső rendszerek saját bejáratot kapnak: két csak olvasható címet, tokennel védve. A token semmit sem változtat a kiszolgálón: kizárólag adatok lekérésére jó.

Bekapcsolás — „Beállítások” → „Csak olvasható API”: a „Kapcsolja be az API-t” kapcsoló; a token az első mentéskor automatikusan létrejön. Az „Új token” gomb másikat ad ki, és ugyanabban a pillanatban lekapcsol mindenkit, aki a korábbit használta.

  • /api/status.php — JSON: biztonsági pontszám, a modulok állapota, a legutóbbi terhelési mérés a legterhelőbb folyamatokkal, valamint az elmúlt 24 óra biztonsági eseményei;
  • /api/metrics.php — ugyanezek a számok a Prometheus szöveges formátumában (arciveo_* mérőszámok: arciveo_security_score, arciveo_fail2ban_banned, arciveo_cpu_busy_pct és így tovább).
curl -H "Authorization: Bearer <TOKEN>" https://monitor.example.com/api/status.php curl -H "Authorization: Bearer <TOKEN>" https://monitor.example.com/api/metrics.php

Ha az Ön kliense nem tud fejlécet küldeni, a token paraméterként is elfogadott — ?token=…. Vegye figyelembe, hogy ebben a formában bekerül a webkiszolgáló hozzáférési naplójába, ezért a fejléc a jobb megoldás.

Prometheus. Kész blokk a scrape_configs részhez:

scrape_configs: - job_name: arciveo metrics_path: /api/metrics.php scheme: https authorization: credentials: <TOKEN> static_configs: - targets: ['monitor.example.com']
A válasz 5 percig gyorsítótárban marad: e számok mögött ugyanaz a nehéz eszközlekérdezés áll, mint az irányítópult mögött. A gyakori lekérdezés így semmibe sem kerül a kiszolgálónak — az értékek egyszerűen ismétlődnek a következő frissítésig —, egy percnél rövidebb időköznek viszont nincs értelme.
401 — a token hibás, vagy nem érkezett meg. 404 az api disabled szöveggel — az API ki van kapcsolva a beállításokban. Az elutasított kéréseket a rendszer a küldő IP-címével együtt az alkalmazásnaplóba írja, így a token találgatása látszik az „Alkalmazásnaplók” oldalon.

10. Kiszolgálók áttekintése az ügyfélfiókban

A panel kiszolgálónként települ, és arra a kérdésre, hogy „hogy áll ez a gép”, jól válaszol. Arra, hogy „hogy áll az összes gépem”, nem — ezért minden panel küldhet rövid összefoglalót az ügyfélfiókba, ahol a kiszolgálók egyetlen listában látszanak.

Amit az ügyfélfiókban kell elővenni my.arciveo.com → „Kiszolgálóim” rész: itt kap egy tokent (fk_… alakban), és itt szerepel a fogadó címe: https://my.arciveo.com/api/fleet.php. A token fiókonként egy — minden kiszolgálójához ugyanaz.

Amit a panelen kell beállítani — „Beállítások” → „Kiszolgálók áttekintése”: a fogadó címe, a token, a kiszolgáló neve (ahogy a listában megjelenik; üresen hagyva a panel domainje kerül oda) és az „Összefoglaló küldése” kapcsoló. A „Küldés most” gomb azonnal ellenőrzi a kapcsolatot, az ütemezés bevárása nélkül.

Ezután az összefoglaló cronnal megy ki, 15 percenként:

# 15 percenként — a kiszolgáló összefoglalója az ügyfélfiókba 3,18,33,48 * * * * /usr/local/bin/fleet-push-all.sh >> /path/to/monitor/logs/cron.log 2>&1

Pontosan mi megy ki: a kiszolgáló neve és domainje, az operációs rendszer, az üzemidő, a PHP verziója; a biztonsági pontszám; a modulok állapota (UFW, a Fail2ban jailek száma, a mai tiltások, fut-e a CrowdSec, a Suricata és a Falco, ClamAV-fenyegetések, AIDE-változások, Lynis-index, várakozó frissítések, szükséges-e újraindítás, hány nap van a tanúsítvány lejártáig, a veszélyesen nyitott portok száma); a legutóbbi terhelési mérés (load, CPU, RAM, lemez, inode); az elmúlt 24 óra eseményszámlálói és a legutóbbi kritikus esemény. Naplók, jelszavak és fájltartalom nincs az összefoglalóban.

A kiszolgáló küld, az ügyfélfiók nem kérdez. Ezért kívülről semmit sem kell megnyitni az Ön hálózata felé, és egy IP-szűrővel zárt panel is jelent. A csomópontot a panel domainje azonosítja, így a lista újraindítás vagy IP-csere után sem duplázódik meg.
Ha egy kiszolgáló némaként van megjelölve a fiókban, az összefoglaló régóta nem érkezett meg. Ellenőrizze sorban: az „Összefoglaló küldése” kapcsolót, a cron sorát (sudo crontab -l), és hogy mit válaszol a „Küldés most” gomb. A küldési hibák FLEET jelöléssel kerülnek az alkalmazásnaplóba — ott látszik, hogy a tokent utasították-e el (HTTP 401), vagy maga a kapcsolat nem jött létre.

Biztonsági eszközök

11. 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á.

12. 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ó.

13. 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.

14. 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.

15. 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.

16. 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.

17. 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.

18. 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.

19. 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.

20. 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.

21. 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.

22. 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.

23. 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

24. 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.

25. 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.

26. 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.

27. 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

28. 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

29. 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.

30. 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.

31. 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 alapértelmezett a 24 órás ablak: a felső gombokkal 7 napra vagy 30 napra válthat.

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.

Két tárolási mélység. A „nyers” ötperces pillanatképek egy napig élnek (plusz egy óra tartalék, hogy a grafikon legrégebbi pontjának legyen még elődje a számításhoz). Minden befejezett óra egyetlen sorrá záródik össze; ezt az órás sort 30 napig őrzi a rendszer, és éppen ezt olvassa a „7 nap” és a „30 nap” nézet. Egy hónapnyi előzmény így körülbelül 720 sorba kerül nagyjából 8600 helyett.

A 7 és 30 napos időszakokon órás átlagok látszanak, nem az egyes mérések — egy ötperces csúcs ebben a léptékben elsimul, és az oldal figyelmeztet is erre. A Load Average esetében az órás sor az óra átlagát és csúcsát is megőrzi, ezért a grafikon mindkét vonalat mutatja. Frissítés után a hosszú időszakok üresek („ehhez az időszakhoz még nincs előzmény”) — az órás sor ettől a pillanattól kezd feltöltődni.
# 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.

Legterhelőbb folyamatok. A grafikonok alatt két táblázat áll az öt legtöbb CPU-t fogyasztó folyamattal:

  • „Folyamatok a legutóbbi mérésben” — mi terhelte a kiszolgálót az utolsó pillanatkép idején (az időpont a kártya fejlécében szerepel);
  • „Folyamatok a nap csúcspontján” — ugyanaz az öt, de az elmúlt 24 óra legmagasabb Load Average-ű méréséből. Ez a válasz arra a kérdésre, hogy „mi volt ez az éjjel”, amikor a grafikon csúcsa már rég elmúlt.

Mindkét táblázat mindig az elmúlt 24 órát írja le, akkor is, ha a grafikonok egy hónapot mutatnak: folyamat-pillanatképet csak az ötperces sorok hordoznak, azok pedig nem maradnak meg egy napnál tovább.

A mérés saját folyamatai (ps, a gyűjtő PHP-szkript és a fölötte lévő cron/sudo lánc) kimaradnak a listából — különben minden pillanatkép élén állnának: a ps az indulás pillanatában közel 100 % CPU-t mutat. Az ugyanabban a percben futó többi cron-feladat viszont megjelenik — éppen ezért van a táblázat.

Terhelési riasztások („Beállítások” → „Terhelési riasztások” rész) — a CPU/RAM/lemez/inode küszöb túllépésekor a panel minden bekapcsolt csatornán értesítést küld (Telegram, e-mail, webhook, push — ugyanazok, mint a napi jelentésnél; a riasztásokhoz külön semmit sem kell bekapcsolni), majd még egyet, amikor a mérőszám visszatér a normális tartományba. Amíg a küszöb fennáll, nem küld újra és újra: a következő értesítés csak a „helyreállt → ismét 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.

32. Biztonsági események (érzékelő 5 percenként)

A napi jelentés arra a kérdésre válaszol, hogy „hogy áll a kiszolgáló”. Az érzékelő egy másikra — „mi történt az imént”. 5 percenként lekérdezi a gyors forrásokat, és csak azt jegyzi fel, ami az előző ellenőrzés óta megváltozott; a menüben lévő „Biztonsági események” oldal mutatja a találatok listáját.

A lassú ellenőrzésekhez — Lynis, debsums, csomagfrissítések, az SSL lejárata — az érzékelő nem nyúl: ezek számai úgyis naponta egyszer változnak, és a napi jelentés hatáskörében maradnak.

Mit vesz észre — kilenc forrás:

  • Fail2ban — új tiltások (a tiltott címek listáját hasonlítja össze, így a feloldás nem esemény, egy érvényben lévő tiltásról pedig pontosan egyszer jelent);
  • CrowdSec — új döntések;
  • Falco — Emergency, Alert és Critical szintű események;
  • Suricata — új riasztások; a [Priority: 1] jelölés kritikus szintre emeli a találatot;
  • ClamAV — új FOUND sorok a vizsgálati naplóban;
  • AIDE — fájlváltozások a legutóbbi ellenőrzés szerint (tehát nem gyakrabban, mint ahogy az a saját ütemezése szerint lefut);
  • SSH — sikeres bejelentkezés root néven (kritikus) és bejelentkezés korábban nem látott címről (figyelmeztetés);
  • Védelmi szolgáltatások — UFW, Fail2ban, CrowdSec, Suricata, Falco: egy üzenet, amikor egy szolgáltatás leáll, és egy, amikor újra működik;
  • Portok — kívülről elérhetővé vált port; ha adatbázis vagy gyorsítótár áll mögötte, kritikus.

Az az eszköz, amelyik nincs telepítve, vagy amelyiknek a naplóját a panel nem tudja olvasni, egyszerűen hallgat — ez nem hiba és nem esemény.

Az első ellenőrzés semmit sem küld. Minden forrás megjegyzi, „meddig olvasott már” (a data/secwatch_state.json fájl), és az első futás csak ezt a jelölést írja ki. Különben a figyelés bekapcsolásakor mindarról értesítés érkezne, amit a naplók hónapok alatt felhalmoztak.

Beállítás — „Beállítások” → „Események figyelése”:

  • Kapcsolja be a figyelést — amíg ki van kapcsolva, a cron-feladat üresen fut, és a lista nem telik meg;
  • Értesítés ettől — „Figyelmeztetés” vagy „Kritikus”. A küszöb alatti találatok így is a listába kerülnek, de az értesítésekbe nem;
  • Szünet, perc — a legkisebb idő két értesítés között, alapértelmezés szerint 15;
  • Csendes órák — 23-7 formátumú ablak, amely alatt a figyelmeztetések nem mennek ki.
A kritikus találatok azonnal kimennek — sem a szünet, sem a csendes órák nem tartják vissza őket: éppen miattuk van 5 perces érzékelő. Biztosíték azért van: óránként legfeljebb 6 értesítés — arra az esetre, ha valamelyik forrás „villogni” kezdene.

Az értesítések ugyanazokon a csatornákon mennek, mint a napi jelentés (Telegram, e-mail, webhook, push) — külön semmit sem kell bekapcsolni. Minden találat bekerül a listába attól függetlenül, hogy ment-e értesítés, és 90 napig megmarad.

Az eseménylista. Szűrők: időszak (24 óra, 7, 30 vagy 90 nap), fontosság és forrás; az utolsó 500 bejegyzés látszik. Az „Ellenőrzés most” gomb pontosan ugyanazt a menetet indítja, mint a cron — közvetlenül a beállítás után hasznos, hogy ne kelljen öt percet várni; meg is nevezi az okot, ha nem ment ki értesítés („a fontossági küszöb alatt”, „csendes órák”, „nincs beállítva értesítési csatorna”). A menüpont melletti piros számláló az elmúlt 24 óra kritikus eseményeinek száma.

A cím adatlapja. Az eseménylista egy sorára vagy az Összefüggő címek blokk egy sorára kattintva megnyílik minden, ami egy címről tudható: eseményeinek időrendje, az ország, és az első sorban a következtetés. A lista sora akkor nyitja meg az adatlapot, ha az esemény pontosan egy címhez tartozik; ha többet nevez meg, a soron belüli címek a hivatkozások. Négyféle következtetés van:

  • Hozzáférés lehetséges — a címről sikeres bejelentkezés történt, és ugyanezt a címet más védelmek is jelezték, vagy közvetlenül utána megszólalt az AIDE, a ClamAV, illetve új port nyílt. Az egyetlen eset, amelyet érdemes azonnal ellenőrizni;
  • Bejelentkezés erről a címről — van bejelentkezés, és semmi más. Rendszerint a tulajdonos az új helyről, ezért az adatlap nem vörös;
  • Letiltva — a címet elkapták és letiltották: a védelem elvégezte a dolgát, nincs teendő;
  • Ellenőrzést igényel — vannak észlelések, de letiltás nem volt. Ha a cím visszatér, zárja le kézzel.

Az időrend alatt a Mi történt a kiszolgálón ugyanekkor blokk áll: olyan események, amelyeknek egyáltalán nincs címük. Az AIDE nem tudja, ki módosította a fájlt, a ClamAV nem tudja, ki hozta a fertőzöttet. Azok látszanak, amelyek a cím tevékenységének idejére és az azt követő hat órára esnek. Épp a bejelentkezés és az utána történtek együtt választják el a kísérletet a tényleges hozzáféréstől.

Az összefüggést a cím adja. A címet váltó támadó elszakítja. Az adatlap azt mutatja, amit a védelmek láttak, és nem vállalja, hogy megkülönböztesse a betörést az Ön saját, új helyről történő bejelentkezésétől.

Ütemezés. A feladat a root crontabjába kerül (sudo crontab -e), a mérésgyűjtéshez képest 2 perccel eltolva, hogy a kettő ne induljon egyszerre:

# 5 percenként — a biztonsági események ellenőrzése 2-57/5 * * * * /usr/local/bin/security-watch-all.sh >> /path/to/monitor/logs/cron.log 2>&1
Az ellenőrzést csak a wrapperen keresztül indítsa, soha ne közvetlenül a php cron/security_watch.php paranccsal. A wrapper megtalálja a panel összes telepítését a kiszolgálón, és a webhely tulajdonosának nevében indítja az ellenőrzést — pontosan azokkal a sudo jogokkal, amelyeket a panel a webről használ. A root crontabjából indított közvetlen hívás root tulajdonú data/secwatch_state.json állapotfájlt hozna létre, és az „Ellenőrzés most” gomb működésképtelenné válna.
Ha a kiszolgálót az automatikus telepítéssel készítette elő, a feladat már be van állítva — csak a figyelést kell bekapcsolni a beállításokban.

33. Webkiszolgáló: kérések és válaszkódok

A „Webkiszolgáló” oldal a hozzáférési naplót elemzi, és megmutatja, hány kérés érkezett, ezek mekkora része végződött hibával, és ki küldte őket. A ModSecurity arra válaszol, hogy „mi lett blokkolva”, ez az oldal arra, hogy „mi jutott el egyáltalán a webhelyre”.

Ami látszik: a kérések száma, RPS, a hibaarány, külön 5xx számláló és a kiszolgált adatmennyiség; óránkénti kérésgrafikon; a 2xx/3xx/4xx/5xx kódok megoszlása; gyakori címek, gyakori IP-k, gyakori hibák (kód és útvonal) és kliensek (User-Agent). Az időszak: 24 óra vagy 7 nap.

A forrás a combined formátumú hozzáférési napló, így az Nginx és az Apache is megfelel, és nem kell hozzá külön modul. A panel a szabványos fájlok között keresi a naplót:

  • /var/log/nginx/access.log
  • /var/log/apache2/access.log
  • /var/log/apache2/other_vhosts_access.log
  • /var/log/httpd/access_log

Ezeken kívül a panel átnézi a *access*.log és *requests*.log nevű fájlokat a /var/log/nginx/, /var/log/apache2/ és /var/log/httpd/ könyvtárban. Így megtalálja azt a naplót is, amelyet egy webhely a CustomLog direktívával saját fájlba ír — például az arciveo-monitor_requests.log fájlt, amelyet az Arcivéo telepítője hoz létre.

Csak egy napló olvasódik be: ha az Nginx az Apache előtt áll, két napló összeadása minden kérést kétszer számolna. A panel a fenti lista első olyan naplóját veszi, amelybe az elmúlt egy napban írtak (a névminta alapján találtakat utána próbálja, a legfrissebbel kezdve); ha egy napja egyikbe sem írtak, a legutóbb módosult nem üres naplót. Így a logrotate által kiürített vagy egy leállított webkiszolgálóról ott maradt napló nem takarja el az élőt. A napló utolsó szakasza olvasódik be (3 MB), az eredmény pedig 5 percig gyorsítótárban marad — terhelt webhelyen ezért előfordulhat, hogy a választott időszak nincs teljesen lefedve; a ténylegesen elért lefedettség a grafikon fölött olvasható.

„A panel nem tudja olvasni a webkiszolgáló naplóját.” Az ok szinte mindig a jogosultság: a naplók és a könyvtáruk az adm csoporté, a webfelhasználó pedig nincs benne. Az Arcivéo telepítője felveszi őt ebbe a csoportba; kézi telepítés után egy apró, roothoz tartozó wrapper segít, amelynek pontosan egyet szabad — kiírni a naplót (a ModSecurity oldala ugyanígy működik). A wrapper ugyanazokkal a szabályokkal választja ki a naplót, mint a panel. A parancs magán az oldalon is megjelenik; itt is. Illessze be egészben — ez egyetlen parancs:
sudo tee /usr/local/bin/monitor-weblog >/dev/null <<'EOF' && sudo chmod 755 /usr/local/bin/monitor-weblog && echo 'www-data ALL=(root) NOPASSWD: /usr/local/bin/monitor-weblog' | sudo tee /etc/sudoers.d/monitor-weblog >/dev/null && sudo visudo -c #!/bin/sh L="/var/log/nginx/access.log /var/log/apache2/access.log /var/log/apache2/other_vhosts_access.log /var/log/httpd/access_log $(ls -t /var/log/nginx/*access*.log /var/log/apache2/*access*.log /var/log/apache2/*requests*.log /var/log/httpd/*access_log 2>/dev/null)" for f in $L; do [ -r "$f" ] && [ -n "$(find "$f" -size +0 -mmin -1440 2>/dev/null)" ] && exec tail -c 3000000 "$f"; done for f in $(ls -t $L 2>/dev/null); do [ -r "$f" ] && [ -s "$f" ] && exec tail -c 3000000 "$f"; done EOF

A webfelhasználó eltérhet a www-data felhasználótól — ellenőrizze, melyik felhasználóval fut a webhely PHP-FPM készlete (ps -o user= -C php-fpm), és írja be a sudoers sorába. Ha a napló nevében sem access, sem requests nem szerepel, írja be az útvonalát a wrapperben az L=… sor elejére.

„A választott időszakhoz nincsenek bejegyzések” — a napló beolvasódott, de nem találhatók benne megfelelő sorok: vagy tényleg nem nyitotta meg senki a webhelyet, vagy a napló épp most fordult át (logrotate), és elölről kezdődik.

Ismert sebezhetőségek kihasználási kísérletei. A panel a napló kéréseit mintegy húsz elterjedt exploit aláírásával veti össze: PHP-CGI, könyvtárbejárás az Apache-ban, PHPUnit, Log4Shell, routerek, kamerák és VPN-átjárók hibái. Minden kísérletnél megmondja, működhet-e ezen a szerveren, és tényekre támaszkodik: a telepített Apache- és PHP-verzióra, a Java meglétére és arra a válaszkódra, amellyel a szerver a fájlkérésre felelt. Pirossal csak az van jelölve, ami tényleg működhet.

A webszerver védelme. A panel a szerver minden oldalát lekéri a 127.0.0.1 címen keresztül, és megnézi, mit kap a látogató: látható-e a webszerver és a PHP verziója, be van-e kapcsolva a TRACE metódus, és megvannak-e a Strict-Transport-Security, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy és Content-Security-Policy védőfejlécek. Az oldalak a panel megnyitási címéből és a virtuális hosztok fájljaiból származnak, ha a panel olvasni tudja őket. Az eredmény 10 percenként frissül.

Ha valami hiányzik, a táblázat alatt egyetlen parancs jelenik meg. Külön zz-arciveo-hardening.conf fájlt hoz létre, és a webszervert csak sikeres konfigurációs teszt után tölti újra; az oldal által már küldött fejlécek nem duplázódnak. A CSP-t nem ajánlja egy sorként: a szabályzatot az adott oldalhoz kell összeállítani, különben az oldal nem tölti be a saját szkriptjeit, stílusait és betűtípusait. A módosítás visszavonása Apache alatt:

sudo a2disconf zz-arciveo-hardening && sudo systemctl reload apache2
A hibaoldalak aláírását (ServerSignature) a panel nem jelöli, ha a webszerver verziója már rejtve van: verzió nélkül csak a szerver nevét és a hosztnevet mutatja.

34. 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.

35. 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

36. 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.

37. 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_DENIED — Permission 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.

38. Második webhely ezen a szerveren (még egy domain)

A panel már működik, és ugyanezen a szerveren szükség van még egy webhelyre — saját domainnel a monitor mellett. Az automatikus telepítés után a szerver egy szokásos Apache + PHP-FPM gép, így a webhelynek három dolog kell: saját könyvtár, saját vhost és saját tanúsítvány. A panelhez közben nem nyúlunk: az egész szervert figyeli, a második domainhez nem kell második példány.

Ez a szakasz tárhelypanel nélküli szerverre vonatkozik. Ha HestiaCP vagy hasonló panel van telepítve, a domaint abban vegye fel, ne kézzel. Ha pedig sok webhelyet tervez (ráadásul levelezéssel), a panelt az automatikus telepítés előtt telepítse: a szkript felismeri, és additív módba vált, míg a később telepített panel újraépíti az Apache, a tűzfal és a levelezés konfigurációját.
Mit írjon be a parancsokba. A site2.example.com az új webhely címe. Ez lehet külön domain (mycompany.com) és aldomain (shop.mycompany.com) is — az Apache-nak mindegy, csak a DNS-rekord (1. lépés) és a tanúsítvány kiállítása (5. lépés) tér el. A site2 csupán a webhely rövid neve: így hívják a /var/www/site2 könyvtárat és a site2.conf konfigurációs fájlt. A domainhez semmi köze, az Apache a címet kizárólag a ServerName értékéből veszi; a név bármi lehet — a shop.mycompany.com esetén például kényelmes a shop: könyvtár /var/www/shop, konfiguráció shop.conf.

1. DNS. A domain regisztrátorának DNS-felületén hozzon létre egy A rekordot a szerver IP-címére:

# Aldomain (shop.mycompany.com): Típus: A Név: shop Érték: 203.0.113.10 TTL: 3600 # Külön domain (mycompany.com) — két rekord, hogy a www-s cím is működjön: Típus: A Név: @ Érték: 203.0.113.10 TTL: 3600 Típus: A Név: www Érték: 203.0.113.10 TTL: 3600

Néhány perc múlva ellenőrizze: a dig +short site2.example.com a szerver IP-címét kell visszaadja.

2. A webhely könyvtára.

sudo mkdir -p /var/www/site2 sudo chown -R www-data:www-data /var/www/site2

3. A vhost. A blokkot egészben illessze be a terminálba — a PHP-FPM socket útvonalát a szkript magától megállapítja:

PHPSOCK=$(ls -1 /run/php/php*-fpm.sock 2>/dev/null | head -1) # a PHP-FPM socket automatikus felismerése sudo tee /etc/apache2/sites-available/site2.conf > /dev/null <<'EOF' <VirtualHost *:80> ServerName site2.example.com # Külön domain: vegye ki a # jelet az alábbi sorból, hogy a webhely www-vel is megnyíljon. # Aldomainhez erre a sorra nincs szükség. #ServerAlias www.site2.example.com DocumentRoot /var/www/site2 <Directory /var/www/site2> Options -Indexes +FollowSymLinks AllowOverride All Require all granted </Directory> <FilesMatch \.php$> SetHandler "proxy:unix:__PHPSOCK__|fcgi://localhost" </FilesMatch> ErrorLog ${APACHE_LOG_DIR}/site2_error.log CustomLog ${APACHE_LOG_DIR}/site2_access.log combined </VirtualHost> EOF sudo sed -i "s#__PHPSOCK__#${PHPSOCK}#" /etc/apache2/sites-available/site2.conf

4. Kapcsolja be a webhelyet, és újratöltés előtt ellenőrizze a konfigurációt:

sudo a2ensite site2.conf sudo apache2ctl configtest # várt eredmény: Syntax OK sudo systemctl reload apache2

5. SSL. A certbot-ot az automatikus telepítés már feltette; ekkorra a DNS-nek már a szerverre kell mutatnia:

# Aldomain — egyetlen cím: sudo certbot --apache -d site2.example.com # Külön domain — rögtön www-vel is (az 1. lépés mindkét A rekordjának a szerverre kell mutatnia, # a www-nek pedig a ServerAlias sorban kell szerepelnie, különben a certbot nem tudja ellenőrizni a második címet): sudo certbot --apache -d site2.example.com -d www.site2.example.com

A harmadik és a további domaineket ugyanígy veheti fel — ismételje meg az 1–5. lépést más domainnel és könyvtárral.

Ki válaszol az „idegen” kérésekre. Ha a Host egyetlen ServerName értékkel sem egyezik (IP-címmel való megnyitás vagy a szerverére irányított idegen domain), az Apache a /etc/apache2/sites-enabled/ könyvtárból az ábécésorrendben első bekapcsolt webhelyet szolgálja ki. A gyári 000-default webhelyet az automatikus telepítés kikapcsolja, így ez az „ügyeletes” szerep a panel vhostjánál (arciveo-monitor.conf) marad — a saját nevükön megnyitott webhelyeket ez nem érinti. Ha IP-címmel más webhelynek kell megnyílnia, nevezze el a fájlját úgy, hogy ábécésorrendben előrébb kerüljön (például 000-site2.conf).
A védelem az egész szerverre vonatkozik: az UFW, a Fail2ban, a CrowdSec, a ModSecurity és a Suricata már fut, és az új webhelyet automatikusan lefedi, külön nem kell beállítani. A 80/443-as portok szintén nyitva vannak. A webhely saját naplókat kap: site2_error.log és site2_access.log a /var/log/apache2/ könyvtárban.
Az új webhely könyvtárát ne tegye a panel könyvtárán belülre — a panel webgyökerét saját .htaccess vezérli (front controller), és egy beágyazott webhely nem azt szolgálná ki, amit várna. Tartsa a webhelyeket egymás mellett: /var/www/monitor, /var/www/site2.

39. 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.

40. 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 # 5 percenként, a fenti pillanatképhez képest eltolva — a biztonsági események # érzékelője: új tiltások, IDS-riasztások, leállt védelem, megnyílt port. # Amíg a figyelés a beállításokban ki van kapcsolva, a feladat nem csinál semmit. 2-57/5 * * * * /usr/local/bin/security-watch-all.sh >> /path/to/monitor/logs/cron.log 2>&1 # 15 percenként — a kiszolgáló összefoglalója az ügyfélfiókba, hogy több kiszolgáló # egy listában látszódjon. Amíg az összefoglaló ki van kapcsolva, a feladat nem csinál semmit. 3,18,33,48 * * * * /usr/local/bin/fleet-push-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;
  • security-watch-all.sh → /usr/local/bin/ (chmod +x) — a panel cron/security_watch.php szkriptjét a webhely tulajdonosának nevében futtatja („Biztonsági események” oldal, a fenti crontab 2-57/5 sora); a security_watch.php már a panel része, külön telepíteni nem kell;
  • fleet-push-all.sh → /usr/local/bin/ (chmod +x) — a kiszolgáló összefoglalóját küldi az ügyfélfiókba a panel cron/fleet_push.php szkriptjén keresztül (a fenti 3,18,33,48 sor);
  • 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

41. 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

42. 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).

43. 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.

44. 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.

45. 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.

46. 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 Security 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.

47. 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.